Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-12-16 19:40:07 +01:00
dcc290167f
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: dea9ce0a SPIGOT-7198: Add Sittable interface to Camel CraftBukkit Changes: eecb4c0dc SPIGOT-7196: Exception loading alternate worlds 0ff61e8fa SPIGOT-7198: Add Sittable interface to Camel 676441aac PR-1121: Handle additional missing SpawnEggs in MetaSpawnEgg e85280e02 Handle missing SpawnEggs in MetaSpawnEgg Spigot Changes: d90018e0 SPIGOT-7199: NPE loading or creating world with custom chunk generator
71 Zeilen
3.4 KiB
Diff
71 Zeilen
3.4 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
Date: Sun, 8 May 2022 13:35:45 -0700
|
|
Subject: [PATCH] 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
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
|
index 76ee8adfb6cccc15dde748b0796d1de7fc5507f8..fa2e865324c11b724c351cdf8c03bfc4c8a274f6 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
|
@@ -978,6 +978,53 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
|
|
throw new IllegalArgumentException(entityCategory + " is an unrecognized entity category");
|
|
}
|
|
|
|
+ @Override
|
|
+ public void broadcastSlotBreak(org.bukkit.inventory.EquipmentSlot slot) {
|
|
+ this.getHandle().broadcastBreakEvent(org.bukkit.craftbukkit.CraftEquipmentSlot.getNMS(slot));
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void broadcastSlotBreak(org.bukkit.inventory.EquipmentSlot slot, 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, int amount) {
|
|
+ final net.minecraft.world.item.ItemStack nmsStack;
|
|
+ if (stack instanceof 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(org.bukkit.inventory.EquipmentSlot slot, 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(net.minecraft.world.item.ItemStack nmsStack, int amount, net.minecraft.world.entity.EquipmentSlot slot) {
|
|
+ nmsStack.hurtAndBreak(amount, this.getHandle(), livingEntity -> {
|
|
+ if (slot != null) {
|
|
+ livingEntity.broadcastBreakEvent(slot);
|
|
+ }
|
|
+ });
|
|
+ }
|
|
+
|
|
@Override
|
|
public void knockback(double strength, double directionX, double directionZ) {
|
|
Preconditions.checkArgument(strength > 0, "Knockback strength must be > 0");
|