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.func_82144_au())
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.markBlocksDirty(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.markBlocksDirty(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 * Is this block powering the block on the specified side
216 */
217 public boolean isPoweringTo(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
218 {
219 return par1IBlockAccess.getBlockMetadata(par2, par3, par4) > 0;
220 }
221
222 /**
223 * Is this block indirectly powering the block on the specified side
224 */
225 public boolean isIndirectlyPoweringTo(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
226 {
227 return par1IBlockAccess.getBlockMetadata(par2, par3, par4) == 0 ? false : par5 == 1;
228 }
229
230 /**
231 * Can this block provide power. Only wire currently seems to have this change based on its state.
232 */
233 public boolean canProvidePower()
234 {
235 return true;
236 }
237
238 /**
239 * Sets the block's bounds for rendering it as an item
240 */
241 public void setBlockBoundsForItemRender()
242 {
243 float var1 = 0.5F;
244 float var2 = 0.125F;
245 float var3 = 0.5F;
246 this.setBlockBounds(0.5F - var1, 0.5F - var2, 0.5F - var3, 0.5F + var1, 0.5F + var2, 0.5F + var3);
247 }
248
249 /**
250 * Returns the mobility information of the block, 0 = free, 1 = can't push but can move over, 2 = total immobility
251 * and stop pistons
252 */
253 public int getMobilityFlag()
254 {
255 return 1;
256 }
257 }