Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

EquipSlot Deprecation #7478

Open
wants to merge 9 commits into
base: dev/feature
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
22 changes: 10 additions & 12 deletions src/main/java/ch/njol/skript/expressions/ExprArmorSlot.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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")
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/ch/njol/skript/expressions/ExprTool.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 " : "";
Expand Down
141 changes: 105 additions & 36 deletions src/main/java/ch/njol/skript/util/slot/EquipmentSlot.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -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<org.bukkit.inventory.EquipmentSlot, Integer> 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")
Expand All @@ -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());
}

}