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