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