001    package net.minecraft.src;
002    
003    import cpw.mods.fml.common.Side;
004    import cpw.mods.fml.common.asm.SideOnly;
005    import java.util.Random;
006    
007    public class BlockSkull extends BlockContainer
008    {
009        protected BlockSkull(int par1)
010        {
011            super(par1, Material.circuits);
012            this.blockIndexInTexture = 104;
013            this.setBlockBounds(0.25F, 0.0F, 0.25F, 0.75F, 0.5F, 0.75F);
014        }
015    
016        /**
017         * The type of render function that is called for this block
018         */
019        public int getRenderType()
020        {
021            return -1;
022        }
023    
024        /**
025         * Is this block (a) opaque and (b) a full 1m cube?  This determines whether or not to render the shared face of two
026         * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
027         */
028        public boolean isOpaqueCube()
029        {
030            return false;
031        }
032    
033        /**
034         * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
035         */
036        public boolean renderAsNormalBlock()
037        {
038            return false;
039        }
040    
041        /**
042         * Updates the blocks bounds based on its current state. Args: world, x, y, z
043         */
044        public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
045        {
046            int var5 = par1IBlockAccess.getBlockMetadata(par2, par3, par4) & 7;
047    
048            switch (var5)
049            {
050                case 1:
051                default:
052                    this.setBlockBounds(0.25F, 0.0F, 0.25F, 0.75F, 0.5F, 0.75F);
053                    break;
054                case 2:
055                    this.setBlockBounds(0.25F, 0.25F, 0.5F, 0.75F, 0.75F, 1.0F);
056                    break;
057                case 3:
058                    this.setBlockBounds(0.25F, 0.25F, 0.0F, 0.75F, 0.75F, 0.5F);
059                    break;
060                case 4:
061                    this.setBlockBounds(0.5F, 0.25F, 0.25F, 1.0F, 0.75F, 0.75F);
062                    break;
063                case 5:
064                    this.setBlockBounds(0.0F, 0.25F, 0.25F, 0.5F, 0.75F, 0.75F);
065            }
066        }
067    
068        /**
069         * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been
070         * cleared to be reused)
071         */
072        public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
073        {
074            this.setBlockBoundsBasedOnState(par1World, par2, par3, par4);
075            return super.getCollisionBoundingBoxFromPool(par1World, par2, par3, par4);
076        }
077    
078        /**
079         * Called when the block is placed in the world.
080         */
081        public void onBlockPlacedBy(World par1World, int par2, int par3, int par4, EntityLiving par5EntityLiving)
082        {
083            int var6 = MathHelper.floor_double((double)(par5EntityLiving.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
084            par1World.setBlockMetadataWithNotify(par2, par3, par4, var6);
085        }
086    
087        /**
088         * Returns a new instance of a block's tile entity class. Called on placing the block.
089         */
090        public TileEntity createNewTileEntity(World par1World)
091        {
092            return new TileEntitySkull();
093        }
094    
095        @SideOnly(Side.CLIENT)
096    
097        /**
098         * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative)
099         */
100        public int idPicked(World par1World, int par2, int par3, int par4)
101        {
102            return Item.field_82799_bQ.shiftedIndex;
103        }
104    
105        /**
106         * Get the block's damage value (for use with pick block).
107         */
108        public int getDamageValue(World par1World, int par2, int par3, int par4)
109        {
110            TileEntity var5 = par1World.getBlockTileEntity(par2, par3, par4);
111            return var5 != null && var5 instanceof TileEntitySkull ? ((TileEntitySkull)var5).func_82117_a() : super.getDamageValue(par1World, par2, par3, par4);
112        }
113    
114        /**
115         * Determines the damage on the item the block drops. Used in cloth and wood.
116         */
117        public int damageDropped(int par1)
118        {
119            return par1;
120        }
121    
122        /**
123         * Drops the block items with a specified chance of dropping the specified items
124         */
125        public void dropBlockAsItemWithChance(World par1World, int par2, int par3, int par4, int par5, float par6, int par7) {}
126    
127        /**
128         * Called when the block is attempted to be harvested
129         */
130        public void onBlockHarvested(World par1World, int par2, int par3, int par4, int par5, EntityPlayer par6EntityPlayer)
131        {
132            if (par6EntityPlayer.capabilities.isCreativeMode)
133            {
134                par5 |= 8;
135                par1World.setBlockMetadataWithNotify(par2, par3, par4, par5);
136            }
137    
138            super.onBlockHarvested(par1World, par2, par3, par4, par5, par6EntityPlayer);
139        }
140    
141        /**
142         * ejects contained items into the world, and notifies neighbours of an update, as appropriate
143         */
144        public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6)
145        {
146            if (!par1World.isRemote)
147            {
148                if ((par6 & 8) == 0)
149                {
150                    this.dropBlockAsItem_do(par1World, par2, par3, par4, new ItemStack(Item.field_82799_bQ.shiftedIndex, 1, this.getDamageValue(par1World, par2, par3, par4)));
151                }
152    
153                super.breakBlock(par1World, par2, par3, par4, par5, par6);
154            }
155        }
156    
157        /**
158         * Returns the ID of the items to drop on destruction.
159         */
160        public int idDropped(int par1, Random par2Random, int par3)
161        {
162            return Item.field_82799_bQ.shiftedIndex;
163        }
164    
165        public void func_82529_a(World par1World, int par2, int par3, int par4, TileEntitySkull par5TileEntitySkull)
166        {
167            if (par5TileEntitySkull.func_82117_a() == 1 && par3 >= 2)
168            {
169                int var6 = Block.slowSand.blockID;
170                int var7;
171                EntityWither var8;
172                int var9;
173    
174                for (var7 = -2; var7 <= 0; ++var7)
175                {
176                    if (par1World.getBlockId(par2, par3 - 1, par4 + var7) == var6 && par1World.getBlockId(par2, par3 - 1, par4 + var7 + 1) == var6 && par1World.getBlockId(par2, par3 - 2, par4 + var7 + 1) == var6 && par1World.getBlockId(par2, par3 - 1, par4 + var7 + 2) == var6 && this.func_82528_d(par1World, par2, par3, par4 + var7, 1) && this.func_82528_d(par1World, par2, par3, par4 + var7 + 1, 1) && this.func_82528_d(par1World, par2, par3, par4 + var7 + 2, 1))
177                    {
178                        par1World.setBlockMetadata(par2, par3, par4 + var7, 8);
179                        par1World.setBlockMetadata(par2, par3, par4 + var7 + 1, 8);
180                        par1World.setBlockMetadata(par2, par3, par4 + var7 + 2, 8);
181                        par1World.setBlock(par2, par3, par4 + var7, 0);
182                        par1World.setBlock(par2, par3, par4 + var7 + 1, 0);
183                        par1World.setBlock(par2, par3, par4 + var7 + 2, 0);
184                        par1World.setBlock(par2, par3 - 1, par4 + var7, 0);
185                        par1World.setBlock(par2, par3 - 1, par4 + var7 + 1, 0);
186                        par1World.setBlock(par2, par3 - 1, par4 + var7 + 2, 0);
187                        par1World.setBlock(par2, par3 - 2, par4 + var7 + 1, 0);
188    
189                        if (!par1World.isRemote)
190                        {
191                            var8 = new EntityWither(par1World);
192                            var8.setLocationAndAngles((double)par2 + 0.5D, (double)par3 - 1.45D, (double)(par4 + var7) + 1.5D, 90.0F, 0.0F);
193                            var8.renderYawOffset = 90.0F;
194                            var8.func_82206_m();
195                            par1World.spawnEntityInWorld(var8);
196                        }
197    
198                        for (var9 = 0; var9 < 120; ++var9)
199                        {
200                            par1World.spawnParticle("snowballpoof", (double)par2 + par1World.rand.nextDouble(), (double)(par3 - 2) + par1World.rand.nextDouble() * 3.9D, (double)(par4 + var7 + 1) + par1World.rand.nextDouble(), 0.0D, 0.0D, 0.0D);
201                        }
202    
203                        par1World.notifyBlockChange(par2, par3, par4 + var7, 0);
204                        par1World.notifyBlockChange(par2, par3, par4 + var7 + 1, 0);
205                        par1World.notifyBlockChange(par2, par3, par4 + var7 + 2, 0);
206                        par1World.notifyBlockChange(par2, par3 - 1, par4 + var7, 0);
207                        par1World.notifyBlockChange(par2, par3 - 1, par4 + var7 + 1, 0);
208                        par1World.notifyBlockChange(par2, par3 - 1, par4 + var7 + 2, 0);
209                        par1World.notifyBlockChange(par2, par3 - 2, par4 + var7 + 1, 0);
210                        return;
211                    }
212                }
213    
214                for (var7 = -2; var7 <= 0; ++var7)
215                {
216                    if (par1World.getBlockId(par2 + var7, par3 - 1, par4) == var6 && par1World.getBlockId(par2 + var7 + 1, par3 - 1, par4) == var6 && par1World.getBlockId(par2 + var7 + 1, par3 - 2, par4) == var6 && par1World.getBlockId(par2 + var7 + 2, par3 - 1, par4) == var6 && this.func_82528_d(par1World, par2 + var7, par3, par4, 1) && this.func_82528_d(par1World, par2 + var7 + 1, par3, par4, 1) && this.func_82528_d(par1World, par2 + var7 + 2, par3, par4, 1))
217                    {
218                        par1World.setBlockMetadata(par2 + var7, par3, par4, 8);
219                        par1World.setBlockMetadata(par2 + var7 + 1, par3, par4, 8);
220                        par1World.setBlockMetadata(par2 + var7 + 2, par3, par4, 8);
221                        par1World.setBlock(par2 + var7, par3, par4, 0);
222                        par1World.setBlock(par2 + var7 + 1, par3, par4, 0);
223                        par1World.setBlock(par2 + var7 + 2, par3, par4, 0);
224                        par1World.setBlock(par2 + var7, par3 - 1, par4, 0);
225                        par1World.setBlock(par2 + var7 + 1, par3 - 1, par4, 0);
226                        par1World.setBlock(par2 + var7 + 2, par3 - 1, par4, 0);
227                        par1World.setBlock(par2 + var7 + 1, par3 - 2, par4, 0);
228    
229                        if (!par1World.isRemote)
230                        {
231                            var8 = new EntityWither(par1World);
232                            var8.setLocationAndAngles((double)(par2 + var7) + 1.5D, (double)par3 - 1.45D, (double)par4 + 0.5D, 0.0F, 0.0F);
233                            var8.func_82206_m();
234                            par1World.spawnEntityInWorld(var8);
235                        }
236    
237                        for (var9 = 0; var9 < 120; ++var9)
238                        {
239                            par1World.spawnParticle("snowballpoof", (double)(par2 + var7 + 1) + par1World.rand.nextDouble(), (double)(par3 - 2) + par1World.rand.nextDouble() * 3.9D, (double)par4 + par1World.rand.nextDouble(), 0.0D, 0.0D, 0.0D);
240                        }
241    
242                        par1World.notifyBlockChange(par2 + var7, par3, par4, 0);
243                        par1World.notifyBlockChange(par2 + var7 + 1, par3, par4, 0);
244                        par1World.notifyBlockChange(par2 + var7 + 2, par3, par4, 0);
245                        par1World.notifyBlockChange(par2 + var7, par3 - 1, par4, 0);
246                        par1World.notifyBlockChange(par2 + var7 + 1, par3 - 1, par4, 0);
247                        par1World.notifyBlockChange(par2 + var7 + 2, par3 - 1, par4, 0);
248                        par1World.notifyBlockChange(par2 + var7 + 1, par3 - 2, par4, 0);
249                        return;
250                    }
251                }
252            }
253        }
254    
255        private boolean func_82528_d(World par1World, int par2, int par3, int par4, int par5)
256        {
257            if (par1World.getBlockId(par2, par3, par4) != this.blockID)
258            {
259                return false;
260            }
261            else
262            {
263                TileEntity var6 = par1World.getBlockTileEntity(par2, par3, par4);
264                return var6 != null && var6 instanceof TileEntitySkull ? ((TileEntitySkull)var6).func_82117_a() == par5 : false;
265            }
266        }
267    }