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