    001package net.minecraftforge.common;
    002
    003import java.io.File;
    004import java.util.Arrays;
    005import java.util.Map;
    006
    007import net.minecraft.nbt.NBTBase;
    008import net.minecraft.nbt.NBTTagCompound;
    009import net.minecraft.server.management.PlayerInstance;
    010import net.minecraft.world.storage.SaveHandler;
    011import net.minecraft.world.storage.WorldInfo;
    012
    013import com.google.common.eventbus.EventBus;
    014import com.google.common.eventbus.Subscribe;
    015
    016import cpw.mods.fml.common.DummyModContainer;
    017import cpw.mods.fml.common.FMLLog;
    018import cpw.mods.fml.common.LoadController;
    019import cpw.mods.fml.common.Loader;
    020import cpw.mods.fml.common.ModMetadata;
    021import cpw.mods.fml.common.WorldAccessContainer;
    022import cpw.mods.fml.common.event.FMLPostInitializationEvent;
    023import cpw.mods.fml.common.event.FMLPreInitializationEvent;
    024
    025import static net.minecraftforge.common.ForgeVersion.*;
    026
    027public class ForgeDummyContainer extends DummyModContainer implements WorldAccessContainer
    028{
    029    public static int clumpingThreshold = 64;
    030    public static boolean legacyFurnaceSides = false;
    031    public static boolean removeErroringEntities = false;
    032    public static boolean removeErroringTileEntities = false;
    033    public static boolean disableStitchedFileSaving = false;
    034
    035    public ForgeDummyContainer()
    036    {
    037        super(new ModMetadata());
    038        ModMetadata meta = getMetadata();
    039        meta.modId       = "Forge";
    040        meta.name        = "Minecraft Forge";
    041        meta.version     = String.format("%d.%d.%d.%d", majorVersion, minorVersion, revisionVersion, buildVersion);
    042        meta.credits     = "Made possible with help from many people";
    043        meta.authorList  = Arrays.asList("LexManos", "Eloraam", "Spacetoad");
    044        meta.description = "Minecraft Forge is a common open source API allowing a broad range of mods " +
    045                           "to work cooperatively together. It allows many mods to be created without " +
    046                           "them editing the main Minecraft code.";
    047        meta.url         = "http://MinecraftForge.net";
    048        meta.updateUrl   = "http://MinecraftForge.net/forum/index.php/topic,5.0.html";
    049        meta.screenshots = new String[0];
    050        meta.logoFile    = "/forge_logo.png";
    051
    052        Configuration config = null;
    053        File cfgFile = new File(Loader.instance().getConfigDir(), "forge.cfg");
    054        try
    055        {
    056            config = new Configuration(cfgFile);
    057        }
    058        catch (Exception e)
    059        {
    060            System.out.println("Error loading forge.cfg, deleting file and resetting: ");
    061            e.printStackTrace();
    062
    063            if (cfgFile.exists())
    064                cfgFile.delete();
    065
    066            config = new Configuration(cfgFile);
    067        }
    068        if (!config.isChild)
    069        {
    070            config.load();
    071            Property enableGlobalCfg = config.get(Configuration.CATEGORY_GENERAL, "enableGlobalConfig", false);
    072            if (enableGlobalCfg.getBoolean(false))
    073            {
    074                Configuration.enableGlobalConfig();
    075            }
    076        }
    077        Property prop;
    078        prop = config.get(Configuration.CATEGORY_GENERAL, "clumpingThreshold", 64);
    079        prop.comment = "Controls the number threshold at which Packet51 is preferred over Packet52, default and minimum 64, maximum 1024";
    080        clumpingThreshold = prop.getInt(64);
    081        if (clumpingThreshold > 1024 || clumpingThreshold < 64)
    082        {
    083            clumpingThreshold = 64;
    084            prop.set(64);
    085        }
    086
    087        prop = config.get(Configuration.CATEGORY_GENERAL, "legacyFurnaceOutput", false);
    088        prop.comment = "Controls the sides of vanilla furnaces for Forge's ISidedInventroy, Vanilla defines the output as the bottom, but mods/Forge define it as the sides. Settings this to true will restore the old side relations.";
    089        legacyFurnaceSides = prop.getBoolean(false);
    090
    091        prop = config.get(Configuration.CATEGORY_GENERAL, "removeErroringEntities", false);
    092        prop.comment = "Set this to just remove any TileEntity that throws a error in there update method instead of closing the server and reporting a crash log. BE WARNED THIS COULD SCREW UP EVERYTHING USE SPARINGLY WE ARE NOT RESPONSIBLE FOR DAMAGES.";
    093        removeErroringEntities = prop.getBoolean(false);
    094
    095        if (removeErroringEntities)
    096        {
    097            FMLLog.warning("Enableing removal of erroring Entities USE AT YOUR OWN RISK");
    098        }
    099
    100        prop = config.get(Configuration.CATEGORY_GENERAL, "removeErroringTileEntities", false);
    101        prop.comment = "Set this to just remove any TileEntity that throws a error in there update method instead of closing the server and reporting a crash log. BE WARNED THIS COULD SCREW UP EVERYTHING USE SPARINGLY WE ARE NOT RESPONSIBLE FOR DAMAGES.";
    102        removeErroringTileEntities = prop.getBoolean(false);
    103
    104        if (removeErroringTileEntities)
    105        {
    106            FMLLog.warning("Enableing removal of erroring Tile Entities USE AT YOUR OWN RISK");
    107        }
    108
    109        prop = config.get(Configuration.CATEGORY_GENERAL, "disableStitchedFileSaving", true);
    110        prop.comment = "Set this to just disable the texture stitcher from writing the 'debug.stitched_{name}.png file to disc. Just a small performance tweak. Default: true";
    111        disableStitchedFileSaving = prop.getBoolean(true);
    112
    113        if (config.hasChanged())
    114        {
    115            config.save();
    116        }
    117    }
    118
    119    @Override
    120    public boolean registerBus(EventBus bus, LoadController controller)
    121    {
    122        bus.register(this);
    123        return true;
    124    }
    125
    126    @Subscribe
    127    public void preInit(FMLPreInitializationEvent evt)
    128    {
    129        ForgeChunkManager.captureConfig(evt.getModConfigurationDirectory());
    130    }
    131
    132    @Subscribe
    133    public void postInit(FMLPostInitializationEvent evt)
    134    {
    135        ForgeChunkManager.loadConfiguration();
    136    }
    137
    138    @Override
    139    public NBTTagCompound getDataForWriting(SaveHandler handler, WorldInfo info)
    140    {
    141        NBTTagCompound forgeData = new NBTTagCompound();
    142        NBTTagCompound dimData = DimensionManager.saveDimensionDataMap();
    143        forgeData.setCompoundTag("DimensionData", dimData);
    144        return forgeData;
    145    }
    146
    147    @Override
    148    public void readData(SaveHandler handler, WorldInfo info, Map<String, NBTBase> propertyMap, NBTTagCompound tag)
    149    {
    150        if (tag.hasKey("DimensionData"))
    151        {
    152            DimensionManager.loadDimensionDataMap(tag.hasKey("DimensionData") ? tag.getCompoundTag("DimensionData") : null);
    153        }
    154    }
    155}