diff --git a/src/main/java/com/extendedclip/deluxemenus/config/DeluxeMenusConfig.java b/src/main/java/com/extendedclip/deluxemenus/config/DeluxeMenusConfig.java index a441b34..f287393 100644 --- a/src/main/java/com/extendedclip/deluxemenus/config/DeluxeMenusConfig.java +++ b/src/main/java/com/extendedclip/deluxemenus/config/DeluxeMenusConfig.java @@ -759,8 +759,12 @@ private Map> loadMenuItems(FileConfiguration .hideUnbreakable(c.getBoolean(currentPath + "hide_unbreakable", false)) .hideEnchants(c.getBoolean(currentPath + "hide_enchantments", false)) .nbtString(c.getString(currentPath + "nbt_string", null)) + .nbtByte(c.getString(currentPath + "nbt_byte", null)) + .nbtShort(c.getString(currentPath + "nbt_short", null)) .nbtInt(c.getString(currentPath + "nbt_int", null)) .nbtStrings(c.getStringList(currentPath + "nbt_strings")) + .nbtBytes(c.getStringList(currentPath + "nbt_bytes")) + .nbtShorts(c.getStringList(currentPath + "nbt_shorts")) .nbtInts(c.getStringList(currentPath + "nbt_ints")) .priority(c.getInt(currentPath + "priority", 1)) .hideTooltip(c.getString(currentPath + "hide_tooltip", null)) diff --git a/src/main/java/com/extendedclip/deluxemenus/menu/MenuItem.java b/src/main/java/com/extendedclip/deluxemenus/menu/MenuItem.java index 623651e..07eeaae 100644 --- a/src/main/java/com/extendedclip/deluxemenus/menu/MenuItem.java +++ b/src/main/java/com/extendedclip/deluxemenus/menu/MenuItem.java @@ -448,6 +448,22 @@ public ItemStack getItemStack(@NotNull final MenuHolder holder) { } } + if (this.options.nbtByte().isPresent()) { + final String tag = holder.setPlaceholdersAndArguments(this.options.nbtByte().get()); + if (tag.contains(":")) { + final String[] parts = tag.split(":"); + itemStack = NbtProvider.setByte(itemStack, parts[0], Byte.parseByte(parts[1])); + } + } + + if (this.options.nbtShort().isPresent()) { + final String tag = holder.setPlaceholdersAndArguments(this.options.nbtShort().get()); + if (tag.contains(":")) { + final String[] parts = tag.split(":"); + itemStack = NbtProvider.setShort(itemStack, parts[0], Short.parseShort(parts[1])); + } + } + if (this.options.nbtInt().isPresent()) { final String tag = holder.setPlaceholdersAndArguments(this.options.nbtInt().get()); if (tag.contains(":")) { @@ -464,6 +480,22 @@ public ItemStack getItemStack(@NotNull final MenuHolder holder) { } } + for (String nbtTag : this.options.nbtBytes()) { + final String tag = holder.setPlaceholdersAndArguments(nbtTag); + if (tag.contains(":")) { + final String[] parts = tag.split(":"); + itemStack = NbtProvider.setByte(itemStack, parts[0], Byte.parseByte(parts[1])); + } + } + + for (String nbtTag : this.options.nbtShorts()) { + final String tag = holder.setPlaceholdersAndArguments(nbtTag); + if (tag.contains(":")) { + final String[] parts = tag.split(":"); + itemStack = NbtProvider.setShort(itemStack, parts[0], Short.parseShort(parts[1])); + } + } + for (String nbtTag : this.options.nbtInts()) { final String tag = holder.setPlaceholdersAndArguments(nbtTag); if (tag.contains(":")) { diff --git a/src/main/java/com/extendedclip/deluxemenus/menu/options/MenuItemOptions.java b/src/main/java/com/extendedclip/deluxemenus/menu/options/MenuItemOptions.java index 13dc63f..21cdc15 100644 --- a/src/main/java/com/extendedclip/deluxemenus/menu/options/MenuItemOptions.java +++ b/src/main/java/com/extendedclip/deluxemenus/menu/options/MenuItemOptions.java @@ -56,8 +56,12 @@ public class MenuItemOptions { private final LoreAppendMode loreAppendMode; private final String nbtString; + private final String nbtByte; + private final String nbtShort; private final String nbtInt; private final List nbtStrings; + private final List nbtBytes; + private final List nbtShorts; private final List nbtInts; private final int slot; @@ -108,8 +112,12 @@ private MenuItemOptions(final @NotNull MenuItemOptionsBuilder builder) { this.displayNameHasPlaceholders = builder.displayNameHasPlaceholders; this.loreHasPlaceholders = builder.loreHasPlaceholders; this.nbtString = builder.nbtString; + this.nbtByte = builder.nbtByte; + this.nbtShort = builder.nbtShort; this.nbtInt = builder.nbtInt; this.nbtStrings = builder.nbtStrings; + this.nbtBytes = builder.nbtBytes; + this.nbtShorts = builder.nbtShorts; this.nbtInts = builder.nbtInts; this.slot = builder.slot; this.priority = builder.priority; @@ -249,6 +257,14 @@ public boolean hasLore() { return Optional.ofNullable(nbtString); } + public @NotNull Optional nbtByte() { + return Optional.ofNullable(nbtByte); + } + + public @NotNull Optional nbtShort() { + return Optional.ofNullable(nbtShort); + } + public @NotNull Optional nbtInt() { return Optional.ofNullable(nbtInt); } @@ -257,6 +273,14 @@ public boolean hasLore() { return nbtStrings; } + public @NotNull List nbtBytes() { + return nbtBytes; + } + + public @NotNull List nbtShorts() { + return nbtShorts; + } + public @NotNull List nbtInts() { return nbtInts; } @@ -353,8 +377,12 @@ public boolean updatePlaceholders() { .itemFlags(this.itemFlags) .unbreakable(this.unbreakable) .nbtString(this.nbtString) + .nbtByte(this.nbtByte) + .nbtShort(this.nbtShort) .nbtInt(this.nbtInt) .nbtStrings(this.nbtStrings) + .nbtBytes(this.nbtBytes) + .nbtShorts(this.nbtShorts) .nbtInts(this.nbtInts) .slot(this.slot) .priority(this.priority) @@ -410,8 +438,12 @@ public static class MenuItemOptionsBuilder { private LoreAppendMode loreAppendMode; private String nbtString; + private String nbtByte; + private String nbtShort; private String nbtInt; private List nbtStrings = Collections.emptyList(); + private List nbtBytes = Collections.emptyList(); + private List nbtShorts = Collections.emptyList(); private List nbtInts = Collections.emptyList(); private int slot; @@ -593,6 +625,16 @@ public MenuItemOptionsBuilder nbtString(final @Nullable String nbtString) { return this; } + public MenuItemOptionsBuilder nbtByte(final @Nullable String nbtByte) { + this.nbtByte = nbtByte; + return this; + } + + public MenuItemOptionsBuilder nbtShort(final @Nullable String nbtShort) { + this.nbtShort = nbtShort; + return this; + } + public MenuItemOptionsBuilder nbtInt(final @Nullable String nbtInt) { this.nbtInt = nbtInt; return this; @@ -603,6 +645,16 @@ public MenuItemOptionsBuilder nbtStrings(final @NotNull List nbtStrings) return this; } + public MenuItemOptionsBuilder nbtBytes(final @NotNull List nbtBytes) { + this.nbtBytes = nbtBytes; + return this; + } + + public MenuItemOptionsBuilder nbtShorts(final @NotNull List nbtShorts) { + this.nbtShorts = nbtShorts; + return this; + } + public MenuItemOptionsBuilder nbtInts(final @NotNull List nbtInts) { this.nbtInts = nbtInts; return this; diff --git a/src/main/java/com/extendedclip/deluxemenus/nbt/NbtProvider.java b/src/main/java/com/extendedclip/deluxemenus/nbt/NbtProvider.java index 418f913..3e0c426 100644 --- a/src/main/java/com/extendedclip/deluxemenus/nbt/NbtProvider.java +++ b/src/main/java/com/extendedclip/deluxemenus/nbt/NbtProvider.java @@ -15,6 +15,8 @@ public final class NbtProvider { private static Method getStringMethod; private static Method setStringMethod; private static Method setBooleanMethod; + private static Method setByteMethod; + private static Method setShortMethod; private static Method setIntMethod; private static Method removeTagMethod; private static Method hasTagMethod; @@ -36,6 +38,8 @@ public final class NbtProvider { getStringMethod = compoundClass.getMethod(VersionConstants.GET_STRING_METHOD_NAME, String.class); setStringMethod = compoundClass.getMethod(VersionConstants.SET_STRING_METHOD_NAME, String.class, String.class); setBooleanMethod = compoundClass.getMethod(VersionConstants.SET_BOOLEAN_METHOD_NAME, String.class, boolean.class); + setByteMethod = compoundClass.getMethod(VersionConstants.SET_BYTE_METHOD_NAME, String.class, byte.class); + setShortMethod = compoundClass.getMethod(VersionConstants.SET_SHORT_METHOD_NAME, String.class, short.class); setIntMethod = compoundClass.getMethod(VersionConstants.SET_INTEGER_METHOD_NAME, String.class, int.class); removeTagMethod = compoundClass.getMethod(VersionConstants.REMOVE_TAG_METHOD_NAME, String.class); hasTagMethod = itemStackClass.getMethod(VersionConstants.HAS_TAG_METHOD_NAME); @@ -116,6 +120,32 @@ public static String getString(final ItemStack itemStack, final String key) { return getString(itemCompound, key); } + public static ItemStack setByte(final ItemStack itemStack, final String key, final byte value) { + if (itemStack == null) return null; + if (itemStack.getType() == Material.AIR) return null; + + Object nmsItemStack = asNMSCopy(itemStack); + Object itemCompound = hasTag(nmsItemStack) ? getTag(nmsItemStack) : newNBTTagCompound(); + + setByte(itemCompound, key, value); + setTag(nmsItemStack, itemCompound); + + return asBukkitCopy(nmsItemStack); + } + + public static ItemStack setShort(final ItemStack itemStack, final String key, final short value) { + if (itemStack == null) return null; + if (itemStack.getType() == Material.AIR) return null; + + Object nmsItemStack = asNMSCopy(itemStack); + Object itemCompound = hasTag(nmsItemStack) ? getTag(nmsItemStack) : newNBTTagCompound(); + + setShort(itemCompound, key, value); + setTag(nmsItemStack, itemCompound); + + return asBukkitCopy(nmsItemStack); + } + public static ItemStack setInt(final ItemStack itemStack, final String key, final int value) { if (itemStack == null) return null; if (itemStack.getType() == Material.AIR) return null; @@ -176,6 +206,20 @@ private static void setBoolean(final Object itemCompound, final String key, fina } } + private static void setByte(final Object itemCompound, final String key, final byte value) { + try { + setByteMethod.invoke(itemCompound, key, value); + } catch (IllegalAccessException | InvocationTargetException ignored) { + } + } + + private static void setShort(final Object itemCompound, final String key, final short value) { + try { + setShortMethod.invoke(itemCompound, key, value); + } catch (IllegalAccessException | InvocationTargetException ignored) { + } + } + private static void setInt(final Object itemCompound, final String key, final int value) { try { setIntMethod.invoke(itemCompound, key, value); @@ -299,6 +343,8 @@ private static class VersionConstants { private final static String GET_STRING_METHOD_NAME = getStringMethodName(); private final static String SET_STRING_METHOD_NAME = setStringMethodName(); private final static String SET_BOOLEAN_METHOD_NAME = setBooleanMethodName(); + private final static String SET_BYTE_METHOD_NAME = setByteMethodName(); + private final static String SET_SHORT_METHOD_NAME = setShortMethodName(); private final static String SET_INTEGER_METHOD_NAME = setIntegerMethodName(); private final static String REMOVE_TAG_METHOD_NAME = removeTagMethodName(); private final static String HAS_TAG_METHOD_NAME = hasTagMethodName(); @@ -320,6 +366,16 @@ private static String setBooleanMethodName() { return "setBoolean"; } + private static String setByteMethodName() { + if (VersionHelper.HAS_OBFUSCATED_NAMES) return "a"; + return "setByte"; + } + + private static String setShortMethodName() { + if (VersionHelper.HAS_OBFUSCATED_NAMES) return "a"; + return "setShort"; + } + private static String setIntegerMethodName() { if (VersionHelper.HAS_OBFUSCATED_NAMES) return "a"; return "setInt";