From 77eca8665c0df07292369ab9f870e58d3bd1f781 Mon Sep 17 00:00:00 2001 From: MemencioPerez Date: Sun, 24 Nov 2024 04:33:10 -0400 Subject: [PATCH] feat: add options for NBT Byte tags --- .../deluxemenus/config/DeluxeMenusConfig.java | 2 ++ .../deluxemenus/menu/MenuItem.java | 16 +++++++++++ .../menu/options/MenuItemOptions.java | 26 +++++++++++++++++ .../deluxemenus/nbt/NbtProvider.java | 28 +++++++++++++++++++ 4 files changed, 72 insertions(+) diff --git a/src/main/java/com/extendedclip/deluxemenus/config/DeluxeMenusConfig.java b/src/main/java/com/extendedclip/deluxemenus/config/DeluxeMenusConfig.java index 46a7d50..dae137e 100644 --- a/src/main/java/com/extendedclip/deluxemenus/config/DeluxeMenusConfig.java +++ b/src/main/java/com/extendedclip/deluxemenus/config/DeluxeMenusConfig.java @@ -759,9 +759,11 @@ 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)); diff --git a/src/main/java/com/extendedclip/deluxemenus/menu/MenuItem.java b/src/main/java/com/extendedclip/deluxemenus/menu/MenuItem.java index 88178e5..82f1700 100644 --- a/src/main/java/com/extendedclip/deluxemenus/menu/MenuItem.java +++ b/src/main/java/com/extendedclip/deluxemenus/menu/MenuItem.java @@ -413,6 +413,14 @@ 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(":")) { @@ -437,6 +445,14 @@ 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(":")) { 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 da6977d..fb1c45d 100644 --- a/src/main/java/com/extendedclip/deluxemenus/menu/options/MenuItemOptions.java +++ b/src/main/java/com/extendedclip/deluxemenus/menu/options/MenuItemOptions.java @@ -50,9 +50,11 @@ 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; @@ -99,9 +101,11 @@ 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; @@ -222,6 +226,10 @@ public boolean hasLore() { return Optional.ofNullable(nbtString); } + public @NotNull Optional nbtByte() { + return Optional.ofNullable(nbtByte); + } + public @NotNull Optional nbtShort() { return Optional.ofNullable(nbtShort); } @@ -234,6 +242,10 @@ public boolean hasLore() { return nbtStrings; } + public @NotNull List nbtBytes() { + return nbtBytes; + } + public @NotNull List nbtShorts() { return nbtShorts; } @@ -329,9 +341,11 @@ 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) @@ -382,9 +396,11 @@ 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(); @@ -542,6 +558,11 @@ 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; @@ -557,6 +578,11 @@ 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; diff --git a/src/main/java/com/extendedclip/deluxemenus/nbt/NbtProvider.java b/src/main/java/com/extendedclip/deluxemenus/nbt/NbtProvider.java index bb37d2a..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,7 @@ 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; @@ -37,6 +38,7 @@ 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); @@ -118,6 +120,19 @@ 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; @@ -191,6 +206,13 @@ 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); @@ -321,6 +343,7 @@ 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(); @@ -343,6 +366,11 @@ 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";