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