diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java b/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java index 503baf87877..90b60276615 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java @@ -627,11 +627,7 @@ else if (hand == EquipmentSlot.OFF_HAND) EventValues.registerEventValue(EntityResurrectEvent.class, Slot.class, event -> { EquipmentSlot hand = event.getHand(); EntityEquipment equipment = event.getEntity().getEquipment(); - if (equipment == null || hand == null) - return null; - return new ch.njol.skript.util.slot.EquipmentSlot(equipment, - (hand == EquipmentSlot.HAND) ? ch.njol.skript.util.slot.EquipmentSlot.EquipSlot.TOOL - : ch.njol.skript.util.slot.EquipmentSlot.EquipSlot.OFF_HAND); + return new ch.njol.skript.util.slot.EquipmentSlot(equipment, hand); }); // PlayerItemHeldEvent diff --git a/src/main/java/ch/njol/skript/expressions/ExprArmorSlot.java b/src/main/java/ch/njol/skript/expressions/ExprArmorSlot.java index 1d700b3fb06..ea0a6a6113c 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprArmorSlot.java +++ b/src/main/java/ch/njol/skript/expressions/ExprArmorSlot.java @@ -1,11 +1,6 @@ package ch.njol.skript.expressions; -import ch.njol.skript.Skript; -import ch.njol.skript.doc.Description; -import ch.njol.skript.doc.Examples; -import ch.njol.skript.doc.Keywords; -import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.Since; +import ch.njol.skript.doc.*; import ch.njol.skript.expressions.base.PropertyExpression; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; @@ -19,7 +14,10 @@ import org.bukkit.inventory.EntityEquipment; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Locale; +import java.util.Set; import java.util.stream.Stream; @Name("Armor Slot") @@ -76,13 +74,13 @@ protected Slot[] get(Event event, LivingEntity[] source) { if (isBody) { if (!bodyEntities.contains(equipment.getHolder().getType().getEntityClass())) return null; - return Stream.of(new EquipmentSlot(equipment, EquipSlot.BODY, explicitSlot)); + return Stream.of(new EquipmentSlot(equipment, org.bukkit.inventory.EquipmentSlot.BODY, explicitSlot)); } return Stream.of( - new EquipmentSlot(equipment, EquipSlot.HELMET, explicitSlot), - new EquipmentSlot(equipment, EquipSlot.CHESTPLATE, explicitSlot), - new EquipmentSlot(equipment, EquipSlot.LEGGINGS, explicitSlot), - new EquipmentSlot(equipment, EquipSlot.BOOTS, explicitSlot) + new EquipmentSlot(equipment, org.bukkit.inventory.EquipmentSlot.HEAD, explicitSlot), + new EquipmentSlot(equipment, org.bukkit.inventory.EquipmentSlot.CHEST, explicitSlot), + new EquipmentSlot(equipment, org.bukkit.inventory.EquipmentSlot.LEGS, explicitSlot), + new EquipmentSlot(equipment, org.bukkit.inventory.EquipmentSlot.FEET, explicitSlot) ); }) .toArray(Slot[]::new); diff --git a/src/main/java/ch/njol/skript/expressions/ExprTool.java b/src/main/java/ch/njol/skript/expressions/ExprTool.java index 39b1eecee24..f1ac902bf2b 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprTool.java +++ b/src/main/java/ch/njol/skript/expressions/ExprTool.java @@ -88,7 +88,7 @@ public void setItem(final @Nullable ItemStack item) { EntityEquipment equipment = entity.getEquipment(); if (equipment == null) return null; - return new EquipmentSlot(equipment, offHand ? EquipmentSlot.EquipSlot.OFF_HAND : EquipmentSlot.EquipSlot.TOOL) { + return new EquipmentSlot(equipment, offHand ? org.bukkit.inventory.EquipmentSlot.OFF_HAND : org.bukkit.inventory.EquipmentSlot.HAND) { @Override public String toString(@Nullable Event event, boolean debug) { String time = getTime() == 1 ? "future " : getTime() == -1 ? "former " : ""; diff --git a/src/main/java/ch/njol/skript/util/slot/EquipmentSlot.java b/src/main/java/ch/njol/skript/util/slot/EquipmentSlot.java index a5d6ee21e0e..5d76ec24d44 100644 --- a/src/main/java/ch/njol/skript/util/slot/EquipmentSlot.java +++ b/src/main/java/ch/njol/skript/util/slot/EquipmentSlot.java @@ -1,7 +1,7 @@ package ch.njol.skript.util.slot; -import java.util.Locale; - +import ch.njol.skript.bukkitutil.PlayerUtils; +import ch.njol.skript.registrations.Classes; import org.bukkit.entity.Entity; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; @@ -10,14 +10,19 @@ import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.Nullable; -import ch.njol.skript.bukkitutil.PlayerUtils; -import ch.njol.skript.registrations.Classes; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; /** * Represents equipment slot of an entity. */ public class EquipmentSlot extends SlotWithIndex { - + + /** + * @deprecated Use {@link org.bukkit.inventory.EquipmentSlot}, {@link EntityEquipment} instead + */ + @Deprecated public enum EquipSlot { TOOL { @Override @@ -123,28 +128,65 @@ public void set(EntityEquipment equipment, @Nullable ItemStack item) { } - private static final EquipSlot[] values = EquipSlot.values(); + private static final EquipSlot[] SKRIPT_VALUES = EquipSlot.values(); + private static final org.bukkit.inventory.EquipmentSlot[] BUKKIT_VALUES = org.bukkit.inventory.EquipmentSlot.values(); + + private static final Map BUKKIT_SLOT_INDICES = new HashMap<>(); + + static { + BUKKIT_SLOT_INDICES.put(org.bukkit.inventory.EquipmentSlot.FEET, 36); + BUKKIT_SLOT_INDICES.put(org.bukkit.inventory.EquipmentSlot.LEGS, 37); + BUKKIT_SLOT_INDICES.put(org.bukkit.inventory.EquipmentSlot.CHEST, 38); + BUKKIT_SLOT_INDICES.put(org.bukkit.inventory.EquipmentSlot.HEAD, 39); + BUKKIT_SLOT_INDICES.put(org.bukkit.inventory.EquipmentSlot.OFF_HAND, 40); + } - private final EntityEquipment e; - private final EquipSlot slot; + private final EntityEquipment entityEquipment; + private EquipSlot skriptSlot; private final int slotIndex; private final boolean slotToString; - - public EquipmentSlot(final EntityEquipment e, final EquipSlot slot, final boolean slotToString) { - this.e = e; + private org.bukkit.inventory.EquipmentSlot bukkitSlot; + + /** + * @deprecated Use {@link EquipmentSlot#EquipmentSlot(EntityEquipment, org.bukkit.inventory.EquipmentSlot, boolean)} instead + */ + @Deprecated + public EquipmentSlot(EntityEquipment entityEquipment, EquipSlot skriptSlot, boolean slotToString) { + this.entityEquipment = entityEquipment; int slotIndex = -1; - if (slot == EquipSlot.TOOL) { - Entity holder = e.getHolder(); + if (skriptSlot == EquipSlot.TOOL) { + Entity holder = entityEquipment.getHolder(); if (holder instanceof Player) slotIndex = ((Player) holder).getInventory().getHeldItemSlot(); } this.slotIndex = slotIndex; - this.slot = slot; + this.skriptSlot = skriptSlot; this.slotToString = slotToString; } - - public EquipmentSlot(final EntityEquipment e, final EquipSlot slot) { - this(e, slot, false); + + /** + * @deprecated Use {@link EquipmentSlot#EquipmentSlot(EntityEquipment, org.bukkit.inventory.EquipmentSlot)} instead + */ + @Deprecated + public EquipmentSlot(EntityEquipment entityEquipment, EquipSlot skriptSlot) { + this(entityEquipment, skriptSlot, false); + } + + public EquipmentSlot(EntityEquipment equipment, org.bukkit.inventory.EquipmentSlot bukkitSlot, boolean slotToString) { + this.entityEquipment = equipment; + int slotIndex = -1; + if (bukkitSlot == org.bukkit.inventory.EquipmentSlot.HAND) { + Entity holder = equipment.getHolder(); + if (holder instanceof Player player) + slotIndex = player.getInventory().getHeldItemSlot(); + } + this.slotIndex = slotIndex; + this.bukkitSlot = bukkitSlot; + this.slotToString = slotToString; + } + + public EquipmentSlot(EntityEquipment equipment, org.bukkit.inventory.EquipmentSlot bukkitSlot) { + this(equipment, bukkitSlot, false); } @SuppressWarnings("null") @@ -154,56 +196,83 @@ public EquipmentSlot(HumanEntity holder, int index) { * So this math trick gets us the EquipSlot from inventory slot index * slotToString: Referring to numeric slot id, right? */ - this(holder.getEquipment(), values[41 - index], true); + this(holder.getEquipment(), BUKKIT_VALUES[41 - index], true); } @Override - @Nullable - public ItemStack getItem() { - return slot.get(e); + public @Nullable ItemStack getItem() { + if (skriptSlot != null) + return skriptSlot.get(entityEquipment); + return entityEquipment.getItem(bukkitSlot); } @Override - public void setItem(final @Nullable ItemStack item) { - slot.set(e, item); - if (e.getHolder() instanceof Player) - PlayerUtils.updateInventory((Player) e.getHolder()); + public void setItem(@Nullable ItemStack item) { + if (skriptSlot != null) { + skriptSlot.set(entityEquipment, item); + } else { + entityEquipment.setItem(bukkitSlot, item); + } + if (entityEquipment.getHolder() instanceof Player player) + PlayerUtils.updateInventory(player); } @Override public int getAmount() { - ItemStack item = slot.get(e); + ItemStack item = getItem(); return item != null ? item.getAmount() : 0; } @Override public void setAmount(int amount) { - ItemStack item = slot.get(e); + ItemStack item = getItem(); if (item != null) item.setAmount(amount); - slot.set(e, item); + setItem(item); } /** - * Gets underlying armor slot enum. - * @return Armor slot. + * @deprecated Use {@link EquipmentSlot#EquipmentSlot(EntityEquipment, org.bukkit.inventory.EquipmentSlot)} and {@link #getEquipmentSlot()} */ + @Deprecated public EquipSlot getEquipSlot() { - return slot; + return skriptSlot; + } + + /** + * Get the corresponding {@link org.bukkit.inventory.EquipmentSlot} + * @return + */ + public org.bukkit.inventory.EquipmentSlot getEquipmentSlot() { + return bukkitSlot; } @Override public int getIndex() { // use specific slotIndex if available - return slotIndex != -1 ? slotIndex : slot.slotNumber; + if (slotIndex != -1) { + return slotIndex; + } else if (skriptSlot != null) { + return skriptSlot.slotNumber; + } else if (BUKKIT_SLOT_INDICES.containsKey(bukkitSlot)) { + return BUKKIT_SLOT_INDICES.get(bukkitSlot); + } + return -1; } @Override public String toString(@Nullable Event event, boolean debug) { - if (slotToString) // Slot to string - return "the " + slot.name().toLowerCase(Locale.ENGLISH) + " of " + Classes.toString(e.getHolder()); // TODO localise? - else // Contents of slot to string - return Classes.toString(getItem()); + if (slotToString) { + StringBuilder builder = new StringBuilder("the "); + if (skriptSlot != null) { + builder.append(skriptSlot.name().toLowerCase(Locale.ENGLISH)); + } else { + builder.append(bukkitSlot.name().replace('_', ' ').toLowerCase(Locale.ENGLISH)); + } + builder.append(" of ").append(Classes.toString(entityEquipment.getHolder())); + return builder.toString(); + } + return Classes.toString(getItem()); } }