aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0059-Improve-Player-chat-API-handling.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0059-Improve-Player-chat-API-handling.patch')
-rw-r--r--patches/server/0059-Improve-Player-chat-API-handling.patch80
1 files changed, 80 insertions, 0 deletions
diff --git a/patches/server/0059-Improve-Player-chat-API-handling.patch b/patches/server/0059-Improve-Player-chat-API-handling.patch
new file mode 100644
index 0000000000..9f73bcc555
--- /dev/null
+++ b/patches/server/0059-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 e63aadfe5209978f5d515ef9c37df01e08cd8fdb..84c53376312e5f2253521ce2fcac756bc1e5365f 100644
+--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+@@ -1996,7 +1996,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
+@@ -2083,7 +2083,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 b43dae6ed6ebdd1978e35e9d43e07591f90dcb09..4a1305df41c42be65dbb0438066e148e0b22aaaf 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+@@ -897,7 +897,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 a7ccce7b5036eb0602e6030be6fbaa9f032f78c2..a51bce9252328df85b485a5af7786db0622a4672 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -544,7 +544,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