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