From 96c58199ec9921dd7508564ac274b6dbc38ef67b Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 28 Jan 2023 13:21:35 +0100 Subject: [PATCH] /give command is now called silently (no console output), slight refactor of function createItemLore() --- .../ArmorStandTools/ArmorStandGUI.java | 6 +- .../plugins/ArmorStandTools/ItemStackNBT.java | 68 ------------------- .../plugins/ArmorStandTools/Reflections.java | 68 +++++++++++++++++++ .../plugins/ArmorStandTools/Utils.java | 32 +++++---- 4 files changed, 87 insertions(+), 87 deletions(-) delete mode 100644 src/main/java/com/gmail/St3venAU/plugins/ArmorStandTools/ItemStackNBT.java create mode 100644 src/main/java/com/gmail/St3venAU/plugins/ArmorStandTools/Reflections.java diff --git a/src/main/java/com/gmail/St3venAU/plugins/ArmorStandTools/ArmorStandGUI.java b/src/main/java/com/gmail/St3venAU/plugins/ArmorStandTools/ArmorStandGUI.java index d348cc6..f8bf6de 100644 --- a/src/main/java/com/gmail/St3venAU/plugins/ArmorStandTools/ArmorStandGUI.java +++ b/src/main/java/com/gmail/St3venAU/plugins/ArmorStandTools/ArmorStandGUI.java @@ -262,11 +262,7 @@ class ArmorStandGUI implements Listener { Utils.title(p, Config.glow + ": " + (glowing ? Config.isOn : Config.isOff)); break; case ITEM: - World w = p.getWorld(); - boolean commandFeedback = Boolean.TRUE.equals(w.getGameRuleValue(GameRule.SEND_COMMAND_FEEDBACK)); - if(commandFeedback) w.setGameRule(GameRule.SEND_COMMAND_FEEDBACK, false); - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), Utils.createGiveCommand(as, p)); - if(commandFeedback) w.setGameRule(GameRule.SEND_COMMAND_FEEDBACK, true); + Reflections.callCommandSilently(Utils.createGiveCommand(as, p)); p.closeInventory(); if(p.getGameMode() != GameMode.CREATIVE) { as.remove(); diff --git a/src/main/java/com/gmail/St3venAU/plugins/ArmorStandTools/ItemStackNBT.java b/src/main/java/com/gmail/St3venAU/plugins/ArmorStandTools/ItemStackNBT.java deleted file mode 100644 index 8ea1259..0000000 --- a/src/main/java/com/gmail/St3venAU/plugins/ArmorStandTools/ItemStackNBT.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.gmail.St3venAU.plugins.ArmorStandTools; - -import org.bukkit.Bukkit; -import org.bukkit.inventory.ItemStack; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -// CREDIT: This class is based on the MiniNBT library: https://github.com/I-Al-Istannen/MiniNBT -public class ItemStackNBT { - private final static Method AS_NMS_COPY; - private final static Method GET_TAG; - private final static Method TAG_TO_STRING; - private static final String SERVER_VERSION; - - static { - boolean runningUnderTest = Bukkit.getServer() == null - || Bukkit.getServer().getClass().getName().contains("Mockito"); - - String name = runningUnderTest - ? "org.bukkit.craftbukkit.v1_14_R1" - : Bukkit.getServer().getClass().getPackage().getName(); - String[] split = name.split("\\."); - name = split[split.length - 1]; - - SERVER_VERSION = name; - Class craftItemStackClass; - Class itemStackClass; - Class compoundTagClass; - try { - craftItemStackClass = Class.forName("org.bukkit.craftbukkit." + SERVER_VERSION + ".inventory.CraftItemStack"); - itemStackClass = Class.forName("net.minecraft.world.item.ItemStack"); - compoundTagClass = Class.forName("net.minecraft.nbt.NBTTagCompound"); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - try { - AS_NMS_COPY = craftItemStackClass.getMethod("asNMSCopy", ItemStack.class); - GET_TAG = itemStackClass.getDeclaredMethod("getTagClone"); - GET_TAG.setAccessible(true); - TAG_TO_STRING = compoundTagClass.getMethod("toString"); - } catch (NoSuchMethodException e) { - throw new RuntimeException(e); - } - } - - public static String itemToString(ItemStack item){ - Object nmsItem; - try { - nmsItem = AS_NMS_COPY.invoke(null, item); - - if (nmsItem == null) { - throw new NullPointerException("Unable to find a nms item clone for " + item); - } - - Object tag = GET_TAG.invoke(nmsItem); - - if (tag == null) { - return null; - } - - return (String) TAG_TO_STRING.invoke(tag); - } catch (IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException(e); - } - } - // -} diff --git a/src/main/java/com/gmail/St3venAU/plugins/ArmorStandTools/Reflections.java b/src/main/java/com/gmail/St3venAU/plugins/ArmorStandTools/Reflections.java new file mode 100644 index 0000000..1f188cd --- /dev/null +++ b/src/main/java/com/gmail/St3venAU/plugins/ArmorStandTools/Reflections.java @@ -0,0 +1,68 @@ +package com.gmail.St3venAU.plugins.ArmorStandTools; + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ProxiedCommandSender; +import org.bukkit.inventory.ItemStack; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; + +public class Reflections { + private final static Method AS_NMS_COPY; + private final static Method GET_TAG; + private static final String SERVER_VERSION; + private static final ProxiedCommandSender PROXIED_COMMAND_SENDER; + + static { + String name = Bukkit.getServer().getClass().getPackage().getName(); + String[] split = name.split("\\."); + name = split[split.length - 1]; + SERVER_VERSION = name; + + try { + AS_NMS_COPY = Class.forName("org.bukkit.craftbukkit." + SERVER_VERSION + ".inventory.CraftItemStack").getMethod("asNMSCopy", ItemStack.class); + GET_TAG = Class.forName("net.minecraft.world.item.ItemStack").getDeclaredMethod("getTagClone"); + GET_TAG.setAccessible(true); + + Object commandSourceStack = Class.forName("org.bukkit.craftbukkit." + SERVER_VERSION + ".command.VanillaCommandWrapper").getMethod("getListener", CommandSender.class).invoke(null, Bukkit.getConsoleSender()); + Method suppressOutput = Arrays.stream(commandSourceStack.getClass().getDeclaredMethods()).filter(m -> m.getParameters().length == 0 && m.getReturnType() == commandSourceStack.getClass()).findAny().orElse(null); + if(suppressOutput == null){ + throw new RuntimeException("Cant find method withSuppressedOutput() of net.minecraft.commands.CommandListenerWrapper"); + } + PROXIED_COMMAND_SENDER = (ProxiedCommandSender) Class.forName("org.bukkit.craftbukkit." + SERVER_VERSION + ".command.ProxiedNativeCommandSender") + .getConstructor(commandSourceStack.getClass(), CommandSender.class, CommandSender.class) + .newInstance(suppressOutput.invoke(commandSourceStack), Bukkit.getConsoleSender(), Bukkit.getConsoleSender()); + } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException | ClassNotFoundException | InstantiationException e) { + throw new RuntimeException(e); + } + } + + // CREDIT: This function is based on the MiniNBT library: https://github.com/I-Al-Istannen/MiniNBT + public static String itemToString(ItemStack item){ + Object nmsItem; + try { + nmsItem = AS_NMS_COPY.invoke(null, item); + + if (nmsItem == null) { + throw new NullPointerException("Unable to find a nms item clone for " + item); + } + + Object tag = GET_TAG.invoke(nmsItem); + + if (tag == null) { + return null; + } + + return tag.toString(); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + } + // Run a command with no output to the console + public static void callCommandSilently(String command){ + Bukkit.dispatchCommand(PROXIED_COMMAND_SENDER, command); + } +} diff --git a/src/main/java/com/gmail/St3venAU/plugins/ArmorStandTools/Utils.java b/src/main/java/com/gmail/St3venAU/plugins/ArmorStandTools/Utils.java index 0039f5a..c90a97c 100644 --- a/src/main/java/com/gmail/St3venAU/plugins/ArmorStandTools/Utils.java +++ b/src/main/java/com/gmail/St3venAU/plugins/ArmorStandTools/Utils.java @@ -2,9 +2,11 @@ package com.gmail.St3venAU.plugins.ArmorStandTools; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.Server; import org.bukkit.block.Block; import org.bukkit.block.CommandBlock; -import org.bukkit.enchantments.Enchantment; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ProxiedCommandSender; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; @@ -13,19 +15,20 @@ import org.bukkit.inventory.EntityEquipment; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.LeatherArmorMeta; -import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.MetadataValue; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionAttachment; +import org.bukkit.permissions.PermissionAttachmentInfo; +import org.bukkit.plugin.Plugin; import org.bukkit.util.EulerAngle; import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.util.*; class Utils { @@ -148,7 +151,7 @@ class Utils { if(is.getAmount() > 0) { sb.append(",Count:").append(is.getAmount()); } - String itemStackTags = ItemStackNBT.itemToString(is); + String itemStackTags = Reflections.itemToString(is); if(itemStackTags != null && !itemStackTags.isEmpty()) { sb.append(",tag:"); sb.append(itemStackTags); @@ -253,12 +256,12 @@ class Utils { if (e != null) { int stacks = 0; int items = 0; - if(e.getHelmet() != null) { stacks++; items += e.getHelmet().getAmount(); } - if(e.getChestplate() != null) { stacks++; items += e.getChestplate().getAmount(); } - if(e.getLeggings() != null) { stacks++; items += e.getLeggings().getAmount(); } - if(e.getBoots() != null) { stacks++; items += e.getBoots().getAmount(); } - if(Material.AIR != e.getItemInMainHand().getType()) { stacks++; items += e.getItemInMainHand().getAmount(); } - if(Material.AIR != e.getItemInOffHand().getType()) { stacks++; items += e.getItemInOffHand().getAmount(); } + for(EquipmentSlot slot : EquipmentSlot.values()){ + ItemStack item = e.getItem(slot); + if(item.getType() == Material.AIR) continue; + stacks++; + items += item.getAmount(); + } if(stacks > 0) { lore.add(Config.inventory + ": " + items + " " + Config.items + " (" + stacks + " " + Config.stacks + ")"); } @@ -392,4 +395,5 @@ class Utils { clone.setMetadata("clone", new FixedMetadataValue(AST.plugin, true)); return clone; } + }