    001    package net.minecraft.item;
    002
    003    import net.minecraft.block.Block;
    004    import net.minecraft.block.material.Material;
    005    import net.minecraft.creativetab.CreativeTabs;
    006    import net.minecraft.entity.passive.EntityCow;
    007    import net.minecraft.entity.player.EntityPlayer;
    008    import net.minecraft.util.EnumMovingObjectType;
    009    import net.minecraft.util.MovingObjectPosition;
    010    import net.minecraft.world.World;
    011
    012    import net.minecraftforge.common.MinecraftForge;
    013    import net.minecraftforge.event.Event;
    014    import net.minecraftforge.event.entity.player.FillBucketEvent;
    015
    016    public class ItemBucket extends Item
    017    {
    018        /** field for checking if the bucket has been filled. */
    019        private int isFull;
    020
    021        public ItemBucket(int par1, int par2)
    022        {
    023            super(par1);
    024            this.maxStackSize = 1;
    025            this.isFull = par2;
    026            this.setCreativeTab(CreativeTabs.tabMisc);
    027        }
    028
    029        /**
    030         * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer
    031         */
    032        public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
    033        {
    034            float var4 = 1.0F;
    035            double var5 = par3EntityPlayer.prevPosX + (par3EntityPlayer.posX - par3EntityPlayer.prevPosX) * (double)var4;
    036            double var7 = par3EntityPlayer.prevPosY + (par3EntityPlayer.posY - par3EntityPlayer.prevPosY) * (double)var4 + 1.62D - (double)par3EntityPlayer.yOffset;
    037            double var9 = par3EntityPlayer.prevPosZ + (par3EntityPlayer.posZ - par3EntityPlayer.prevPosZ) * (double)var4;
    038            boolean var11 = this.isFull == 0;
    039            MovingObjectPosition var12 = this.getMovingObjectPositionFromPlayer(par2World, par3EntityPlayer, var11);
    040
    041            if (var12 == null)
    042            {
    043                return par1ItemStack;
    044            }
    045            else
    046            {
    047                FillBucketEvent event = new FillBucketEvent(par3EntityPlayer, par1ItemStack, par2World, var12);
    048                if (MinecraftForge.EVENT_BUS.post(event))
    049                {
    050                    return par1ItemStack;
    051                }
    052
    053                if (event.getResult() == Event.Result.ALLOW)
    054                {
    055                    if (par3EntityPlayer.capabilities.isCreativeMode)
    056                    {
    057                        return par1ItemStack;
    058                    }
    059
    060                    if (--par1ItemStack.stackSize <= 0)
    061                    {
    062                        return event.result;
    063                    }
    064
    065                    if (!par3EntityPlayer.inventory.addItemStackToInventory(event.result))
    066                    {
    067                        par3EntityPlayer.dropPlayerItem(event.result);
    068                    }
    069
    070                    return par1ItemStack;
    071                }
    072
    073                if (var12.typeOfHit == EnumMovingObjectType.TILE)
    074                {
    075                    int var13 = var12.blockX;
    076                    int var14 = var12.blockY;
    077                    int var15 = var12.blockZ;
    078
    079                    if (!par2World.canMineBlock(par3EntityPlayer, var13, var14, var15))
    080                    {
    081                        return par1ItemStack;
    082                    }
    083
    084                    if (this.isFull == 0)
    085                    {
    086                        if (!par3EntityPlayer.canPlayerEdit(var13, var14, var15, var12.sideHit, par1ItemStack))
    087                        {
    088                            return par1ItemStack;
    089                        }
    090
    091                        if (par2World.getBlockMaterial(var13, var14, var15) == Material.water && par2World.getBlockMetadata(var13, var14, var15) == 0)
    092                        {
    093                            par2World.setBlockWithNotify(var13, var14, var15, 0);
    094
    095                            if (par3EntityPlayer.capabilities.isCreativeMode)
    096                            {
    097                                return par1ItemStack;
    098                            }
    099
    100                            if (--par1ItemStack.stackSize <= 0)
    101                            {
    102                                return new ItemStack(Item.bucketWater);
    103                            }
    104
    105                            if (!par3EntityPlayer.inventory.addItemStackToInventory(new ItemStack(Item.bucketWater)))
    106                            {
    107                                par3EntityPlayer.dropPlayerItem(new ItemStack(Item.bucketWater.shiftedIndex, 1, 0));
    108                            }
    109
    110                            return par1ItemStack;
    111                        }
    112
    113                        if (par2World.getBlockMaterial(var13, var14, var15) == Material.lava && par2World.getBlockMetadata(var13, var14, var15) == 0)
    114                        {
    115                            par2World.setBlockWithNotify(var13, var14, var15, 0);
    116
    117                            if (par3EntityPlayer.capabilities.isCreativeMode)
    118                            {
    119                                return par1ItemStack;
    120                            }
    121
    122                            if (--par1ItemStack.stackSize <= 0)
    123                            {
    124                                return new ItemStack(Item.bucketLava);
    125                            }
    126
    127                            if (!par3EntityPlayer.inventory.addItemStackToInventory(new ItemStack(Item.bucketLava)))
    128                            {
    129                                par3EntityPlayer.dropPlayerItem(new ItemStack(Item.bucketLava.shiftedIndex, 1, 0));
    130                            }
    131
    132                            return par1ItemStack;
    133                        }
    134                    }
    135                    else
    136                    {
    137                        if (this.isFull < 0)
    138                        {
    139                            return new ItemStack(Item.bucketEmpty);
    140                        }
    141
    142                        if (var12.sideHit == 0)
    143                        {
    144                            --var14;
    145                        }
    146
    147                        if (var12.sideHit == 1)
    148                        {
    149                            ++var14;
    150                        }
    151
    152                        if (var12.sideHit == 2)
    153                        {
    154                            --var15;
    155                        }
    156
    157                        if (var12.sideHit == 3)
    158                        {
    159                            ++var15;
    160                        }
    161
    162                        if (var12.sideHit == 4)
    163                        {
    164                            --var13;
    165                        }
    166
    167                        if (var12.sideHit == 5)
    168                        {
    169                            ++var13;
    170                        }
    171
    172                        if (!par3EntityPlayer.canPlayerEdit(var13, var14, var15, var12.sideHit, par1ItemStack))
    173                        {
    174                            return par1ItemStack;
    175                        }
    176
    177                        if (this.tryPlaceContainedLiquid(par2World, var5, var7, var9, var13, var14, var15) && !par3EntityPlayer.capabilities.isCreativeMode)
    178                        {
    179                            return new ItemStack(Item.bucketEmpty);
    180                        }
    181                    }
    182                }
    183                else if (this.isFull == 0 && var12.entityHit instanceof EntityCow)
    184                {
    185                    return new ItemStack(Item.bucketMilk);
    186                }
    187
    188                return par1ItemStack;
    189            }
    190        }
    191
    192        /**
    193         * Attempts to place the liquid contained inside the bucket.
    194         */
    195        public boolean tryPlaceContainedLiquid(World par1World, double par2, double par4, double par6, int par8, int par9, int par10)
    196        {
    197            if (this.isFull <= 0)
    198            {
    199                return false;
    200            }
    201            else if (!par1World.isAirBlock(par8, par9, par10) && par1World.getBlockMaterial(par8, par9, par10).isSolid())
    202            {
    203                return false;
    204            }
    205            else
    206            {
    207                if (par1World.provider.isHellWorld && this.isFull == Block.waterMoving.blockID)
    208                {
    209                    par1World.playSoundEffect(par2 + 0.5D, par4 + 0.5D, par6 + 0.5D, "random.fizz", 0.5F, 2.6F + (par1World.rand.nextFloat() - par1World.rand.nextFloat()) * 0.8F);
    210
    211                    for (int var11 = 0; var11 < 8; ++var11)
    212                    {
    213                        par1World.spawnParticle("largesmoke", (double)par8 + Math.random(), (double)par9 + Math.random(), (double)par10 + Math.random(), 0.0D, 0.0D, 0.0D);
    214                    }
    215                }
    216                else
    217                {
    218                    par1World.setBlockAndMetadataWithNotify(par8, par9, par10, this.isFull, 0);
    219                }
    220
    221                return true;
    222            }
    223        }
    224    }