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.setCreativeTab(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                    if (par3EntityPlayer.capabilities.isCreativeMode)
046                    {
047                        return par1ItemStack;
048                    }
049    
050                    if (--par1ItemStack.stackSize <= 0)
051                    {
052                        return event.result;
053                    }
054    
055                    if (!par3EntityPlayer.inventory.addItemStackToInventory(event.result))
056                    {
057                        par3EntityPlayer.dropPlayerItem(event.result);
058                    }
059    
060                    return par1ItemStack;
061                }
062    
063                if (var12.typeOfHit == EnumMovingObjectType.TILE)
064                {
065                    int var13 = var12.blockX;
066                    int var14 = var12.blockY;
067                    int var15 = var12.blockZ;
068    
069                    if (!par2World.canMineBlock(par3EntityPlayer, var13, var14, var15))
070                    {
071                        return par1ItemStack;
072                    }
073    
074                    if (this.isFull == 0)
075                    {
076                        if (!par3EntityPlayer.canPlayerEdit(var13, var14, var15))
077                        {
078                            return par1ItemStack;
079                        }
080    
081                        if (par2World.getBlockMaterial(var13, var14, var15) == Material.water && par2World.getBlockMetadata(var13, var14, var15) == 0)
082                        {
083                            par2World.setBlockWithNotify(var13, var14, var15, 0);
084    
085                            if (par3EntityPlayer.capabilities.isCreativeMode)
086                            {
087                                return par1ItemStack;
088                            }
089    
090                            if (--par1ItemStack.stackSize <= 0)
091                            {
092                                return new ItemStack(Item.bucketWater);
093                            }
094    
095                            if (!par3EntityPlayer.inventory.addItemStackToInventory(new ItemStack(Item.bucketWater)))
096                            {
097                                par3EntityPlayer.dropPlayerItem(new ItemStack(Item.bucketWater.shiftedIndex, 1, 0));
098                            }
099    
100                            return par1ItemStack;
101                        }
102    
103                        if (par2World.getBlockMaterial(var13, var14, var15) == Material.lava && par2World.getBlockMetadata(var13, var14, var15) == 0)
104                        {
105                            par2World.setBlockWithNotify(var13, var14, var15, 0);
106    
107                            if (par3EntityPlayer.capabilities.isCreativeMode)
108                            {
109                                return par1ItemStack;
110                            }
111    
112                            if (--par1ItemStack.stackSize <= 0)
113                            {
114                                return new ItemStack(Item.bucketLava);
115                            }
116    
117                            if (!par3EntityPlayer.inventory.addItemStackToInventory(new ItemStack(Item.bucketLava)))
118                            {
119                                par3EntityPlayer.dropPlayerItem(new ItemStack(Item.bucketLava.shiftedIndex, 1, 0));
120                            }
121    
122                            return par1ItemStack;
123                        }
124                    }
125                    else
126                    {
127                        if (this.isFull < 0)
128                        {
129                            return new ItemStack(Item.bucketEmpty);
130                        }
131    
132                        if (var12.sideHit == 0)
133                        {
134                            --var14;
135                        }
136    
137                        if (var12.sideHit == 1)
138                        {
139                            ++var14;
140                        }
141    
142                        if (var12.sideHit == 2)
143                        {
144                            --var15;
145                        }
146    
147                        if (var12.sideHit == 3)
148                        {
149                            ++var15;
150                        }
151    
152                        if (var12.sideHit == 4)
153                        {
154                            --var13;
155                        }
156    
157                        if (var12.sideHit == 5)
158                        {
159                            ++var13;
160                        }
161    
162                        if (!par3EntityPlayer.canPlayerEdit(var13, var14, var15))
163                        {
164                            return par1ItemStack;
165                        }
166    
167                        if (this.func_77875_a(par2World, var5, var7, var9, var13, var14, var15) && !par3EntityPlayer.capabilities.isCreativeMode)
168                        {
169                            return new ItemStack(Item.bucketEmpty);
170                        }
171                    }
172                }
173                else if (this.isFull == 0 && var12.entityHit instanceof EntityCow)
174                {
175                    return new ItemStack(Item.bucketMilk);
176                }
177    
178                return par1ItemStack;
179            }
180        }
181    
182        public boolean func_77875_a(World par1World, double par2, double par4, double par6, int par8, int par9, int par10)
183        {
184            if (this.isFull <= 0)
185            {
186                return false;
187            }
188            else if (!par1World.isAirBlock(par8, par9, par10) && par1World.getBlockMaterial(par8, par9, par10).isSolid())
189            {
190                return false;
191            }
192            else
193            {
194                if (par1World.provider.isHellWorld && this.isFull == Block.waterMoving.blockID)
195                {
196                    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);
197    
198                    for (int var11 = 0; var11 < 8; ++var11)
199                    {
200                        par1World.spawnParticle("largesmoke", (double)par8 + Math.random(), (double)par9 + Math.random(), (double)par10 + Math.random(), 0.0D, 0.0D, 0.0D);
201                    }
202                }
203                else
204                {
205                    par1World.setBlockAndMetadataWithNotify(par8, par9, par10, this.isFull, 0);
206                }
207    
208                return true;
209            }
210        }
211    }