001    package net.minecraft.block;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import java.util.Random;
006    import net.minecraft.block.material.Material;
007    import net.minecraft.entity.player.EntityPlayer;
008    import net.minecraft.tileentity.TileEntity;
009    import net.minecraft.tileentity.TileEntityPiston;
010    import net.minecraft.util.AxisAlignedBB;
011    import net.minecraft.util.Facing;
012    import net.minecraft.world.IBlockAccess;
013    import net.minecraft.world.World;
014    
015    public class BlockPistonMoving extends BlockContainer
016    {
017        public BlockPistonMoving(int par1)
018        {
019            super(par1, Material.piston);
020            this.setHardness(-1.0F);
021        }
022    
023        /**
024         * Returns a new instance of a block's tile entity class. Called on placing the block.
025         */
026        public TileEntity createNewTileEntity(World par1World)
027        {
028            return null;
029        }
030    
031        /**
032         * Called whenever the block is added into the world. Args: world, x, y, z
033         */
034        public void onBlockAdded(World par1World, int par2, int par3, int par4) {}
035    
036        /**
037         * ejects contained items into the world, and notifies neighbours of an update, as appropriate
038         */
039        public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6)
040        {
041            TileEntity var7 = par1World.getBlockTileEntity(par2, par3, par4);
042    
043            if (var7 instanceof TileEntityPiston)
044            {
045                ((TileEntityPiston)var7).clearPistonTileEntity();
046            }
047            else
048            {
049                super.breakBlock(par1World, par2, par3, par4, par5, par6);
050            }
051        }
052    
053        /**
054         * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z
055         */
056        public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4)
057        {
058            return false;
059        }
060    
061        /**
062         * checks to see if you can place this block can be placed on that side of a block: BlockLever overrides
063         */
064        public boolean canPlaceBlockOnSide(World par1World, int par2, int par3, int par4, int par5)
065        {
066            return false;
067        }
068    
069        /**
070         * The type of render function that is called for this block
071         */
072        public int getRenderType()
073        {
074            return -1;
075        }
076    
077        /**
078         * Is this block (a) opaque and (b) a full 1m cube?  This determines whether or not to render the shared face of two
079         * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
080         */
081        public boolean isOpaqueCube()
082        {
083            return false;
084        }
085    
086        /**
087         * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
088         */
089        public boolean renderAsNormalBlock()
090        {
091            return false;
092        }
093    
094        /**
095         * Called upon block activation (right click on the block.)
096         */
097        public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
098        {
099            if (!par1World.isRemote && par1World.getBlockTileEntity(par2, par3, par4) == null)
100            {
101                par1World.setBlockWithNotify(par2, par3, par4, 0);
102                return true;
103            }
104            else
105            {
106                return false;
107            }
108        }
109    
110        /**
111         * Returns the ID of the items to drop on destruction.
112         */
113        public int idDropped(int par1, Random par2Random, int par3)
114        {
115            return 0;
116        }
117    
118        /**
119         * Drops the block items with a specified chance of dropping the specified items
120         */
121        public void dropBlockAsItemWithChance(World par1World, int par2, int par3, int par4, int par5, float par6, int par7)
122        {
123            if (!par1World.isRemote)
124            {
125                TileEntityPiston var8 = this.getTileEntityAtLocation(par1World, par2, par3, par4);
126    
127                if (var8 != null)
128                {
129                    Block.blocksList[var8.getStoredBlockID()].dropBlockAsItem(par1World, par2, par3, par4, var8.getBlockMetadata(), 0);
130                }
131            }
132        }
133    
134        /**
135         * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are
136         * their own) Args: x, y, z, neighbor blockID
137         */
138        public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5)
139        {
140            if (!par1World.isRemote && par1World.getBlockTileEntity(par2, par3, par4) == null)
141            {
142                ;
143            }
144        }
145    
146        /**
147         * gets a new TileEntityPiston created with the arguments provided.
148         */
149        public static TileEntity getTileEntity(int par0, int par1, int par2, boolean par3, boolean par4)
150        {
151            return new TileEntityPiston(par0, par1, par2, par3, par4);
152        }
153    
154        /**
155         * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been
156         * cleared to be reused)
157         */
158        public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
159        {
160            TileEntityPiston var5 = this.getTileEntityAtLocation(par1World, par2, par3, par4);
161    
162            if (var5 == null)
163            {
164                return null;
165            }
166            else
167            {
168                float var6 = var5.getProgress(0.0F);
169    
170                if (var5.isExtending())
171                {
172                    var6 = 1.0F - var6;
173                }
174    
175                return this.getAxisAlignedBB(par1World, par2, par3, par4, var5.getStoredBlockID(), var6, var5.getPistonOrientation());
176            }
177        }
178    
179        /**
180         * Updates the blocks bounds based on its current state. Args: world, x, y, z
181         */
182        public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
183        {
184            TileEntityPiston var5 = this.getTileEntityAtLocation(par1IBlockAccess, par2, par3, par4);
185    
186            if (var5 != null)
187            {
188                Block var6 = Block.blocksList[var5.getStoredBlockID()];
189    
190                if (var6 == null || var6 == this)
191                {
192                    return;
193                }
194    
195                var6.setBlockBoundsBasedOnState(par1IBlockAccess, par2, par3, par4);
196                float var7 = var5.getProgress(0.0F);
197    
198                if (var5.isExtending())
199                {
200                    var7 = 1.0F - var7;
201                }
202    
203                int var8 = var5.getPistonOrientation();
204                this.minX = var6.getBlockBoundsMinX() - (double)((float)Facing.offsetsXForSide[var8] * var7);
205                this.minY = var6.getBlockBoundsMinY() - (double)((float)Facing.offsetsYForSide[var8] * var7);
206                this.minZ = var6.getBlockBoundsMinZ() - (double)((float)Facing.offsetsZForSide[var8] * var7);
207                this.maxX = var6.getBlockBoundsMaxX() - (double)((float)Facing.offsetsXForSide[var8] * var7);
208                this.maxY = var6.getBlockBoundsMaxY() - (double)((float)Facing.offsetsYForSide[var8] * var7);
209                this.maxZ = var6.getBlockBoundsMaxZ() - (double)((float)Facing.offsetsZForSide[var8] * var7);
210            }
211        }
212    
213        public AxisAlignedBB getAxisAlignedBB(World par1World, int par2, int par3, int par4, int par5, float par6, int par7)
214        {
215            if (par5 != 0 && par5 != this.blockID)
216            {
217                AxisAlignedBB var8 = Block.blocksList[par5].getCollisionBoundingBoxFromPool(par1World, par2, par3, par4);
218    
219                if (var8 == null)
220                {
221                    return null;
222                }
223                else
224                {
225                    if (Facing.offsetsXForSide[par7] < 0)
226                    {
227                        var8.minX -= (double)((float)Facing.offsetsXForSide[par7] * par6);
228                    }
229                    else
230                    {
231                        var8.maxX -= (double)((float)Facing.offsetsXForSide[par7] * par6);
232                    }
233    
234                    if (Facing.offsetsYForSide[par7] < 0)
235                    {
236                        var8.minY -= (double)((float)Facing.offsetsYForSide[par7] * par6);
237                    }
238                    else
239                    {
240                        var8.maxY -= (double)((float)Facing.offsetsYForSide[par7] * par6);
241                    }
242    
243                    if (Facing.offsetsZForSide[par7] < 0)
244                    {
245                        var8.minZ -= (double)((float)Facing.offsetsZForSide[par7] * par6);
246                    }
247                    else
248                    {
249                        var8.maxZ -= (double)((float)Facing.offsetsZForSide[par7] * par6);
250                    }
251    
252                    return var8;
253                }
254            }
255            else
256            {
257                return null;
258            }
259        }
260    
261        /**
262         * gets the piston tile entity at the specified location
263         */
264        private TileEntityPiston getTileEntityAtLocation(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
265        {
266            TileEntity var5 = par1IBlockAccess.getBlockTileEntity(par2, par3, par4);
267            return var5 instanceof TileEntityPiston ? (TileEntityPiston)var5 : null;
268        }
269    
270        @SideOnly(Side.CLIENT)
271    
272        /**
273         * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative)
274         */
275        public int idPicked(World par1World, int par2, int par3, int par4)
276        {
277            return 0;
278        }
279    }