From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Nassim Jahnke <jahnke.nassim@gmail.com>
Date: Mon, 17 Jan 2022 19:47:19 +0100
Subject: [PATCH] Kick on main for illegal chat

Makes the PlayerKickEvent fire on the main thread for
illegal characters or chat out-of-order errors.

diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
index a84ab1754ffee0436ac3abf05e3fd69f3523e5e6..dbd16fabc781a2820dc073154830667ea88cb27d 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -2105,7 +2105,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser
         }
         // CraftBukkit end
         if (ServerGamePacketListenerImpl.isChatMessageIllegal(packet.getMessage())) {
+            this.server.scheduleOnMain(() -> { // Paper - push to main for event firing
             this.disconnect(Component.translatable("multiplayer.disconnect.illegal_characters"), org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_CHARACTERS); // Paper - add cause
+            }); // Paper - push to main for event firing
         } else {
             if (this.tryHandleChat(packet.getMessage(), packet.getTimeStamp())) {
                 // CraftBukkit start
@@ -2121,7 +2123,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser
     @Override
     public void handleChatCommand(ServerboundChatCommandPacket packet) {
         if (ServerGamePacketListenerImpl.isChatMessageIllegal(packet.command())) {
+            this.server.scheduleOnMain(() -> { // Paper - push to main for event firing
             this.disconnect(Component.translatable("multiplayer.disconnect.illegal_characters"));
+            }); // Paper - push to main for event firing
         } else {
             PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel());
             if (this.tryHandleChat(packet.command(), packet.timeStamp())) {
@@ -2145,7 +2149,9 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser
     private boolean tryHandleChat(String s, Instant instant) {
         if (!this.updateChatOrder(instant)) {
             ServerGamePacketListenerImpl.LOGGER.warn("{} sent out-of-order chat: '{}'", this.player.getName().getString(), s);
+            this.server.scheduleOnMain(() -> { // Paper - push to main
             this.disconnect(Component.translatable("multiplayer.disconnect.out_of_order_chat"));
+            }); // Paper - push to main
             return false;
         } else {
             if (this.isChatExpired(instant)) {