    001    /*
    002     * The FML Forge Mod Loader suite. Copyright (C) 2012 cpw
    003     *
    004     * 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
    005     * Software Foundation; either version 2.1 of the License, or any later version.
    006     *
    007     * 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
    008     * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
    009     *
    010     * 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
    011     * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
    012     */
    013    package net.minecraft.src;
    014
    015    import static cpw.mods.fml.relauncher.Side.CLIENT;
    016
    017    import java.awt.image.BufferedImage;
    018    import java.util.Collections;
    019    import java.util.List;
    020    import java.util.Map;
    021    import java.util.logging.Logger;
    022
    023    import net.minecraft.block.Block;
    024    import net.minecraft.block.BlockDispenser;
    025    import net.minecraft.client.*;
    026    import net.minecraft.client.gui.GuiScreen;
    027    import net.minecraft.client.multiplayer.NetClientHandler;
    028    import net.minecraft.client.renderer.RenderBlocks;
    029    import net.minecraft.client.renderer.RenderEngine;
    030    import net.minecraft.client.renderer.entity.Render;
    031    import net.minecraft.client.renderer.texturefx.TextureFX;
    032    import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
    033    import net.minecraft.client.settings.KeyBinding;
    034    import net.minecraft.command.ICommand;
    035    import net.minecraft.dispenser.IBehaviorDispenseItem;
    036    import net.minecraft.entity.Entity;
    037    import net.minecraft.entity.EntityLiving;
    038    import net.minecraft.entity.EnumCreatureType;
    039    import net.minecraft.entity.player.EntityPlayer;
    040    import net.minecraft.entity.player.EntityPlayerMP;
    041    import net.minecraft.inventory.Container;
    042    import net.minecraft.inventory.IInventory;
    043    import net.minecraft.item.Item;
    044    import net.minecraft.item.ItemBlock;
    045    import net.minecraft.item.ItemStack;
    046    import net.minecraft.network.NetServerHandler;
    047    import net.minecraft.network.packet.Packet;
    048    import net.minecraft.network.packet.Packet1Login;
    049    import net.minecraft.network.packet.Packet250CustomPayload;
    050    import net.minecraft.server.*;
    051    import net.minecraft.stats.Achievement;
    052    import net.minecraft.tileentity.TileEntity;
    053    import net.minecraft.world.IBlockAccess;
    054    import net.minecraft.world.World;
    055    import net.minecraft.world.WorldType;
    056    import net.minecraft.world.biome.BiomeGenBase;
    057    import net.minecraft.world.chunk.IChunkProvider;
    058    import cpw.mods.fml.client.FMLClientHandler;
    059    import cpw.mods.fml.client.SpriteHelper;
    060    import cpw.mods.fml.client.TextureFXManager;
    061    import cpw.mods.fml.client.modloader.ModLoaderClientHelper;
    062    import cpw.mods.fml.client.modloader.ModLoaderKeyBindingHandler;
    063    import cpw.mods.fml.client.registry.ClientRegistry;
    064    import cpw.mods.fml.client.registry.KeyBindingRegistry;
    065    import cpw.mods.fml.client.registry.RenderingRegistry;
    066    import cpw.mods.fml.common.FMLCommonHandler;
    067    import cpw.mods.fml.common.FMLLog;
    068    import cpw.mods.fml.common.Loader;
    069    import cpw.mods.fml.common.ObfuscationReflectionHelper;
    070    import cpw.mods.fml.common.modloader.ModLoaderHelper;
    071    import cpw.mods.fml.common.modloader.ModLoaderModContainer;
    072    import cpw.mods.fml.common.network.NetworkRegistry;
    073    import cpw.mods.fml.common.network.PacketDispatcher;
    074    import cpw.mods.fml.common.network.Player;
    075    import cpw.mods.fml.common.registry.EntityRegistry;
    076    import cpw.mods.fml.common.registry.GameRegistry;
    077    import cpw.mods.fml.common.registry.LanguageRegistry;
    078    import cpw.mods.fml.relauncher.SideOnly;
    079    import cpw.mods.fml.server.FMLServerHandler;
    080
    081    public class ModLoader
    082    {
    083        public static final String fmlMarker = "This is an FML marker";
    084        // TODO dirty workaround for millinaire
    085        @Deprecated
    086        public static final Map<String,Map<String,String>> localizedStrings=Collections.emptyMap();
    087
    088        /**
    089         * Adds localization info for an achievement, Not used on the server.
    090         *
    091         * @param achievement The achievement to name
    092         * @param name The name
    093         * @param description The description
    094         */
    095        public static void addAchievementDesc(Achievement achievement, String name, String description)
    096        {
    097            String achName=achievement.getName();
    098            addLocalization(achName, name);
    099            addLocalization(achName+".desc", description);
    100        }
    101
    102        /**
    103         * This method is a call in hook from modified external code. Implemented elsewhere.
    104         *
    105         * {@link GameRegistry#getFuelValue(ItemStack)}
    106         *
    107         * @param id The Item ID
    108         * @param metadata The Item Metadata
    109         * @return The fuel strength, in ticks, 0 if unhandled
    110         */
    111        @Deprecated
    112        public static int addAllFuel(int id, int metadata)
    113        {
    114            return 0;
    115        }
    116
    117        @Deprecated
    118        @SideOnly(CLIENT)
    119        public static void addAllRenderers(Map<Class<? extends Entity>, Render> renderers)
    120        {
    121        }
    122
    123        @SideOnly(CLIENT)
    124        public static void addAnimation(TextureFX anim)
    125        {
    126            TextureFXManager.instance().addAnimation(anim);
    127        }
    128
    129        /**
    130         * Adds a new prefix to the armor texture list
    131         *
    132         * {@link RenderingRegistry#addNewArmourRendererPrefix(String)}
    133         *
    134         * @param armor The new armor prefix
    135         * @return The new armor index
    136         */
    137        @SideOnly(CLIENT)
    138        public static int addArmor(String armor)
    139        {
    140            return RenderingRegistry.addNewArmourRendererPrefix(armor);
    141        }
    142
    143        /**
    144         * This method adds the supplied biome to the set of candidate biomes for the default world generator type.
    145         *
    146         * @param biome The biome to add
    147         */
    148        public static void addBiome(BiomeGenBase biome)
    149        {
    150            GameRegistry.addBiome(biome);
    151        }
    152
    153        public static void addEntityTracker(BaseMod mod, Class<? extends Entity> entityClass, int entityTypeId, int updateRange, int updateInterval, boolean sendVelocityInfo)
    154        {
    155            ModLoaderHelper.buildEntityTracker(mod, entityClass, entityTypeId, updateRange, updateInterval, sendVelocityInfo);
    156        }
    157
    158        public static void addCommand(ICommand command)
    159        {
    160            ModLoaderHelper.addCommand(command);
    161        }
    162
    163        /**
    164         * Add a behaviour to the dispenser
    165         *
    166         * @param item
    167         * @param behavior
    168         */
    169        public static void addDispenserBehavior(Item item, IBehaviorDispenseItem behavior)
    170        {
    171            BlockDispenser.dispenseBehaviorRegistry.putObject(item, behavior);
    172        }
    173        /**
    174         * Add localization for the specified string
    175         *
    176         * @param key Key
    177         * @param value Value
    178         */
    179        public static void addLocalization(String key, String value)
    180        {
    181            addLocalization(key, "en_US", value);
    182        }
    183
    184        /**
    185         * Add localization for the specified string
    186         *
    187         * @param key Key
    188         * @param lang Language identifier
    189         * @param value Value
    190         */
    191        public static void addLocalization(String key, String lang, String value)
    192        {
    193            LanguageRegistry.instance().addStringLocalization(key, lang, value);
    194        }
    195
    196        /**
    197         * Name the specified minecraft object with the supplied name
    198         *
    199         * @param instance Item to name
    200         * @param name The name to give it
    201         */
    202        public static void addName(Object instance, String name)
    203        {
    204            addName(instance,"en_US",name);
    205        }
    206
    207        /**
    208         * Unimplemented on the server as it does not generate names
    209         *
    210         * @param instance Item to name
    211         * @param lang Languge identifier
    212         * @param name Name to give it
    213         */
    214        public static void addName(Object instance, String lang, String name)
    215        {
    216            LanguageRegistry.instance().addNameForObject(instance, lang, name);
    217        }
    218
    219        /**
    220         * Attempts to register a small image to be applied to a larger texture image,
    221         * typically how old ModLoader mods add custom Item/Block textures.
    222         *
    223         * Forge mods should use setTextureFile in Item/Block
    224         *
    225         * Will return the icon index it was applied to.
    226         *
    227         * Unimplemented on the server as it does not render textures
    228         *
    229         * @param fileToOverride The texture to apply the new image to
    230         * @param fileToAdd The new image
    231         * @return The 'icon index' in the main image that the new image will be applied to
    232         */
    233        @SideOnly(CLIENT)
    234        public static int addOverride(String fileToOverride, String fileToAdd)
    235        {
    236            return RenderingRegistry.addTextureOverride(fileToOverride, fileToAdd);
    237        }
    238
    239        /**
    240         * Attempts to register a small image to be applied to a larger texture image,
    241         * typically how old ModLoader mods add custom Item/Block textures.
    242         *
    243         * Forge mods should use setTextureFile in Item/Block
    244         *
    245         * Unimplemented on the server as it does not render textures
    246         *
    247         * @param path The texture to apply the new image to
    248         * @param overlayPath The new image
    249         * @param index Where on the texture to apply it
    250         */
    251        @SideOnly(CLIENT)
    252        public static void addOverride(String path, String overlayPath, int index)
    253        {
    254            RenderingRegistry.addTextureOverride(path, overlayPath, index);
    255        }
    256
    257        /**
    258         * Add a Shaped Recipe
    259         *
    260         * @param output The result
    261         * @param params The input
    262         */
    263        public static void addRecipe(ItemStack output, Object... params)
    264        {
    265            GameRegistry.addRecipe(output, params);
    266        }
    267
    268        /**
    269         * Add a shapeless recipe
    270         *
    271         * @param output The result
    272         * @param params The input
    273         */
    274        public static void addShapelessRecipe(ItemStack output, Object... params)
    275        {
    276            GameRegistry.addShapelessRecipe(output, params);
    277        }
    278
    279        /**
    280         * Add a new product to be smelted
    281         *
    282         * @param input
    283         * @param output
    284         */
    285        public static void addSmelting(int input, ItemStack output)
    286        {
    287            GameRegistry.addSmelting(input, output, 1.0f);
    288        }
    289
    290        /**
    291         * Add a new product to be smelted
    292         *
    293         * @param input
    294         * @param output
    295         */
    296        public static void addSmelting(int input, ItemStack output, float experience)
    297        {
    298            GameRegistry.addSmelting(input, output, experience);
    299        }
    300        /**
    301         * Add a mob to the spawn list
    302         *
    303         * @param entityClass
    304         * @param weightedProb
    305         * @param min
    306         * @param max
    307         * @param spawnList
    308         */
    309        public static void addSpawn(Class<? extends EntityLiving> entityClass, int weightedProb, int min, int max, EnumCreatureType spawnList)
    310        {
    311            EntityRegistry.addSpawn(entityClass, weightedProb, min, max, spawnList, WorldType.base12Biomes);
    312        }
    313
    314        /**
    315         * Add a mob to the spawn list
    316         *
    317         * @param entityClass
    318         * @param weightedProb
    319         * @param min
    320         * @param max
    321         * @param spawnList
    322         * @param biomes
    323         */
    324        public static void addSpawn(Class<? extends EntityLiving> entityClass, int weightedProb, int min, int max, EnumCreatureType spawnList, BiomeGenBase... biomes)
    325        {
    326            EntityRegistry.addSpawn(entityClass, weightedProb, min, max, spawnList, biomes);
    327        }
    328
    329        /**
    330         * Add a mob to the spawn list
    331         *
    332         * @param entityName
    333         * @param weightedProb
    334         * @param min
    335         * @param max
    336         * @param spawnList
    337         */
    338        public static void addSpawn(String entityName, int weightedProb, int min, int max, EnumCreatureType spawnList)
    339        {
    340            EntityRegistry.addSpawn(entityName, weightedProb, min, max, spawnList, WorldType.base12Biomes);
    341        }
    342
    343        /**
    344         * Add a mob to the spawn list
    345         *
    346         * @param entityName
    347         * @param weightedProb
    348         * @param min
    349         * @param max
    350         * @param spawnList
    351         * @param biomes
    352         */
    353        public static void addSpawn(String entityName, int weightedProb, int min, int max, EnumCreatureType spawnList, BiomeGenBase... biomes)
    354        {
    355            EntityRegistry.addSpawn(entityName, weightedProb, min, max, spawnList, biomes);
    356        }
    357
    358        public static void addTrade(int profession, TradeEntry entry)
    359        {
    360            ModLoaderHelper.registerTrade(profession, entry);
    361        }
    362        /**
    363         * Send a packet from the client
    364         * @param packet
    365         */
    366        public static void clientSendPacket(Packet packet)
    367        {
    368            PacketDispatcher.sendPacketToServer(packet);
    369        }
    370
    371        /**
    372         * This method is a call in hook from modified external code. Implemented elsewhere.
    373         *
    374         * @param world
    375         * @param x
    376         * @param y
    377         * @param z
    378         * @param xVel
    379         * @param zVel
    380         * @param item
    381         * @return Always false, not implemented here
    382         */
    383        @Deprecated
    384        public static boolean dispenseEntity(World world, double x, double y, double z, int xVel, int zVel, ItemStack item)
    385        {
    386            return false;
    387        }
    388
    389        /**
    390         * Remove a container and drop all the items in it on the ground around
    391         *
    392         * @param world
    393         * @param x
    394         * @param y
    395         * @param z
    396         */
    397        public static void genericContainerRemoval(World world, int x, int y, int z)
    398        {
    399    /*        TileEntity te = world.func_603_b(x, y, z);
    400
    401            if (!(te instanceof IInventory))
    402            {
    403                return;
    404            }
    405
    406            IInventory inv = (IInventory)te;
    407
    408            for (int l = 0; l < inv.func_469_c(); l++)
    409            {
    410                ItemStack itemstack = inv.func_468_c(l);
    411
    412                if (itemstack == null)
    413                {
    414                    continue;
    415                }
    416
    417                float f = world.field_1037_n.nextFloat() * 0.8F + 0.1F;
    418                float f1 = world.field_1037_n.nextFloat() * 0.8F + 0.1F;
    419                float f2 = world.field_1037_n.nextFloat() * 0.8F + 0.1F;
    420
    421                while (itemstack.field_1615_a > 0)
    422                {
    423                    int i1 = world.field_1037_n.nextInt(21) + 10;
    424
    425                    if (i1 > itemstack.field_1615_a)
    426                    {
    427                        i1 = itemstack.field_1615_a;
    428                    }
    429
    430                    itemstack.field_1615_a -= i1;
    431                    EntityItem entityitem = new EntityItem(world, (float)te.field_823_f + f, (float)te.field_822_g + f1, (float)te.field_821_h + f2, new ItemStack(itemstack.field_1617_c, i1, itemstack.func_21181_i()));
    432                    float f3 = 0.05F;
    433                    entityitem.field_608_an = (float) world.field_1037_n.nextGaussian() * f3;
    434                    entityitem.field_607_ao = (float) world.field_1037_n.nextGaussian() * f3 + 0.2F;
    435                    entityitem.field_606_ap = (float) world.field_1037_n.nextGaussian() * f3;
    436
    437                    if (itemstack.func_40710_n())
    438                    {
    439                        entityitem.field_801_a.func_40706_d((NBTTagCompound) itemstack.func_40709_o().func_40195_b());
    440                    }
    441
    442                    world.func_674_a(entityitem);
    443                }
    444            }
    445    */    }
    446
    447        /**
    448         * Get a list of all BaseMod loaded into the system
    449         * {@link ModLoaderModContainer#findAll}
    450         *
    451         * @return A list containing all loaded ModLoader mods
    452         */
    453        public static List<BaseMod> getLoadedMods()
    454        {
    455            return ModLoaderModContainer.findAll(BaseMod.class);
    456        }
    457
    458        /**
    459         * Get a logger instance {@link FMLCommonHandler#getFMLLogger()}
    460         *
    461         * @return The current logger
    462         */
    463        public static Logger getLogger()
    464        {
    465            return FMLLog.getLogger();
    466        }
    467
    468        @SideOnly(CLIENT)
    469        public static Minecraft getMinecraftInstance()
    470        {
    471            return FMLClientHandler.instance().getClient();
    472        }
    473
    474        public static MinecraftServer getMinecraftServerInstance()
    475        {
    476            return FMLCommonHandler.instance().getMinecraftServerInstance();
    477        }
    478
    479        /**
    480         * Get a value from a field using reflection
    481         * {@link ObfuscationReflectionHelper#getPrivateValue(Class, Object, int)}
    482         *
    483         * @param instanceclass
    484         * @param instance
    485         * @param fieldindex
    486         * @return The value in the specified field.
    487         */
    488        public static <T, E> T getPrivateValue(Class<? super E> instanceclass, E instance, int fieldindex)
    489        {
    490            return ObfuscationReflectionHelper.getPrivateValue(instanceclass, instance, fieldindex);
    491        }
    492
    493        /**
    494         * Get a value from a field using reflection
    495         * {@link ObfuscationReflectionHelper#getPrivateValue(Class, Object, String[])}
    496         *
    497         * @param instanceclass
    498         * @param instance
    499         * @param field
    500         * @return The value in the specified field.
    501         */
    502        public static <T, E> T getPrivateValue(Class<? super E> instanceclass, E instance, String field)
    503        {
    504            return ObfuscationReflectionHelper.getPrivateValue(instanceclass, instance, field);
    505        }
    506
    507        /**
    508         * Stubbed method on the server to return a unique model id
    509         *
    510         */
    511        @SideOnly(CLIENT)
    512        public static int getUniqueBlockModelID(BaseMod mod, boolean inventoryRenderer)
    513        {
    514            return ModLoaderClientHelper.obtainBlockModelIdFor(mod, inventoryRenderer);
    515        }
    516
    517        /**
    518         * Get a new unique entity id
    519         * {@link EntityRegistry#findGlobalUniqueEntityId()}
    520         *
    521         * @return A unique entity ID
    522         */
    523        public static int getUniqueEntityId()
    524        {
    525            return EntityRegistry.findGlobalUniqueEntityId();
    526        }
    527
    528        @SideOnly(CLIENT)
    529        public static int getUniqueSpriteIndex(String path)
    530        {
    531            return SpriteHelper.getUniqueSpriteIndex(path);
    532        }
    533
    534        /**
    535         * To properly implement packet 250 protocol you should always check your
    536         * channel is active prior to sending the packet
    537         *
    538         * @param player
    539         * @param channel
    540         * @return If the channel is registered to the current connection.
    541         */
    542        public static boolean isChannelActive(EntityPlayer player, String channel)
    543        {
    544            return NetworkRegistry.instance().isChannelActive(channel, (Player)player);
    545        }
    546
    547        @SideOnly(CLIENT)
    548        public static boolean isGUIOpen(Class<? extends GuiScreen> gui)
    549        {
    550            return FMLClientHandler.instance().getClient().currentScreen != null && FMLClientHandler.instance().getClient().currentScreen.equals(gui);
    551        }
    552
    553        /**
    554         * Is the named mod loaded?
    555         * {@link Loader#isModLoaded(String)}
    556         *
    557         * @param modname
    558         * @return If the specified mod is loaded
    559         */
    560        public static boolean isModLoaded(String modname)
    561        {
    562            return Loader.isModLoaded(modname);
    563        }
    564
    565        /**
    566         * Implemented elsewhere
    567         */
    568        @Deprecated
    569        public static void loadConfig()
    570        {
    571        }
    572
    573        @SideOnly(CLIENT)
    574        public static BufferedImage loadImage(RenderEngine renderEngine, String path) throws Exception
    575        {
    576            return TextureFXManager.instance().loadImageFromTexturePack(renderEngine, path);
    577        }
    578
    579        /**
    580         * Call in from elsewhere. Unimplemented here.
    581         * @param player
    582         * @param item
    583         */
    584        @Deprecated
    585        public static void onItemPickup(EntityPlayer player, ItemStack item)
    586        {
    587        }
    588        /**
    589         * Call in from elsewhere. Unimplemented here.
    590         */
    591        @Deprecated
    592        @SideOnly(CLIENT)
    593        public static void onTick(float tick, Minecraft game)
    594        {
    595        }
    596
    597        @SideOnly(CLIENT)
    598        public static void openGUI(EntityPlayer player, GuiScreen gui)
    599        {
    600            FMLClientHandler.instance().displayGuiScreen(player, gui);
    601        }
    602
    603        @Deprecated
    604        public static void populateChunk(IChunkProvider generator, int chunkX, int chunkZ, World world)
    605        {
    606        }
    607
    608        /**
    609         * This method is a call in hook from modified external code. Implemented elsewhere.
    610         *
    611         * @param packet
    612         */
    613        @Deprecated
    614        public static void receivePacket(Packet250CustomPayload packet)
    615        {
    616        }
    617
    618        @Deprecated
    619        @SideOnly(CLIENT)
    620        public static KeyBinding[] registerAllKeys(KeyBinding[] keys)
    621        {
    622            return keys;
    623        }
    624
    625        @Deprecated
    626        @SideOnly(CLIENT)
    627        public static void registerAllTextureOverrides(RenderEngine cache)
    628        {
    629        }
    630
    631        /**
    632         * Register a new block
    633         *
    634         * @param block
    635         */
    636        public static void registerBlock(Block block)
    637        {
    638            GameRegistry.registerBlock(block);
    639        }
    640
    641        /**
    642         * Register a new block
    643         *
    644         * @param block
    645         * @param itemclass
    646         */
    647        public static void registerBlock(Block block, Class<? extends ItemBlock> itemclass)
    648        {
    649            GameRegistry.registerBlock(block, itemclass);
    650        }
    651
    652        public static void registerContainerID(BaseMod mod, int id)
    653        {
    654            ModLoaderHelper.buildGuiHelper(mod, id);
    655        }
    656        /**
    657         * Register a new entity ID
    658         *
    659         * @param entityClass
    660         * @param entityName
    661         * @param id
    662         */
    663        public static void registerEntityID(Class<? extends Entity> entityClass, String entityName, int id)
    664        {
    665            EntityRegistry.registerGlobalEntityID(entityClass, entityName, id);
    666        }
    667
    668        /**
    669         * Register a new entity ID
    670         *
    671         * @param entityClass
    672         * @param entityName
    673         * @param id
    674         * @param background
    675         * @param foreground
    676         */
    677        public static void registerEntityID(Class<? extends Entity> entityClass, String entityName, int id, int background, int foreground)
    678        {
    679            EntityRegistry.registerGlobalEntityID(entityClass, entityName, id, background, foreground);
    680        }
    681
    682        @SideOnly(CLIENT)
    683        public static void registerKey(BaseMod mod, KeyBinding keyHandler, boolean allowRepeat)
    684        {
    685            ModLoaderClientHelper.registerKeyBinding(mod, keyHandler, allowRepeat);
    686        }
    687
    688        /**
    689         * Register the mod for packets on this channel.
    690         * {@link NetworkRegistry#registerChannel(IPacketHandler, String)}
    691         *
    692         * @param mod
    693         * @param channel
    694         */
    695        public static void registerPacketChannel(BaseMod mod, String channel)
    696        {
    697            NetworkRegistry.instance().registerChannel(ModLoaderHelper.buildPacketHandlerFor(mod), channel);
    698        }
    699
    700        /**
    701         * Register a new tile entity class
    702         *
    703         * @param tileEntityClass
    704         * @param id
    705         */
    706        public static void registerTileEntity(Class<? extends TileEntity> tileEntityClass, String id)
    707        {
    708            GameRegistry.registerTileEntity(tileEntityClass, id);
    709        }
    710
    711        @SideOnly(CLIENT)
    712        public static void registerTileEntity(Class<? extends TileEntity> tileEntityClass, String id, TileEntitySpecialRenderer renderer)
    713        {
    714            ClientRegistry.registerTileEntity(tileEntityClass, id, renderer);
    715        }
    716
    717        /**
    718         * Remove a biome from the list of generated biomes
    719         *
    720         * @param biome
    721         */
    722        public static void removeBiome(BiomeGenBase biome)
    723        {
    724            GameRegistry.removeBiome(biome);
    725        }
    726
    727        /**
    728         * Remove a spawn
    729         *
    730         * @param entityClass
    731         * @param spawnList
    732         */
    733        public static void removeSpawn(Class<? extends EntityLiving> entityClass, EnumCreatureType spawnList)
    734        {
    735            EntityRegistry.removeSpawn(entityClass, spawnList, WorldType.base12Biomes);
    736        }
    737
    738        /**
    739         * Remove a spawn
    740         *
    741         * @param entityClass
    742         * @param spawnList
    743         * @param biomes
    744         */
    745        public static void removeSpawn(Class<? extends EntityLiving> entityClass, EnumCreatureType spawnList, BiomeGenBase... biomes)
    746        {
    747            EntityRegistry.removeSpawn(entityClass, spawnList, biomes);
    748        }
    749
    750        /**
    751         * Remove a spawn
    752         *
    753         * @param entityName
    754         * @param spawnList
    755         */
    756        public static void removeSpawn(String entityName, EnumCreatureType spawnList)
    757        {
    758            EntityRegistry.removeSpawn(entityName, spawnList, WorldType.base12Biomes);
    759        }
    760
    761        /**
    762         * Remove a spawn
    763         *
    764         * @param entityName
    765         * @param spawnList
    766         * @param biomes
    767         */
    768        public static void removeSpawn(String entityName, EnumCreatureType spawnList, BiomeGenBase... biomes)
    769        {
    770            EntityRegistry.removeSpawn(entityName, spawnList, biomes);
    771        }
    772
    773        @Deprecated
    774        @SideOnly(CLIENT)
    775        public static boolean renderBlockIsItemFull3D(int modelID)
    776        {
    777            return RenderingRegistry.instance().renderItemAsFull3DBlock(modelID);
    778        }
    779
    780        @Deprecated
    781        @SideOnly(CLIENT)
    782        public static void renderInvBlock(RenderBlocks renderer, Block block, int metadata, int modelID)
    783        {
    784            RenderingRegistry.instance().renderInventoryBlock(renderer, block, metadata, modelID);
    785        }
    786
    787        @Deprecated
    788        @SideOnly(CLIENT)
    789        public static boolean renderWorldBlock(RenderBlocks renderer, IBlockAccess world, int x, int y, int z, Block block, int modelID)
    790        {
    791            return RenderingRegistry.instance().renderWorldBlock(renderer, world, x, y, z, block, modelID);
    792        }
    793
    794        /**
    795         * Configuration is handled elsewhere
    796         * {@link ModLoaderModContainer}
    797         */
    798        @Deprecated
    799        public static void saveConfig()
    800        {
    801        }
    802
    803        /**
    804         * Send a packet from client to server
    805         *
    806         * @param packet
    807         */
    808        public static void sendPacket(Packet packet) {
    809            PacketDispatcher.sendPacketToServer(packet);
    810        }
    811        /**
    812         * Send a chat message to the server
    813         *
    814         * @param text
    815         */
    816        @Deprecated
    817        public static void serverChat(String text)
    818        {
    819            //TODO
    820        }
    821
    822        @Deprecated
    823        @SideOnly(CLIENT)
    824        public static void serverLogin(NetClientHandler handler, Packet1Login loginPacket)
    825        {
    826            //TODO
    827        }
    828
    829        public static void serverSendPacket(NetServerHandler handler, Packet packet)
    830        {
    831            if (handler != null)
    832            {
    833                PacketDispatcher.sendPacketToPlayer(packet, (Player)handler.getPlayer());
    834            }
    835        }
    836        public static void serverOpenWindow(EntityPlayerMP player, Container container, int ID, int x, int y, int z)
    837        {
    838            ModLoaderHelper.openGui(ID, player, container, x, y, z);
    839        }
    840
    841        /**
    842         * Indicate that you want to receive ticks
    843         *
    844         * @param mod receiving the events
    845         * @param enable indicates whether you want to recieve them or not
    846         * @param useClock don't receive render subticks, just world ticks
    847         */
    848        public static void setInGameHook(BaseMod mod, boolean enable, boolean useClock)
    849        {
    850            ModLoaderHelper.updateStandardTicks(mod, enable, useClock);
    851        }
    852
    853
    854        public static void setInGUIHook(BaseMod mod, boolean enable, boolean useClock)
    855        {
    856            ModLoaderHelper.updateGUITicks(mod, enable, useClock);
    857        }
    858
    859        /**
    860         * Set a private field to a value using reflection
    861         * {@link ObfuscationReflectionHelper#setPrivateValue(Class, Object, int, Object)}
    862         *
    863         * @param instanceclass
    864         * @param instance
    865         * @param fieldindex
    866         * @param value
    867         */
    868        public static <T, E> void setPrivateValue(Class<? super T> instanceclass, T instance, int fieldindex, E value)
    869        {
    870            ObfuscationReflectionHelper.setPrivateValue(instanceclass, instance, value, fieldindex);
    871        }
    872
    873        /**
    874         * Set a private field to a value using reflection
    875         * {@link ObfuscationReflectionHelper#setPrivateValue(Class, Object, String, Object)}
    876         *
    877         * @param instanceclass
    878         * @param instance
    879         * @param field
    880         * @param value
    881         */
    882        public static <T, E> void setPrivateValue(Class<? super T> instanceclass, T instance, String field, E value)
    883        {
    884            ObfuscationReflectionHelper.setPrivateValue(instanceclass, instance, value, field);
    885        }
    886
    887        /**
    888         * This method is a call in hook from modified external code. Implemented elsewhere.
    889         *
    890         * @param player
    891         * @param item
    892         * @param matrix
    893         */
    894        @Deprecated
    895        public static void takenFromCrafting(EntityPlayer player, ItemStack item, IInventory matrix)
    896        {
    897        }
    898
    899        /**
    900         * This method is a call in hook from modified external code. Implemented elsewhere.
    901         *
    902         * @param player
    903         * @param item
    904         */
    905        @Deprecated
    906        public static void takenFromFurnace(EntityPlayer player, ItemStack item)
    907        {
    908        }
    909
    910        /**
    911         * Throw the offered exception. Likely will stop the game.
    912         *
    913         * @param message
    914         * @param e
    915         */
    916        public static void throwException(String message, Throwable e)
    917        {
    918            FMLCommonHandler.instance().raiseException(e, message, true);
    919        }
    920
    921        public static void throwException(Throwable e)
    922        {
    923            throwException("Exception in ModLoader", e);
    924        }
    925    }