--- a/net/minecraft/world/item/ItemBucket.java +++ b/net/minecraft/world/item/ItemBucket.java @@ -31,6 +31,16 @@ import net.minecraft.world.phys.MovingObjectPosition; import net.minecraft.world.phys.MovingObjectPositionBlock; +// CraftBukkit start +import net.minecraft.network.protocol.game.PacketPlayOutBlockChange; +import net.minecraft.server.level.WorldServer; +import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.util.DummyGeneratorAccess; +import org.bukkit.event.player.PlayerBucketEmptyEvent; +import org.bukkit.event.player.PlayerBucketFillEvent; +// CraftBukkit end + public class ItemBucket extends Item implements DispensibleContainerItem { public final FluidType content; @@ -61,6 +71,16 @@ iblockdata = world.getType(blockposition); if (iblockdata.getBlock() instanceof IFluidSource) { IFluidSource ifluidsource = (IFluidSource) iblockdata.getBlock(); + // CraftBukkit start + ItemStack dummyFluid = ifluidsource.removeFluid(DummyGeneratorAccess.INSTANCE, blockposition, iblockdata); + PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent((WorldServer) world, entityhuman, blockposition, blockposition, movingobjectpositionblock.getDirection(), itemstack, dummyFluid.getItem()); + + if (event.isCancelled()) { + ((EntityPlayer) entityhuman).connection.sendPacket(new PacketPlayOutBlockChange(world, blockposition)); // SPIGOT-5163 (see PlayerInteractManager) + ((EntityPlayer) entityhuman).getBukkitEntity().updateInventory(); // SPIGOT-4541 + return InteractionResultWrapper.fail(itemstack); + } + // CraftBukkit end ItemStack itemstack1 = ifluidsource.removeFluid(world, blockposition, iblockdata); if (!itemstack1.isEmpty()) { @@ -69,7 +89,7 @@ entityhuman.playSound(soundeffect, 1.0F, 1.0F); }); world.a((Entity) entityhuman, GameEvent.FLUID_PICKUP, blockposition); - ItemStack itemstack2 = ItemLiquidUtil.a(itemstack, entityhuman, itemstack1); + ItemStack itemstack2 = ItemLiquidUtil.a(itemstack, entityhuman, CraftItemStack.asNMSCopy(event.getItemStack())); // CraftBukkit if (!world.isClientSide) { CriterionTriggers.FILLED_BUCKET.a((EntityPlayer) entityhuman, itemstack1); @@ -84,7 +104,7 @@ iblockdata = world.getType(blockposition); BlockPosition blockposition2 = iblockdata.getBlock() instanceof IFluidContainer && this.content == FluidTypes.WATER ? blockposition : blockposition1; - if (this.a(entityhuman, world, blockposition2, movingobjectpositionblock)) { + if (this.a(entityhuman, world, blockposition2, movingobjectpositionblock, movingobjectpositionblock.getDirection(), blockposition, itemstack)) { // CraftBukkit this.a(entityhuman, world, itemstack, blockposition2); if (entityhuman instanceof EntityPlayer) { CriterionTriggers.PLACED_BLOCK.a((EntityPlayer) entityhuman, blockposition2, itemstack); @@ -111,6 +131,11 @@ @Override public boolean a(@Nullable EntityHuman entityhuman, World world, BlockPosition blockposition, @Nullable MovingObjectPositionBlock movingobjectpositionblock) { + return a(entityhuman, world, blockposition, movingobjectpositionblock, null, null, null); + } + + public boolean a(EntityHuman entityhuman, World world, BlockPosition blockposition, @Nullable MovingObjectPositionBlock movingobjectpositionblock, EnumDirection enumdirection, BlockPosition clicked, ItemStack itemstack) { + // CraftBukkit end if (!(this.content instanceof FluidTypeFlowing)) { return false; } else { @@ -120,8 +145,18 @@ boolean flag = iblockdata.a(this.content); boolean flag1 = iblockdata.isAir() || flag || block instanceof IFluidContainer && ((IFluidContainer) block).canPlace(world, blockposition, iblockdata, this.content); + // CraftBukkit start + if (flag1 && entityhuman != null) { + PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent((WorldServer) world, entityhuman, blockposition, clicked, enumdirection, itemstack); + if (event.isCancelled()) { + ((EntityPlayer) entityhuman).connection.sendPacket(new PacketPlayOutBlockChange(world, blockposition)); // SPIGOT-4238: needed when looking through entity + ((EntityPlayer) entityhuman).getBukkitEntity().updateInventory(); // SPIGOT-4541 + return false; + } + } + // CraftBukkit end if (!flag1) { - return movingobjectpositionblock != null && this.a(entityhuman, world, movingobjectpositionblock.getBlockPosition().shift(movingobjectpositionblock.getDirection()), (MovingObjectPositionBlock) null); + return movingobjectpositionblock != null && this.a(entityhuman, world, movingobjectpositionblock.getBlockPosition().shift(movingobjectpositionblock.getDirection()), (MovingObjectPositionBlock) null, enumdirection, clicked, itemstack); // CraftBukkit } else if (world.getDimensionManager().isNether() && this.content.a((Tag) TagsFluid.WATER)) { int i = blockposition.getX(); int j = blockposition.getY();