001/* 002 * Forge Mod Loader 003 * Copyright (c) 2012-2013 cpw. 004 * All rights reserved. This program and the accompanying materials 005 * are made available under the terms of the GNU Lesser Public License v2.1 006 * which accompanies this distribution, and is available at 007 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html 008 * 009 * Contributors: 010 * cpw - implementation 011 */ 012 013package cpw.mods.fml.common; 014 015import java.security.cert.Certificate; 016import java.util.Arrays; 017import java.util.Map; 018import java.util.Set; 019import java.util.logging.Level; 020 021import net.minecraft.nbt.NBTBase; 022import net.minecraft.nbt.NBTTagCompound; 023import net.minecraft.nbt.NBTTagList; 024import net.minecraft.world.storage.SaveHandler; 025import net.minecraft.world.storage.WorldInfo; 026 027import com.google.common.eventbus.EventBus; 028 029import cpw.mods.fml.common.registry.GameData; 030import cpw.mods.fml.common.registry.GameRegistry; 031import cpw.mods.fml.common.registry.ItemData; 032 033/** 034 * @author cpw 035 * 036 */ 037public class FMLDummyContainer extends DummyModContainer implements WorldAccessContainer 038{ 039 public FMLDummyContainer() 040 { 041 super(new ModMetadata()); 042 ModMetadata meta = getMetadata(); 043 meta.modId="FML"; 044 meta.name="Forge Mod Loader"; 045 meta.version=Loader.instance().getFMLVersionString(); 046 meta.credits="Made possible with help from many people"; 047 meta.authorList=Arrays.asList("cpw, LexManos"); 048 meta.description="The Forge Mod Loader provides the ability for systems to load mods " + 049 "from the file system. It also provides key capabilities for mods to be able " + 050 "to cooperate and provide a good modding environment. " + 051 "The mod loading system is compatible with ModLoader, all your ModLoader " + 052 "mods should work."; 053 meta.url="https://github.com/MinecraftForge/FML/wiki"; 054 meta.updateUrl="https://github.com/MinecraftForge/FML/wiki"; 055 meta.screenshots=new String[0]; 056 meta.logoFile=""; 057 } 058 059 @Override 060 public boolean registerBus(EventBus bus, LoadController controller) 061 { 062 return true; 063 } 064 065 @Override 066 public NBTTagCompound getDataForWriting(SaveHandler handler, WorldInfo info) 067 { 068 NBTTagCompound fmlData = new NBTTagCompound(); 069 NBTTagList list = new NBTTagList(); 070 for (ModContainer mc : Loader.instance().getActiveModList()) 071 { 072 NBTTagCompound mod = new NBTTagCompound(); 073 mod.setString("ModId", mc.getModId()); 074 mod.setString("ModVersion", mc.getVersion()); 075 list.appendTag(mod); 076 } 077 fmlData.setTag("ModList", list); 078 NBTTagList itemList = new NBTTagList(); 079 GameData.writeItemData(itemList); 080 fmlData.setTag("ModItemData", itemList); 081 return fmlData; 082 } 083 084 @Override 085 public void readData(SaveHandler handler, WorldInfo info, Map<String, NBTBase> propertyMap, NBTTagCompound tag) 086 { 087 if (tag.hasKey("ModList")) 088 { 089 NBTTagList modList = tag.getTagList("ModList"); 090 for (int i = 0; i < modList.tagCount(); i++) 091 { 092 NBTTagCompound mod = (NBTTagCompound) modList.tagAt(i); 093 String modId = mod.getString("ModId"); 094 String modVersion = mod.getString("ModVersion"); 095 ModContainer container = Loader.instance().getIndexedModList().get(modId); 096 if (container == null) 097 { 098 FMLLog.log("fml.ModTracker", Level.SEVERE, "This world was saved with mod %s which appears to be missing, things may not work well", modId); 099 continue; 100 } 101 if (!modVersion.equals(container.getVersion())) 102 { 103 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()); 104 } 105 } 106 } 107 if (tag.hasKey("ModItemData")) 108 { 109 NBTTagList modList = tag.getTagList("ModItemData"); 110 Set<ItemData> worldSaveItems = GameData.buildWorldItemData(modList); 111 GameData.validateWorldSave(worldSaveItems); 112 } 113 else 114 { 115 GameData.validateWorldSave(null); 116 } 117 } 118 119 120 @Override 121 public Certificate getSigningCertificate() 122 { 123 Certificate[] certificates = getClass().getProtectionDomain().getCodeSource().getCertificates(); 124 return certificates != null ? certificates[0] : null; 125 } 126}