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 }