From 9097cbe95be3d2b5b6bce5ff3a2cb1192b144a61 Mon Sep 17 00:00:00 2001 From: jhqwqmc Date: Thu, 11 Dec 2025 13:34:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=85=8D=E7=BD=AE=E9=80=89?= =?UTF-8?q?=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/font/BukkitFontManager.java | 14 +- .../bukkit/plugin/BukkitCraftEngine.java | 8 - .../plugin/network/BukkitNetworkManager.java | 246 +++++++++++++++++- .../bukkit/plugin/network/PacketIds.java | 2 + .../plugin/network/id/PacketIds1_20.java | 5 + .../plugin/network/id/PacketIds1_20_5.java | 5 + .../reflection/minecraft/CoreReflections.java | 12 + common-files/src/main/resources/config.yml | 1 + .../craftengine/core/plugin/CraftEngine.java | 1 + .../core/plugin/config/Config.java | 6 + gradle.properties | 2 +- 11 files changed, 274 insertions(+), 28 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java index 9f8ca6e1b..2177f49d4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java @@ -230,13 +230,13 @@ public class BukkitFontManager extends AbstractFontManager implements Listener { changed = true; } } - // if (Config.allowEmojiChat()) { - // EmojiTextProcessResult result = replaceJsonEmoji(rawJsonMessage, BukkitAdaptors.adapt(player)); - // if (result.replaced()) { - // rawJsonMessage = result.text(); - // changed = true; - // } - // } + if (Config.allowEmojiChat() && !Config.disableChatReport()) { + EmojiTextProcessResult result = replaceJsonEmoji(rawJsonMessage, BukkitAdaptors.adapt(player)); + if (result.replaced()) { + rawJsonMessage = result.text(); + changed = true; + } + } if (changed) { PaperReflections.method$AsyncChatDecorateEvent$result.invoke(event, ComponentUtils.jsonToPaperAdventure(rawJsonMessage)); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java index ef4a1f4e6..98f5fd274 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java @@ -160,14 +160,6 @@ public class BukkitCraftEngine extends CraftEngine { } catch (Exception e) { throw new InjectionException("Error initializing ProtectedFieldVisitor", e); } - // 关闭聊天验证 - try { - Object settings = CoreReflections.field$DedicatedServer$settings.get(FastNMS.INSTANCE.method$MinecraftServer$getServer()); - Object properties = CoreReflections.field$DedicatedServerSettings$properties.get(settings); - CoreReflections.methodHandle$DedicatedServerProperties$enforceSecureProfileSetter.invoke(properties, false); - } catch (Throwable e) { - throw new InjectionException("Error injecting secure profile", e); - } // 初始化一些注册表 super.onPluginLoad(); BukkitBlockBehaviors.init(); 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 d85f3d1f7..6c7470b61 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 @@ -42,6 +42,7 @@ import net.momirealms.craftengine.bukkit.item.behavior.FurnitureItemBehavior; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.command.feature.TotemAnimationCommand; +import net.momirealms.craftengine.bukkit.plugin.injector.InjectionException; import net.momirealms.craftengine.bukkit.plugin.injector.ProtectedFieldVisitor; import net.momirealms.craftengine.bukkit.plugin.network.handler.*; import net.momirealms.craftengine.bukkit.plugin.network.id.PacketIdHelper; @@ -124,7 +125,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import org.bukkit.persistence.PersistentDataType; import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.messaging.PluginMessageListener; import org.bukkit.util.RayTraceResult; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; @@ -138,8 +138,9 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiFunction; import java.util.function.Predicate; -public class BukkitNetworkManager implements NetworkManager, Listener, PluginMessageListener { +public class BukkitNetworkManager implements NetworkManager, Listener { private static BukkitNetworkManager instance; + private static Tristate enforceSecureProfile = Tristate.UNDEFINED; private final BukkitCraftEngine plugin; private final Map, NMSPacketListener> nmsPacketListeners = new IdentityHashMap<>(128); @@ -178,7 +179,6 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes private int[] blockStateRemapper; private int[] modBlockStateRemapper; - @SuppressWarnings("unchecked") public BukkitNetworkManager(BukkitCraftEngine plugin) { instance = this; Plugin modelEngine = Bukkit.getPluginManager().getPlugin("ModelEngine"); @@ -192,10 +192,10 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes PayloadHelper.registerDataTypes(); // set up packet senders this.packetConsumer = FastNMS.INSTANCE::method$Connection$send; - this.packetsConsumer = ((connection, packets, sendListener) -> { + this.packetsConsumer = (connection, packets, sendListener) -> { Object bundle = FastNMS.INSTANCE.constructor$ClientboundBundlePacket(packets); this.packetConsumer.accept(connection, bundle, sendListener); - }); + }; this.immediatePacketConsumer = (channel, packet, sendListener) -> { ChannelFuture future = channel.writeAndFlush(packet); if (sendListener == null) return; @@ -481,6 +481,13 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes this.packetIds.clientboundSetObjectivePacket(), "ClientboundSetObjectivePacket", ConnectionState.PLAY, PacketFlow.CLIENTBOUND ); + registerByteBufferPacketListener( + VersionHelper.isOrAbove1_20_3() ? + new PlayerChatListener_1_20_3() : + new PlayerChatListener_1_20(), + this.packetIds.clientboundPlayerChatPacket(), "ClientboundPlayerChatPacket", + ConnectionState.PLAY, PacketFlow.CLIENTBOUND + ); } @EventHandler(priority = EventPriority.LOWEST) @@ -531,13 +538,32 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes return this.onlineUserArray; } - @Override - public void onPluginMessageReceived(@NotNull String channel, @NotNull Player player, byte @NotNull [] message) { + private void updateEnforceSecureProfile() { + // 更新聊天验证 + try { + Object settings = CoreReflections.field$DedicatedServer$settings.get(FastNMS.INSTANCE.method$MinecraftServer$getServer()); + Object properties = CoreReflections.field$DedicatedServerSettings$properties.get(settings); + boolean enforceSecureProfile = (boolean) CoreReflections.methodHandle$DedicatedServerProperties$enforceSecureProfileGetter.invoke(properties); + if (BukkitNetworkManager.enforceSecureProfile == Tristate.UNDEFINED) { + BukkitNetworkManager.enforceSecureProfile = Tristate.of(enforceSecureProfile); + } + if (BukkitNetworkManager.enforceSecureProfile.asBoolean()) { // 如果启用才修改 + CoreReflections.methodHandle$DedicatedServerProperties$enforceSecureProfileSetter.invoke(properties, !Config.disableChatReport()); + } + } catch (Throwable e) { + throw new InjectionException("Error injecting secure profile", e); + } } @Override public void init() { Bukkit.getPluginManager().registerEvents(this, this.plugin.javaPlugin()); + updateEnforceSecureProfile(); + } + + @Override + public void load() { + updateEnforceSecureProfile(); } @Override @@ -1496,8 +1522,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } else { CraftEngine.instance().logger().warn("Failed to handle ClientboundLoginPacket: World " + location + " does not exist"); } - if (VersionHelper.isOrAbove1_20_5()) { - try { + if (VersionHelper.isOrAbove1_20_5() && Config.disableChatReport()) { + try { // 去弹窗警告 NetworkReflections.methodHandle$ClientboundLoginPacket$enforcesSecureChatSetter.invoke(packet, true); } catch (Throwable t) { CraftEngine.instance().logger().warn("Failed to set enforcesSecureChat to false"); @@ -1510,10 +1536,10 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes @Override public void onPacketSend(NetWorkUser user, NMSPacketEvent event, Object packet) { - if (VersionHelper.isOrAbove1_20_5()) { + if (VersionHelper.isOrAbove1_20_5() || !Config.disableChatReport()) { return; } - try { + try { // 去弹窗警告 NetworkReflections.methodHandle$ClientboundServerDataPacket$enforcesSecureChatSetter.invokeExact(packet, true); } catch (Throwable t) { CraftEngine.instance().logger().warn("Failed to set enforcesSecureChat to false"); @@ -1525,7 +1551,9 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes @Override public void onPacketReceive(NetWorkUser user, NMSPacketEvent event, Object packet) { - event.setCancelled(true); + if (Config.disableChatReport()) { + event.setCancelled(true); + } } } @@ -1533,6 +1561,9 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes @Override public void onPacketSend(NetWorkUser user, NMSPacketEvent event, Object packet) { + if (!Config.interceptPlayerChat() || !Config.disableChatReport()) { + return; + } event.setCancelled(true); Object content = FastNMS.INSTANCE.field$ClientboundPlayerChatPacket$unsignedContent(packet); if (content == null) { @@ -4496,11 +4527,202 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } } } + public static class PlayerChatListener_1_20 implements ByteBufferPacketListener { + + public void onPacketSend(NetWorkUser user, ByteBufPacketEvent event) { + if (!Config.interceptPlayerChat() || Config.disableChatReport()) return; + FriendlyByteBuf buf = event.getBuffer(); + boolean changed = false; + UUID sender = buf.readUUID(); + int index = buf.readVarInt(); + byte @Nullable [] messageSignature = buf.readNullable(b -> { + byte[] bs = new byte[256]; + buf.readBytes(bs); + return bs; + }); + // SignedMessageBody.Packed start + String content = buf.readUtf(256); + Instant timeStamp = buf.readInstant(); + long salt = buf.readLong(); + // LastSeenMessages.Packed start + ArrayList> lastSeen = buf.readCollection(FriendlyByteBuf.limitValue(ArrayList::new, 20), b -> { + int i = b.readVarInt() - 1; + if (i == -1) { + byte[] bs = new byte[256]; + buf.readBytes(bs); + return Pair.of(-1, bs); + } else { + return Pair.of(i, null); + } + }); + // LastSeenMessages.Packed end + // SignedMessageBody.Packed end + @Nullable String unsignedContent = buf.readNullable(FriendlyByteBuf::readUtf); + if (unsignedContent != null) { + Map unsignedContentTokens = CraftEngine.instance().fontManager().matchTags(unsignedContent); + if (!unsignedContentTokens.isEmpty()) { + Tag tag = MRegistryOps.JSON.convertTo(MRegistryOps.SPARROW_NBT, GsonHelper.get().fromJson(unsignedContent, JsonElement.class)); + Component component = AdventureHelper.nbtToComponent(tag); + component = AdventureHelper.replaceText(component, unsignedContentTokens, NetworkTextReplaceContext.of((BukkitServerPlayer) user)); + unsignedContent = MRegistryOps.SPARROW_NBT.convertTo(MRegistryOps.JSON, AdventureHelper.componentToNbt(component)).toString(); + changed = true; + } + } + // FilterMask start + int type = buf.readVarInt(); + BitSet mask = type == 2 /* PARTIALLY_FILTERED */ ? buf.readBitSet() : null; + // FilterMask end + // ChatType.BoundNetwork start + int chatType = buf.readVarInt(); + String name = buf.readUtf(); + Map nameTokens = CraftEngine.instance().fontManager().matchTags(name); + if (!nameTokens.isEmpty()) { + Tag tag = MRegistryOps.JSON.convertTo(MRegistryOps.SPARROW_NBT, GsonHelper.get().fromJson(name, JsonElement.class)); + Component component = AdventureHelper.nbtToComponent(tag); + component = AdventureHelper.replaceText(component, nameTokens, NetworkTextReplaceContext.of((BukkitServerPlayer) user)); + name = MRegistryOps.SPARROW_NBT.convertTo(MRegistryOps.JSON, AdventureHelper.componentToNbt(component)).toString(); + changed = true; + } + @Nullable String targetName = buf.readNullable(FriendlyByteBuf::readUtf); + if (targetName != null) { + Map targetNameTokens = CraftEngine.instance().fontManager().matchTags(targetName); + if (!targetNameTokens.isEmpty()) { + Tag tag = MRegistryOps.JSON.convertTo(MRegistryOps.SPARROW_NBT, GsonHelper.get().fromJson(targetName, JsonElement.class)); + Component component = AdventureHelper.nbtToComponent(tag); + component = AdventureHelper.replaceText(component, targetNameTokens, NetworkTextReplaceContext.of((BukkitServerPlayer) user)); + targetName = MRegistryOps.SPARROW_NBT.convertTo(MRegistryOps.JSON, AdventureHelper.componentToNbt(component)).toString(); + changed = true; + } + } + // ChatType.BoundNetwork end + if (changed) { + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeUUID(sender); + buf.writeVarInt(index); + buf.writeNullable(messageSignature, (b, bs) -> buf.writeBytes(bs)); + buf.writeUtf(content); + buf.writeInstant(timeStamp); + buf.writeLong(salt); + buf.writeCollection(lastSeen, (b, pair) -> { + b.writeVarInt(pair.left() + 1); + if (pair.right() != null) { + b.writeBytes(pair.right()); + } + }); + buf.writeNullable(unsignedContent, FriendlyByteBuf::writeUtf); + buf.writeVarInt(type); + if (type == 2) buf.writeBitSet(mask); + buf.writeVarInt(chatType); + buf.writeUtf(name); + buf.writeNullable(targetName, FriendlyByteBuf::writeUtf); + } + } + } + + public static class PlayerChatListener_1_20_3 implements ByteBufferPacketListener { + + public void onPacketSend(NetWorkUser user, ByteBufPacketEvent event) { + if (!Config.interceptPlayerChat() || Config.disableChatReport()) return; + FriendlyByteBuf buf = event.getBuffer(); + boolean changed = false; + int globalIndex = VersionHelper.isOrAbove1_21_5() ? buf.readVarInt() : -1; + UUID sender = buf.readUUID(); + int index = buf.readVarInt(); + byte @Nullable [] messageSignature = buf.readNullable(b -> { + byte[] bs = new byte[256]; + buf.readBytes(bs); + return bs; + }); + // SignedMessageBody.Packed start + String content = buf.readUtf(256); + Instant timeStamp = buf.readInstant(); + long salt = buf.readLong(); + // LastSeenMessages.Packed start + ArrayList> lastSeen = buf.readCollection(FriendlyByteBuf.limitValue(ArrayList::new, 20), b -> { + int i = b.readVarInt() - 1; + if (i == -1) { + byte[] bs = new byte[256]; + buf.readBytes(bs); + return Pair.of(-1, bs); + } else { + return Pair.of(i, null); + } + }); + // LastSeenMessages.Packed end + // SignedMessageBody.Packed end + @Nullable Tag unsignedContent = buf.readNullable(b -> b.readNbt(false)); + if (unsignedContent != null) { + Map tokens = CraftEngine.instance().fontManager().matchTags(unsignedContent); + if (!tokens.isEmpty()) { + Component component = AdventureHelper.tagToComponent(unsignedContent); + component = AdventureHelper.replaceText(component, tokens, NetworkTextReplaceContext.of((BukkitServerPlayer) user)); + unsignedContent = AdventureHelper.componentToTag(component); + changed = true; + } + } + // FilterMask start + int type = buf.readVarInt(); + BitSet mask = type == 2 /* PARTIALLY_FILTERED */ ? buf.readBitSet() : null; + // FilterMask end + // ChatType.Bound start + int chatType = buf.readVarInt(); + Tag name = buf.readNbt(false); + if (name != null) { + Map tokens = CraftEngine.instance().fontManager().matchTags(name); + if (!tokens.isEmpty()) { + Component component = AdventureHelper.tagToComponent(name); + component = AdventureHelper.replaceText(component, tokens, NetworkTextReplaceContext.of((BukkitServerPlayer) user)); + name = AdventureHelper.componentToTag(component); + changed = true; + } + } + @Nullable Tag targetName = buf.readNullable(b -> b.readNbt(false)); + if (targetName != null) { + Map tokens = CraftEngine.instance().fontManager().matchTags(targetName); + if (!tokens.isEmpty()) { + Component component = AdventureHelper.tagToComponent(targetName); + component = AdventureHelper.replaceText(component, tokens, NetworkTextReplaceContext.of((BukkitServerPlayer) user)); + targetName = AdventureHelper.componentToTag(component); + changed = true; + } + } + // ChatType.Bound end + if (changed) { + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + if (VersionHelper.isOrAbove1_21_5()) buf.writeVarInt(globalIndex); + buf.writeUUID(sender); + buf.writeVarInt(index); + buf.writeNullable(messageSignature, (b, bs) -> buf.writeBytes(bs)); + buf.writeUtf(content); + buf.writeInstant(timeStamp); + buf.writeLong(salt); + buf.writeCollection(lastSeen, (b, pair) -> { + b.writeVarInt(pair.left() + 1); + if (pair.right() != null) { + b.writeBytes(pair.right()); + } + }); + buf.writeNullable(unsignedContent, (b, tag) -> b.writeNbt(tag, false)); + buf.writeVarInt(type); + if (type == 2) buf.writeBitSet(mask); + buf.writeVarInt(chatType); + buf.writeNbt(name, false); + buf.writeNullable(targetName, (b, tag) -> b.writeNbt(tag, false)); + } + } + } public static class StatusResponseListener implements ByteBufferPacketListener { @Override public void onPacketSend(NetWorkUser user, ByteBufPacketEvent event) { + if (!Config.disableChatReport()) { + return; + } FriendlyByteBuf buf = event.getBuffer(); JsonObject jsonObject = JsonParser.parseString(buf.readUtf()).getAsJsonObject(); jsonObject.addProperty("preventsChatReports", true); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java index bd7f60b68..f0999c467 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java @@ -76,6 +76,8 @@ public interface PacketIds { int serverboundCustomPayloadPacket(); + int clientboundPlayerChatPacket(); + int clientIntentionPacket(); int clientboundStatusResponsePacket(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java index 71610cd73..69fb036cd 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java @@ -192,6 +192,11 @@ public class PacketIds1_20 implements PacketIds { return PacketIdHelper.byClazz(NetworkReflections.clazz$ServerboundCustomPayloadPacket, PacketFlow.SERVERBOUND, ConnectionState.PLAY); } + @Override + public int clientboundPlayerChatPacket() { + return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientboundPlayerChatPacket, PacketFlow.CLIENTBOUND, ConnectionState.PLAY); + } + @Override public int clientIntentionPacket() { return PacketIdHelper.byClazz(NetworkReflections.clazz$ClientIntentionPacket, PacketFlow.SERVERBOUND, ConnectionState.HANDSHAKING); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java index 5c933c64a..0ad2dace8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java @@ -191,6 +191,11 @@ public class PacketIds1_20_5 implements PacketIds { return PacketIdHelper.byName("minecraft:custom_payload", PacketFlow.SERVERBOUND, ConnectionState.PLAY); } + @Override + public int clientboundPlayerChatPacket() { + return PacketIdHelper.byName("minecraft:player_chat", PacketFlow.CLIENTBOUND, ConnectionState.PLAY); + } + @Override public int clientIntentionPacket() { return PacketIdHelper.byName("minecraft:intention", PacketFlow.SERVERBOUND, ConnectionState.HANDSHAKING); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java index 004ae8748..c4dbaed8d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java @@ -4696,4 +4696,16 @@ public final class CoreReflections { public static final MethodHandle methodHandle$DedicatedServerProperties$enforceSecureProfileSetter = requireNonNull( ReflectionUtils.unreflectSetter(field$DedicatedServerProperties$enforceSecureProfile) ).asType(MethodType.methodType(void.class, Object.class, boolean.class)); + + public static final MethodHandle methodHandle$DedicatedServerProperties$enforceSecureProfileGetter; + + static { + try { + methodHandle$DedicatedServerProperties$enforceSecureProfileGetter = requireNonNull( + ReflectionUtils.unreflectGetter(field$DedicatedServerProperties$enforceSecureProfile) + ).asType(MethodType.methodType(boolean.class, Object.class)); + } catch (IllegalAccessException e) { + throw new ReflectionInitException("Failed to init DedicatedServerProperties$enforceSecureProfileGetter", e); + } + } } diff --git a/common-files/src/main/resources/config.yml b/common-files/src/main/resources/config.yml index 14f683dca..2f7f7fbdb 100644 --- a/common-files/src/main/resources/config.yml +++ b/common-files/src/main/resources/config.yml @@ -401,6 +401,7 @@ image: # Only consider modifying the options below if you need to optimize Netty performance. # In most cases, you can improve load handling by increasing the number of Netty threads. network: + disable-chat-report: true # Disable network operations related to items. # This option will disable client-bound-data/material and the functionality of replacing tags in item name and lore. disable-item-operations: false diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java index e61d94def..d50a96cda 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java @@ -163,6 +163,7 @@ public abstract class CraftEngine implements Plugin { this.templateManager.reload(); this.globalVariableManager.reload(); this.furnitureManager.reload(); + this.networkManager.reload(); this.fontManager.reload(); this.itemManager.reload(); this.soundManager.reload(); 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 13b130d1b..adcde8685 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 @@ -183,6 +183,7 @@ public class Config { protected boolean network$intercept_packets$advancement; protected boolean network$intercept_packets$player_chat; protected boolean network$disable_item_operations; + protected boolean network$disable_chat_report; protected boolean item$client_bound_model; protected boolean item$non_italic_tag; @@ -558,6 +559,7 @@ public class Config { image$codepoint_starting_value$overrides = Map.of(); } + network$disable_chat_report = config.getBoolean("network.disable-chat-report", true); network$disable_item_operations = config.getBoolean("network.disable-item-operations", false); network$intercept_packets$system_chat = config.getBoolean("network.intercept-packets.system-chat", true); network$intercept_packets$tab_list = config.getBoolean("network.intercept-packets.tab-list", true); @@ -976,6 +978,10 @@ public class Config { return id; } + public static boolean disableChatReport() { + return instance.network$disable_chat_report; + } + public static boolean disableItemOperations() { return instance.network$disable_item_operations; } diff --git a/gradle.properties b/gradle.properties index 482e3c63d..4774bf29f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx4G # Project settings project_version=0.0.66.4 -config_version=61 +config_version=62 lang_version=44 project_group=net.momirealms latest_supported_version=1.21.11