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    }