geforkt von Mirrors/Paper
4bc15f13aa
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: e2160a18 Make MapCursor#type not depends on deprecated values CraftBukkit Changes: 6ce172642 SPIGOT-7761: Ender pearl does not damage or spawn endermites f5a63f734 SPIGOT-7759: Chunk not there when requested in ChunkUnloadEvent 28287259c Remove unused import eb9a7dde0 SPIGOT-7757: Cannot set item in Stonecutter Inventory f8be9d752 Move deserialized removed unhandled tags to dedicated removedTags a7e576186 Fix potential mutability issue with CraftMetaItem copy constructor 995885452 SPIGOT-7741: Vanilla ItemComponent in commands can't remove components 9ef69aa0b PR-1284: Move ItemType <-> ItemMeta linking to a centralized place 3e82eafbe PR-1420: Fix DirectEntity and CausingEntity Damager for Creepers ignited by Player c23daa71f SPIGOT-7751: Fix crash caused by arrows from trial spawners Make MapCursor#type not depends on deprecated values SPIGOT-7761: Ender pearl does not damage or spawn endermites
115 Zeilen
6.2 KiB
Diff
115 Zeilen
6.2 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
Date: Wed, 22 May 2024 10:01:19 -0700
|
|
Subject: [PATCH] Fix equipment slot and group API
|
|
|
|
Add test for EquipmentSlotGroup
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java
|
|
index 9d74577af071954e1e37201a96368c1360076209..eafa54c870c3e2aef30c3f9f96f516607a7cae24 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java
|
|
@@ -135,6 +135,10 @@ public class CraftInventoryPlayer extends CraftInventory implements org.bukkit.i
|
|
case HEAD:
|
|
this.setHelmet(item);
|
|
break;
|
|
+ // Paper start
|
|
+ case BODY:
|
|
+ throw new IllegalArgumentException("BODY is not valid for players!");
|
|
+ // Paper end
|
|
default:
|
|
throw new IllegalArgumentException("Not implemented. This is a bug");
|
|
}
|
|
@@ -162,6 +166,10 @@ public class CraftInventoryPlayer extends CraftInventory implements org.bukkit.i
|
|
return java.util.Objects.requireNonNullElseGet(this.getChestplate(), () -> new ItemStack(org.bukkit.Material.AIR)); // Paper - make nonnull
|
|
case HEAD:
|
|
return java.util.Objects.requireNonNullElseGet(this.getHelmet(), () -> new ItemStack(org.bukkit.Material.AIR)); // Paper - make nonnull
|
|
+ // Paper start
|
|
+ case BODY:
|
|
+ throw new IllegalArgumentException("BODY is not valid for players!");
|
|
+ // Paper end
|
|
default:
|
|
throw new IllegalArgumentException("Not implemented. This is a bug");
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
|
index d2a7414f3ae9fb23a2f9f2ed7fd0a50a4aa3d7d9..89c545d4390c7f717f496806fed1d5bc094db0f1 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
|
@@ -1452,7 +1452,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
|
|
if (this.attributeModifiers == null) return LinkedHashMultimap.create(); // Paper - don't change the components
|
|
SetMultimap<Attribute, AttributeModifier> result = LinkedHashMultimap.create();
|
|
for (Map.Entry<Attribute, AttributeModifier> entry : this.attributeModifiers.entries()) {
|
|
- if (entry.getValue().getSlot() == null || entry.getValue().getSlot() == slot) {
|
|
+ if (entry.getValue().getSlotGroup().test(slot)) { // Paper - correctly test slot against group
|
|
result.put(entry.getKey(), entry.getValue());
|
|
}
|
|
}
|
|
@@ -1520,9 +1520,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
|
|
|
|
while (iter.hasNext()) {
|
|
Map.Entry<Attribute, AttributeModifier> entry = iter.next();
|
|
- // Explicitly match against null because (as of MC 1.13) AttributeModifiers without a -
|
|
- // set slot are active in any slot.
|
|
- if (entry.getValue().getSlot() == null || entry.getValue().getSlot() == slot) {
|
|
+ if (entry.getValue().getSlotGroup().test(slot)) { // Paper - correctly test slot against group
|
|
iter.remove();
|
|
++removed;
|
|
}
|
|
diff --git a/src/test/java/io/papermc/paper/inventory/item/EquipmentSlotGroupTest.java b/src/test/java/io/papermc/paper/inventory/item/EquipmentSlotGroupTest.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..ee0bfe4edb134d7ea3a3b97f5102a7f3122c3b99
|
|
--- /dev/null
|
|
+++ b/src/test/java/io/papermc/paper/inventory/item/EquipmentSlotGroupTest.java
|
|
@@ -0,0 +1,51 @@
|
|
+package io.papermc.paper.inventory.item;
|
|
+
|
|
+import java.lang.reflect.Field;
|
|
+import java.lang.reflect.Modifier;
|
|
+import java.util.ArrayList;
|
|
+import java.util.List;
|
|
+import net.minecraft.world.entity.EquipmentSlot;
|
|
+import org.bukkit.craftbukkit.CraftEquipmentSlot;
|
|
+import org.bukkit.inventory.EquipmentSlotGroup;
|
|
+import org.junit.jupiter.params.ParameterizedTest;
|
|
+import org.junit.jupiter.params.provider.EnumSource;
|
|
+import org.junit.jupiter.params.provider.MethodSource;
|
|
+
|
|
+import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
+import static org.junit.jupiter.api.Assertions.assertNotNull;
|
|
+
|
|
+class EquipmentSlotGroupTest {
|
|
+
|
|
+ static List<EquipmentSlotGroup> apiValues() throws ReflectiveOperationException {
|
|
+ final List<EquipmentSlotGroup> apiValues = new ArrayList<>();
|
|
+ for (final Field field : EquipmentSlotGroup.class.getDeclaredFields()) {
|
|
+ if (!Modifier.isStatic(field.getModifiers()) || !Modifier.isFinal(field.getModifiers()) || !field.getType().equals(EquipmentSlotGroup.class)) {
|
|
+ continue;
|
|
+ }
|
|
+ apiValues.add((EquipmentSlotGroup) field.get(null));
|
|
+ }
|
|
+ if (apiValues.isEmpty()) {
|
|
+ throw new RuntimeException("Didn't find any api " + EquipmentSlotGroup.class.getSimpleName());
|
|
+ }
|
|
+ return apiValues;
|
|
+ }
|
|
+
|
|
+ @ParameterizedTest
|
|
+ @MethodSource("apiValues")
|
|
+ void testBukkitToNms(final EquipmentSlotGroup slotGroup) {
|
|
+ final net.minecraft.world.entity.EquipmentSlotGroup nmsGroup = CraftEquipmentSlot.getNMSGroup(slotGroup);
|
|
+ assertNotNull(nmsGroup, "No nms slot group found for " + slotGroup);
|
|
+ assertEquals(nmsGroup.getSerializedName(), slotGroup.toString(), "slot group name mismatch");
|
|
+ for (final EquipmentSlot slot : EquipmentSlot.values()) {
|
|
+ assertEquals(nmsGroup.test(slot), slotGroup.test(CraftEquipmentSlot.getSlot(slot)));
|
|
+ }
|
|
+ }
|
|
+
|
|
+ @ParameterizedTest
|
|
+ @EnumSource(net.minecraft.world.entity.EquipmentSlotGroup.class)
|
|
+ void testNmsToBukkit(final net.minecraft.world.entity.EquipmentSlotGroup slotGroup) {
|
|
+ final EquipmentSlotGroup apiGroup = CraftEquipmentSlot.getSlot(slotGroup);
|
|
+ assertNotNull(apiGroup, "No api slot group found for " + slotGroup);
|
|
+ assertEquals(apiGroup.toString(), slotGroup.getSerializedName(), "slot group name mismatch");
|
|
+ }
|
|
+}
|