diff --git a/leaf-server/minecraft-patches/features/0204-Paper-PR-Fix-cancelled-Projectile-Events-still-consu.patch b/leaf-server/minecraft-patches/features/0204-Paper-PR-Fix-cancelled-Projectile-Events-still-consu.patch index 1840e252..dadc3d43 100644 --- a/leaf-server/minecraft-patches/features/0204-Paper-PR-Fix-cancelled-Projectile-Events-still-consu.patch +++ b/leaf-server/minecraft-patches/features/0204-Paper-PR-Fix-cancelled-Projectile-Events-still-consu.patch @@ -65,7 +65,7 @@ index d49a5360d4a21e5b15bac94a823831e25d242a3d..04286fdba0c22d5b6d7b3ab71ee1a1fe CriteriaTriggers.SHOT_CROSSBOW.trigger(serverPlayer, weapon); serverPlayer.awardStat(Stats.ITEM_USED.get(weapon.getItem())); diff --git a/net/minecraft/world/item/ProjectileWeaponItem.java b/net/minecraft/world/item/ProjectileWeaponItem.java -index f12b9e4e8a78c713782af548d1cb15ef363305b4..d24b5e8baa6920d8736fe8686200bf39b0ae727a 100644 +index f12b9e4e8a78c713782af548d1cb15ef363305b4..799652853481b6d93619d6afaf82185060ebaa41 100644 --- a/net/minecraft/world/item/ProjectileWeaponItem.java +++ b/net/minecraft/world/item/ProjectileWeaponItem.java @@ -40,7 +40,20 @@ public abstract class ProjectileWeaponItem extends Item { @@ -133,7 +133,7 @@ index f12b9e4e8a78c713782af548d1cb15ef363305b4..d24b5e8baa6920d8736fe8686200bf39 if (event.getProjectile() == projectile.getBukkitEntity()) { if (Projectile.spawnProjectile( -@@ -79,7 +114,26 @@ public abstract class ProjectileWeaponItem extends Item { +@@ -79,7 +114,27 @@ public abstract class ProjectileWeaponItem extends Item { level, itemStack ).isRemoved()) { @@ -150,18 +150,19 @@ index f12b9e4e8a78c713782af548d1cb15ef363305b4..d24b5e8baa6920d8736fe8686200bf39 + if (!event.shouldConsumeItem() && projectile instanceof final AbstractArrow abstractArrow) + abstractArrow.pickup = AbstractArrow.Pickup.CREATIVE_ONLY; + if (event.shouldConsumeItem()) { ++ // Update item reference to explicitly use crossbow on hand, since plugin can change item in inventory during this stage ++ weapon = shooter.getItemInHand(hand); + if (weapon.is(Items.CROSSBOW)) { -+ List newProjectiles = new ArrayList<>(projectileItems); ++ List newProjectiles = new ArrayList<>(weapon.get(DataComponents.CHARGED_PROJECTILES).getItems()); + newProjectiles.remove(i - (projectileItems.size() - newProjectiles.size())); -+ // Explicitly update new data to crossbow on hand, since plugin can change item in inventory during this stage -+ if (shooter.getItemInHand(hand).is(Items.CROSSBOW)) shooter.getItemInHand(hand).set(DataComponents.CHARGED_PROJECTILES, net.minecraft.world.item.component.ChargedProjectiles.of(newProjectiles)); ++ weapon.set(DataComponents.CHARGED_PROJECTILES, net.minecraft.world.item.component.ChargedProjectiles.of(newProjectiles)); + } else if (level.shouldConsumeArrow) { + unrealizedDrawResult.consumeProjectilesFromPlayerInventory(i); + // Paper PR end - prevent item consumption for cancelled events } } // CraftBukkit end -@@ -89,6 +143,7 @@ public abstract class ProjectileWeaponItem extends Item { +@@ -89,6 +144,7 @@ public abstract class ProjectileWeaponItem extends Item { } } } @@ -169,7 +170,7 @@ index f12b9e4e8a78c713782af548d1cb15ef363305b4..d24b5e8baa6920d8736fe8686200bf39 } protected int getDurabilityUse(ItemStack stack) { -@@ -112,11 +167,21 @@ public abstract class ProjectileWeaponItem extends Item { +@@ -112,11 +168,21 @@ public abstract class ProjectileWeaponItem extends Item { } protected static List draw(ItemStack weapon, ItemStack ammo, LivingEntity shooter) { @@ -195,7 +196,7 @@ index f12b9e4e8a78c713782af548d1cb15ef363305b4..d24b5e8baa6920d8736fe8686200bf39 if (ammo.isEmpty()) { return List.of(); } else { -@@ -124,8 +189,9 @@ public abstract class ProjectileWeaponItem extends Item { +@@ -124,8 +190,9 @@ public abstract class ProjectileWeaponItem extends Item { List list = new ArrayList<>(i); ItemStack itemStack = ammo.copy(); @@ -206,7 +207,7 @@ index f12b9e4e8a78c713782af548d1cb15ef363305b4..d24b5e8baa6920d8736fe8686200bf39 if (!itemStack1.isEmpty()) { list.add(itemStack1); } -@@ -136,17 +202,23 @@ public abstract class ProjectileWeaponItem extends Item { +@@ -136,17 +203,23 @@ public abstract class ProjectileWeaponItem extends Item { } protected static ItemStack useAmmo(ItemStack weapon, ItemStack ammo, LivingEntity shooter, boolean intangable) {