    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.shiftedIndex)
    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.shiftedIndex)
    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.shiftedIndex;
    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.shiftedIndex;
    195        }
    196    }