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.itemID, 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.itemID, 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    }