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 f655e9ac..cc1bf697 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..1ac688cc89c32168bcb3ecda2a4e1f993098b3aa 100644 +index f12b9e4e8a78c713782af548d1cb15ef363305b4..9467d8513786a1ed0d4d14cc5540151f897aae35 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..1ac688cc89c32168bcb3ecda2a4e1f99 if (event.getProjectile() == projectile.getBukkitEntity()) { if (Projectile.spawnProjectile( -@@ -79,7 +114,25 @@ public abstract class ProjectileWeaponItem extends Item { +@@ -79,7 +114,26 @@ public abstract class ProjectileWeaponItem extends Item { level, itemStack ).isRemoved()) { @@ -150,17 +150,18 @@ index f12b9e4e8a78c713782af548d1cb15ef363305b4..1ac688cc89c32168bcb3ecda2a4e1f99 + if (!event.shouldConsumeItem() && projectile instanceof final AbstractArrow abstractArrow) + abstractArrow.pickup = AbstractArrow.Pickup.CREATIVE_ONLY; + if (event.shouldConsumeItem()) { -+ if (weapon.is(net.minecraft.world.item.Items.CROSSBOW)) { -+ List newProjectiles = new java.util.ArrayList<>(weapon.get(DataComponents.CHARGED_PROJECTILES).getItems()); ++ if (weapon.is(Items.CROSSBOW)) { ++ List newProjectiles = new ArrayList<>(projectileItems); + newProjectiles.remove(i - (projectileItems.size() - newProjectiles.size())); -+ weapon.set(DataComponents.CHARGED_PROJECTILES, net.minecraft.world.item.component.ChargedProjectiles.of(newProjectiles)); ++ // Explicitly update new data to crossbow on hand, since plugin can change item in inventory during this stage ++ shooter.getItemInHand(hand).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 +142,7 @@ public abstract class ProjectileWeaponItem extends Item { +@@ -89,6 +143,7 @@ public abstract class ProjectileWeaponItem extends Item { } } } @@ -168,7 +169,7 @@ index f12b9e4e8a78c713782af548d1cb15ef363305b4..1ac688cc89c32168bcb3ecda2a4e1f99 } protected int getDurabilityUse(ItemStack stack) { -@@ -112,11 +166,21 @@ public abstract class ProjectileWeaponItem extends Item { +@@ -112,11 +167,21 @@ public abstract class ProjectileWeaponItem extends Item { } protected static List draw(ItemStack weapon, ItemStack ammo, LivingEntity shooter) { @@ -194,7 +195,7 @@ index f12b9e4e8a78c713782af548d1cb15ef363305b4..1ac688cc89c32168bcb3ecda2a4e1f99 if (ammo.isEmpty()) { return List.of(); } else { -@@ -124,8 +188,9 @@ public abstract class ProjectileWeaponItem extends Item { +@@ -124,8 +189,9 @@ public abstract class ProjectileWeaponItem extends Item { List list = new ArrayList<>(i); ItemStack itemStack = ammo.copy(); @@ -205,7 +206,7 @@ index f12b9e4e8a78c713782af548d1cb15ef363305b4..1ac688cc89c32168bcb3ecda2a4e1f99 if (!itemStack1.isEmpty()) { list.add(itemStack1); } -@@ -136,17 +201,23 @@ public abstract class ProjectileWeaponItem extends Item { +@@ -136,17 +202,23 @@ public abstract class ProjectileWeaponItem extends Item { } protected static ItemStack useAmmo(ItemStack weapon, ItemStack ammo, LivingEntity shooter, boolean intangable) {