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