001package net.minecraft.item; 002 003import cpw.mods.fml.relauncher.Side; 004import cpw.mods.fml.relauncher.SideOnly; 005import java.util.List; 006import net.minecraft.block.Block; 007import net.minecraft.client.renderer.texture.IconRegister; 008import net.minecraft.creativetab.CreativeTabs; 009import net.minecraft.entity.Entity; 010import net.minecraft.entity.player.EntityPlayer; 011import net.minecraft.util.Icon; 012import net.minecraft.world.World; 013 014public class ItemBlock extends Item 015{ 016 /** The block ID of the Block associated with this ItemBlock */ 017 private int blockID; 018 @SideOnly(Side.CLIENT) 019 private Icon field_94588_b; 020 021 public ItemBlock(int par1) 022 { 023 super(par1); 024 this.blockID = par1 + 256; 025 } 026 027 /** 028 * Returns the blockID for this Item 029 */ 030 public int getBlockID() 031 { 032 return this.blockID; 033 } 034 035 @SideOnly(Side.CLIENT) 036 public int func_94901_k() 037 { 038 return Block.blocksList[this.blockID].func_94327_t_() != null ? 1 : 0; 039 } 040 041 @SideOnly(Side.CLIENT) 042 043 /** 044 * Gets an icon index based on an item's damage value 045 */ 046 public Icon getIconFromDamage(int par1) 047 { 048 return this.field_94588_b != null ? this.field_94588_b : Block.blocksList[this.blockID].getBlockTextureFromSide(1); 049 } 050 051 /** 052 * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return 053 * True if something happen and false if it don't. This is for ITEMS, not BLOCKS 054 */ 055 public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) 056 { 057 int i1 = par3World.getBlockId(par4, par5, par6); 058 059 if (i1 == Block.snow.blockID && (par3World.getBlockMetadata(par4, par5, par6) & 7) < 1) 060 { 061 par7 = 1; 062 } 063 else if (i1 != Block.vine.blockID && i1 != Block.tallGrass.blockID && i1 != Block.deadBush.blockID 064 && (Block.blocksList[i1] == null || !Block.blocksList[i1].isBlockReplaceable(par3World, par4, par5, par6))) 065 { 066 if (par7 == 0) 067 { 068 --par5; 069 } 070 071 if (par7 == 1) 072 { 073 ++par5; 074 } 075 076 if (par7 == 2) 077 { 078 --par6; 079 } 080 081 if (par7 == 3) 082 { 083 ++par6; 084 } 085 086 if (par7 == 4) 087 { 088 --par4; 089 } 090 091 if (par7 == 5) 092 { 093 ++par4; 094 } 095 } 096 097 if (par1ItemStack.stackSize == 0) 098 { 099 return false; 100 } 101 else if (!par2EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack)) 102 { 103 return false; 104 } 105 else if (par5 == 255 && Block.blocksList[this.blockID].blockMaterial.isSolid()) 106 { 107 return false; 108 } 109 else if (par3World.canPlaceEntityOnSide(this.blockID, par4, par5, par6, false, par7, par2EntityPlayer, par1ItemStack)) 110 { 111 Block block = Block.blocksList[this.blockID]; 112 int j1 = this.getMetadata(par1ItemStack.getItemDamage()); 113 int k1 = Block.blocksList[this.blockID].onBlockPlaced(par3World, par4, par5, par6, par7, par8, par9, par10, j1); 114 115 if (placeBlockAt(par1ItemStack, par2EntityPlayer, par3World, par4, par5, par6, par7, par8, par9, par10, k1)) 116 { 117 par3World.playSoundEffect((double)((float)par4 + 0.5F), (double)((float)par5 + 0.5F), (double)((float)par6 + 0.5F), block.stepSound.getPlaceSound(), (block.stepSound.getVolume() + 1.0F) / 2.0F, block.stepSound.getPitch() * 0.8F); 118 --par1ItemStack.stackSize; 119 } 120 121 return true; 122 } 123 else 124 { 125 return false; 126 } 127 } 128 129 @SideOnly(Side.CLIENT) 130 131 /** 132 * Returns true if the given ItemBlock can be placed on the given side of the given block position. 133 */ 134 public boolean canPlaceItemBlockOnSide(World par1World, int par2, int par3, int par4, int par5, EntityPlayer par6EntityPlayer, ItemStack par7ItemStack) 135 { 136 int i1 = par1World.getBlockId(par2, par3, par4); 137 138 if (i1 == Block.snow.blockID) 139 { 140 par5 = 1; 141 } 142 else if (i1 != Block.vine.blockID && i1 != Block.tallGrass.blockID && i1 != Block.deadBush.blockID 143 && (Block.blocksList[i1] == null || !Block.blocksList[i1].isBlockReplaceable(par1World, par2, par3, par4))) 144 { 145 if (par5 == 0) 146 { 147 --par3; 148 } 149 150 if (par5 == 1) 151 { 152 ++par3; 153 } 154 155 if (par5 == 2) 156 { 157 --par4; 158 } 159 160 if (par5 == 3) 161 { 162 ++par4; 163 } 164 165 if (par5 == 4) 166 { 167 --par2; 168 } 169 170 if (par5 == 5) 171 { 172 ++par2; 173 } 174 } 175 176 return par1World.canPlaceEntityOnSide(this.getBlockID(), par2, par3, par4, false, par5, (Entity)null, par7ItemStack); 177 } 178 179 /** 180 * Returns the unlocalized name of this item. This version accepts an ItemStack so different stacks can have 181 * different names based on their damage or NBT. 182 */ 183 public String getUnlocalizedName(ItemStack par1ItemStack) 184 { 185 return Block.blocksList[this.blockID].getUnlocalizedName(); 186 } 187 188 /** 189 * Returns the unlocalized name of this item. 190 */ 191 public String getUnlocalizedName() 192 { 193 return Block.blocksList[this.blockID].getUnlocalizedName(); 194 } 195 196 @SideOnly(Side.CLIENT) 197 198 /** 199 * gets the CreativeTab this item is displayed on 200 */ 201 public CreativeTabs getCreativeTab() 202 { 203 return Block.blocksList[this.blockID].getCreativeTabToDisplayOn(); 204 } 205 206 @SideOnly(Side.CLIENT) 207 208 /** 209 * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) 210 */ 211 public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List) 212 { 213 Block.blocksList[this.blockID].getSubBlocks(par1, par2CreativeTabs, par3List); 214 } 215 216 @SideOnly(Side.CLIENT) 217 public void func_94581_a(IconRegister par1IconRegister) 218 { 219 String s = Block.blocksList[this.blockID].func_94327_t_(); 220 221 if (s != null) 222 { 223 this.field_94588_b = par1IconRegister.func_94245_a(s); 224 } 225 } 226 227 /** 228 * Called to actually place the block, after the location is determined 229 * and all permission checks have been made. 230 * 231 * @param stack The item stack that was used to place the block. This can be changed inside the method. 232 * @param player The player who is placing the block. Can be null if the block is not being placed by a player. 233 * @param side The side the player (or machine) right-clicked on. 234 */ 235 public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int metadata) 236 { 237 if (!world.setBlockAndMetadataWithNotify(x, y, z, this.blockID, metadata, 3)) 238 { 239 return false; 240 } 241 242 if (world.getBlockId(x, y, z) == this.blockID) 243 { 244 Block.blocksList[this.blockID].onBlockPlacedBy(world, x, y, z, player, stack); 245 Block.blocksList[this.blockID].onPostBlockPlaced(world, x, y, z, metadata); 246 } 247 248 return true; 249 } 250}