001 package net.minecraft.item; 002 003 import cpw.mods.fml.relauncher.Side; 004 import cpw.mods.fml.relauncher.SideOnly; 005 import net.minecraft.block.Block; 006 import net.minecraft.block.BlockHalfSlab; 007 import net.minecraft.entity.player.EntityPlayer; 008 import net.minecraft.world.World; 009 010 public class ItemSlab extends ItemBlock 011 { 012 private final boolean isFullBlock; 013 014 /** Instance of BlockHalfSlab. */ 015 private final BlockHalfSlab theHalfSlab; 016 017 /** Instance of BlockHalfSlab. */ 018 private final BlockHalfSlab theHalfSlab2; 019 020 public ItemSlab(int par1, BlockHalfSlab par2BlockHalfSlab, BlockHalfSlab par3BlockHalfSlab, boolean par4) 021 { 022 super(par1); 023 this.theHalfSlab = par2BlockHalfSlab; 024 this.theHalfSlab2 = par3BlockHalfSlab; 025 this.isFullBlock = par4; 026 this.setMaxDamage(0); 027 this.setHasSubtypes(true); 028 } 029 030 @SideOnly(Side.CLIENT) 031 032 /** 033 * Gets an icon index based on an item's damage value 034 */ 035 public int getIconFromDamage(int par1) 036 { 037 return Block.blocksList[this.itemID].getBlockTextureFromSideAndMetadata(2, par1); 038 } 039 040 /** 041 * Returns the metadata of the block which this Item (ItemBlock) can place 042 */ 043 public int getMetadata(int par1) 044 { 045 return par1; 046 } 047 048 public String getItemNameIS(ItemStack par1ItemStack) 049 { 050 return this.theHalfSlab.getFullSlabName(par1ItemStack.getItemDamage()); 051 } 052 053 /** 054 * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return 055 * True if something happen and false if it don't. This is for ITEMS, not BLOCKS 056 */ 057 public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) 058 { 059 if (this.isFullBlock) 060 { 061 return super.onItemUse(par1ItemStack, par2EntityPlayer, par3World, par4, par5, par6, par7, par8, par9, par10); 062 } 063 else if (par1ItemStack.stackSize == 0) 064 { 065 return false; 066 } 067 else if (!par2EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack)) 068 { 069 return false; 070 } 071 else 072 { 073 int var11 = par3World.getBlockId(par4, par5, par6); 074 int var12 = par3World.getBlockMetadata(par4, par5, par6); 075 int var13 = var12 & 7; 076 boolean var14 = (var12 & 8) != 0; 077 078 if ((par7 == 1 && !var14 || par7 == 0 && var14) && var11 == this.theHalfSlab.blockID && var13 == par1ItemStack.getItemDamage()) 079 { 080 if (par3World.checkIfAABBIsClear(this.theHalfSlab2.getCollisionBoundingBoxFromPool(par3World, par4, par5, par6)) && par3World.setBlockAndMetadataWithNotify(par4, par5, par6, this.theHalfSlab2.blockID, var13)) 081 { 082 par3World.playSoundEffect((double)((float)par4 + 0.5F), (double)((float)par5 + 0.5F), (double)((float)par6 + 0.5F), this.theHalfSlab2.stepSound.getPlaceSound(), (this.theHalfSlab2.stepSound.getVolume() + 1.0F) / 2.0F, this.theHalfSlab2.stepSound.getPitch() * 0.8F); 083 --par1ItemStack.stackSize; 084 } 085 086 return true; 087 } 088 else 089 { 090 return this.func_77888_a(par1ItemStack, par2EntityPlayer, par3World, par4, par5, par6, par7) ? true : super.onItemUse(par1ItemStack, par2EntityPlayer, par3World, par4, par5, par6, par7, par8, par9, par10); 091 } 092 } 093 } 094 095 @SideOnly(Side.CLIENT) 096 097 /** 098 * Returns true if the given ItemBlock can be placed on the given side of the given block position. 099 */ 100 public boolean canPlaceItemBlockOnSide(World par1World, int par2, int par3, int par4, int par5, EntityPlayer par6EntityPlayer, ItemStack par7ItemStack) 101 { 102 int var8 = par2; 103 int var9 = par3; 104 int var10 = par4; 105 int var11 = par1World.getBlockId(par2, par3, par4); 106 int var12 = par1World.getBlockMetadata(par2, par3, par4); 107 int var13 = var12 & 7; 108 boolean var14 = (var12 & 8) != 0; 109 110 if ((par5 == 1 && !var14 || par5 == 0 && var14) && var11 == this.theHalfSlab.blockID && var13 == par7ItemStack.getItemDamage()) 111 { 112 return true; 113 } 114 else 115 { 116 if (par5 == 0) 117 { 118 --par3; 119 } 120 121 if (par5 == 1) 122 { 123 ++par3; 124 } 125 126 if (par5 == 2) 127 { 128 --par4; 129 } 130 131 if (par5 == 3) 132 { 133 ++par4; 134 } 135 136 if (par5 == 4) 137 { 138 --par2; 139 } 140 141 if (par5 == 5) 142 { 143 ++par2; 144 } 145 146 var11 = par1World.getBlockId(par2, par3, par4); 147 var12 = par1World.getBlockMetadata(par2, par3, par4); 148 var13 = var12 & 7; 149 var14 = (var12 & 8) != 0; 150 return var11 == this.theHalfSlab.blockID && var13 == par7ItemStack.getItemDamage() ? true : super.canPlaceItemBlockOnSide(par1World, var8, var9, var10, par5, par6EntityPlayer, par7ItemStack); 151 } 152 } 153 154 private boolean func_77888_a(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7) 155 { 156 if (par7 == 0) 157 { 158 --par5; 159 } 160 161 if (par7 == 1) 162 { 163 ++par5; 164 } 165 166 if (par7 == 2) 167 { 168 --par6; 169 } 170 171 if (par7 == 3) 172 { 173 ++par6; 174 } 175 176 if (par7 == 4) 177 { 178 --par4; 179 } 180 181 if (par7 == 5) 182 { 183 ++par4; 184 } 185 186 int var8 = par3World.getBlockId(par4, par5, par6); 187 int var9 = par3World.getBlockMetadata(par4, par5, par6); 188 int var10 = var9 & 7; 189 190 if (var8 == this.theHalfSlab.blockID && var10 == par1ItemStack.getItemDamage()) 191 { 192 if (par3World.checkIfAABBIsClear(this.theHalfSlab2.getCollisionBoundingBoxFromPool(par3World, par4, par5, par6)) && par3World.setBlockAndMetadataWithNotify(par4, par5, par6, this.theHalfSlab2.blockID, var10)) 193 { 194 par3World.playSoundEffect((double)((float)par4 + 0.5F), (double)((float)par5 + 0.5F), (double)((float)par6 + 0.5F), this.theHalfSlab2.stepSound.getPlaceSound(), (this.theHalfSlab2.stepSound.getVolume() + 1.0F) / 2.0F, this.theHalfSlab2.stepSound.getPitch() * 0.8F); 195 --par1ItemStack.stackSize; 196 } 197 198 return true; 199 } 200 else 201 { 202 return false; 203 } 204 } 205 }