From aee2faa8b09b5be43c34801d083825a2739d6b3d Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 9 Apr 2025 21:23:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BA=E7=9B=94=E7=94=B2=E6=9E=B6=E5=8D=95?= =?UTF-8?q?=E5=BC=80=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/loader/src/main/resources/config.yml | 1 + .../plugin/network/PacketConsumers.java | 53 +++++++++++++++++-- .../craftengine/bukkit/util/Reflections.java | 3 ++ .../core/plugin/config/Config.java | 8 ++- 4 files changed, 59 insertions(+), 6 deletions(-) diff --git a/bukkit/loader/src/main/resources/config.yml b/bukkit/loader/src/main/resources/config.yml index 79c9af030..78ff3ec52 100644 --- a/bukkit/loader/src/main/resources/config.yml +++ b/bukkit/loader/src/main/resources/config.yml @@ -163,6 +163,7 @@ image: team: true scoreboard: true entity-name: false + armor-stand: true text-display: true emoji: {} 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 096490cc2..2fce786b1 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 @@ -1883,10 +1883,10 @@ public class PacketConsumers { buf.writeVarInt(id); FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$pack(packedItems, buf); } - } else if (Config.interceptEntityName()) { - boolean isChanged = false; - List packedItems = FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$unpack(buf); - if (entityType == Reflections.instance$EntityType$TEXT_DISPLAY) { + } else if (entityType == Reflections.instance$EntityType$TEXT_DISPLAY) { + if (Config.interceptTextDisplay()) { + boolean isChanged = false; + List packedItems = FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$unpack(buf); for (int i = 0; i < packedItems.size(); i++) { Object packedItem = packedItems.get(i); int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem); @@ -1907,7 +1907,18 @@ public class PacketConsumers { } } } - } else { + if (isChanged) { + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeVarInt(id); + FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$pack(packedItems, buf); + } + } + } else if (entityType == Reflections.instance$EntityType$ARMOR_STAND) { + if (Config.interceptArmorStand()) { + boolean isChanged = false; + List packedItems = FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$unpack(buf); for (int i = 0; i < packedItems.size(); i++) { Object packedItem = packedItems.get(i); int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem); @@ -1930,6 +1941,38 @@ public class PacketConsumers { } } } + if (isChanged) { + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeVarInt(id); + FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$pack(packedItems, buf); + } + } + } else if (Config.interceptEntityName()) { + boolean isChanged = false; + List packedItems = FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$unpack(buf); + for (int i = 0; i < packedItems.size(); i++) { + Object packedItem = packedItems.get(i); + int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem); + if (entityDataId == EntityDataUtils.CUSTOM_NAME_DATA_ID) { + Optional optionalTextComponent = (Optional) FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem); + if (optionalTextComponent.isPresent()) { + Object textComponent = optionalTextComponent.get(); + String json = ComponentUtils.minecraftToJson(textComponent); + Map tokens = CraftEngine.instance().imageManager().matchTags(json); + if (!tokens.isEmpty()) { + Component component = AdventureHelper.jsonToComponent(json); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); + } + Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem); + packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue(entityDataId, serializer, Optional.of(ComponentUtils.adventureToMinecraft(component)))); + isChanged = true; + break; + } + } + } } if (isChanged) { event.setChanged(true); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index 13dea6c76..7c67dbc05 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -3706,6 +3706,7 @@ public class Reflections { public static final Object instance$EntityType$TEXT_DISPLAY; public static final Object instance$EntityType$ITEM_DISPLAY; public static final Object instance$EntityType$BLOCK_DISPLAY; + public static final Object instance$EntityType$ARMOR_STAND; public static final Object instance$EntityType$FALLING_BLOCK; public static final Object instance$EntityType$INTERACTION; public static final Object instance$EntityType$SHULKER; @@ -3724,6 +3725,8 @@ public class Reflections { instance$EntityType$INTERACTION = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, interaction); Object shulker = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "shulker"); instance$EntityType$SHULKER = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, shulker); + Object armorStand = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "armor_stand"); + instance$EntityType$ARMOR_STAND = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, armorStand); } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java index 83f78491d..fd197c315 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java @@ -132,6 +132,7 @@ public class Config { protected boolean image$intercept_packets$scoreboard; protected boolean image$intercept_packets$entity_name; protected boolean image$intercept_packets$text_display; + protected boolean image$intercept_packets$armor_stand; public Config(CraftEngine plugin) { this.plugin = plugin; @@ -296,8 +297,9 @@ public class Config { image$intercept_packets$container = config.getBoolean("image.intercept-packets.container", true); image$intercept_packets$team = config.getBoolean("image.intercept-packets.team", true); image$intercept_packets$scoreboard = config.getBoolean("image.intercept-packets.scoreboard", true); - image$intercept_packets$entity_name = config.getBoolean("image.intercept-packets.entity-name", true); + image$intercept_packets$entity_name = config.getBoolean("image.intercept-packets.entity-name", false); image$intercept_packets$text_display = config.getBoolean("image.intercept-packets.text-display", true); + image$intercept_packets$armor_stand = config.getBoolean("image.intercept-packets.armor-stand", true); Class modClazz = ReflectionUtils.getClazz(CraftEngine.MOD_CLASS); if (modClazz != null) { @@ -638,6 +640,10 @@ public class Config { return instance.image$intercept_packets$text_display; } + public static boolean interceptArmorStand() { + return instance.image$intercept_packets$armor_stand; + } + public YamlDocument loadOrCreateYamlData(String fileName) { File file = new File(this.plugin.dataFolderFile(), fileName); if (!file.exists()) {