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 }