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