From 01f2d81b5d8f080a8ea6e5218354846775ac0fc0 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sat, 30 Aug 2025 02:43:37 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9A=8F=E5=A4=84=E5=8F=AF=E7=94=A8global?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/PacketConsumers.java | 15 ++-- .../handler/ItemFramePacketHandler.java | 1 - ...andler.java => MinecartPacketHandler.java} | 8 +-- .../core/font/AbstractFontManager.java | 70 +++++++++++++------ .../plugin/context/GlobalVariableManager.java | 5 ++ .../craftengine/core/util/MutableBoolean.java | 17 +++++ 6 files changed, 80 insertions(+), 36 deletions(-) rename bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/{AbstractMinecartPacketHandler.java => MinecartPacketHandler.java} (93%) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/MutableBoolean.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index 04e46152c..cda262388 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -142,13 +142,13 @@ public class PacketConsumers { ADD_ENTITY_HANDLERS[MEntityTypes.ITEM_FRAME$registryId] = simpleAddEntityHandler(ItemFramePacketHandler.INSTANCE); ADD_ENTITY_HANDLERS[MEntityTypes.GLOW_ITEM_FRAME$registryId] = simpleAddEntityHandler(ItemFramePacketHandler.INSTANCE); ADD_ENTITY_HANDLERS[MEntityTypes.ENDERMAN$registryId] = simpleAddEntityHandler(EndermanPacketHandler.INSTANCE); - ADD_ENTITY_HANDLERS[MEntityTypes.CHEST_MINECART$registryId] = simpleAddEntityHandler(AbstractMinecartPacketHandler.INSTANCE); - ADD_ENTITY_HANDLERS[MEntityTypes.COMMAND_BLOCK_MINECART$registryId] = simpleAddEntityHandler(AbstractMinecartPacketHandler.INSTANCE); - ADD_ENTITY_HANDLERS[MEntityTypes.FURNACE_MINECART$registryId] = simpleAddEntityHandler(AbstractMinecartPacketHandler.INSTANCE); - ADD_ENTITY_HANDLERS[MEntityTypes.HOPPER_MINECART$registryId] = simpleAddEntityHandler(AbstractMinecartPacketHandler.INSTANCE); - ADD_ENTITY_HANDLERS[MEntityTypes.MINECART$registryId] = simpleAddEntityHandler(AbstractMinecartPacketHandler.INSTANCE); - ADD_ENTITY_HANDLERS[MEntityTypes.SPAWNER_MINECART$registryId] = simpleAddEntityHandler(AbstractMinecartPacketHandler.INSTANCE); - ADD_ENTITY_HANDLERS[MEntityTypes.TNT_MINECART$registryId] = simpleAddEntityHandler(AbstractMinecartPacketHandler.INSTANCE); + ADD_ENTITY_HANDLERS[MEntityTypes.CHEST_MINECART$registryId] = simpleAddEntityHandler(MinecartPacketHandler.INSTANCE); + ADD_ENTITY_HANDLERS[MEntityTypes.COMMAND_BLOCK_MINECART$registryId] = simpleAddEntityHandler(MinecartPacketHandler.INSTANCE); + ADD_ENTITY_HANDLERS[MEntityTypes.FURNACE_MINECART$registryId] = simpleAddEntityHandler(MinecartPacketHandler.INSTANCE); + ADD_ENTITY_HANDLERS[MEntityTypes.HOPPER_MINECART$registryId] = simpleAddEntityHandler(MinecartPacketHandler.INSTANCE); + ADD_ENTITY_HANDLERS[MEntityTypes.MINECART$registryId] = simpleAddEntityHandler(MinecartPacketHandler.INSTANCE); + ADD_ENTITY_HANDLERS[MEntityTypes.SPAWNER_MINECART$registryId] = simpleAddEntityHandler(MinecartPacketHandler.INSTANCE); + ADD_ENTITY_HANDLERS[MEntityTypes.TNT_MINECART$registryId] = simpleAddEntityHandler(MinecartPacketHandler.INSTANCE); ADD_ENTITY_HANDLERS[MEntityTypes.FIREBALL$registryId] = createOptionalCustomProjectileEntityHandler(true); ADD_ENTITY_HANDLERS[MEntityTypes.EYE_OF_ENDER$registryId] = createOptionalCustomProjectileEntityHandler(true); ADD_ENTITY_HANDLERS[MEntityTypes.FIREWORK_ROCKET$registryId] = createOptionalCustomProjectileEntityHandler(true); @@ -495,7 +495,6 @@ public class PacketConsumers { 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()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemFramePacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemFramePacketHandler.java index caf19a28d..eeefbcc48 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemFramePacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ItemFramePacketHandler.java @@ -9,7 +9,6 @@ import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent; import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler; -import net.momirealms.craftengine.core.plugin.network.NetWorkUser; import net.momirealms.craftengine.core.util.FriendlyByteBuf; import org.bukkit.inventory.ItemStack; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/AbstractMinecartPacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/MinecartPacketHandler.java similarity index 93% rename from bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/AbstractMinecartPacketHandler.java rename to bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/MinecartPacketHandler.java index 67774af83..653b1f18a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/AbstractMinecartPacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/MinecartPacketHandler.java @@ -23,9 +23,9 @@ import java.util.List; import java.util.Map; import java.util.Optional; -public class AbstractMinecartPacketHandler implements EntityPacketHandler { - public static final AbstractMinecartPacketHandler INSTANCE = new AbstractMinecartPacketHandler(); - private static final BlockStateHandler HANDLER = VersionHelper.isOrAbove1_21_3() ? BlockStateHandler_1_21_3.INSTANCE : BlockStateHandler_1_20.INSTANCE; +public class MinecartPacketHandler implements EntityPacketHandler { + public static final MinecartPacketHandler INSTANCE = new MinecartPacketHandler(); + private static final BlockStateHandler BLOCK_STATE_HANDLER = VersionHelper.isOrAbove1_21_3() ? BlockStateHandler_1_21_3.INSTANCE : BlockStateHandler_1_20.INSTANCE; @Override public void handleSetEntityData(Player user, ByteBufPacketEvent event) { @@ -36,7 +36,7 @@ public class AbstractMinecartPacketHandler implements EntityPacketHandler { for (int i = 0; i < packedItems.size(); i++) { Object packedItem = packedItems.get(i); int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem); - Object blockState = HANDLER.handle(user, packedItem, entityDataId); + Object blockState = BLOCK_STATE_HANDLER.handle(user, packedItem, entityDataId); if (blockState != null) { packedItems.set(i, blockState); isChanged = true; 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 3a5cef4e6..adfbebdef 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 @@ -42,7 +42,7 @@ public abstract class AbstractFontManager implements FontManager { protected Trie imageTagTrie; protected Trie emojiKeywordTrie; - protected Map tagMapper; + protected Map networkTagMapper; protected Map emojiMapper; protected List emojiList; protected List allEmojiSuggestions; @@ -58,6 +58,7 @@ public abstract class AbstractFontManager implements FontManager { this.offsetFont = Optional.ofNullable(plugin.config().settings().getSection("image.offset-characters")) .map(OffsetFont::new) .orElse(null); + this.networkTagMapper = new HashMap<>(1024); } @Override @@ -66,6 +67,9 @@ public abstract class AbstractFontManager implements FontManager { this.images.clear(); this.illegalChars.clear(); this.emojis.clear(); + if (this.networkTagMapper != null) { + this.networkTagMapper.clear(); + } } @Override @@ -81,6 +85,9 @@ public abstract class AbstractFontManager implements FontManager { @Override public void delayedLoad() { Optional.ofNullable(this.fonts.get(DEFAULT_FONT)).ifPresent(font -> this.illegalChars.addAll(font.codepointsInUse())); + this.registerImageTags(); + this.registerShiftTags(); + this.registerGlobalTags(); this.buildImageTagTrie(); this.buildEmojiKeywordsTrie(); this.emojiList = new ArrayList<>(this.emojis.values()); @@ -89,6 +96,39 @@ public abstract class AbstractFontManager implements FontManager { .collect(Collectors.toList()); } + private void registerGlobalTags() { + for (Map.Entry entry : this.plugin.globalVariableManager().globalVariables().entrySet()) { + String globalTag = globalTag(entry.getKey()); + this.networkTagMapper.put(globalTag, ComponentProvider.miniMessageOrConstant(entry.getValue())); + this.networkTagMapper.put("\\" + globalTag, ComponentProvider.constant(Component.text(entry.getValue()))); + } + } + + private void registerShiftTags() { + for (int i = -256; i <= 256; i++) { + String shiftTag = ""; + this.networkTagMapper.put(shiftTag, ComponentProvider.constant(this.offsetFont.createOffset(i))); + this.networkTagMapper.put("\\" + shiftTag, ComponentProvider.constant(Component.text(shiftTag))); + } + } + + private void registerImageTags() { + for (BitmapImage image : this.images.values()) { + String id = image.id().toString(); + String simpleImageTag = imageTag(id); + this.networkTagMapper.put(simpleImageTag, ComponentProvider.constant(image.componentAt(0, 0))); + this.networkTagMapper.put("\\" + simpleImageTag, ComponentProvider.constant(Component.text(simpleImageTag))); + for (int i = 0; i < image.rows(); i++) { + for (int j = 0; j < image.columns(); j++) { + String imageArgs = id + ":" + i + ":" + j; + String imageTag = imageTag(imageArgs); + this.networkTagMapper.put(imageTag, ComponentProvider.constant(image.componentAt(i, j))); + this.networkTagMapper.put("\\" + imageTag, ComponentProvider.constant(Component.text(imageTag))); + } + } + } + } + @Override public Map matchTags(String json) { if (this.imageTagTrie == null) { @@ -97,7 +137,7 @@ public abstract class AbstractFontManager implements FontManager { Map tags = new HashMap<>(); for (Token token : this.imageTagTrie.tokenize(json)) { if (token.isMatch()) { - tags.put(token.getFragment(), this.tagMapper.get(token.getFragment())); + tags.put(token.getFragment(), this.networkTagMapper.get(token.getFragment())); } } return tags; @@ -266,29 +306,9 @@ public abstract class AbstractFontManager implements FontManager { } private void buildImageTagTrie() { - this.tagMapper = new HashMap<>(1024); - for (BitmapImage image : this.images.values()) { - String id = image.id().toString(); - String simpleImageTag = imageTag(id); - this.tagMapper.put(simpleImageTag, ComponentProvider.constant(image.componentAt(0, 0))); - this.tagMapper.put("\\" + simpleImageTag, ComponentProvider.constant(Component.text(simpleImageTag))); - for (int i = 0; i < image.rows(); i++) { - for (int j = 0; j < image.columns(); j++) { - String imageArgs = id + ":" + i + ":" + j; - String imageTag = imageTag(imageArgs); - this.tagMapper.put(imageTag, ComponentProvider.constant(image.componentAt(i, j))); - this.tagMapper.put("\\" + imageTag, ComponentProvider.constant(Component.text(imageTag))); - } - } - } - for (int i = -256; i <= 256; i++) { - String shiftTag = ""; - this.tagMapper.put(shiftTag, ComponentProvider.constant(this.offsetFont.createOffset(i))); - this.tagMapper.put("\\" + shiftTag, ComponentProvider.constant(Component.text(shiftTag))); - } this.imageTagTrie = Trie.builder() .ignoreOverlaps() - .addKeywords(this.tagMapper.keySet()) + .addKeywords(this.networkTagMapper.keySet()) .build(); } @@ -296,6 +316,10 @@ public abstract class AbstractFontManager implements FontManager { return ""; } + private static String globalTag(String text) { + return ""; + } + @Override public boolean isDefaultFontInUse() { return !this.illegalChars.isEmpty(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/GlobalVariableManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/GlobalVariableManager.java index 5c29100a9..eb0b3ae25 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/GlobalVariableManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/GlobalVariableManager.java @@ -8,6 +8,7 @@ import net.momirealms.craftengine.core.plugin.locale.LocalizedException; import org.jetbrains.annotations.Nullable; import java.nio.file.Path; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -25,6 +26,10 @@ public class GlobalVariableManager implements Manageable { this.globalVariables.clear(); } + public Map globalVariables() { + return Collections.unmodifiableMap(this.globalVariables); + } + public ConfigParser parser() { return this.parser; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/MutableBoolean.java b/core/src/main/java/net/momirealms/craftengine/core/util/MutableBoolean.java new file mode 100644 index 000000000..dfe5b977a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/MutableBoolean.java @@ -0,0 +1,17 @@ +package net.momirealms.craftengine.core.util; + +public class MutableBoolean { + private boolean value; + + public MutableBoolean(boolean value) { + this.value = value; + } + + public boolean booleanValue() { + return value; + } + + public void set(boolean value) { + this.value = value; + } +}