9
0
mirror of https://github.com/Winds-Studio/Leaf.git synced 2025-12-19 15:09:25 +00:00

Fix failed update crossbow's projectile data

Explicitly update new data to crossbow on hand, to prevent failed to update projectile data on crossbow and also avoid dupe.

Some plugins may change items by setting new item copy to player's inventory under scheduler under other projectile related events. In this way, the reference of crossbow item changed, thus the set call to `weapon` may not update data on the actual item.
This commit is contained in:
Dreeam
2025-09-15 20:37:16 -04:00
parent fe444c434f
commit 784786f100

View File

@@ -65,7 +65,7 @@ index d49a5360d4a21e5b15bac94a823831e25d242a3d..04286fdba0c22d5b6d7b3ab71ee1a1fe
CriteriaTriggers.SHOT_CROSSBOW.trigger(serverPlayer, weapon); CriteriaTriggers.SHOT_CROSSBOW.trigger(serverPlayer, weapon);
serverPlayer.awardStat(Stats.ITEM_USED.get(weapon.getItem())); serverPlayer.awardStat(Stats.ITEM_USED.get(weapon.getItem()));
diff --git a/net/minecraft/world/item/ProjectileWeaponItem.java b/net/minecraft/world/item/ProjectileWeaponItem.java 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 --- a/net/minecraft/world/item/ProjectileWeaponItem.java
+++ b/net/minecraft/world/item/ProjectileWeaponItem.java +++ b/net/minecraft/world/item/ProjectileWeaponItem.java
@@ -40,7 +40,20 @@ public abstract class ProjectileWeaponItem extends Item { @@ -40,7 +40,20 @@ public abstract class ProjectileWeaponItem extends Item {
@@ -133,7 +133,7 @@ index f12b9e4e8a78c713782af548d1cb15ef363305b4..1ac688cc89c32168bcb3ecda2a4e1f99
if (event.getProjectile() == projectile.getBukkitEntity()) { if (event.getProjectile() == projectile.getBukkitEntity()) {
if (Projectile.spawnProjectile( if (Projectile.spawnProjectile(
@@ -79,7 +114,25 @@ public abstract class ProjectileWeaponItem extends Item { @@ -79,7 +114,26 @@ public abstract class ProjectileWeaponItem extends Item {
level, level,
itemStack itemStack
).isRemoved()) { ).isRemoved()) {
@@ -150,17 +150,18 @@ index f12b9e4e8a78c713782af548d1cb15ef363305b4..1ac688cc89c32168bcb3ecda2a4e1f99
+ if (!event.shouldConsumeItem() && projectile instanceof final AbstractArrow abstractArrow) + if (!event.shouldConsumeItem() && projectile instanceof final AbstractArrow abstractArrow)
+ abstractArrow.pickup = AbstractArrow.Pickup.CREATIVE_ONLY; + abstractArrow.pickup = AbstractArrow.Pickup.CREATIVE_ONLY;
+ if (event.shouldConsumeItem()) { + if (event.shouldConsumeItem()) {
+ if (weapon.is(net.minecraft.world.item.Items.CROSSBOW)) { + if (weapon.is(Items.CROSSBOW)) {
+ List<ItemStack> newProjectiles = new java.util.ArrayList<>(weapon.get(DataComponents.CHARGED_PROJECTILES).getItems()); + List<ItemStack> newProjectiles = new ArrayList<>(projectileItems);
+ newProjectiles.remove(i - (projectileItems.size() - newProjectiles.size())); + 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) { + } else if (level.shouldConsumeArrow) {
+ unrealizedDrawResult.consumeProjectilesFromPlayerInventory(i); + unrealizedDrawResult.consumeProjectilesFromPlayerInventory(i);
+ // Paper PR end - prevent item consumption for cancelled events + // Paper PR end - prevent item consumption for cancelled events
} }
} }
// CraftBukkit end // 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) { 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<ItemStack> draw(ItemStack weapon, ItemStack ammo, LivingEntity shooter) { protected static List<ItemStack> draw(ItemStack weapon, ItemStack ammo, LivingEntity shooter) {
@@ -194,7 +195,7 @@ index f12b9e4e8a78c713782af548d1cb15ef363305b4..1ac688cc89c32168bcb3ecda2a4e1f99
if (ammo.isEmpty()) { if (ammo.isEmpty()) {
return List.of(); return List.of();
} else { } else {
@@ -124,8 +188,9 @@ public abstract class ProjectileWeaponItem extends Item { @@ -124,8 +189,9 @@ public abstract class ProjectileWeaponItem extends Item {
List<ItemStack> list = new ArrayList<>(i); List<ItemStack> list = new ArrayList<>(i);
ItemStack itemStack = ammo.copy(); ItemStack itemStack = ammo.copy();
@@ -205,7 +206,7 @@ index f12b9e4e8a78c713782af548d1cb15ef363305b4..1ac688cc89c32168bcb3ecda2a4e1f99
if (!itemStack1.isEmpty()) { if (!itemStack1.isEmpty()) {
list.add(itemStack1); 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) { protected static ItemStack useAmmo(ItemStack weapon, ItemStack ammo, LivingEntity shooter, boolean intangable) {