diff --git a/docs/docs/admin/configuration.md b/docs/docs/admin/configuration.md index 92df637..e055f41 100644 --- a/docs/docs/admin/configuration.md +++ b/docs/docs/admin/configuration.md @@ -35,6 +35,14 @@ Global settings affect all worlds on the server as well as the core server funct - **default**: false - **description**: Sets whether the server should dump all configuration values to the server log on startup (this maybe not working) +### settings + - #### do-not-process-chat-commands + - **default**: true + - **description**: Commands will not be proceeded while the player is joining the server + - #### disable-chat-reports + - **default**: false + - **description**: Disables chat signing, which was introduced in version 1.19.1 (similar to No Chat Reports mod) + ### region-format - #### linear - ##### flush-frequency diff --git a/patches/server/0002-Divine-Configuration.patch b/patches/server/0002-Divine-Configuration.patch index f54951c..1612127 100644 --- a/patches/server/0002-Divine-Configuration.patch +++ b/patches/server/0002-Divine-Configuration.patch @@ -79,7 +79,7 @@ index 0000000000000000000000000000000000000000..6ab4a0ae2a0f63e4dfdb36a561ccda2a +} diff --git a/src/main/java/gq/bxteam/divinemc/configuration/DivineConfig.java b/src/main/java/gq/bxteam/divinemc/configuration/DivineConfig.java new file mode 100644 -index 0000000000000000000000000000000000000000..9e802fbe8e5f1a3c24cb6bc9254c72a2a0c3fde1 +index 0000000000000000000000000000000000000000..fa7ee2b2778a26d0e466bdc05ade26a5ae0c17f4 --- /dev/null +++ b/src/main/java/gq/bxteam/divinemc/configuration/DivineConfig.java @@ -0,0 +1,155 @@ @@ -238,7 +238,6 @@ index 0000000000000000000000000000000000000000..9e802fbe8e5f1a3c24cb6bc9254c72a2 + return builder.build(); + } +} -\ No newline at end of file diff --git a/src/main/java/gq/bxteam/divinemc/configuration/DivineWorldConfig.java b/src/main/java/gq/bxteam/divinemc/configuration/DivineWorldConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..5d16d2250bae9c982a0af9ad2580a63532b140f7 @@ -348,7 +347,7 @@ index d21260dd1b7305949f063123b427dec1f5a00ae5..e64ac037eeeebd3b14d8652bdea7b05b this.setFlightAllowed(dedicatedserverproperties.allowFlight); this.setMotd(dedicatedserverproperties.motd); diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 3c7cc1cba00df45296155bdd1430a64a94945f6c..20f760e678b3b9c5d5b2184f5b92f05932fb1256 100644 +index 2b5409e653be7d6b9c0529b512b2f7408b218011..1b318f6c281170cdaafd26a0bff4901e3a153b59 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -15,6 +15,8 @@ import java.util.function.Consumer; @@ -377,7 +376,7 @@ index 3c7cc1cba00df45296155bdd1430a64a94945f6c..20f760e678b3b9c5d5b2184f5b92f059 this.generator = gen; this.world = new CraftWorld((ServerLevel) this, gen, biomeProvider, env); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 19fca5427c175a1ebcfb6c37c9ce91a51b285c0f..37fc46c9329240f494f41f625db679673c41c537 100644 +index 08808e9d98380792b4d4c944b7b1723a3efb346d..c5c5731a755fe635384aad24c3ac5152e5c8ae74 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -14,6 +14,7 @@ import com.mojang.brigadier.tree.CommandNode; diff --git a/patches/server/0004-Optimize-default-values-for-configs.patch b/patches/server/0004-Optimize-default-values-for-configs.patch index 34f0028..0a94965 100644 --- a/patches/server/0004-Optimize-default-values-for-configs.patch +++ b/patches/server/0004-Optimize-default-values-for-configs.patch @@ -36,7 +36,7 @@ index a6f58b3457b7477015c5c6d969e7d83017dd3fa1..e51f427eadc0c3b60754d0a67bea3892 public boolean strictAdvancementDimensionCheck = false; public IntOr.Default compressionLevel = IntOr.Default.USE_DEFAULT; diff --git a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java -index 071d3877e386a0c7c4d2f2e8ddd06e0765c49d0d..d4cb765e3093365346c7ce2ab524e102148941f9 100644 +index 385ca2c1022e0985550a5cc2bbff953f1aa33f5c..fce65fd461e0dbeaa93fb4ddbe931a9792b103da 100644 --- a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java +++ b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java @@ -151,9 +151,9 @@ public class WorldConfiguration extends ConfigurationPart { @@ -192,7 +192,7 @@ index 071d3877e386a0c7c4d2f2e8ddd06e0765c49d0d..d4cb765e3093365346c7ce2ab524e102 @Setting(FeatureSeedsGeneration.FEATURES_KEY) public Reference2LongMap>> features = new Reference2LongOpenHashMap<>(); -@@ -525,9 +540,9 @@ public class WorldConfiguration extends ConfigurationPart { +@@ -532,9 +547,9 @@ public class WorldConfiguration extends ConfigurationPart { public class Misc extends ConfigurationPart { public int lightQueueSize = 20; @@ -205,7 +205,7 @@ index 071d3877e386a0c7c4d2f2e8ddd06e0765c49d0d..d4cb765e3093365346c7ce2ab524e102 public float maxLeashDistance = 10f; public boolean disableSprintInterruptionOnAttack = false; diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 1f54e2ec6d73853001642bcf4b355c4a0dd10f6d..d8d19567cf49b41d730a936d46c8e37e5aec2f07 100644 +index e14a5be13af47162c3f03f7d75ecbe10799bc907..7d24b3177c41661bbd35d51e7e33dedc2fc69d2c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java @@ -241,7 +241,7 @@ public class PurpurConfig { diff --git a/patches/server/0007-Fix-entity-serialization.patch b/patches/server/0007-Fix-entity-serialization.patch index 242ebf3..0990870 100644 --- a/patches/server/0007-Fix-entity-serialization.patch +++ b/patches/server/0007-Fix-entity-serialization.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Fix entity serialization diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index a9d5a9b9bff5631f3f458fba7d88c3fc642416b8..293df31309490af25d3c553e714a6938c14016b6 100644 +index 251b336c1915f173c975fd0c568dfb04182fc91b..174e0113d54d049b56316f4cba8250ba7df4d236 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2336,15 +2336,6 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -2340,15 +2340,6 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } } diff --git a/patches/server/0019-Fix-MC-2025.patch b/patches/server/0019-Fix-MC-2025.patch index 2fda558..1c44dfa 100644 --- a/patches/server/0019-Fix-MC-2025.patch +++ b/patches/server/0019-Fix-MC-2025.patch @@ -7,10 +7,10 @@ Original post on Mojira: https://bugs.mojang.com/browse/MC-2025 Fix taken from Reddit: https://redd.it/8pgd4q diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 293df31309490af25d3c553e714a6938c14016b6..f93c2f57ad8ca828de09ddb0759cd7b880f05f98 100644 +index 174e0113d54d049b56316f4cba8250ba7df4d236..29e040ff5c2d5c4022dd18d807b1b665e2acbe9c 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2502,6 +2502,17 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -2506,6 +2506,17 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S nbttagcompound.putBoolean("Purpur.FireImmune", immuneToFire); } // Purpur end @@ -28,7 +28,7 @@ index 293df31309490af25d3c553e714a6938c14016b6..f93c2f57ad8ca828de09ddb0759cd7b8 return nbttagcompound; } catch (Throwable throwable) { CrashReport crashreport = CrashReport.forThrowable(throwable, "Saving entity NBT"); -@@ -2579,6 +2590,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -2583,6 +2594,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.reapplyPosition(); } diff --git a/patches/server/0026-Do-not-process-chat-commands-before-player-has-joine.patch b/patches/server/0026-Do-not-process-chat-commands-before-player-has-joine.patch index 0756a71..ad568d2 100644 --- a/patches/server/0026-Do-not-process-chat-commands-before-player-has-joine.patch +++ b/patches/server/0026-Do-not-process-chat-commands-before-player-has-joine.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Do not process chat/commands before player has joined diff --git a/src/main/java/gq/bxteam/divinemc/configuration/DivineConfig.java b/src/main/java/gq/bxteam/divinemc/configuration/DivineConfig.java -index 9e802fbe8e5f1a3c24cb6bc9254c72a2a0c3fde1..199a49bed6e5d827f8d01212e37f2f1de589bb8c 100644 +index fa7ee2b2778a26d0e466bdc05ade26a5ae0c17f4..11dc1af9f8d8ce8c0a855d14a35077f5482ef0e8 100644 --- a/src/main/java/gq/bxteam/divinemc/configuration/DivineConfig.java +++ b/src/main/java/gq/bxteam/divinemc/configuration/DivineConfig.java @@ -152,4 +152,9 @@ public class DivineConfig { @@ -18,9 +18,8 @@ index 9e802fbe8e5f1a3c24cb6bc9254c72a2a0c3fde1..199a49bed6e5d827f8d01212e37f2f1d + doNotProcessChatCommands = getBoolean("settings.do-not-process-chat-commands", doNotProcessChatCommands); + } } -\ No newline at end of file diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 819906c465debe02192084968bf3d17d69cdd8c8..b934e57437ae34f4599ddda6eaa90844a1cf403c 100644 +index 68d4ccd7ae5719e66fd3f14e5bfce4675eb73a17..8244d269fcd179b285e5e3a36bff8e58c3806577 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -6,6 +6,7 @@ import com.mojang.authlib.GameProfile; diff --git a/patches/server/0028-Implement-Linear-region-format.patch b/patches/server/0028-Implement-Linear-region-format.patch index 71308d0..0687f43 100644 --- a/patches/server/0028-Implement-Linear-region-format.patch +++ b/patches/server/0028-Implement-Linear-region-format.patch @@ -49,7 +49,7 @@ index f2c27e0ac65be4b75c1d86ef6fd45fdb538d96ac..84ef82da3a18341c1f8bc463360e8ba0 public static final class InProgressWrite { public long writeCounter; diff --git a/src/main/java/gq/bxteam/divinemc/configuration/DivineConfig.java b/src/main/java/gq/bxteam/divinemc/configuration/DivineConfig.java -index 199a49bed6e5d827f8d01212e37f2f1de589bb8c..734f7785261c7f4d45bccf5e5a18d9d6e9a0621a 100644 +index 11dc1af9f8d8ce8c0a855d14a35077f5482ef0e8..def6f834d32b97e1065b17657e73d020a873bd14 100644 --- a/src/main/java/gq/bxteam/divinemc/configuration/DivineConfig.java +++ b/src/main/java/gq/bxteam/divinemc/configuration/DivineConfig.java @@ -157,4 +157,15 @@ public class DivineConfig { @@ -68,7 +68,6 @@ index 199a49bed6e5d827f8d01212e37f2f1de589bb8c..734f7785261c7f4d45bccf5e5a18d9d6 + linearFlushThreads = Math.max(linearFlushThreads, 1); + } } -\ No newline at end of file diff --git a/src/main/java/gq/bxteam/divinemc/configuration/DivineWorldConfig.java b/src/main/java/gq/bxteam/divinemc/configuration/DivineWorldConfig.java index ca344da743a7503795bdaeff0a1b14e0721f5092..7deda3f07cbe5c520ae44575d79f4e857f0b44a1 100644 --- a/src/main/java/gq/bxteam/divinemc/configuration/DivineWorldConfig.java @@ -729,7 +728,7 @@ index f69976dcba060027c67c2e1b49fa28d3f28f66f0..e10ef28420c755258f7fbe7935f8c8ab return flag3; diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index cd55b5bbba17a60766c3302fd8cb94553fe3f929..20530ca2a09f0b6993cde6772adbfabdcf989195 100644 +index 2631c05a3855c71eff3f8cf8d13920430f929a13..b2ccdcc1aba21d0edfed3cd3da7b8ba8dc80cd1e 100644 --- a/src/main/java/net/minecraft/server/level/ChunkMap.java +++ b/src/main/java/net/minecraft/server/level/ChunkMap.java @@ -1,31 +1,23 @@ @@ -862,7 +861,7 @@ index cd55b5bbba17a60766c3302fd8cb94553fe3f929..20530ca2a09f0b6993cde6772adbfabd regionFile.setStatus(chunkPos.x, chunkPos.z, ChunkSerializer.getStatus(compound)); } diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index dd0ef00d29d4caa3a1fe8513ec82d72f64fc308f..80547757b468c14ae38d647ae3e87d5a305c2c9d 100644 +index ac3e1d0f5b8def2bdace6f3b680ff9e929c515fb..f9de830eee88d438357e524921069e7bc20fc3dd 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -6,6 +6,7 @@ import com.google.common.collect.Lists; @@ -933,7 +932,7 @@ index dd0ef00d29d4caa3a1fe8513ec82d72f64fc308f..80547757b468c14ae38d647ae3e87d5a protected void write(ChunkPos pos, net.minecraft.nbt.CompoundTag nbt) throws IOException { ChunkPos nbtPos = nbt == null ? null : EntityStorage.readChunkPos(nbt); -@@ -749,7 +746,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -754,7 +751,7 @@ public class ServerLevel extends Level implements WorldGenLevel { // CraftBukkit end boolean flag2 = minecraftserver.forceSynchronousWrites(); DataFixer datafixer = minecraftserver.getFixerUpper(); @@ -1145,7 +1144,7 @@ index 9248769e6d357f6eec68945fd7700e79b2942c41..4d9dd194d9754103579c15884f799f05 try (DataInputStream out = new DataInputStream(new java.io.BufferedInputStream(new InflaterInputStream(Files.newInputStream(file))))) { return NbtIo.read((java.io.DataInput) out); diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java -index db571f658f636cdda1dcdbaffa0c4da67fae11ad..a84e40213c83aac9f6f408d198333750e7ce53d7 100644 +index 6eaeb2db0da59611501f2b1a63b5b48816a0ba48..0e61161d7d8d714bb7a7c3f68e018e867c6161a0 100644 --- a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java +++ b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java @@ -1,5 +1,8 @@ @@ -1451,7 +1450,7 @@ index 4aac1979cf57300825a999c876fcf24d3170e68e..b81636c1aa5b39e1696fdf30a7e2b270 this.factory = factory; this.fixerUpper = dataFixer; diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index 7321a8dfc59ccb1ae0b7e2d1ce23cb1a5cfbe029..1a3c1eb1ab43d13fed58155d3d2cf9fe4028879f 100644 +index f6c6cd92e1eff044abefa6ca74477d361f4434ec..e24498294f44877bcf8fc97cea9e3ca1a4f9200d 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -5,7 +5,7 @@ import com.google.common.base.Predicates; diff --git a/patches/server/0029-Configurable-Chat-message-signatures.patch b/patches/server/0029-Configurable-Chat-message-signatures.patch new file mode 100644 index 0000000..4914cbb --- /dev/null +++ b/patches/server/0029-Configurable-Chat-message-signatures.patch @@ -0,0 +1,179 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com> +Date: Sun, 7 Jan 2024 11:56:00 +0300 +Subject: [PATCH] Configurable Chat message signatures + + +diff --git a/src/main/java/gq/bxteam/divinemc/configuration/DivineConfig.java b/src/main/java/gq/bxteam/divinemc/configuration/DivineConfig.java +index def6f834d32b97e1065b17657e73d020a873bd14..c58eb66184d3e7fcf722d8871eb212eebed92646 100644 +--- a/src/main/java/gq/bxteam/divinemc/configuration/DivineConfig.java ++++ b/src/main/java/gq/bxteam/divinemc/configuration/DivineConfig.java +@@ -168,4 +168,9 @@ public class DivineConfig { + else + linearFlushThreads = Math.max(linearFlushThreads, 1); + } ++ ++ public static boolean chatMessageSignatures = false; ++ private static void chatMessageSignatures() { ++ chatMessageSignatures = getBoolean("settings.disable-chat-reports", chatMessageSignatures); ++ } + } +diff --git a/src/main/java/io/papermc/paper/adventure/ChatProcessor.java b/src/main/java/io/papermc/paper/adventure/ChatProcessor.java +index e4fd372a1d585887287253a02531cd192929377b..dcc806bcbdcc18f8094b8aa55e8a92a6b12a5f7c 100644 +--- a/src/main/java/io/papermc/paper/adventure/ChatProcessor.java ++++ b/src/main/java/io/papermc/paper/adventure/ChatProcessor.java +@@ -355,7 +355,7 @@ public final class ChatProcessor { + + private void sendToServer(final ChatType.Bound chatType, final @Nullable Function msgFunction) { + final PlayerChatMessage toConsoleMessage = msgFunction == null ? ChatProcessor.this.message : ChatProcessor.this.message.withUnsignedContent(msgFunction.apply(ChatProcessor.this.server.console)); +- ChatProcessor.this.server.logChatMessage(toConsoleMessage.decoratedContent(), chatType, ChatProcessor.this.server.getPlayerList().verifyChatTrusted(toConsoleMessage) ? null : "Not Secure"); ++ ChatProcessor.this.server.logChatMessage(toConsoleMessage.decoratedContent(), chatType, ChatProcessor.this.server.getPlayerList().verifyChatTrusted(toConsoleMessage) ? null : (gq.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures ? null : "Not Secure")); // DivineMC - Configurable Chat message signatures + } + } + +diff --git a/src/main/java/net/minecraft/network/protocol/game/ServerboundChatCommandPacket.java b/src/main/java/net/minecraft/network/protocol/game/ServerboundChatCommandPacket.java +index b8c1f3b9afddc87d56541c8af63cffecfcdd2653..fbfd8cf782ec73a0498ccd6ec0b4110de83ffb2d 100644 +--- a/src/main/java/net/minecraft/network/protocol/game/ServerboundChatCommandPacket.java ++++ b/src/main/java/net/minecraft/network/protocol/game/ServerboundChatCommandPacket.java +@@ -16,7 +16,7 @@ public record ServerboundChatCommandPacket(String command, Instant timeStamp, lo + buf.writeUtf(this.command, 256); + buf.writeInstant(this.timeStamp); + buf.writeLong(this.salt); +- this.argumentSignatures.write(buf); ++ if (!gq.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures) this.argumentSignatures.write(buf); // DivineMC - Configurable Chat message signatures + this.lastSeenMessages.write(buf); + } + +diff --git a/src/main/java/net/minecraft/network/protocol/game/ServerboundChatPacket.java b/src/main/java/net/minecraft/network/protocol/game/ServerboundChatPacket.java +index d1d2fc0c57523c1abf1e8bfec913c78927c3dafc..fa19289a2bbe5e6b72a505e45586a14670bc0c0b 100644 +--- a/src/main/java/net/minecraft/network/protocol/game/ServerboundChatPacket.java ++++ b/src/main/java/net/minecraft/network/protocol/game/ServerboundChatPacket.java +@@ -17,7 +17,7 @@ public record ServerboundChatPacket(String message, Instant timeStamp, long salt + buf.writeUtf(this.message, 256); + buf.writeInstant(this.timeStamp); + buf.writeLong(this.salt); +- buf.writeNullable(this.signature, MessageSignature::write); ++ if (!gq.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures) buf.writeNullable(this.signature, MessageSignature::write); // DivineMC - Configurable Chat message signatures + this.lastSeenMessages.write(buf); + } + +diff --git a/src/main/java/net/minecraft/network/protocol/status/ServerStatus.java b/src/main/java/net/minecraft/network/protocol/status/ServerStatus.java +index c40979e2fa37acb2f3df493395f3ab6e185345d7..16250b44775b2ccd02e2112600c9f3bab5820a98 100644 +--- a/src/main/java/net/minecraft/network/protocol/status/ServerStatus.java ++++ b/src/main/java/net/minecraft/network/protocol/status/ServerStatus.java +@@ -17,7 +17,7 @@ import net.minecraft.network.chat.ComponentSerialization; + + public record ServerStatus(Component description, Optional players, Optional version, Optional favicon, boolean enforcesSecureChat) { + public static final Codec CODEC = RecordCodecBuilder.create((instance) -> { +- return instance.group(ComponentSerialization.CODEC.optionalFieldOf("description", CommonComponents.EMPTY).forGetter(ServerStatus::description), ServerStatus.Players.CODEC.optionalFieldOf("players").forGetter(ServerStatus::players), ServerStatus.Version.CODEC.optionalFieldOf("version").forGetter(ServerStatus::version), ServerStatus.Favicon.CODEC.optionalFieldOf("favicon").forGetter(ServerStatus::favicon), Codec.BOOL.optionalFieldOf("enforcesSecureChat", Boolean.valueOf(false)).forGetter(ServerStatus::enforcesSecureChat)).apply(instance, ServerStatus::new); ++ return gq.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures ? instance.group(ComponentSerialization.CODEC.optionalFieldOf("description", CommonComponents.EMPTY).forGetter(ServerStatus::description), ServerStatus.Players.CODEC.optionalFieldOf("players").forGetter(ServerStatus::players), ServerStatus.Version.CODEC.optionalFieldOf("version").forGetter(ServerStatus::version), ServerStatus.Favicon.CODEC.optionalFieldOf("favicon").forGetter(ServerStatus::favicon), Codec.BOOL.optionalFieldOf("enforcesSecureChat", Boolean.FALSE).forGetter(x -> true)).apply(instance, ServerStatus::new) : instance.group(ComponentSerialization.CODEC.optionalFieldOf("description", CommonComponents.EMPTY).forGetter(ServerStatus::description), ServerStatus.Players.CODEC.optionalFieldOf("players").forGetter(ServerStatus::players), ServerStatus.Version.CODEC.optionalFieldOf("version").forGetter(ServerStatus::version), ServerStatus.Favicon.CODEC.optionalFieldOf("favicon").forGetter(ServerStatus::favicon), Codec.BOOL.optionalFieldOf("enforcesSecureChat", Boolean.FALSE).forGetter(ServerStatus::enforcesSecureChat)).apply(instance, ServerStatus::new); // DivineMC - Configurable Chat message signatures + }); + + public static record Favicon(byte[] iconBytes) { +diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +index e64ac037eeeebd3b14d8652bdea7b05bbd85c7c3..7cf002599cf6a982dc616228eb7a9091c0e92875 100644 +--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java ++++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +@@ -686,6 +686,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface + + @Override + public boolean enforceSecureProfile() { ++ if (gq.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures) return false; // DivineMC - Configurable Chat message signatures + DedicatedServerProperties dedicatedserverproperties = this.getProperties(); + + // Paper start - fix secure profile with proxy online mode +diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java +index 37a3ce5da2cb89675e0180c4ed937e5851cd002b..c73217929e9ae8264052ec4d6d46ac2c84c70725 100644 +--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java ++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java +@@ -2258,7 +2258,7 @@ public class ServerPlayer extends Player { + } + + public void sendServerStatus(ServerStatus metadata) { +- this.connection.send(new ClientboundServerDataPacket(metadata.description(), metadata.favicon().map(ServerStatus.Favicon::iconBytes), metadata.enforcesSecureChat())); ++ if (gq.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures) this.connection.send(new ClientboundServerDataPacket(metadata.description(), metadata.favicon().map(ServerStatus.Favicon::iconBytes), true)); else this.connection.send(new ClientboundServerDataPacket(metadata.description(), metadata.favicon().map(ServerStatus.Favicon::iconBytes), metadata.enforcesSecureChat())); // DivineMC - Configurable Chat message signatures + } + + @Override +diff --git a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +index da499e0b21eba40d24d95047e3a9220567d4bae7..af52d6c7f18f0837f4ffce95a310ddeedfe30df9 100644 +--- a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +@@ -4,7 +4,7 @@ import com.mojang.authlib.GameProfile; + import com.mojang.logging.LogUtils; + import java.util.Objects; + import javax.annotation.Nullable; +-import net.minecraft.ChatFormatting; ++import io.papermc.paper.adventure.PaperAdventure; // DivineMC + import net.minecraft.CrashReport; + import net.minecraft.CrashReportCategory; + import net.minecraft.ReportedException; +@@ -22,6 +22,7 @@ import net.minecraft.network.protocol.common.ServerboundKeepAlivePacket; + import net.minecraft.network.protocol.common.ServerboundPongPacket; + import net.minecraft.network.protocol.common.ServerboundResourcePackPacket; + import net.minecraft.network.protocol.game.ClientboundSetDefaultSpawnPositionPacket; ++import net.minecraft.network.protocol.game.ClientboundSystemChatPacket; // DivineMC + import net.minecraft.resources.ResourceLocation; + import net.minecraft.server.MinecraftServer; + import net.minecraft.server.level.ClientInformation; +@@ -34,7 +35,6 @@ import org.slf4j.Logger; + import io.netty.buffer.ByteBuf; + import java.util.concurrent.ExecutionException; + import org.bukkit.craftbukkit.entity.CraftPlayer; +-import org.bukkit.craftbukkit.util.CraftChatMessage; + import org.bukkit.craftbukkit.util.CraftLocation; + import org.bukkit.craftbukkit.util.Waitable; + import org.bukkit.event.player.PlayerKickEvent; +@@ -271,10 +271,31 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack + } + + public void send(Packet packet) { ++ // DivineMC start - Configurable Chat message signatures ++ if (gq.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures) { ++ if (packet instanceof net.minecraft.network.protocol.game.ClientboundPlayerChatPacket chat) { ++ packet = new ClientboundSystemChatPacket(PaperAdventure.asAdventure(chat.chatType().resolve(this.player.level().registryAccess()) ++ .get().decorate(chat.unsignedContent() != null ? chat.unsignedContent() ++ : Component.literal(chat.body().content()))), false); ++ ++ this.send(packet); ++ return; ++ } ++ } ++ // DivineMC end + this.send(packet, (PacketSendListener) null); + } + + public void send(Packet packet, @Nullable PacketSendListener callbacks) { ++ // DivineMC start - Configurable Chat message signatures ++ if (gq.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures) { ++ if (packet instanceof net.minecraft.network.protocol.game.ClientboundPlayerChatPacket chat && callbacks != null) { ++ this.send(chat); ++ return; ++ } ++ } ++ // DivineMC end ++ + // CraftBukkit start + if (packet == null || this.processedDisconnect) { // Spigot + return; +diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java +index a52f0b7d76dc71d176d960fc4f67f0683127112e..39142f0619d20393e043eda61e6a82b0088a1c1e 100644 +--- a/src/main/java/net/minecraft/server/players/PlayerList.java ++++ b/src/main/java/net/minecraft/server/players/PlayerList.java +@@ -1469,7 +1469,7 @@ public abstract class PlayerList { + // Paper end + boolean flag = this.verifyChatTrusted(message); + +- this.server.logChatMessage((unsignedFunction == null ? message.decoratedContent() : unsignedFunction.apply(this.server.console)), params, flag ? null : "Not Secure"); // Paper ++ this.server.logChatMessage((unsignedFunction == null ? message.decoratedContent() : unsignedFunction.apply(this.server.console)), params, flag ? null : (gq.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures ? null : "Not Secure")); // Paper // DivineMC - Configurable Chat message signatures + OutgoingChatMessage outgoingchatmessage = OutgoingChatMessage.create(message); + boolean flag1 = false; + +@@ -1498,6 +1498,7 @@ public abstract class PlayerList { + } + + public boolean verifyChatTrusted(PlayerChatMessage message) { // Paper - private -> public ++ if (gq.bxteam.divinemc.configuration.DivineConfig.chatMessageSignatures) return true; // DivineMC - Configurable Chat message signatures + return message.hasSignature() && !message.hasExpiredServer(Instant.now()); + } +