ItemStack damage API

Adds methods notify clients about item breaks and
to simulate damage done to an itemstack and all
the logic associated with damaging them

== AT ==
public net.minecraft.world.entity.LivingEntity entityEventForEquipmentBreak(Lnet/minecraft/world/entity/EquipmentSlot;)B
This commit is contained in:
Jake Potrebic
2022-05-08 13:35:45 -07:00
parent 0e9f28fe68
commit 4a416ca85a
2 changed files with 101 additions and 32 deletions

View File

@@ -1154,4 +1154,48 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
this.getHandle().knockback(strength, directionX, directionZ);
};
// Paper end - knockback API
// Paper start - ItemStack damage API
public void broadcastSlotBreak(final org.bukkit.inventory.EquipmentSlot slot) {
this.getHandle().level().broadcastEntityEvent(this.getHandle(), net.minecraft.world.entity.LivingEntity.entityEventForEquipmentBreak(org.bukkit.craftbukkit.CraftEquipmentSlot.getNMS(slot)));
}
@Override
public void broadcastSlotBreak(final org.bukkit.inventory.EquipmentSlot slot, final Collection<org.bukkit.entity.Player> players) {
if (players.isEmpty()) {
return;
}
final net.minecraft.network.protocol.game.ClientboundEntityEventPacket packet = new net.minecraft.network.protocol.game.ClientboundEntityEventPacket(
this.getHandle(),
net.minecraft.world.entity.LivingEntity.entityEventForEquipmentBreak(org.bukkit.craftbukkit.CraftEquipmentSlot.getNMS(slot))
);
players.forEach(player -> ((CraftPlayer) player).getHandle().connection.send(packet));
}
@Override
public ItemStack damageItemStack(ItemStack stack, final int amount) {
final net.minecraft.world.item.ItemStack nmsStack;
if (stack instanceof final CraftItemStack craftItemStack) {
if (craftItemStack.handle == null || craftItemStack.handle.isEmpty()) {
return stack;
}
nmsStack = craftItemStack.handle;
} else {
nmsStack = CraftItemStack.asNMSCopy(stack);
stack = CraftItemStack.asCraftMirror(nmsStack); // mirror to capture changes in hurt logic & events
}
this.damageItemStack0(nmsStack, amount, null);
return stack;
}
@Override
public void damageItemStack(final org.bukkit.inventory.EquipmentSlot slot, final int amount) {
final net.minecraft.world.entity.EquipmentSlot nmsSlot = org.bukkit.craftbukkit.CraftEquipmentSlot.getNMS(slot);
this.damageItemStack0(this.getHandle().getItemBySlot(nmsSlot), amount, nmsSlot);
}
private void damageItemStack0(final net.minecraft.world.item.ItemStack nmsStack, final int amount, final net.minecraft.world.entity.EquipmentSlot slot) {
nmsStack.hurtAndBreak(amount, this.getHandle(), slot, true);
}
// Paper end - ItemStack damage API
}