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.Iterator; 006 import java.util.List; 007 import java.util.Random; 008 009 public class BlockTripWire extends Block 010 { 011 public BlockTripWire(int par1) 012 { 013 super(par1, 173, Material.circuits); 014 this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.15625F, 1.0F); 015 this.setTickRandomly(true); 016 } 017 018 /** 019 * How many world ticks before ticking 020 */ 021 public int tickRate() 022 { 023 return 10; 024 } 025 026 /** 027 * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been 028 * cleared to be reused) 029 */ 030 public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) 031 { 032 return null; 033 } 034 035 /** 036 * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two 037 * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. 038 */ 039 public boolean isOpaqueCube() 040 { 041 return false; 042 } 043 044 /** 045 * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) 046 */ 047 public boolean renderAsNormalBlock() 048 { 049 return false; 050 } 051 052 @SideOnly(Side.CLIENT) 053 054 /** 055 * Returns which pass should this block be rendered on. 0 for solids and 1 for alpha 056 */ 057 public int getRenderBlockPass() 058 { 059 return 1; 060 } 061 062 /** 063 * The type of render function that is called for this block 064 */ 065 public int getRenderType() 066 { 067 return 30; 068 } 069 070 /** 071 * Returns the ID of the items to drop on destruction. 072 */ 073 public int idDropped(int par1, Random par2Random, int par3) 074 { 075 return Item.silk.shiftedIndex; 076 } 077 078 @SideOnly(Side.CLIENT) 079 080 /** 081 * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative) 082 */ 083 public int idPicked(World par1World, int par2, int par3, int par4) 084 { 085 return Item.silk.shiftedIndex; 086 } 087 088 /** 089 * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are 090 * their own) Args: x, y, z, neighbor blockID 091 */ 092 public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5) 093 { 094 int var6 = par1World.getBlockMetadata(par2, par3, par4); 095 boolean var7 = (var6 & 2) == 2; 096 boolean var8 = !par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4); 097 098 if (var7 != var8) 099 { 100 this.dropBlockAsItem(par1World, par2, par3, par4, var6, 0); 101 par1World.setBlockWithNotify(par2, par3, par4, 0); 102 } 103 } 104 105 /** 106 * Updates the blocks bounds based on its current state. Args: world, x, y, z 107 */ 108 public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) 109 { 110 int var5 = par1IBlockAccess.getBlockMetadata(par2, par3, par4); 111 boolean var6 = (var5 & 4) == 4; 112 boolean var7 = (var5 & 2) == 2; 113 114 if (!var7) 115 { 116 this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.09375F, 1.0F); 117 } 118 else if (!var6) 119 { 120 this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); 121 } 122 else 123 { 124 this.setBlockBounds(0.0F, 0.0625F, 0.0F, 1.0F, 0.15625F, 1.0F); 125 } 126 } 127 128 /** 129 * Called whenever the block is added into the world. Args: world, x, y, z 130 */ 131 public void onBlockAdded(World par1World, int par2, int par3, int par4) 132 { 133 int var5 = par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4) ? 0 : 2; 134 par1World.setBlockMetadataWithNotify(par2, par3, par4, var5); 135 this.func_72149_e(par1World, par2, par3, par4, var5); 136 } 137 138 /** 139 * ejects contained items into the world, and notifies neighbours of an update, as appropriate 140 */ 141 public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) 142 { 143 this.func_72149_e(par1World, par2, par3, par4, par6 | 1); 144 } 145 146 /** 147 * Called when the block is attempted to be harvested 148 */ 149 public void onBlockHarvested(World par1World, int par2, int par3, int par4, int par5, EntityPlayer par6EntityPlayer) 150 { 151 if (!par1World.isRemote) 152 { 153 if (par6EntityPlayer.getCurrentEquippedItem() != null && par6EntityPlayer.getCurrentEquippedItem().itemID == Item.shears.shiftedIndex) 154 { 155 par1World.setBlockMetadataWithNotify(par2, par3, par4, par5 | 8); 156 } 157 } 158 } 159 160 private void func_72149_e(World par1World, int par2, int par3, int par4, int par5) 161 { 162 int var6 = 0; 163 164 while (var6 < 2) 165 { 166 int var7 = 1; 167 168 while (true) 169 { 170 if (var7 < 42) 171 { 172 int var8 = par2 + Direction.offsetX[var6] * var7; 173 int var9 = par4 + Direction.offsetZ[var6] * var7; 174 int var10 = par1World.getBlockId(var8, par3, var9); 175 176 if (var10 == Block.tripWireSource.blockID) 177 { 178 int var11 = par1World.getBlockMetadata(var8, par3, var9) & 3; 179 180 if (var11 == Direction.footInvisibleFaceRemap[var6]) 181 { 182 Block.tripWireSource.func_72143_a(par1World, var8, par3, var9, var10, par1World.getBlockMetadata(var8, par3, var9), true, var7, par5); 183 } 184 } 185 else if (var10 == Block.tripWire.blockID) 186 { 187 ++var7; 188 continue; 189 } 190 } 191 192 ++var6; 193 break; 194 } 195 } 196 } 197 198 /** 199 * Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity 200 */ 201 public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity) 202 { 203 if (!par1World.isRemote) 204 { 205 if ((par1World.getBlockMetadata(par2, par3, par4) & 1) != 1) 206 { 207 this.updateTripWireState(par1World, par2, par3, par4); 208 } 209 } 210 } 211 212 /** 213 * Ticks the block if it's been scheduled 214 */ 215 public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random) 216 { 217 if (!par1World.isRemote) 218 { 219 if ((par1World.getBlockMetadata(par2, par3, par4) & 1) == 1) 220 { 221 this.updateTripWireState(par1World, par2, par3, par4); 222 } 223 } 224 } 225 226 private void updateTripWireState(World par1World, int par2, int par3, int par4) 227 { 228 int var5 = par1World.getBlockMetadata(par2, par3, par4); 229 boolean var6 = (var5 & 1) == 1; 230 boolean var7 = false; 231 List var8 = par1World.getEntitiesWithinAABBExcludingEntity((Entity)null, AxisAlignedBB.getAABBPool().addOrModifyAABBInPool((double)par2 + this.minX, (double)par3 + this.minY, (double)par4 + this.minZ, (double)par2 + this.maxX, (double)par3 + this.maxY, (double)par4 + this.maxZ)); 232 233 if (!var8.isEmpty()) 234 { 235 Iterator var9 = var8.iterator(); 236 237 while (var9.hasNext()) 238 { 239 Entity var10 = (Entity)var9.next(); 240 241 if (!var10.doesEntityNotTriggerPressurePlate()) 242 { 243 var7 = true; 244 break; 245 } 246 } 247 } 248 249 if (var7 && !var6) 250 { 251 var5 |= 1; 252 } 253 254 if (!var7 && var6) 255 { 256 var5 &= -2; 257 } 258 259 if (var7 != var6) 260 { 261 par1World.setBlockMetadataWithNotify(par2, par3, par4, var5); 262 this.func_72149_e(par1World, par2, par3, par4, var5); 263 } 264 265 if (var7) 266 { 267 par1World.scheduleBlockUpdate(par2, par3, par4, this.blockID, this.tickRate()); 268 } 269 } 270 271 @SideOnly(Side.CLIENT) 272 public static boolean func_72148_a(IBlockAccess par0IBlockAccess, int par1, int par2, int par3, int par4, int par5) 273 { 274 int var6 = par1 + Direction.offsetX[par5]; 275 int var8 = par3 + Direction.offsetZ[par5]; 276 int var9 = par0IBlockAccess.getBlockId(var6, par2, var8); 277 boolean var10 = (par4 & 2) == 2; 278 int var11; 279 280 if (var9 == Block.tripWireSource.blockID) 281 { 282 var11 = par0IBlockAccess.getBlockMetadata(var6, par2, var8); 283 int var13 = var11 & 3; 284 return var13 == Direction.footInvisibleFaceRemap[par5]; 285 } 286 else if (var9 == Block.tripWire.blockID) 287 { 288 var11 = par0IBlockAccess.getBlockMetadata(var6, par2, var8); 289 boolean var12 = (var11 & 2) == 2; 290 return var10 == var12; 291 } 292 else 293 { 294 return false; 295 } 296 } 297 }