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