aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0912-Fix-inconsistencies-in-dispense-events-regarding-sta.patch
diff options
context:
space:
mode:
authorJake Potrebic <[email protected]>2023-06-08 10:25:32 -0700
committerJake Potrebic <[email protected]>2023-06-08 10:25:32 -0700
commit870dafe358f4896c3628407093badfb4600fdc29 (patch)
treeb19b5a76f1b084ffb9ce5ffeef5d2b6ef0610330 /patches/server/0912-Fix-inconsistencies-in-dispense-events-regarding-sta.patch
parent1a0280ccc061b692bfb251a5d90f0c98cd91c4c7 (diff)
downloadPaper-870dafe358f4896c3628407093badfb4600fdc29.tar.gz
Paper-870dafe358f4896c3628407093badfb4600fdc29.zip
add 1 more networking patch and add comments to dropped patches
Diffstat (limited to 'patches/server/0912-Fix-inconsistencies-in-dispense-events-regarding-sta.patch')
-rw-r--r--patches/server/0912-Fix-inconsistencies-in-dispense-events-regarding-sta.patch525
1 files changed, 0 insertions, 525 deletions
diff --git a/patches/server/0912-Fix-inconsistencies-in-dispense-events-regarding-sta.patch b/patches/server/0912-Fix-inconsistencies-in-dispense-events-regarding-sta.patch
deleted file mode 100644
index 923b2ffa50..0000000000
--- a/patches/server/0912-Fix-inconsistencies-in-dispense-events-regarding-sta.patch
+++ /dev/null
@@ -1,525 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jake Potrebic <[email protected]>
-Date: Sun, 11 Dec 2022 23:47:22 -0800
-Subject: [PATCH] Fix inconsistencies in dispense events regarding stack size
-
-The javadocs for BlockDispenseEvent suggest the ItemStack is a single
-item which is being dispensed. Before this fix, sometimes it was the whole
-stack before a single item had been taken. This fixes that so the stack size
-is always 1.
-
-diff --git a/src/main/java/net/minecraft/core/dispenser/AbstractProjectileDispenseBehavior.java b/src/main/java/net/minecraft/core/dispenser/AbstractProjectileDispenseBehavior.java
-index 2542cf94ac76871f4ff02c3524e8606c96f50cc7..309ad5a1da6b3a297d5526cd9247359ac5f49406 100644
---- a/src/main/java/net/minecraft/core/dispenser/AbstractProjectileDispenseBehavior.java
-+++ b/src/main/java/net/minecraft/core/dispenser/AbstractProjectileDispenseBehavior.java
-@@ -28,7 +28,7 @@ public abstract class AbstractProjectileDispenseBehavior extends DefaultDispense
-
- // CraftBukkit start
- // iprojectile.shoot((double) enumdirection.getStepX(), (double) ((float) enumdirection.getStepY() + 0.1F), (double) enumdirection.getStepZ(), this.getPower(), this.getUncertainty());
-- ItemStack itemstack1 = stack.split(1);
-+ ItemStack itemstack1 = stack.copyWithCount(1); // Paper - shrink below and single item in event
- org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1);
-
-@@ -38,12 +38,13 @@ public abstract class AbstractProjectileDispenseBehavior extends DefaultDispense
- }
-
- if (event.isCancelled()) {
-- stack.grow(1);
-+ // stack.grow(1); // Paper - shrink below
- return stack;
- }
-
-+ boolean shrink = true; // Paper
- if (!event.getItem().equals(craftItem)) {
-- stack.grow(1);
-+ shrink = false; // Paper - shrink below
- // Chain to handler for new item
- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
- DispenseItemBehavior idispensebehavior = (DispenseItemBehavior) DispenserBlock.DISPENSER_REGISTRY.get(eventStack.getItem());
-@@ -57,7 +58,7 @@ public abstract class AbstractProjectileDispenseBehavior extends DefaultDispense
- ((Entity) iprojectile).projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource((DispenserBlockEntity) pointer.getEntity());
- // CraftBukkit end
- worldserver.addFreshEntity(iprojectile);
-- // itemstack.shrink(1); // CraftBukkit - Handled during event processing
-+ if (shrink) stack.shrink(1); // Paper - actually handle here
- return stack;
- }
-
-diff --git a/src/main/java/net/minecraft/core/dispenser/BoatDispenseItemBehavior.java b/src/main/java/net/minecraft/core/dispenser/BoatDispenseItemBehavior.java
-index 03baafa6884bba08c2d7646706a5480baf009d87..573244877f096c4ff4c68f7fcfd21f7423da1104 100644
---- a/src/main/java/net/minecraft/core/dispenser/BoatDispenseItemBehavior.java
-+++ b/src/main/java/net/minecraft/core/dispenser/BoatDispenseItemBehavior.java
-@@ -55,7 +55,7 @@ public class BoatDispenseItemBehavior extends DefaultDispenseItemBehavior {
-
- // Object object = this.isChestBoat ? new ChestBoat(worldserver, d1, d2 + d4, d3) : new EntityBoat(worldserver, d1, d2 + d4, d3);
- // CraftBukkit start
-- ItemStack itemstack1 = stack.split(1);
-+ ItemStack itemstack1 = stack.copyWithCount(1); // Paper - shrink at end and single item in event
- org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1);
-
-@@ -65,12 +65,13 @@ public class BoatDispenseItemBehavior extends DefaultDispenseItemBehavior {
- }
-
- if (event.isCancelled()) {
-- stack.grow(1);
-+ // stack.grow(1); // Paper - shrink below
- return stack;
- }
-
-+ boolean shrink = true; // Paper
- if (!event.getItem().equals(craftItem)) {
-- stack.grow(1);
-+ shrink = false; // Paper - shrink below
- // Chain to handler for new item
- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
- DispenseItemBehavior idispensebehavior = (DispenseItemBehavior) DispenserBlock.DISPENSER_REGISTRY.get(eventStack.getItem());
-@@ -85,8 +86,7 @@ public class BoatDispenseItemBehavior extends DefaultDispenseItemBehavior {
-
- ((Boat) object).setVariant(this.type);
- ((Boat) object).setYRot(enumdirection.toYRot());
-- if (!worldserver.addFreshEntity((Entity) object)) stack.grow(1); // CraftBukkit
-- // itemstack.shrink(1); // CraftBukkit - handled during event processing
-+ if (worldserver.addFreshEntity((Entity) object) && shrink) stack.shrink(1); // Paper - if entity add was successful and supposed to shrink
- return stack;
- }
-
-diff --git a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java
-index 876f44845a02b02c93233b302c7306eff40f1468..b4f5dbe9022dd20437c15c4f6fbe2ac06dacbadb 100644
---- a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java
-+++ b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java
-@@ -217,7 +217,7 @@ public interface DispenseItemBehavior {
-
- // CraftBukkit start
- ServerLevel worldserver = pointer.getLevel();
-- ItemStack itemstack1 = stack.split(1);
-+ ItemStack itemstack1 = stack.copyWithCount(1); // Paper - shrink below and single item in event
- org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1);
-
-@@ -227,12 +227,13 @@ public interface DispenseItemBehavior {
- }
-
- if (event.isCancelled()) {
-- stack.grow(1);
-+ // stack.grow(1); // Paper - shrink below
- return stack;
- }
-
-+ boolean shrink = true; // Paper
- if (!event.getItem().equals(craftItem)) {
-- stack.grow(1);
-+ shrink = false; // Paper - shrink below
- // Chain to handler for new item
- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
- DispenseItemBehavior idispensebehavior = (DispenseItemBehavior) DispenserBlock.DISPENSER_REGISTRY.get(eventStack.getItem());
-@@ -249,7 +250,7 @@ public interface DispenseItemBehavior {
- return ItemStack.EMPTY;
- }
-
-- // itemstack.shrink(1); // Handled during event processing
-+ if (shrink) stack.shrink(1); // Paper - actually handle here
- // CraftBukkit end
- pointer.getLevel().gameEvent((Entity) null, GameEvent.ENTITY_PLACE, pointer.getPos());
- return stack;
-@@ -271,7 +272,7 @@ public interface DispenseItemBehavior {
- ServerLevel worldserver = pointer.getLevel();
-
- // CraftBukkit start
-- ItemStack itemstack1 = stack.split(1);
-+ ItemStack itemstack1 = stack.copyWithCount(1); // Paper - shrink below and single item in event
- org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1);
-
-@@ -281,12 +282,13 @@ public interface DispenseItemBehavior {
- }
-
- if (event.isCancelled()) {
-- stack.grow(1);
-+ // stack.grow(1); // Paper - shrink below
- return stack;
- }
-
-+ boolean shrink = true; // Paper
- if (!event.getItem().equals(craftItem)) {
-- stack.grow(1);
-+ shrink = false; // Paper - shrink below
- // Chain to handler for new item
- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
- DispenseItemBehavior idispensebehavior = (DispenseItemBehavior) DispenserBlock.DISPENSER_REGISTRY.get(eventStack.getItem());
-@@ -303,7 +305,7 @@ public interface DispenseItemBehavior {
- ArmorStand entityarmorstand = (ArmorStand) EntityType.ARMOR_STAND.spawn(worldserver, stack.getTag(), consumer, blockposition, MobSpawnType.DISPENSER, false, false);
-
- if (entityarmorstand != null) {
-- // itemstack.shrink(1); // CraftBukkit - Handled during event processing
-+ if (shrink) stack.shrink(1); // Paper - actually handle here
- }
-
- return stack;
-@@ -325,7 +327,7 @@ public interface DispenseItemBehavior {
-
- if (!list.isEmpty()) {
- // CraftBukkit start
-- ItemStack itemstack1 = stack.split(1);
-+ ItemStack itemstack1 = stack.copyWithCount(1); // Paper - shrink below and single item in event
- Level world = pointer.getLevel();
- org.bukkit.block.Block block = world.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1);
-@@ -336,12 +338,13 @@ public interface DispenseItemBehavior {
- }
-
- if (event.isCancelled()) {
-- stack.grow(1);
-+ // stack.grow(1); // Paper - shrink below
- return stack;
- }
-
-+ boolean shrink = true; // Paper
- if (!event.getItem().equals(craftItem)) {
-- stack.grow(1);
-+ shrink = false; // Paper - shrink below
- // Chain to handler for new item
- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
- DispenseItemBehavior idispensebehavior = (DispenseItemBehavior) DispenserBlock.DISPENSER_REGISTRY.get(eventStack.getItem());
-@@ -352,7 +355,7 @@ public interface DispenseItemBehavior {
- }
- // CraftBukkit end
- ((Saddleable) list.get(0)).equipSaddle(SoundSource.BLOCKS, CraftItemStack.asNMSCopy(event.getItem())); // Paper - Fix saddles losing nbt data - MC-191591
-- // itemstack.shrink(1); // CraftBukkit - handled above
-+ if (shrink) stack.shrink(1); // Paper - actually handle here
- this.setSuccess(true);
- return stack;
- } else {
-@@ -380,7 +383,7 @@ public interface DispenseItemBehavior {
- } while (!entityhorseabstract.isArmor(stack) || entityhorseabstract.isWearingArmor() || !entityhorseabstract.isTamed());
-
- // CraftBukkit start
-- ItemStack itemstack1 = stack.split(1);
-+ ItemStack itemstack1 = stack.copyWithCount(1); // Paper - shrink below and single item in event
- Level world = pointer.getLevel();
- org.bukkit.block.Block block = world.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1);
-@@ -391,12 +394,13 @@ public interface DispenseItemBehavior {
- }
-
- if (event.isCancelled()) {
-- stack.grow(1);
-+ // stack.grow(1); // Paper - shrink below
- return stack;
- }
-
-+ boolean shrink = true; // Paper
- if (!event.getItem().equals(craftItem)) {
-- stack.grow(1);
-+ shrink = false; // Paper - shrink below
- // Chain to handler for new item
- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
- DispenseItemBehavior idispensebehavior = (DispenseItemBehavior) DispenserBlock.DISPENSER_REGISTRY.get(eventStack.getItem());
-@@ -406,6 +410,7 @@ public interface DispenseItemBehavior {
- }
- }
-
-+ if (shrink) stack.shrink(1); // Paper - shrink here
- entityhorseabstract.getSlot(401).set(CraftItemStack.asNMSCopy(event.getItem()));
- // CraftBukkit end
- this.setSuccess(true);
-@@ -452,7 +457,7 @@ public interface DispenseItemBehavior {
- entityhorsechestedabstract = (AbstractChestedHorse) iterator1.next();
- // CraftBukkit start
- } while (!entityhorsechestedabstract.isTamed());
-- ItemStack itemstack1 = stack.split(1);
-+ ItemStack itemstack1 = stack.copyWithCount(1); // Paper - shrink below
- Level world = pointer.getLevel();
- org.bukkit.block.Block block = world.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1);
-@@ -463,10 +468,13 @@ public interface DispenseItemBehavior {
- }
-
- if (event.isCancelled()) {
-+ // stack.grow(1); // Paper - shrink below (this was actually missing and should be here, added it commented out just for less confusion)
- return stack;
- }
-
-+ boolean shrink = true; // Paper
- if (!event.getItem().equals(craftItem)) {
-+ shrink = false; // Paper - shrink below (this was actually missing and should be here, added it commented out just for less confusion)
- // Chain to handler for new item
- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
- DispenseItemBehavior idispensebehavior = (DispenseItemBehavior) DispenserBlock.DISPENSER_REGISTRY.get(eventStack.getItem());
-@@ -478,7 +486,7 @@ public interface DispenseItemBehavior {
- entityhorsechestedabstract.getSlot(499).set(CraftItemStack.asNMSCopy(event.getItem()));
- // CraftBukkit end
-
-- // itemstack.shrink(1); // CraftBukkit - handled above
-+ if (shrink) stack.shrink(1); // Paper - actually handle here
- this.setSuccess(true);
- return stack;
- }
-@@ -489,7 +497,7 @@ public interface DispenseItemBehavior {
- Direction enumdirection = (Direction) pointer.getBlockState().getValue(DispenserBlock.FACING);
- // CraftBukkit start
- ServerLevel worldserver = pointer.getLevel();
-- ItemStack itemstack1 = stack.split(1);
-+ ItemStack itemstack1 = stack.copyWithCount(1); // Paper - shrink below and single item in event
- org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1);
-
-@@ -499,12 +507,13 @@ public interface DispenseItemBehavior {
- }
-
- if (event.isCancelled()) {
-- stack.grow(1);
-+ // stack.grow(1); // Paper - shrink below
- return stack;
- }
-
-+ boolean shrink = true; // Paper
- if (!event.getItem().equals(craftItem)) {
-- stack.grow(1);
-+ shrink = false; // Paper - shrink below
- // Chain to handler for new item
- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
- DispenseItemBehavior idispensebehavior = (DispenseItemBehavior) DispenserBlock.DISPENSER_REGISTRY.get(eventStack.getItem());
-@@ -521,7 +530,7 @@ public interface DispenseItemBehavior {
- DispenseItemBehavior.setEntityPokingOutOfBlock(pointer, entityfireworks, enumdirection);
- entityfireworks.shoot((double) enumdirection.getStepX(), (double) enumdirection.getStepY(), (double) enumdirection.getStepZ(), 0.5F, 1.0F);
- pointer.getLevel().addFreshEntity(entityfireworks);
-- // itemstack.shrink(1); // Handled during event processing
-+ if (shrink) stack.shrink(1); // Paper - actually handle here
- // CraftBukkit end
- return stack;
- }
-@@ -546,7 +555,7 @@ public interface DispenseItemBehavior {
- double d5 = randomsource.triangle((double) enumdirection.getStepZ(), 0.11485000000000001D);
-
- // CraftBukkit start
-- ItemStack itemstack1 = stack.split(1);
-+ ItemStack itemstack1 = stack.copyWithCount(1); // Paper - shrink below and single item in event
- org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1);
-
-@@ -556,12 +565,13 @@ public interface DispenseItemBehavior {
- }
-
- if (event.isCancelled()) {
-- stack.grow(1);
-+ // stack.grow(1); // Paper - shrink at end
- return stack;
- }
-
-+ boolean shrink = true; // Paper
- if (!event.getItem().equals(craftItem)) {
-- stack.grow(1);
-+ shrink = false; // Paper - shrink at end
- // Chain to handler for new item
- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
- DispenseItemBehavior idispensebehavior = (DispenseItemBehavior) DispenserBlock.DISPENSER_REGISTRY.get(eventStack.getItem());
-@@ -576,7 +586,7 @@ public interface DispenseItemBehavior {
- entitysmallfireball.projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource((DispenserBlockEntity) pointer.getEntity());
-
- worldserver.addFreshEntity(entitysmallfireball);
-- // itemstack.shrink(1); // Handled during event processing
-+ if (shrink) stack.shrink(1); // Paper - actually handle here
- // CraftBukkit end
- return stack;
- }
-@@ -620,7 +630,7 @@ public interface DispenseItemBehavior {
- BlockState iblockdata = worldserver.getBlockState(blockposition);
- if (iblockdata.isAir() || iblockdata.canBeReplaced() || (dispensiblecontaineritem instanceof BucketItem && iblockdata.getBlock() instanceof LiquidBlockContainer && ((LiquidBlockContainer) iblockdata.getBlock()).canPlaceLiquid(worldserver, blockposition, iblockdata, ((BucketItem) dispensiblecontaineritem).content))) {
- org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
-- CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack);
-+ CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack.copyWithCount(1)); // Paper - single item in event
-
- BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(x, y, z));
- if (!DispenserBlock.eventFired) {
-@@ -693,7 +703,7 @@ public interface DispenseItemBehavior {
-
- // CraftBukkit start
- org.bukkit.block.Block bukkitBlock = worldserver.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
-- CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack);
-+ CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack.copyWithCount(1)); // Paper - single item in event
-
- BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ()));
- if (!DispenserBlock.eventFired) {
-@@ -740,7 +750,7 @@ public interface DispenseItemBehavior {
-
- // CraftBukkit start
- org.bukkit.block.Block bukkitBlock = worldserver.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
-- CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack);
-+ CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack); // Paper - ignore stack size on damageable items
-
- BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0));
- if (!DispenserBlock.eventFired) {
-@@ -801,7 +811,7 @@ public interface DispenseItemBehavior {
- BlockPos blockposition = pointer.getPos().relative((Direction) pointer.getBlockState().getValue(DispenserBlock.FACING));
- // CraftBukkit start
- org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
-- CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack);
-+ CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack.copyWithCount(1)); // Paper - single item in event
-
- BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0));
- if (!DispenserBlock.eventFired) {
-@@ -867,7 +877,7 @@ public interface DispenseItemBehavior {
- // CraftBukkit start
- // EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(worldserver, (double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D, (EntityLiving) null);
-
-- ItemStack itemstack1 = stack.split(1);
-+ ItemStack itemstack1 = stack.copyWithCount(1); // Paper - shrink at end and single item in event
- org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1);
-
-@@ -877,12 +887,13 @@ public interface DispenseItemBehavior {
- }
-
- if (event.isCancelled()) {
-- stack.grow(1);
-+ // stack.grow(1); // Paper - shrink below
- return stack;
- }
-
-+ boolean shrink = true; // Paper
- if (!event.getItem().equals(craftItem)) {
-- stack.grow(1);
-+ shrink = false; // Paper - shrink below
- // Chain to handler for new item
- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
- DispenseItemBehavior idispensebehavior = (DispenseItemBehavior) DispenserBlock.DISPENSER_REGISTRY.get(eventStack.getItem());
-@@ -898,7 +909,7 @@ public interface DispenseItemBehavior {
- worldserver.addFreshEntity(entitytntprimed);
- worldserver.playSound((Player) null, entitytntprimed.getX(), entitytntprimed.getY(), entitytntprimed.getZ(), SoundEvents.TNT_PRIMED, SoundSource.BLOCKS, 1.0F, 1.0F);
- worldserver.gameEvent((Entity) null, GameEvent.ENTITY_PLACE, blockposition);
-- // itemstack.shrink(1); // CraftBukkit - handled above
-+ if (shrink) stack.shrink(1); // Paper - actually handle here
- return stack;
- }
- });
-@@ -925,7 +936,7 @@ public interface DispenseItemBehavior {
-
- // CraftBukkit start
- org.bukkit.block.Block bukkitBlock = worldserver.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
-- CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack);
-+ CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack.copyWithCount(1)); // Paper - single item in event
-
- BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ()));
- if (!DispenserBlock.eventFired) {
-@@ -974,7 +985,7 @@ public interface DispenseItemBehavior {
-
- // CraftBukkit start
- org.bukkit.block.Block bukkitBlock = worldserver.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
-- CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack);
-+ CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack.copyWithCount(1)); // Paper - single item in event
-
- BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ()));
- if (!DispenserBlock.eventFired) {
-@@ -1047,7 +1058,7 @@ public interface DispenseItemBehavior {
-
- // CraftBukkit start
- org.bukkit.block.Block bukkitBlock = worldserver.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
-- CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack);
-+ CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack.copyWithCount(1)); // Paper - only single item in event
-
- BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ()));
- if (!DispenserBlock.eventFired) {
-diff --git a/src/main/java/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java b/src/main/java/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java
-index 8b2e9d11f61276f53e7d15af7a119569c0b661fc..9b0049dfeaec9b688bf276f2ac2b18943b5696b2 100644
---- a/src/main/java/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java
-+++ b/src/main/java/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java
-@@ -37,7 +37,7 @@ public class ShearsDispenseItemBehavior extends OptionalDispenseItemBehavior {
- ServerLevel worldserver = pointer.getLevel();
- // CraftBukkit start
- org.bukkit.block.Block bukkitBlock = worldserver.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
-- CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack);
-+ CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack); // Paper - ignore stack size on damageable items
-
- BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0));
- if (!DispenserBlock.eventFired) {
-diff --git a/src/main/java/net/minecraft/core/dispenser/ShulkerBoxDispenseBehavior.java b/src/main/java/net/minecraft/core/dispenser/ShulkerBoxDispenseBehavior.java
-index 38b5d8f7b66f5130dbd126957a4a1e59ec543e4a..0159ed9cbc644c39fa79e62327f13375193fdc98 100644
---- a/src/main/java/net/minecraft/core/dispenser/ShulkerBoxDispenseBehavior.java
-+++ b/src/main/java/net/minecraft/core/dispenser/ShulkerBoxDispenseBehavior.java
-@@ -34,7 +34,7 @@ public class ShulkerBoxDispenseBehavior extends OptionalDispenseItemBehavior {
-
- // CraftBukkit start
- org.bukkit.block.Block bukkitBlock = pointer.getLevel().getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
-- CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack);
-+ CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack.copyWithCount(1)); // Paper - single item in event
-
- BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ()));
- if (!DispenserBlock.eventFired) {
-diff --git a/src/main/java/net/minecraft/world/item/ArmorItem.java b/src/main/java/net/minecraft/world/item/ArmorItem.java
-index 98aae5bb3cff07fcc081ad4d6c2be8728f3d1637..d7a0cbde8f8c99276307502674c71463fbe7e89c 100644
---- a/src/main/java/net/minecraft/world/item/ArmorItem.java
-+++ b/src/main/java/net/minecraft/world/item/ArmorItem.java
-@@ -61,7 +61,7 @@ public class ArmorItem extends Item implements Equipable {
- } else {
- LivingEntity entityliving = (LivingEntity) list.get(0);
- EquipmentSlot enumitemslot = Mob.getEquipmentSlotForItem(armor);
-- ItemStack itemstack1 = armor.split(1);
-+ ItemStack itemstack1 = armor.copyWithCount(1); // Paper - shrink below and single item in event
- // CraftBukkit start
- Level world = pointer.getLevel();
- org.bukkit.block.Block block = world.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
-@@ -73,12 +73,13 @@ public class ArmorItem extends Item implements Equipable {
- }
-
- if (event.isCancelled()) {
-- armor.grow(1);
-+ // armor.grow(1); // Paper - shrink below
- return false;
- }
-
-+ boolean shrink = true; // Paper
- if (!event.getItem().equals(craftItem)) {
-- armor.grow(1);
-+ shrink = false; // Paper - shrink below
- // Chain to handler for new item
- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
- DispenseItemBehavior idispensebehavior = (DispenseItemBehavior) DispenserBlock.DISPENSER_REGISTRY.get(eventStack.getItem());
-@@ -95,6 +96,7 @@ public class ArmorItem extends Item implements Equipable {
- ((Mob) entityliving).setPersistenceRequired();
- }
-
-+ if (shrink) armor.shrink(1); // Paper
- return true;
- }
- }
-diff --git a/src/main/java/net/minecraft/world/item/MinecartItem.java b/src/main/java/net/minecraft/world/item/MinecartItem.java
-index 127a799f7848b32664b77bf67847ca6b8ac9a90d..c6d2f764efa9b8bec730bbe757d480e365b25ccc 100644
---- a/src/main/java/net/minecraft/world/item/MinecartItem.java
-+++ b/src/main/java/net/minecraft/world/item/MinecartItem.java
-@@ -62,7 +62,7 @@ public class MinecartItem extends Item {
-
- // CraftBukkit start
- // EntityMinecartAbstract entityminecartabstract = EntityMinecartAbstract.createMinecart(worldserver, d0, d1 + d3, d2, ((ItemMinecart) itemstack.getItem()).type);
-- ItemStack itemstack1 = stack.split(1);
-+ ItemStack itemstack1 = stack.copyWithCount(1); // Paper - shrink below and single item in event
- org.bukkit.block.Block block2 = worldserver.getWorld().getBlockAt(pointer.getPos().getX(), pointer.getPos().getY(), pointer.getPos().getZ());
- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1);
-
-@@ -72,12 +72,13 @@ public class MinecartItem extends Item {
- }
-
- if (event.isCancelled()) {
-- stack.grow(1);
-+ // stack.grow(1); // Paper - shrink below
- return stack;
- }
-
-+ boolean shrink = true; // Paper
- if (!event.getItem().equals(craftItem)) {
-- stack.grow(1);
-+ shrink = false; // Paper - shrink below
- // Chain to handler for new item
- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
- DispenseItemBehavior idispensebehavior = (DispenseItemBehavior) DispenserBlock.DISPENSER_REGISTRY.get(eventStack.getItem());
-@@ -94,8 +95,7 @@ public class MinecartItem extends Item {
- entityminecartabstract.setCustomName(stack.getHoverName());
- }
-
-- if (!worldserver.addFreshEntity(entityminecartabstract)) stack.grow(1);
-- // itemstack.shrink(1); // CraftBukkit - handled during event processing
-+ if (worldserver.addFreshEntity(entityminecartabstract) && shrink) stack.shrink(1); // Paper - actually handle here
- // CraftBukkit end
- return stack;
- }