Fix equipment slot and group API
Adds the following: - Add test for EquipmentSlotGroup - Expose LivingEntity#canUseSlot Co-authored-by: SoSeDiK <mrsosedik@gmail.com>
This commit is contained in:
@@ -1230,4 +1230,11 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
|
|||||||
this.getHandle().setYBodyRot(bodyYaw);
|
this.getHandle().setYBodyRot(bodyYaw);
|
||||||
}
|
}
|
||||||
// Paper end - body yaw API
|
// Paper end - body yaw API
|
||||||
|
|
||||||
|
// Paper start - Expose canUseSlot
|
||||||
|
@Override
|
||||||
|
public boolean canUseEquipmentSlot(org.bukkit.inventory.EquipmentSlot slot) {
|
||||||
|
return this.getHandle().canUseSlot(org.bukkit.craftbukkit.CraftEquipmentSlot.getNMS(slot));
|
||||||
|
}
|
||||||
|
// Paper end - Expose canUseSlot
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,6 +135,10 @@ public class CraftInventoryPlayer extends CraftInventory implements org.bukkit.i
|
|||||||
case HEAD:
|
case HEAD:
|
||||||
this.setHelmet(item);
|
this.setHelmet(item);
|
||||||
break;
|
break;
|
||||||
|
// Paper start
|
||||||
|
case BODY:
|
||||||
|
throw new IllegalArgumentException("BODY is not valid for players!");
|
||||||
|
// Paper end
|
||||||
default:
|
default:
|
||||||
throw new IllegalArgumentException("Could not set slot " + slot + " - not a valid slot for PlayerInventory");
|
throw new IllegalArgumentException("Could not set slot " + slot + " - not a valid slot for PlayerInventory");
|
||||||
}
|
}
|
||||||
@@ -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
|
return java.util.Objects.requireNonNullElseGet(this.getChestplate(), () -> new ItemStack(org.bukkit.Material.AIR)); // Paper - make nonnull
|
||||||
case HEAD:
|
case HEAD:
|
||||||
return java.util.Objects.requireNonNullElseGet(this.getHelmet(), () -> new ItemStack(org.bukkit.Material.AIR)); // Paper - make nonnull
|
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:
|
default:
|
||||||
throw new IllegalArgumentException("Could not get slot " + slot + " - not a valid slot for PlayerInventory");
|
throw new IllegalArgumentException("Could not get slot " + slot + " - not a valid slot for PlayerInventory");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1723,7 +1723,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
|
|||||||
if (this.attributeModifiers == null) return LinkedHashMultimap.create(); // Paper - don't change the components
|
if (this.attributeModifiers == null) return LinkedHashMultimap.create(); // Paper - don't change the components
|
||||||
SetMultimap<Attribute, AttributeModifier> result = LinkedHashMultimap.create();
|
SetMultimap<Attribute, AttributeModifier> result = LinkedHashMultimap.create();
|
||||||
for (Map.Entry<Attribute, AttributeModifier> entry : this.attributeModifiers.entries()) {
|
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());
|
result.put(entry.getKey(), entry.getValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1797,9 +1797,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta {
|
|||||||
|
|
||||||
while (iter.hasNext()) {
|
while (iter.hasNext()) {
|
||||||
Map.Entry<Attribute, AttributeModifier> entry = iter.next();
|
Map.Entry<Attribute, AttributeModifier> entry = iter.next();
|
||||||
// Explicitly match against null because (as of MC 1.13) AttributeModifiers without a -
|
if (entry.getValue().getSlotGroup().test(slot)) { // Paper - correctly test slot against group
|
||||||
// set slot are active in any slot.
|
|
||||||
if (entry.getValue().getSlot() == null || entry.getValue().getSlot() == slot) {
|
|
||||||
iter.remove();
|
iter.remove();
|
||||||
++removed;
|
++removed;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
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.bukkit.support.environment.Normal;
|
||||||
|
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;
|
||||||
|
|
||||||
|
@Normal
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user