mirror of
https://github.com/PaperMC/Paper.git
synced 2025-02-03 21:37:28 +01:00
Fix equipment slot and group API (#10767)
This commit is contained in:
parent
98853ee548
commit
d637706bbd
2 changed files with 119 additions and 0 deletions
31
patches/api/Fix-equipment-slot-and-group-API.patch
Normal file
31
patches/api/Fix-equipment-slot-and-group-API.patch
Normal file
|
@ -0,0 +1,31 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
||||
Date: Wed, 22 May 2024 10:00:19 -0700
|
||||
Subject: [PATCH] Fix equipment slot and group API
|
||||
|
||||
was missing the 'body' slot group
|
||||
|
||||
diff --git a/src/main/java/org/bukkit/attribute/AttributeModifier.java b/src/main/java/org/bukkit/attribute/AttributeModifier.java
|
||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||
--- a/src/main/java/org/bukkit/attribute/AttributeModifier.java
|
||||
+++ b/src/main/java/org/bukkit/attribute/AttributeModifier.java
|
||||
@@ -0,0 +0,0 @@ public class AttributeModifier implements ConfigurationSerializable {
|
||||
*/
|
||||
@Nullable
|
||||
@Deprecated
|
||||
+ @io.papermc.paper.annotation.DoNotUse // Paper
|
||||
public EquipmentSlot getSlot() {
|
||||
return slot == EquipmentSlotGroup.ANY ? null : slot.getExample();
|
||||
}
|
||||
diff --git a/src/main/java/org/bukkit/inventory/EquipmentSlotGroup.java b/src/main/java/org/bukkit/inventory/EquipmentSlotGroup.java
|
||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||
--- a/src/main/java/org/bukkit/inventory/EquipmentSlotGroup.java
|
||||
+++ b/src/main/java/org/bukkit/inventory/EquipmentSlotGroup.java
|
||||
@@ -0,0 +0,0 @@ public final class EquipmentSlotGroup implements Predicate<EquipmentSlot> {
|
||||
public static final EquipmentSlotGroup CHEST = get("chest", EquipmentSlot.CHEST);
|
||||
public static final EquipmentSlotGroup HEAD = get("head", EquipmentSlot.HEAD);
|
||||
public static final EquipmentSlotGroup ARMOR = get("armor", (test) -> test == EquipmentSlot.FEET || test == EquipmentSlot.LEGS || test == EquipmentSlot.CHEST || test == EquipmentSlot.HEAD, EquipmentSlot.CHEST);
|
||||
+ public static final EquipmentSlotGroup BODY = get("body", EquipmentSlot.BODY); // Paper - add missing slot group
|
||||
//
|
||||
private final String key;
|
||||
private final Predicate<EquipmentSlot> predicate;
|
88
patches/server/Fix-equipment-slot-and-group-API.patch
Normal file
88
patches/server/Fix-equipment-slot-and-group-API.patch
Normal file
|
@ -0,0 +1,88 @@
|
|||
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/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
|
||||
@@ -0,0 +0,0 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
|
||||
this.checkAttributeList();
|
||||
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());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +0,0 @@ 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..0000000000000000000000000000000000000000
|
||||
--- /dev/null
|
||||
+++ b/src/test/java/io/papermc/paper/inventory/item/EquipmentSlotGroupTest.java
|
||||
@@ -0,0 +0,0 @@
|
||||
+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");
|
||||
+ }
|
||||
+}
|
Loading…
Add table
Reference in a new issue