From 4560fedea96bd11ee28e3dc517b4c451b75e003b Mon Sep 17 00:00:00 2001 From: Alex 'mcmonkey' Goodwin Date: Sun, 12 Jul 2020 23:29:05 -0700 Subject: [PATCH] use new hover api that doesn't work because spigot is bad --- .../denizenscript/denizen/nms/NMSHandler.java | 3 + .../scripts/commands/npc/RenameCommand.java | 12 ---- .../utilities/FormattedTextHelper.java | 69 ++++++++++++++----- .../denizen/nms/v1_13/Handler.java | 7 ++ .../denizen/nms/v1_14/Handler.java | 7 ++ .../denizen/nms/v1_15/Handler.java | 7 ++ .../denizen/nms/v1_16/Handler.java | 44 ++++++++++-- .../nms/v1_16/helpers/ItemHelperImpl.java | 11 ++- 8 files changed, 120 insertions(+), 40 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java index 0798b2eed6..d926375187 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/NMSHandler.java @@ -11,6 +11,7 @@ import com.denizenscript.denizen.nms.abstracts.ProfileEditor; import com.denizenscript.denizen.nms.abstracts.Sidebar; import com.denizenscript.denizen.utilities.packets.DenizenPacketHandler; +import net.md_5.bungee.api.chat.HoverEvent; import org.bukkit.Location; import org.bukkit.block.Biome; import org.bukkit.entity.Player; @@ -169,4 +170,6 @@ public boolean isCorrectMappingsCode() { public abstract int getPort(); public abstract String getTitle(Inventory inventory); + + public abstract String stringForHover(HoverEvent hover); } diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/RenameCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/RenameCommand.java index 0a019e01f0..80d0fd6bb0 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/RenameCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/RenameCommand.java @@ -49,19 +49,14 @@ public RenameCommand() { @Override public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException { - for (Argument arg : scriptEntry.getProcessedArgs()) { - if (!scriptEntry.hasObject("name")) { scriptEntry.addObject("name", arg.asElement()); } - } - if (!scriptEntry.hasObject("name")) { throw new InvalidArgumentsException("Must specify a name!"); } - if (Utilities.getEntryNPC(scriptEntry) == null || !Utilities.getEntryNPC(scriptEntry).isValid()) { throw new InvalidArgumentsException("Must have a NPC attached!"); } @@ -69,23 +64,16 @@ public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException @Override public void execute(final ScriptEntry scriptEntry) { - ElementTag name = scriptEntry.getElement("name"); - if (scriptEntry.dbCallShouldDebug()) { - Debug.report(scriptEntry, getName(), name.debug()); - } - NPC npc = Utilities.getEntryNPC(scriptEntry).getCitizen(); - Location prev = npc.isSpawned() ? npc.getEntity().getLocation() : null; npc.despawn(DespawnReason.PENDING_RESPAWN); npc.setName(name.asString().length() > 128 ? name.asString().substring(0, 128) : name.asString()); if (prev != null) { npc.spawn(prev); } - } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/FormattedTextHelper.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/FormattedTextHelper.java index e926241183..d56c51a60b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/FormattedTextHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/FormattedTextHelper.java @@ -1,11 +1,16 @@ package com.denizenscript.denizen.utilities; import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizencore.utilities.CoreUtilities; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.*; +import net.md_5.bungee.api.chat.hover.content.Content; +import net.md_5.bungee.api.chat.hover.content.Entity; +import net.md_5.bungee.api.chat.hover.content.Item; +import net.md_5.bungee.api.chat.hover.content.Text; import java.util.ArrayList; import java.util.List; @@ -60,7 +65,7 @@ public static String stringify(BaseComponent component) { boolean hasHover = component.getHoverEvent() != null; if (hasHover) { HoverEvent hover = component.getHoverEvent(); - builder.append(ChatColor.COLOR_CHAR).append("[hover=").append(hover.getAction().name()).append(";").append(escape(stringify(hover.getValue()))).append("]"); + builder.append(ChatColor.COLOR_CHAR).append("[hover=").append(hover.getAction().name()).append(";").append(escape(NMSHandler.getInstance().stringForHover(hover))).append("]"); } boolean hasClick = component.getClickEvent() != null; if (hasClick) { @@ -205,27 +210,57 @@ else if (innardType.equals("hover")) { } TextComponent hoverableText = new TextComponent(); HoverEvent.Action action = HoverEvent.Action.valueOf(innardBase.get(1).toUpperCase()); - BaseComponent[] hoverValue; - if (action == HoverEvent.Action.SHOW_ITEM) { - ItemTag item = ItemTag.valueOf(unescape(innardParts.get(0)), CoreUtilities.noDebugContext); - if (item == null) { - continue; + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_16)) { + Content content; + if (action == HoverEvent.Action.SHOW_ITEM) { + ItemTag item = ItemTag.valueOf(unescape(innardParts.get(0)), CoreUtilities.noDebugContext); + if (item == null) { + continue; + } + // TODO: Why is there not a direct conversion method for Spigot ItemStack -> BungeeChat Item? + String itemNbt = NMSHandler.getItemHelper().getRawHoverText(item.getItemStack()); + content = new Item(item.getItemStack().getType().getKey().toString(), item.getAmount(), net.md_5.bungee.api.chat.ItemTag.ofNbt(itemNbt)); } - // no ItemComponent? - hoverValue = new BaseComponent[] { new TextComponent(NMSHandler.getItemHelper().getRawHoverText(item.getItemStack())) }; - } - else if (action == HoverEvent.Action.SHOW_ENTITY) { - EntityTag entity = EntityTag.valueOf(unescape(innardParts.get(0)), CoreUtilities.basicContext); - if (entity == null) { - continue; + else if (action == HoverEvent.Action.SHOW_ENTITY) { + EntityTag entity = EntityTag.valueOf(unescape(innardParts.get(0)), CoreUtilities.basicContext); + if (entity == null) { + continue; + } + BaseComponent name = null; + if (entity.getBukkitEntity() != null && entity.getBukkitEntity().isCustomNameVisible()) { + name = new TextComponent(); + for (BaseComponent component : parse(entity.getBukkitEntity().getCustomName())) { + name.addExtra(component); + } + } + content = new Entity(entity.getBukkitEntityType().getKey().toString(), entity.getUUID().toString(), name); + } + else { + content = new Text(parse(unescape(innardParts.get(0)))); } - // no EntityComponent? - hoverValue = new BaseComponent[] { new TextComponent(NMSHandler.getEntityHelper().getRawHoverText(entity.getBukkitEntity())) }; + hoverableText.setHoverEvent(new HoverEvent(action, content)); } else { - hoverValue = parse(unescape(innardParts.get(0))); + BaseComponent[] hoverValue; + if (action == HoverEvent.Action.SHOW_ITEM) { + ItemTag item = ItemTag.valueOf(unescape(innardParts.get(0)), CoreUtilities.noDebugContext); + if (item == null) { + continue; + } + hoverValue = new BaseComponent[] {new TextComponent(NMSHandler.getItemHelper().getRawHoverText(item.getItemStack()))}; + } + else if (action == HoverEvent.Action.SHOW_ENTITY) { + EntityTag entity = EntityTag.valueOf(unescape(innardParts.get(0)), CoreUtilities.basicContext); + if (entity == null) { + continue; + } + hoverValue = new BaseComponent[] {new TextComponent(NMSHandler.getEntityHelper().getRawHoverText(entity.getBukkitEntity()))}; + } + else { + hoverValue = parse(unescape(innardParts.get(0))); + } + hoverableText.setHoverEvent(new HoverEvent(action, hoverValue)); } - hoverableText.setHoverEvent(new HoverEvent(action, hoverValue)); for (BaseComponent subComponent : parse(str.substring(endBracket + 1, endIndex))) { hoverableText.addExtra(subComponent); } diff --git a/v1_13/src/main/java/com/denizenscript/denizen/nms/v1_13/Handler.java b/v1_13/src/main/java/com/denizenscript/denizen/nms/v1_13/Handler.java index 9278b6153a..f5e7799d03 100644 --- a/v1_13/src/main/java/com/denizenscript/denizen/nms/v1_13/Handler.java +++ b/v1_13/src/main/java/com/denizenscript/denizen/nms/v1_13/Handler.java @@ -11,6 +11,7 @@ import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizen.nms.util.jnbt.Tag; +import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizen.utilities.packets.DenizenPacketHandler; import com.google.common.collect.Iterables; import com.mojang.authlib.GameProfile; @@ -20,6 +21,7 @@ import com.denizenscript.denizen.nms.abstracts.ProfileEditor; import com.denizenscript.denizen.nms.abstracts.Sidebar; import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.md_5.bungee.api.chat.HoverEvent; import net.minecraft.server.v1_13_R2.MinecraftServer; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -173,4 +175,9 @@ public ProfileEditor getProfileEditor() { public BiomeNMS getBiomeNMS(Biome biome) { return new BiomeNMSImpl(biome); } + + @Override + public String stringForHover(HoverEvent hover) { + return FormattedTextHelper.stringify(hover.getValue()); + } } diff --git a/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/Handler.java b/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/Handler.java index d8e0822cd3..e2f55e5897 100644 --- a/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/Handler.java +++ b/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/Handler.java @@ -10,6 +10,7 @@ import com.denizenscript.denizen.nms.v1_14.impl.jnbt.CompoundTagImpl; import com.denizenscript.denizen.nms.v1_14.impl.network.handlers.DenizenPacketListenerImpl; import com.denizenscript.denizen.nms.util.jnbt.Tag; +import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizen.utilities.packets.DenizenPacketHandler; import com.google.common.collect.Iterables; import com.mojang.authlib.GameProfile; @@ -19,6 +20,7 @@ import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.md_5.bungee.api.chat.HoverEvent; import net.minecraft.server.v1_14_R1.Entity; import net.minecraft.server.v1_14_R1.IInventory; import net.minecraft.server.v1_14_R1.INamableTileEntity; @@ -215,4 +217,9 @@ public ProfileEditor getProfileEditor() { public BiomeNMS getBiomeNMS(Biome biome) { return new BiomeNMSImpl(biome); } + + @Override + public String stringForHover(HoverEvent hover) { + return FormattedTextHelper.stringify(hover.getValue()); + } } diff --git a/v1_15/src/main/java/com/denizenscript/denizen/nms/v1_15/Handler.java b/v1_15/src/main/java/com/denizenscript/denizen/nms/v1_15/Handler.java index 231e4724e3..f01ab9398b 100644 --- a/v1_15/src/main/java/com/denizenscript/denizen/nms/v1_15/Handler.java +++ b/v1_15/src/main/java/com/denizenscript/denizen/nms/v1_15/Handler.java @@ -10,6 +10,7 @@ import com.denizenscript.denizen.nms.v1_15.impl.jnbt.CompoundTagImpl; import com.denizenscript.denizen.nms.v1_15.impl.network.handlers.DenizenPacketListenerImpl; import com.denizenscript.denizen.nms.util.jnbt.Tag; +import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizen.utilities.packets.DenizenPacketHandler; import com.google.common.collect.Iterables; import com.mojang.authlib.GameProfile; @@ -19,6 +20,7 @@ import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizencore.utilities.debugging.Debug; +import net.md_5.bungee.api.chat.HoverEvent; import net.minecraft.server.v1_15_R1.Entity; import net.minecraft.server.v1_15_R1.IInventory; import net.minecraft.server.v1_15_R1.INamableTileEntity; @@ -215,4 +217,9 @@ public ProfileEditor getProfileEditor() { public BiomeNMS getBiomeNMS(Biome biome) { return new BiomeNMSImpl(biome); } + + @Override + public String stringForHover(HoverEvent hover) { + return FormattedTextHelper.stringify(hover.getValue()); + } } diff --git a/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/Handler.java b/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/Handler.java index d10b71f944..e7ca7e5711 100644 --- a/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/Handler.java +++ b/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/Handler.java @@ -10,6 +10,8 @@ import com.denizenscript.denizen.nms.v1_16.impl.jnbt.CompoundTagImpl; import com.denizenscript.denizen.nms.v1_16.impl.network.handlers.DenizenPacketListenerImpl; import com.denizenscript.denizen.nms.util.jnbt.Tag; +import com.denizenscript.denizen.objects.ItemTag; +import com.denizenscript.denizen.utilities.FormattedTextHelper; import com.denizenscript.denizen.utilities.packets.DenizenPacketHandler; import com.google.common.collect.Iterables; import com.mojang.authlib.GameProfile; @@ -19,10 +21,12 @@ import com.denizenscript.denizen.nms.util.jnbt.CompoundTag; import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizencore.utilities.debugging.Debug; -import net.minecraft.server.v1_16_R1.Entity; -import net.minecraft.server.v1_16_R1.IInventory; -import net.minecraft.server.v1_16_R1.INamableTileEntity; -import net.minecraft.server.v1_16_R1.MinecraftServer; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.hover.content.Content; +import net.md_5.bungee.api.chat.hover.content.Item; +import net.md_5.bungee.api.chat.hover.content.Text; +import net.minecraft.server.v1_16_R1.*; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.block.Biome; @@ -34,6 +38,7 @@ import org.bukkit.craftbukkit.v1_16_R1.util.CraftMagicNumbers; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; import org.spigotmc.AsyncCatcher; import java.lang.reflect.Field; @@ -215,4 +220,35 @@ public ProfileEditor getProfileEditor() { public BiomeNMS getBiomeNMS(Biome biome) { return new BiomeNMSImpl(biome); } + + @Override + public String stringForHover(HoverEvent hover) { + if (hover.getContents().isEmpty()) { + return ""; + } + Content contentObject = hover.getContents().get(0); + if (contentObject instanceof Text) { + Object value = ((Text) contentObject).getValue(); + if (value instanceof BaseComponent[]) { + return FormattedTextHelper.stringify((BaseComponent[]) value); + } + else { + return value.toString(); + } + } + else if (contentObject instanceof Item) { + Item item = (Item) contentObject; + ItemStack itemStack = new ItemStack(org.bukkit.Material.getMaterial(item.getId()), item.getCount()); + // TODO: Apply tag somehow + return new ItemTag(itemStack).identify(); + } + else if (contentObject instanceof net.md_5.bungee.api.chat.hover.content.Entity) { + net.md_5.bungee.api.chat.hover.content.Entity entity = (net.md_5.bungee.api.chat.hover.content.Entity) contentObject; + // TODO: Maybe a stabler way of doing this? + return "e@" + entity.getId(); + } + else { + throw new UnsupportedOperationException(); + } + } } diff --git a/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/helpers/ItemHelperImpl.java b/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/helpers/ItemHelperImpl.java index 0fde96af09..12051ec023 100644 --- a/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/helpers/ItemHelperImpl.java +++ b/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/helpers/ItemHelperImpl.java @@ -170,14 +170,11 @@ public String getJsonString(ItemStack itemStack) { @Override public String getRawHoverText(ItemStack itemStack) { - throw new UnsupportedOperationException(); - // TODO: 1.16 - /* - if (itemStack == null || itemStack.getType() == Material.AIR) { - return ""; + NBTTagCompound tag = CraftItemStack.asNMSCopy(itemStack).getTag(); + if (tag == null) { + return null; } - return CraftItemStack.asNMSCopy(itemStack).C().getChatModifier().getHoverEvent().b().getText(); - */ + return tag.toString(); } @Override