From 13a8a2254678930924c9805a865945c3f830755e Mon Sep 17 00:00:00 2001 From: TheMode Date: Fri, 15 Oct 2021 15:54:11 +0200 Subject: [PATCH] Add preventive kick instead of hard to debug timeouts Signed-off-by: TheMode --- src/main/java/net/minestom/server/entity/Player.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 28b2466bc..b17c26fcb 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -12,6 +12,7 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.event.HoverEvent.ShowEntity; import net.kyori.adventure.text.event.HoverEventSource; +import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.kyori.adventure.title.Title; import net.minestom.server.MinecraftServer; @@ -100,6 +101,8 @@ import java.util.function.UnaryOperator; */ public class Player extends LivingEntity implements CommandSender, Localizable, HoverEventSource, Identified, NamedAndIdentified { + private static final Component REMOVE_MESSAGE = Component.text("You have been removed from the server without reason.", NamedTextColor.RED); + private long lastKeepAlive; private boolean answerKeepAlive; @@ -448,9 +451,8 @@ public class Player extends LivingEntity implements CommandSender, Localizable, EventDispatcher.call(new PlayerDisconnectEvent(this)); super.remove(); this.packets.clear(); - if (getOpenInventory() != null) { - getOpenInventory().removeViewer(this); - } + final Inventory currentInventory = getOpenInventory(); + if (currentInventory != null) currentInventory.removeViewer(this); MinecraftServer.getBossBarManager().removeAllBossBars(this); // Advancement tabs cache { @@ -467,6 +469,10 @@ public class Player extends LivingEntity implements CommandSender, Localizable, this.viewableChunks.forEach(chunk -> chunk.removeViewer(this)); // Remove from the tab-list PacketUtils.broadcastPacket(getRemovePlayerToList()); + + // Prevent the player from being stuck in loading screen, or just unable to interact with the server + // This should be considered as a bug, since the player will ultimately time out anyway. + if (playerConnection.isOnline()) kick(REMOVE_MESSAGE); } @Override