001 package net.minecraft.block; 002 003 import cpw.mods.fml.relauncher.Side; 004 import cpw.mods.fml.relauncher.SideOnly; 005 import java.util.List; 006 import java.util.Random; 007 import net.minecraft.block.material.Material; 008 import net.minecraft.entity.Entity; 009 import net.minecraft.util.AxisAlignedBB; 010 import net.minecraft.util.Facing; 011 import net.minecraft.world.IBlockAccess; 012 import net.minecraft.world.World; 013 014 public class BlockPistonExtension extends Block 015 { 016 /** The texture for the 'head' of the piston. Sticky or normal. */ 017 private int headTexture = -1; 018 019 public BlockPistonExtension(int par1, int par2) 020 { 021 super(par1, par2, Material.piston); 022 this.setStepSound(soundStoneFootstep); 023 this.setHardness(0.5F); 024 } 025 026 @SideOnly(Side.CLIENT) 027 public void setHeadTexture(int par1) 028 { 029 this.headTexture = par1; 030 } 031 032 @SideOnly(Side.CLIENT) 033 public void clearHeadTexture() 034 { 035 this.headTexture = -1; 036 } 037 038 /** 039 * ejects contained items into the world, and notifies neighbours of an update, as appropriate 040 */ 041 public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) 042 { 043 super.breakBlock(par1World, par2, par3, par4, par5, par6); 044 int var7 = Facing.faceToSide[getDirectionMeta(par6)]; 045 par2 += Facing.offsetsXForSide[var7]; 046 par3 += Facing.offsetsYForSide[var7]; 047 par4 += Facing.offsetsZForSide[var7]; 048 int var8 = par1World.getBlockId(par2, par3, par4); 049 050 if (var8 == Block.pistonBase.blockID || var8 == Block.pistonStickyBase.blockID) 051 { 052 par6 = par1World.getBlockMetadata(par2, par3, par4); 053 054 if (BlockPistonBase.isExtended(par6)) 055 { 056 Block.blocksList[var8].dropBlockAsItem(par1World, par2, par3, par4, par6, 0); 057 par1World.setBlockWithNotify(par2, par3, par4, 0); 058 } 059 } 060 } 061 062 /** 063 * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata 064 */ 065 public int getBlockTextureFromSideAndMetadata(int par1, int par2) 066 { 067 int var3 = getDirectionMeta(par2); 068 return par1 == var3 ? (this.headTexture >= 0 ? this.headTexture : ((par2 & 8) != 0 ? this.blockIndexInTexture - 1 : this.blockIndexInTexture)) : (var3 < 6 && par1 == Facing.faceToSide[var3] ? 107 : 108); 069 } 070 071 /** 072 * The type of render function that is called for this block 073 */ 074 public int getRenderType() 075 { 076 return 17; 077 } 078 079 /** 080 * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two 081 * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. 082 */ 083 public boolean isOpaqueCube() 084 { 085 return false; 086 } 087 088 /** 089 * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) 090 */ 091 public boolean renderAsNormalBlock() 092 { 093 return false; 094 } 095 096 /** 097 * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z 098 */ 099 public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) 100 { 101 return false; 102 } 103 104 /** 105 * checks to see if you can place this block can be placed on that side of a block: BlockLever overrides 106 */ 107 public boolean canPlaceBlockOnSide(World par1World, int par2, int par3, int par4, int par5) 108 { 109 return false; 110 } 111 112 /** 113 * Returns the quantity of items to drop on block destruction. 114 */ 115 public int quantityDropped(Random par1Random) 116 { 117 return 0; 118 } 119 120 /** 121 * if the specified block is in the given AABB, add its collision bounding box to the given list 122 */ 123 public void addCollidingBlockToList(World par1World, int par2, int par3, int par4, AxisAlignedBB par5AxisAlignedBB, List par6List, Entity par7Entity) 124 { 125 int var8 = par1World.getBlockMetadata(par2, par3, par4); 126 127 switch (getDirectionMeta(var8)) 128 { 129 case 0: 130 this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.25F, 1.0F); 131 super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); 132 this.setBlockBounds(0.375F, 0.25F, 0.375F, 0.625F, 1.0F, 0.625F); 133 super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); 134 break; 135 case 1: 136 this.setBlockBounds(0.0F, 0.75F, 0.0F, 1.0F, 1.0F, 1.0F); 137 super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); 138 this.setBlockBounds(0.375F, 0.0F, 0.375F, 0.625F, 0.75F, 0.625F); 139 super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); 140 break; 141 case 2: 142 this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.25F); 143 super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); 144 this.setBlockBounds(0.25F, 0.375F, 0.25F, 0.75F, 0.625F, 1.0F); 145 super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); 146 break; 147 case 3: 148 this.setBlockBounds(0.0F, 0.0F, 0.75F, 1.0F, 1.0F, 1.0F); 149 super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); 150 this.setBlockBounds(0.25F, 0.375F, 0.0F, 0.75F, 0.625F, 0.75F); 151 super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); 152 break; 153 case 4: 154 this.setBlockBounds(0.0F, 0.0F, 0.0F, 0.25F, 1.0F, 1.0F); 155 super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); 156 this.setBlockBounds(0.375F, 0.25F, 0.25F, 0.625F, 0.75F, 1.0F); 157 super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); 158 break; 159 case 5: 160 this.setBlockBounds(0.75F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); 161 super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); 162 this.setBlockBounds(0.0F, 0.375F, 0.25F, 0.75F, 0.625F, 0.75F); 163 super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity); 164 } 165 166 this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); 167 } 168 169 /** 170 * Updates the blocks bounds based on its current state. Args: world, x, y, z 171 */ 172 public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) 173 { 174 int var5 = par1IBlockAccess.getBlockMetadata(par2, par3, par4); 175 176 switch (getDirectionMeta(var5)) 177 { 178 case 0: 179 this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.25F, 1.0F); 180 break; 181 case 1: 182 this.setBlockBounds(0.0F, 0.75F, 0.0F, 1.0F, 1.0F, 1.0F); 183 break; 184 case 2: 185 this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.25F); 186 break; 187 case 3: 188 this.setBlockBounds(0.0F, 0.0F, 0.75F, 1.0F, 1.0F, 1.0F); 189 break; 190 case 4: 191 this.setBlockBounds(0.0F, 0.0F, 0.0F, 0.25F, 1.0F, 1.0F); 192 break; 193 case 5: 194 this.setBlockBounds(0.75F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); 195 } 196 } 197 198 /** 199 * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are 200 * their own) Args: x, y, z, neighbor blockID 201 */ 202 public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5) 203 { 204 int var6 = getDirectionMeta(par1World.getBlockMetadata(par2, par3, par4)); 205 int var7 = par1World.getBlockId(par2 - Facing.offsetsXForSide[var6], par3 - Facing.offsetsYForSide[var6], par4 - Facing.offsetsZForSide[var6]); 206 207 if (var7 != Block.pistonBase.blockID && var7 != Block.pistonStickyBase.blockID) 208 { 209 par1World.setBlockWithNotify(par2, par3, par4, 0); 210 } 211 else 212 { 213 Block.blocksList[var7].onNeighborBlockChange(par1World, par2 - Facing.offsetsXForSide[var6], par3 - Facing.offsetsYForSide[var6], par4 - Facing.offsetsZForSide[var6], par5); 214 } 215 } 216 217 public static int getDirectionMeta(int par0) 218 { 219 return par0 & 7; 220 } 221 222 @SideOnly(Side.CLIENT) 223 224 /** 225 * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative) 226 */ 227 public int idPicked(World par1World, int par2, int par3, int par4) 228 { 229 return 0; 230 } 231 }