    001/*
    002 * The FML Forge Mod Loader suite.
    003 * Copyright (C) 2012 cpw
    004 *
    005 * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free
    006 * Software Foundation; either version 2.1 of the License, or any later version.
    007 *
    008 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
    009 * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
    010 *
    011 * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51
    012 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
    013 */
    014
    015package cpw.mods.fml.common;
    016
    017import java.security.cert.Certificate;
    018import java.util.Arrays;
    019import java.util.Map;
    020import java.util.Set;
    021import java.util.logging.Level;
    022
    023import net.minecraft.nbt.NBTBase;
    024import net.minecraft.nbt.NBTTagCompound;
    025import net.minecraft.nbt.NBTTagList;
    026import net.minecraft.world.storage.SaveHandler;
    027import net.minecraft.world.storage.WorldInfo;
    028
    029import com.google.common.eventbus.EventBus;
    030
    031import cpw.mods.fml.common.registry.GameData;
    032import cpw.mods.fml.common.registry.GameRegistry;
    033import cpw.mods.fml.common.registry.ItemData;
    034
    035/**
    036 * @author cpw
    037 *
    038 */
    039public class FMLDummyContainer extends DummyModContainer implements WorldAccessContainer
    040{
    041    public FMLDummyContainer()
    042    {
    043        super(new ModMetadata());
    044        ModMetadata meta = getMetadata();
    045        meta.modId="FML";
    046        meta.name="Forge Mod Loader";
    047        meta.version=Loader.instance().getFMLVersionString();
    048        meta.credits="Made possible with help from many people";
    049        meta.authorList=Arrays.asList("cpw, LexManos");
    050        meta.description="The Forge Mod Loader provides the ability for systems to load mods " +
    051                    "from the file system. It also provides key capabilities for mods to be able " +
    052                    "to cooperate and provide a good modding environment. " +
    053                    "The mod loading system is compatible with ModLoader, all your ModLoader " +
    054                    "mods should work.";
    055        meta.url="https://github.com/MinecraftForge/FML/wiki";
    056        meta.updateUrl="https://github.com/MinecraftForge/FML/wiki";
    057        meta.screenshots=new String[0];
    058        meta.logoFile="";
    059    }
    060
    061    @Override
    062    public boolean registerBus(EventBus bus, LoadController controller)
    063    {
    064        return true;
    065    }
    066
    067    @Override
    068    public NBTTagCompound getDataForWriting(SaveHandler handler, WorldInfo info)
    069    {
    070        NBTTagCompound fmlData = new NBTTagCompound();
    071        NBTTagList list = new NBTTagList();
    072        for (ModContainer mc : Loader.instance().getActiveModList())
    073        {
    074            NBTTagCompound mod = new NBTTagCompound();
    075            mod.setString("ModId", mc.getModId());
    076            mod.setString("ModVersion", mc.getVersion());
    077            list.appendTag(mod);
    078        }
    079        fmlData.setTag("ModList", list);
    080        NBTTagList itemList = new NBTTagList();
    081        GameData.writeItemData(itemList);
    082        fmlData.setTag("ModItemData", itemList);
    083        return fmlData;
    084    }
    085
    086    @Override
    087    public void readData(SaveHandler handler, WorldInfo info, Map<String, NBTBase> propertyMap, NBTTagCompound tag)
    088    {
    089        if (tag.hasKey("ModList"))
    090        {
    091            NBTTagList modList = tag.getTagList("ModList");
    092            for (int i = 0; i < modList.tagCount(); i++)
    093            {
    094                NBTTagCompound mod = (NBTTagCompound) modList.tagAt(i);
    095                String modId = mod.getString("ModId");
    096                String modVersion = mod.getString("ModVersion");
    097                ModContainer container = Loader.instance().getIndexedModList().get(modId);
    098                if (container == null)
    099                {
    100                    FMLLog.log("fml.ModTracker", Level.SEVERE, "This world was saved with mod %s which appears to be missing, things may not work well", modId);
    101                    continue;
    102                }
    103                if (!modVersion.equals(container.getVersion()))
    104                {
    105                    FMLLog.log("fml.ModTracker", Level.INFO, "This world was saved with mod %s version %s and it is now at version %s, things may not work well", modId, modVersion, container.getVersion());
    106                }
    107            }
    108        }
    109        if (tag.hasKey("ModItemData"))
    110        {
    111            NBTTagList modList = tag.getTagList("ModItemData");
    112            Set<ItemData> worldSaveItems = GameData.buildWorldItemData(modList);
    113            GameData.validateWorldSave(worldSaveItems);
    114        }
    115        else
    116        {
    117            GameData.validateWorldSave(null);
    118        }
    119    }
    120
    121
    122    @Override
    123    public Certificate getSigningCertificate()
    124    {
    125        Certificate[] certificates = getClass().getProtectionDomain().getCodeSource().getCertificates();
    126        return certificates != null ? certificates[0] : null;
    127    }
    128}