    001    package net.minecraftforge.common;
    002
    003    import java.lang.reflect.Constructor;
    004    import java.util.*;
    005
    006    import cpw.mods.fml.common.FMLCommonHandler;
    007    import cpw.mods.fml.common.FMLLog;
    008    import cpw.mods.fml.common.Mod;
    009    import cpw.mods.fml.common.ModContainer;
    010
    011    import net.minecraft.src.*;
    012    import net.minecraftforge.common.ForgeHooks.GrassEntry;
    013    import net.minecraftforge.common.ForgeHooks.SeedEntry;
    014    import net.minecraftforge.event.EventBus;
    015    import net.minecraftforge.event.ForgeSubscribe;
    016    import net.minecraftforge.event.entity.EntityEvent;
    017    import net.minecraftforge.oredict.OreDictionary;
    018
    019    public class MinecraftForge
    020    {
    021        /**
    022         * The core Forge EventBus, all events for Forge will be fired on this,
    023         * you should use this to register all your listeners.
    024         * This replaces every register*Handler() function in the old version of Forge.
    025         */
    026        public static final EventBus EVENT_BUS = new EventBus();
    027        public static boolean SPAWNER_ALLOW_ON_INVERTED = false;
    028        private static final ForgeInternalHandler INTERNAL_HANDLER = new ForgeInternalHandler();
    029
    030
    031        /** Register a new plant to be planted when bonemeal is used on grass.
    032         * @param block The block to place.
    033         * @param metadata The metadata to set for the block when being placed.
    034         * @param weight The weight of the plant, where red flowers are
    035         *               10 and yellow flowers are 20.
    036         */
    037        public static void addGrassPlant(Block block, int metadata, int weight)
    038        {
    039            ForgeHooks.grassList.add(new GrassEntry(block, metadata, weight));
    040        }
    041
    042        /**
    043         * Register a new seed to be dropped when breaking tall grass.
    044         *
    045         * @param seed The item to drop as a seed.
    046         * @param weight The relative probability of the seeds,
    047         *               where wheat seeds are 10.
    048         */
    049        public static void addGrassSeed(ItemStack seed, int weight)
    050        {
    051            ForgeHooks.seedList.add(new SeedEntry(seed, weight));
    052        }
    053
    054        /**
    055         *
    056         * Register a tool as a tool class with a given harvest level.
    057         *
    058         * @param tool The custom tool to register.
    059         * @param toolClass The tool class to register as.  The predefined tool
    060         *                  clases are "pickaxe", "shovel", "axe".  You can add
    061         *                  others for custom tools.
    062         * @param harvestLevel The harvest level of the tool.
    063         */
    064       public static void setToolClass(Item tool, String toolClass, int harvestLevel)
    065       {
    066           ForgeHooks.toolClasses.put(tool, Arrays.asList(toolClass, harvestLevel));
    067       }
    068
    069       /**
    070        * Register a block to be harvested by a tool class.  This is the metadata
    071        * sensitive version, use it if your blocks are using metadata variants.
    072        * By default, this sets the block class as effective against that type.
    073        *
    074        * @param block The block to register.
    075        * @param metadata The metadata for the block subtype.
    076        * @param toolClass The tool class to register as able to remove this block.
    077        *                  You may register the same block multiple times with different tool
    078        *                  classes, if multiple tool types can be used to harvest this block.
    079        * @param harvestLevel The minimum tool harvest level required to successfully
    080        * harvest the block.
    081        * @see MinecraftForge#setToolClass for details on tool classes.
    082        */
    083       public static void setBlockHarvestLevel(Block block, int metadata, String toolClass, int harvestLevel)
    084       {
    085           List key = Arrays.asList(block, metadata, toolClass);
    086           ForgeHooks.toolHarvestLevels.put(key, harvestLevel);
    087           ForgeHooks.toolEffectiveness.add(key);
    088       }
    089
    090       /**
    091        * Remove a block effectiveness mapping.  Since setBlockHarvestLevel
    092        * makes the tool class effective against the block by default, this can be
    093        * used to remove that mapping.  This will force a block to be harvested at
    094        * the same speed regardless of tool quality, while still requiring a given
    095        * harvesting level.
    096        *
    097        * @param block The block to remove effectiveness from.
    098        * @param metadata The metadata for the block subtype.
    099        * @param toolClass The tool class to remove the effectiveness mapping from.
    100        * @see MinecraftForge#setToolClass for details on tool classes.
    101        */
    102       public static void removeBlockEffectiveness(Block block, int metadata, String toolClass)
    103       {
    104           List key = Arrays.asList(block, metadata, toolClass);
    105           ForgeHooks.toolEffectiveness.remove(key);
    106       }
    107
    108       /**
    109        * Register a block to be harvested by a tool class.
    110        * By default, this sets the block class as effective against that type.
    111        *
    112        * @param block The block to register.
    113        * @param toolClass The tool class to register as able to remove this block.
    114        *                  You may register the same block multiple times with different tool
    115        *                  classes, if multiple tool types can be used to harvest this block.
    116        * @param harvestLevel The minimum tool harvest level required to successfully
    117        *                     harvest the block.
    118        * @see MinecraftForge#setToolClass for details on tool classes.
    119        */
    120       public static void setBlockHarvestLevel(Block block, String toolClass, int harvestLevel)
    121       {
    122           for (int metadata = 0; metadata < 16; metadata++)
    123           {
    124               List key = Arrays.asList(block, metadata, toolClass);
    125               ForgeHooks.toolHarvestLevels.put(key, harvestLevel);
    126               ForgeHooks.toolEffectiveness.add(key);
    127           }
    128       }
    129
    130       /**
    131        * Returns the block harvest level for a particular tool class.
    132        *
    133        * @param block The block to check.
    134        * @param metadata The metadata for the block subtype.
    135        * @param toolClass The tool class to check as able to remove this block.
    136        * @see MinecraftForge#setToolClass for details on tool classes.
    137        * @return The harvest level or -1 if no mapping exists.
    138        */
    139       public static int getBlockHarvestLevel(Block block, int metadata, String toolClass)
    140       {
    141           ForgeHooks.initTools();
    142           List key = Arrays.asList(block, metadata, toolClass);
    143           Integer harvestLevel = (Integer)ForgeHooks.toolHarvestLevels.get(key);
    144           if(harvestLevel == null)
    145           {
    146               return -1;
    147           }
    148           return harvestLevel;
    149       }
    150
    151       /**
    152        * Remove a block effectiveness mapping.  Since setBlockHarvestLevel
    153        * makes the tool class effective against the block by default, this can be
    154        * used to remove that mapping.  This will force a block to be harvested at
    155        * the same speed regardless of tool quality, while still requiring a given
    156        * harvesting level.
    157        *
    158        * @param block The block to remove effectiveness from.
    159        * @param toolClass The tool class to remove the effectiveness mapping from.
    160        * @see MinecraftForge#setToolClass for details on tool classes.
    161        */
    162       public static void removeBlockEffectiveness(Block block, String toolClass)
    163       {
    164           for (int metadata = 0; metadata < 16; metadata++)
    165           {
    166               List key = Arrays.asList(block, metadata, toolClass);
    167               ForgeHooks.toolEffectiveness.remove(key);
    168           }
    169       }
    170
    171       /**
    172        * Method invoked by FML before any other mods are loaded.
    173        */
    174       public static void initialize()
    175       {
    176           System.out.printf("MinecraftForge v%s Initialized\n", ForgeVersion.getVersion());
    177           FMLLog.info("MinecraftForge v%s Initialized", ForgeVersion.getVersion());
    178
    179           Block filler = new Block(0, Material.air);
    180           Block.blocksList[0] = null;
    181           Block.opaqueCubeLookup[0] = false;
    182           Block.lightOpacity[0] = 0;
    183
    184           for (int x = 256; x < 4096; x++)
    185           {
    186               if (Item.itemsList[x] != null)
    187               {
    188                   Block.blocksList[x] = filler;
    189               }
    190           }
    191
    192           boolean[] temp = new boolean[4096];
    193           for (int x = 0; x < EntityEnderman.carriableBlocks.length; x++)
    194           {
    195               temp[x] = EntityEnderman.carriableBlocks[x];
    196           }
    197           EntityEnderman.carriableBlocks = temp;
    198
    199           EVENT_BUS.register(INTERNAL_HANDLER);
    200           OreDictionary.getOreName(0);
    201       }
    202
    203       public static String getBrandingVersion()
    204       {
    205           return "Minecraft Forge "+ ForgeVersion.getVersion();
    206       }
    207    }