001 package net.minecraft.src; 002 003 import java.util.Iterator; 004 import java.util.List; 005 import java.util.Random; 006 007 public class BlockPressurePlate extends Block 008 { 009 /** The mob type that can trigger this pressure plate. */ 010 private EnumMobType triggerMobType; 011 012 protected BlockPressurePlate(int par1, int par2, EnumMobType par3EnumMobType, Material par4Material) 013 { 014 super(par1, par2, par4Material); 015 this.triggerMobType = par3EnumMobType; 016 this.setCreativeTab(CreativeTabs.tabRedstone); 017 this.setTickRandomly(true); 018 float var5 = 0.0625F; 019 this.setBlockBounds(var5, 0.0F, var5, 1.0F - var5, 0.03125F, 1.0F - var5); 020 } 021 022 /** 023 * How many world ticks before ticking 024 */ 025 public int tickRate() 026 { 027 return 20; 028 } 029 030 /** 031 * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been 032 * cleared to be reused) 033 */ 034 public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4) 035 { 036 return null; 037 } 038 039 /** 040 * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two 041 * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block. 042 */ 043 public boolean isOpaqueCube() 044 { 045 return false; 046 } 047 048 /** 049 * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) 050 */ 051 public boolean renderAsNormalBlock() 052 { 053 return false; 054 } 055 056 public boolean getBlocksMovement(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) 057 { 058 return true; 059 } 060 061 /** 062 * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z 063 */ 064 public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) 065 { 066 return par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4) || BlockFence.isIdAFence(par1World.getBlockId(par2, par3 - 1, par4)); 067 } 068 069 /** 070 * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are 071 * their own) Args: x, y, z, neighbor blockID 072 */ 073 public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5) 074 { 075 boolean var6 = false; 076 077 if (!par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4) && !BlockFence.isIdAFence(par1World.getBlockId(par2, par3 - 1, par4))) 078 { 079 var6 = true; 080 } 081 082 if (var6) 083 { 084 this.dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0); 085 par1World.setBlockWithNotify(par2, par3, par4, 0); 086 } 087 } 088 089 /** 090 * Ticks the block if it's been scheduled 091 */ 092 public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random) 093 { 094 if (!par1World.isRemote) 095 { 096 if (par1World.getBlockMetadata(par2, par3, par4) != 0) 097 { 098 this.setStateIfMobInteractsWithPlate(par1World, par2, par3, par4); 099 } 100 } 101 } 102 103 /** 104 * Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity 105 */ 106 public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity) 107 { 108 if (!par1World.isRemote) 109 { 110 if (par1World.getBlockMetadata(par2, par3, par4) != 1) 111 { 112 this.setStateIfMobInteractsWithPlate(par1World, par2, par3, par4); 113 } 114 } 115 } 116 117 /** 118 * Checks if there are mobs on the plate. If a mob is on the plate and it is off, it turns it on, and vice versa. 119 */ 120 private void setStateIfMobInteractsWithPlate(World par1World, int par2, int par3, int par4) 121 { 122 boolean var5 = par1World.getBlockMetadata(par2, par3, par4) == 1; 123 boolean var6 = false; 124 float var7 = 0.125F; 125 List var8 = null; 126 127 if (this.triggerMobType == EnumMobType.everything) 128 { 129 var8 = par1World.getEntitiesWithinAABBExcludingEntity((Entity)null, AxisAlignedBB.getAABBPool().addOrModifyAABBInPool((double)((float)par2 + var7), (double)par3, (double)((float)par4 + var7), (double)((float)(par2 + 1) - var7), (double)par3 + 0.25D, (double)((float)(par4 + 1) - var7))); 130 } 131 132 if (this.triggerMobType == EnumMobType.mobs) 133 { 134 var8 = par1World.getEntitiesWithinAABB(EntityLiving.class, AxisAlignedBB.getAABBPool().addOrModifyAABBInPool((double)((float)par2 + var7), (double)par3, (double)((float)par4 + var7), (double)((float)(par2 + 1) - var7), (double)par3 + 0.25D, (double)((float)(par4 + 1) - var7))); 135 } 136 137 if (this.triggerMobType == EnumMobType.players) 138 { 139 var8 = par1World.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getAABBPool().addOrModifyAABBInPool((double)((float)par2 + var7), (double)par3, (double)((float)par4 + var7), (double)((float)(par2 + 1) - var7), (double)par3 + 0.25D, (double)((float)(par4 + 1) - var7))); 140 } 141 142 if (!var8.isEmpty()) 143 { 144 Iterator var9 = var8.iterator(); 145 146 while (var9.hasNext()) 147 { 148 Entity var10 = (Entity)var9.next(); 149 150 if (!var10.doesEntityNotTriggerPressurePlate()) 151 { 152 var6 = true; 153 break; 154 } 155 } 156 } 157 158 if (var6 && !var5) 159 { 160 par1World.setBlockMetadataWithNotify(par2, par3, par4, 1); 161 par1World.notifyBlocksOfNeighborChange(par2, par3, par4, this.blockID); 162 par1World.notifyBlocksOfNeighborChange(par2, par3 - 1, par4, this.blockID); 163 par1World.markBlockRangeForRenderUpdate(par2, par3, par4, par2, par3, par4); 164 par1World.playSoundEffect((double)par2 + 0.5D, (double)par3 + 0.1D, (double)par4 + 0.5D, "random.click", 0.3F, 0.6F); 165 } 166 167 if (!var6 && var5) 168 { 169 par1World.setBlockMetadataWithNotify(par2, par3, par4, 0); 170 par1World.notifyBlocksOfNeighborChange(par2, par3, par4, this.blockID); 171 par1World.notifyBlocksOfNeighborChange(par2, par3 - 1, par4, this.blockID); 172 par1World.markBlockRangeForRenderUpdate(par2, par3, par4, par2, par3, par4); 173 par1World.playSoundEffect((double)par2 + 0.5D, (double)par3 + 0.1D, (double)par4 + 0.5D, "random.click", 0.3F, 0.5F); 174 } 175 176 if (var6) 177 { 178 par1World.scheduleBlockUpdate(par2, par3, par4, this.blockID, this.tickRate()); 179 } 180 } 181 182 /** 183 * ejects contained items into the world, and notifies neighbours of an update, as appropriate 184 */ 185 public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) 186 { 187 if (par6 > 0) 188 { 189 par1World.notifyBlocksOfNeighborChange(par2, par3, par4, this.blockID); 190 par1World.notifyBlocksOfNeighborChange(par2, par3 - 1, par4, this.blockID); 191 } 192 193 super.breakBlock(par1World, par2, par3, par4, par5, par6); 194 } 195 196 /** 197 * Updates the blocks bounds based on its current state. Args: world, x, y, z 198 */ 199 public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) 200 { 201 boolean var5 = par1IBlockAccess.getBlockMetadata(par2, par3, par4) == 1; 202 float var6 = 0.0625F; 203 204 if (var5) 205 { 206 this.setBlockBounds(var6, 0.0F, var6, 1.0F - var6, 0.03125F, 1.0F - var6); 207 } 208 else 209 { 210 this.setBlockBounds(var6, 0.0F, var6, 1.0F - var6, 0.0625F, 1.0F - var6); 211 } 212 } 213 214 /** 215 * Returns true if the block is emitting indirect/weak redstone power on the specified side. If isBlockNormalCube 216 * returns true, standard redstone propagation rules will apply instead and this will not be called. Args: World, X, 217 * Y, Z, side 218 */ 219 public boolean isProvidingWeakPower(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) 220 { 221 return par1IBlockAccess.getBlockMetadata(par2, par3, par4) > 0; 222 } 223 224 /** 225 * Returns true if the block is emitting direct/strong redstone power on the specified side. Args: World, X, Y, Z, 226 * side 227 */ 228 public boolean isProvidingStrongPower(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) 229 { 230 return par1IBlockAccess.getBlockMetadata(par2, par3, par4) == 0 ? false : par5 == 1; 231 } 232 233 /** 234 * Can this block provide power. Only wire currently seems to have this change based on its state. 235 */ 236 public boolean canProvidePower() 237 { 238 return true; 239 } 240 241 /** 242 * Sets the block's bounds for rendering it as an item 243 */ 244 public void setBlockBoundsForItemRender() 245 { 246 float var1 = 0.5F; 247 float var2 = 0.125F; 248 float var3 = 0.5F; 249 this.setBlockBounds(0.5F - var1, 0.5F - var2, 0.5F - var3, 0.5F + var1, 0.5F + var2, 0.5F + var3); 250 } 251 252 /** 253 * Returns the mobility information of the block, 0 = free, 1 = can't push but can move over, 2 = total immobility 254 * and stop pistons 255 */ 256 public int getMobilityFlag() 257 { 258 return 1; 259 } 260 }