diff options
Diffstat (limited to 'patches/server/0059-Improve-Player-chat-API-handling.patch')
-rw-r--r-- | patches/server/0059-Improve-Player-chat-API-handling.patch | 80 |
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 |