    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.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    }