aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0055-Improve-Player-chat-API-handling.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0055-Improve-Player-chat-API-handling.patch')
-rw-r--r--patches/server/0055-Improve-Player-chat-API-handling.patch80
1 files changed, 80 insertions, 0 deletions
diff --git a/patches/server/0055-Improve-Player-chat-API-handling.patch b/patches/server/0055-Improve-Player-chat-API-handling.patch
new file mode 100644
index 0000000000..f42881ee3d
--- /dev/null
+++ b/patches/server/0055-Improve-Player-chat-API-handling.patch
@@ -0,0 +1,80 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar <[email protected]>
+Date: Thu, 3 Mar 2016 01:17:12 -0600
+Subject: [PATCH] Improve Player chat API handling
+
+Properly split up the chat and command handling to reflect the server now
+having separate packets for both, and the client always using the correct packet. Text
+from a chat packet should never be parsed into a command, even if it starts with the `/`
+character.
+
+Add a missing async catcher and improve Spigot's async catcher error message.
+
+== AT ==
+public net.minecraft.server.network.ServerGamePacketListenerImpl isChatMessageIllegal(Ljava/lang/String;)Z
+
+Co-authored-by: Jake Potrebic <[email protected]>
+Co-authored-by: SoSeDiK <[email protected]>
+
+diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+index 47e1640cafc8087d94d0b88b8b3117591f9f238e..64db7e017b41bffcaac202ee4ecfd7df46d69331 100644
+--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+@@ -2013,7 +2013,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+ }
+ OutgoingChatMessage outgoing = OutgoingChatMessage.create(original);
+
+- if (!async && s.startsWith("/")) {
++ if (false && !async && s.startsWith("/")) { // Paper - Don't handle commands in chat logic
+ this.handleCommand(s);
+ } else if (this.player.getChatVisibility() == ChatVisiblity.SYSTEM) {
+ // Do nothing, this is coming from a plugin
+@@ -2100,7 +2100,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+ }
+ }
+
+- private void handleCommand(String s) {
++ public void handleCommand(String s) { // Paper - private -> public
++ org.spigotmc.AsyncCatcher.catchOp("Command Dispatched Async: " + s); // Paper - Add async catcher
+ co.aikar.timings.MinecraftTimings.playerCommandTimer.startTiming(); // Paper
+ if ( org.spigotmc.SpigotConfig.logCommands ) // Spigot
+ this.LOGGER.info(this.player.getScoreboardName() + " issued server command: " + s);
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+index 7c97ec4aa57562a8383a40e493eaa8a3697208bb..78193f0d66c2755ed238824bcd24ced9f9052188 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+@@ -925,7 +925,7 @@ public final class CraftServer implements Server {
+ public boolean dispatchCommand(CommandSender sender, String commandLine) {
+ Preconditions.checkArgument(sender != null, "sender cannot be null");
+ Preconditions.checkArgument(commandLine != null, "commandLine cannot be null");
+- org.spigotmc.AsyncCatcher.catchOp("command dispatch"); // Spigot
++ org.spigotmc.AsyncCatcher.catchOp("Command Dispatched Async: " + commandLine); // Spigot // Paper - Include command in error message
+
+ if (this.commandMap.dispatch(sender, commandLine)) {
+ return true;
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+index 8a674fe0ceadf278d7b9a525e71b519f8be72289..68df6270f7d08cde78235749950e05bf60c1641c 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -546,7 +546,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+
+ if (this.getHandle().connection == null) return;
+
+- this.getHandle().connection.chat(msg, PlayerChatMessage.system(msg), false);
++ // Paper start - Improve chat handling
++ if (ServerGamePacketListenerImpl.isChatMessageIllegal(msg)) {
++ this.getHandle().connection.disconnect(Component.translatable("multiplayer.disconnect.illegal_characters"));
++ } else {
++ if (msg.startsWith("/")) {
++ this.getHandle().connection.handleCommand(msg);
++ } else {
++ final PlayerChatMessage playerChatMessage = PlayerChatMessage.system(msg).withUnsignedContent(Component.literal(msg));
++ // TODO chat decorating
++ // TODO text filtering
++ this.getHandle().connection.chat(msg, playerChatMessage, false);
++ }
++ }
++ // Paper end - Improve chat handling
+ }
+
+ @Override