001    package net.minecraft.block;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import java.util.List;
006    import java.util.Random;
007    import net.minecraft.block.material.Material;
008    import net.minecraft.entity.Entity;
009    import net.minecraft.entity.item.EntityItem;
010    import net.minecraft.entity.player.EntityPlayer;
011    import net.minecraft.entity.player.EntityPlayerMP;
012    import net.minecraft.item.EnumArmorMaterial;
013    import net.minecraft.item.Item;
014    import net.minecraft.item.ItemArmor;
015    import net.minecraft.item.ItemStack;
016    import net.minecraft.util.AxisAlignedBB;
017    import net.minecraft.world.World;
018    
019    public class BlockCauldron extends Block
020    {
021        public BlockCauldron(int par1)
022        {
023            super(par1, Material.iron);
024            this.blockIndexInTexture = 154;
025        }
026    
027        /**
028         * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata
029         */
030        public int getBlockTextureFromSideAndMetadata(int par1, int par2)
031        {
032            return par1 == 1 ? 138 : (par1 == 0 ? 155 : 154);
033        }
034    
035        /**
036         * if the specified block is in the given AABB, add its collision bounding box to the given list
037         */
038        public void addCollidingBlockToList(World par1World, int par2, int par3, int par4, AxisAlignedBB par5AxisAlignedBB, List par6List, Entity par7Entity)
039        {
040            this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.3125F, 1.0F);
041            super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity);
042            float var8 = 0.125F;
043            this.setBlockBounds(0.0F, 0.0F, 0.0F, var8, 1.0F, 1.0F);
044            super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity);
045            this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, var8);
046            super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity);
047            this.setBlockBounds(1.0F - var8, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
048            super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity);
049            this.setBlockBounds(0.0F, 0.0F, 1.0F - var8, 1.0F, 1.0F, 1.0F);
050            super.addCollidingBlockToList(par1World, par2, par3, par4, par5AxisAlignedBB, par6List, par7Entity);
051            this.setBlockBoundsForItemRender();
052        }
053    
054        /**
055         * Sets the block's bounds for rendering it as an item
056         */
057        public void setBlockBoundsForItemRender()
058        {
059            this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
060        }
061    
062        /**
063         * Is this block (a) opaque and (b) a full 1m cube?  This determines whether or not to render the shared face of two
064         * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
065         */
066        public boolean isOpaqueCube()
067        {
068            return false;
069        }
070    
071        /**
072         * The type of render function that is called for this block
073         */
074        public int getRenderType()
075        {
076            return 24;
077        }
078    
079        /**
080         * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
081         */
082        public boolean renderAsNormalBlock()
083        {
084            return false;
085        }
086    
087        /**
088         * Called upon block activation (right click on the block.)
089         */
090        public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
091        {
092            if (par1World.isRemote)
093            {
094                return true;
095            }
096            else
097            {
098                ItemStack var10 = par5EntityPlayer.inventory.getCurrentItem();
099    
100                if (var10 == null)
101                {
102                    return true;
103                }
104                else
105                {
106                    int var11 = par1World.getBlockMetadata(par2, par3, par4);
107    
108                    if (var10.itemID == Item.bucketWater.itemID)
109                    {
110                        if (var11 < 3)
111                        {
112                            if (!par5EntityPlayer.capabilities.isCreativeMode)
113                            {
114                                par5EntityPlayer.inventory.setInventorySlotContents(par5EntityPlayer.inventory.currentItem, new ItemStack(Item.bucketEmpty));
115                            }
116    
117                            par1World.setBlockMetadataWithNotify(par2, par3, par4, 3);
118                        }
119    
120                        return true;
121                    }
122                    else
123                    {
124                        if (var10.itemID == Item.glassBottle.itemID)
125                        {
126                            if (var11 > 0)
127                            {
128                                ItemStack var12 = new ItemStack(Item.potion, 1, 0);
129    
130                                if (!par5EntityPlayer.inventory.addItemStackToInventory(var12))
131                                {
132                                    par1World.spawnEntityInWorld(new EntityItem(par1World, (double)par2 + 0.5D, (double)par3 + 1.5D, (double)par4 + 0.5D, var12));
133                                }
134                                else if (par5EntityPlayer instanceof EntityPlayerMP)
135                                {
136                                    ((EntityPlayerMP)par5EntityPlayer).sendContainerToPlayer(par5EntityPlayer.inventoryContainer);
137                                }
138    
139                                --var10.stackSize;
140    
141                                if (var10.stackSize <= 0)
142                                {
143                                    par5EntityPlayer.inventory.setInventorySlotContents(par5EntityPlayer.inventory.currentItem, (ItemStack)null);
144                                }
145    
146                                par1World.setBlockMetadataWithNotify(par2, par3, par4, var11 - 1);
147                            }
148                        }
149                        else if (var11 > 0 && var10.getItem() instanceof ItemArmor && ((ItemArmor)var10.getItem()).getArmorMaterial() == EnumArmorMaterial.CLOTH)
150                        {
151                            ItemArmor var13 = (ItemArmor)var10.getItem();
152                            var13.removeColor(var10);
153                            par1World.setBlockMetadataWithNotify(par2, par3, par4, var11 - 1);
154                            return true;
155                        }
156    
157                        return true;
158                    }
159                }
160            }
161        }
162    
163        /**
164         * currently only used by BlockCauldron to incrament meta-data during rain
165         */
166        public void fillWithRain(World par1World, int par2, int par3, int par4)
167        {
168            if (par1World.rand.nextInt(20) == 1)
169            {
170                int var5 = par1World.getBlockMetadata(par2, par3, par4);
171    
172                if (var5 < 3)
173                {
174                    par1World.setBlockMetadataWithNotify(par2, par3, par4, var5 + 1);
175                }
176            }
177        }
178    
179        /**
180         * Returns the ID of the items to drop on destruction.
181         */
182        public int idDropped(int par1, Random par2Random, int par3)
183        {
184            return Item.cauldron.itemID;
185        }
186    
187        @SideOnly(Side.CLIENT)
188    
189        /**
190         * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative)
191         */
192        public int idPicked(World par1World, int par2, int par3, int par4)
193        {
194            return Item.cauldron.itemID;
195        }
196    }