From fd7167d66ffbe79bb8e386fbbd27e859cd9827a0 Mon Sep 17 00:00:00 2001 From: XiaoMoMi <972454774@qq.com> Date: Sun, 12 Oct 2025 23:49:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96visitor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/item/ModernNetworkItemHandler.java | 9 +-- .../plugin/network/BukkitNetworkManager.java | 36 ++++----- .../core/font/AbstractFontManager.java | 4 +- .../craftengine/core/font/FontManager.java | 12 +-- .../core/util/StringValueOnlyTagVisitor.java | 73 +++++++++++++++++++ gradle.properties | 4 +- 6 files changed, 105 insertions(+), 33 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/StringValueOnlyTagVisitor.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java index b04605fd6..e49ebd344 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java @@ -227,8 +227,7 @@ public final class ModernNetworkItemHandler implements NetworkItemHandler item, Supplier tag, Context context) { Tag nameTag = item.getSparrowNBTComponent(ComponentTypes.ITEM_NAME); if (nameTag == null) return false; - String tagStr = nameTag.getAsString(); - Map tokens = CraftEngine.instance().fontManager().matchTags(tagStr); + Map tokens = CraftEngine.instance().fontManager().matchTags(nameTag); if (!tokens.isEmpty()) { item.setNBTComponent(ComponentKeys.ITEM_NAME, AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(nameTag), tokens, context))); tag.get().put(ComponentIds.ITEM_NAME, NetworkItemHandler.pack(Operation.ADD, nameTag)); @@ -240,8 +239,7 @@ public final class ModernNetworkItemHandler implements NetworkItemHandler item, Supplier tag, Context context) { Tag nameTag = item.getSparrowNBTComponent(ComponentTypes.CUSTOM_NAME); if (nameTag == null) return false; - String tagStr = nameTag.getAsString(); - Map tokens = CraftEngine.instance().fontManager().matchTags(tagStr); + Map tokens = CraftEngine.instance().fontManager().matchTags(nameTag); if (!tokens.isEmpty()) { item.setNBTComponent(ComponentKeys.CUSTOM_NAME, AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(nameTag), tokens, context))); tag.get().put(ComponentIds.CUSTOM_NAME, NetworkItemHandler.pack(Operation.ADD, nameTag)); @@ -258,8 +256,7 @@ public final class ModernNetworkItemHandler implements NetworkItemHandler tokens = CraftEngine.instance().fontManager().matchTags(tagStr); + Map tokens = CraftEngine.instance().fontManager().matchTags(tag); if (tokens.isEmpty()) { newLore.add(tag); } else { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index bb2014a0e..f244ff068 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -2509,7 +2509,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes buf.writeVarInt(event.packetID()); Component component = AdventureHelper.tagToComponent(nbt); if (Config.interceptSystemChat()) { - Map tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(nbt); if (!tokens.isEmpty()) { component = AdventureHelper.replaceText(component, tokens, NetworkTextReplaceContext.of((BukkitServerPlayer) user)); } @@ -2552,8 +2552,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes if (nbt1 == null) return; Tag nbt2 = buf.readNbt(false); if (nbt2 == null) return; - Map tokens1 = CraftEngine.instance().fontManager().matchTags(nbt1.getAsString()); - Map tokens2 = CraftEngine.instance().fontManager().matchTags(nbt2.getAsString()); + Map tokens1 = CraftEngine.instance().fontManager().matchTags(nbt1); + Map tokens2 = CraftEngine.instance().fontManager().matchTags(nbt2); if (tokens1.isEmpty() && tokens2.isEmpty()) return; event.setChanged(true); buf.clear(); @@ -2588,7 +2588,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes FriendlyByteBuf buf = event.getBuffer(); Tag nbt = buf.readNbt(false); if (nbt == null) return; - Map tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(nbt); if (tokens.isEmpty()) return; event.setChanged(true); buf.clear(); @@ -2621,7 +2621,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes FriendlyByteBuf buf = event.getBuffer(); Tag nbt = buf.readNbt(false); if (nbt == null) return; - Map tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(nbt); if (tokens.isEmpty()) return; event.setChanged(true); buf.clear(); @@ -2654,7 +2654,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes FriendlyByteBuf buf = event.getBuffer(); Tag nbt = buf.readNbt(false); if (nbt == null) return; - Map tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(nbt); if (tokens.isEmpty()) return; event.setChanged(true); buf.clear(); @@ -2714,7 +2714,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes if (actionType == 0) { Tag nbt = buf.readNbt(false); if (nbt == null) return; - Map tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(nbt); if (tokens.isEmpty()) return; float health = buf.readFloat(); int color = buf.readVarInt(); @@ -2733,7 +2733,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } else if (actionType == 3) { Tag nbt = buf.readNbt(false); if (nbt == null) return; - Map tokens = CraftEngine.instance().fontManager().matchTags(nbt.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(nbt); if (tokens.isEmpty()) return; event.setChanged(true); buf.clear(); @@ -2807,9 +2807,9 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes if (prefix == null) return; Tag suffix = buf.readNbt(false); if (suffix == null) return; - Map tokens1 = CraftEngine.instance().fontManager().matchTags(displayName.getAsString()); - Map tokens2 = CraftEngine.instance().fontManager().matchTags(prefix.getAsString()); - Map tokens3 = CraftEngine.instance().fontManager().matchTags(suffix.getAsString()); + Map tokens1 = CraftEngine.instance().fontManager().matchTags(displayName); + Map tokens2 = CraftEngine.instance().fontManager().matchTags(prefix); + Map tokens3 = CraftEngine.instance().fontManager().matchTags(suffix); if (tokens1.isEmpty() && tokens2.isEmpty() && tokens3.isEmpty()) return; NetworkTextReplaceContext context = NetworkTextReplaceContext.of((BukkitServerPlayer) user); List entities = method == 0 ? buf.readStringList() : null; @@ -2870,7 +2870,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes if (optionalNumberFormat) { int format = buf.readVarInt(); if (format == 0) { - Map tokens = CraftEngine.instance().fontManager().matchTags(displayName.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(displayName); if (tokens.isEmpty()) return; event.setChanged(true); buf.clear(); @@ -2882,7 +2882,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes buf.writeBoolean(true); buf.writeVarInt(0); } else if (format == 1) { - Map tokens = CraftEngine.instance().fontManager().matchTags(displayName.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(displayName); if (tokens.isEmpty()) return; Tag style = buf.readNbt(false); event.setChanged(true); @@ -2898,8 +2898,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } else if (format == 2) { Tag fixed = buf.readNbt(false); if (fixed == null) return; - Map tokens1 = CraftEngine.instance().fontManager().matchTags(displayName.getAsString()); - Map tokens2 = CraftEngine.instance().fontManager().matchTags(fixed.getAsString()); + Map tokens1 = CraftEngine.instance().fontManager().matchTags(displayName); + Map tokens2 = CraftEngine.instance().fontManager().matchTags(fixed); if (tokens1.isEmpty() && tokens2.isEmpty()) return; event.setChanged(true); buf.clear(); @@ -2913,7 +2913,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes buf.writeNbt(tokens2.isEmpty() ? fixed : AdventureHelper.componentToTag(AdventureHelper.replaceText(AdventureHelper.tagToComponent(fixed), tokens2, NetworkTextReplaceContext.of((BukkitServerPlayer) user))), false); } } else { - Map tokens = CraftEngine.instance().fontManager().matchTags(displayName.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(displayName); if (tokens.isEmpty()) return; event.setChanged(true); buf.clear(); @@ -2945,7 +2945,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } outside: if (displayName != null) { - Map tokens = CraftEngine.instance().fontManager().matchTags(displayName.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(displayName); if (tokens.isEmpty()) break outside; Component component = AdventureHelper.tagToComponent(displayName); component = AdventureHelper.replaceText(component, tokens, NetworkTextReplaceContext.of(serverPlayer)); @@ -2966,7 +2966,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } else if (format == 2) { fixed = buf.readNbt(false); if (fixed == null) return; - Map tokens = CraftEngine.instance().fontManager().matchTags(fixed.getAsString()); + Map tokens = CraftEngine.instance().fontManager().matchTags(fixed); if (tokens.isEmpty() && !isChanged) return; if (!tokens.isEmpty()) { Component component = AdventureHelper.tagToComponent(fixed); diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java index 2e830a000..abdd3d610 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java @@ -170,12 +170,12 @@ public abstract class AbstractFontManager implements FontManager { } @Override - public Map matchTags(String json) { + public Map matchTags(String text) { if (this.networkTagTrie == null) { return Collections.emptyMap(); } Map tags = new HashMap<>(); - for (Token token : this.networkTagTrie.tokenize(json)) { + for (Token token : this.networkTagTrie.tokenize(text)) { if (token.isMatch()) { tags.put(token.getFragment(), this.networkTagMapper.get(token.getFragment())); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/FontManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/FontManager.java index 7cf65807b..0c9e46730 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/FontManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/FontManager.java @@ -6,10 +6,8 @@ import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.config.ConfigParser; import net.momirealms.craftengine.core.plugin.text.component.ComponentProvider; -import net.momirealms.craftengine.core.util.AdventureHelper; -import net.momirealms.craftengine.core.util.CharacterUtils; -import net.momirealms.craftengine.core.util.FormatUtils; -import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.*; +import net.momirealms.sparrow.nbt.Tag; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -110,7 +108,11 @@ public interface FontManager extends Manageable { return createOffsets(offset, (raw, font) -> raw); } - Map matchTags(String json); + Map matchTags(String text); + + default Map matchTags(Tag nbt) { + return matchTags(new StringValueOnlyTagVisitor().visit(nbt)); + } void refreshEmojiSuggestions(UUID uuid); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/StringValueOnlyTagVisitor.java b/core/src/main/java/net/momirealms/craftengine/core/util/StringValueOnlyTagVisitor.java new file mode 100644 index 000000000..87986564d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/StringValueOnlyTagVisitor.java @@ -0,0 +1,73 @@ +package net.momirealms.craftengine.core.util; + +import net.momirealms.sparrow.nbt.*; + +import java.util.Map; + +public class StringValueOnlyTagVisitor implements TagVisitor { + protected final StringBuilder builder = new StringBuilder(); + + public String visit(Tag element) { + element.accept(this); + return this.builder.toString(); + } + + @Override + public void visitString(StringTag element) { + this.builder.append(element.getAsString()); + } + + @Override + public void visitByte(ByteTag element) { + } + + @Override + public void visitShort(ShortTag element) { + } + + @Override + public void visitInt(IntTag element) { + } + + @Override + public void visitLong(LongTag element) { + } + + @Override + public void visitFloat(FloatTag element) { + } + + @Override + public void visitDouble(DoubleTag element) { + } + + @Override + public void visitByteArray(ByteArrayTag element) { + } + + @Override + public void visitIntArray(IntArrayTag element) { + } + + @Override + public void visitLongArray(LongArrayTag element) { + } + + @Override + public void visitList(ListTag element) { + for (Tag tag : element) { + this.builder.append((new StringValueOnlyTagVisitor()).visit(tag)); + } + } + + @Override + public void visitCompound(CompoundTag compound) { + for (Map.Entry entry : compound.entrySet()) { + this.builder.append((new StringValueOnlyTagVisitor()).visit(entry.getValue())); + } + } + + @Override + public void visitEnd(EndTag element) { + } +} diff --git a/gradle.properties b/gradle.properties index 97dfe4633..b36f41ba2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.64.7 +project_version=0.0.64.8 config_version=49 lang_version=34 project_group=net.momirealms @@ -39,7 +39,7 @@ zstd_version=1.5.7-4 commons_io_version=2.20.0 commons_imaging_version=1.0.0-alpha6 commons_lang3_version=3.19.0 -sparrow_nbt_version=0.10.5 +sparrow_nbt_version=0.10.6 sparrow_util_version=0.52 fastutil_version=8.5.16 netty_version=4.1.127.Final