From 2cc92e5e3ea024eb6d614cc129fe50b57d942d76 Mon Sep 17 00:00:00 2001 From: TheMode Date: Mon, 26 Jul 2021 15:49:03 +0200 Subject: [PATCH] Simplify login process --- .../demo/largeframebuffers/MainDemo.java | 1 - .../player/AsyncPlayerPreLoginEvent.java | 7 +- .../server/network/ConnectionManager.java | 100 ++++-------------- .../network/player/NettyPlayerConnection.java | 1 + .../network/player/PlayerConnection.java | 1 - 5 files changed, 27 insertions(+), 83 deletions(-) diff --git a/src/lwjgl/java/net/minestom/demo/largeframebuffers/MainDemo.java b/src/lwjgl/java/net/minestom/demo/largeframebuffers/MainDemo.java index 5217b1d16..3faedeae8 100644 --- a/src/lwjgl/java/net/minestom/demo/largeframebuffers/MainDemo.java +++ b/src/lwjgl/java/net/minestom/demo/largeframebuffers/MainDemo.java @@ -10,7 +10,6 @@ import net.minestom.server.event.player.PlayerSpawnEvent; import net.minestom.server.instance.*; import net.minestom.server.instance.batch.ChunkBatch; import net.minestom.server.instance.block.Block; -import net.minestom.server.network.ConnectionManager; import net.minestom.server.world.biomes.Biome; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/minestom/server/event/player/AsyncPlayerPreLoginEvent.java b/src/main/java/net/minestom/server/event/player/AsyncPlayerPreLoginEvent.java index 3b67b438d..acf28e4b6 100644 --- a/src/main/java/net/minestom/server/event/player/AsyncPlayerPreLoginEvent.java +++ b/src/main/java/net/minestom/server/event/player/AsyncPlayerPreLoginEvent.java @@ -1,7 +1,6 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; @@ -17,10 +16,10 @@ public class AsyncPlayerPreLoginEvent implements PlayerEvent { private String username; private UUID playerUuid; - public AsyncPlayerPreLoginEvent(@NotNull Player player, @NotNull String username, @NotNull UUID playerUuid) { + public AsyncPlayerPreLoginEvent(@NotNull Player player) { this.player = player; - this.username = username; - this.playerUuid = playerUuid; + this.username = player.getUsername(); + this.playerUuid = player.getUuid(); } /** diff --git a/src/main/java/net/minestom/server/network/ConnectionManager.java b/src/main/java/net/minestom/server/network/ConnectionManager.java index 9c71f7c40..78dd69dc1 100644 --- a/src/main/java/net/minestom/server/network/ConnectionManager.java +++ b/src/main/java/net/minestom/server/network/ConnectionManager.java @@ -161,24 +161,6 @@ public final class ConnectionManager { this.broadcastMessage(jsonMessage, null); } - private Collection getRecipients(@Nullable PlayerValidator condition) { - Collection recipients; - - // Get the recipients - if (condition == null) { - recipients = getOnlinePlayers(); - } else { - recipients = new ArrayList<>(); - getOnlinePlayers().forEach(player -> { - final boolean result = condition.isValid(player); - if (result) - recipients.add(player); - }); - } - - return recipients; - } - /** * Gets all the listeners which are called for each packet received. * @@ -346,7 +328,6 @@ public final class ConnectionManager { final Player player = this.connectionPlayerMap.get(connection); if (player == null) return; - this.players.remove(player); this.connectionPlayerMap.remove(connection); } @@ -362,58 +343,39 @@ public final class ConnectionManager { */ public void startPlayState(@NotNull Player player, boolean register) { AsyncUtils.runAsync(() -> { - String username = player.getUsername(); - UUID uuid = player.getUuid(); - + final PlayerConnection playerConnection = player.getPlayerConnection(); // Call pre login event - AsyncPlayerPreLoginEvent asyncPlayerPreLoginEvent = new AsyncPlayerPreLoginEvent(player, username, uuid); + AsyncPlayerPreLoginEvent asyncPlayerPreLoginEvent = new AsyncPlayerPreLoginEvent(player); EventDispatcher.call(asyncPlayerPreLoginEvent); - // Close the player channel if he has been disconnected (kick) - final boolean online = player.isOnline(); - if (!online) { - final PlayerConnection playerConnection = player.getPlayerConnection(); + if (!player.isOnline()) { if (playerConnection instanceof NettyPlayerConnection) { ((NettyPlayerConnection) playerConnection).getChannel().flush(); } - //playerConnection.disconnect(); return; } - // Change UUID/Username based on the event { final String eventUsername = asyncPlayerPreLoginEvent.getUsername(); final UUID eventUuid = asyncPlayerPreLoginEvent.getPlayerUuid(); - if (!player.getUsername().equals(eventUsername)) { player.setUsernameField(eventUsername); - username = eventUsername; } - if (!player.getUuid().equals(eventUuid)) { player.setUuid(eventUuid); - uuid = eventUuid; } } - // Send login success packet - { - final PlayerConnection connection = player.getPlayerConnection(); - - LoginSuccessPacket loginSuccessPacket = new LoginSuccessPacket(uuid, username); - if (connection instanceof NettyPlayerConnection) { - ((NettyPlayerConnection) connection).writeAndFlush(loginSuccessPacket); - } else { - connection.sendPacket(loginSuccessPacket); - } - - connection.setConnectionState(ConnectionState.PLAY); + LoginSuccessPacket loginSuccessPacket = new LoginSuccessPacket(player.getUuid(), player.getUsername()); + if (playerConnection instanceof NettyPlayerConnection) { + ((NettyPlayerConnection) playerConnection).writeAndFlush(loginSuccessPacket); + } else { + playerConnection.sendPacket(loginSuccessPacket); } - + playerConnection.setConnectionState(ConnectionState.PLAY); // Add the player to the waiting list - addWaitingPlayer(player); - + this.waitingPlayers.add(player); if (register) { registerPlayer(player); } @@ -457,7 +419,19 @@ public final class ConnectionManager { * Connects waiting players. */ public void updateWaitingPlayers() { - waitingPlayersTick(); + Player waitingPlayer; + while ((waitingPlayer = waitingPlayers.poll()) != null) { + PlayerLoginEvent loginEvent = new PlayerLoginEvent(waitingPlayer); + EventDispatcher.call(loginEvent); + final Instance spawningInstance = loginEvent.getSpawningInstance(); + + Check.notNull(spawningInstance, "You need to specify a spawning instance in the PlayerLoginEvent"); + + waitingPlayer.UNSAFE_init(spawningInstance); + + // Spawn the player at Player#getRespawnPoint during the next instance tick + spawningInstance.scheduleNextTick(waitingPlayer::setInstance); + } } /** @@ -478,32 +452,4 @@ public final class ConnectionManager { } } } - - /** - * Adds connected clients after the handshake (used to free the networking threads). - */ - private void waitingPlayersTick() { - Player waitingPlayer; - while ((waitingPlayer = waitingPlayers.poll()) != null) { - PlayerLoginEvent loginEvent = new PlayerLoginEvent(waitingPlayer); - EventDispatcher.call(loginEvent); - final Instance spawningInstance = loginEvent.getSpawningInstance(); - - Check.notNull(spawningInstance, "You need to specify a spawning instance in the PlayerLoginEvent"); - - waitingPlayer.UNSAFE_init(spawningInstance); - - // Spawn the player at Player#getRespawnPoint during the next instance tick - spawningInstance.scheduleNextTick(waitingPlayer::setInstance); - } - } - - /** - * Adds a player into the waiting list, to be handled during the next server tick. - * - * @param player the {@link Player player} to add into the waiting list - */ - public void addWaitingPlayer(@NotNull Player player) { - this.waitingPlayers.add(player); - } } diff --git a/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java b/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java index 7d698a4e4..9963b84c8 100644 --- a/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java +++ b/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java @@ -245,6 +245,7 @@ public class NettyPlayerConnection extends PlayerConnection { @Override public void disconnect() { + refreshOnline(false); this.channel.close(); } diff --git a/src/main/java/net/minestom/server/network/player/PlayerConnection.java b/src/main/java/net/minestom/server/network/player/PlayerConnection.java index 0d890c232..6fc228b73 100644 --- a/src/main/java/net/minestom/server/network/player/PlayerConnection.java +++ b/src/main/java/net/minestom/server/network/player/PlayerConnection.java @@ -150,7 +150,6 @@ public abstract class PlayerConnection { return MinecraftServer.getNettyServer().getPort(); } - /** * Forcing the player to disconnect. */