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:
@@ -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<ItemStack> newProjectiles = new java.util.ArrayList<>(weapon.get(DataComponents.CHARGED_PROJECTILES).getItems());
|
||||
+ if (weapon.is(Items.CROSSBOW)) {
|
||||
+ List<ItemStack> 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<ItemStack> 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<ItemStack> 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) {
|
||||
|
||||
Reference in New Issue
Block a user