Misc connection improvements

This commit is contained in:
themode 2021-12-26 05:36:11 +01:00 committed by TheMode
parent fd4a4d531e
commit 3972477b3b
1 changed files with 9 additions and 27 deletions

View File

@ -4,14 +4,12 @@ import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.NamedTextColor;
import net.minestom.server.MinecraftServer; import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.Player; import net.minestom.server.entity.Player;
import net.minestom.server.entity.fakeplayer.FakePlayer;
import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.EventDispatcher;
import net.minestom.server.event.player.AsyncPlayerPreLoginEvent; import net.minestom.server.event.player.AsyncPlayerPreLoginEvent;
import net.minestom.server.event.player.PlayerLoginEvent; import net.minestom.server.event.player.PlayerLoginEvent;
import net.minestom.server.instance.Instance; import net.minestom.server.instance.Instance;
import net.minestom.server.listener.manager.ClientPacketConsumer; import net.minestom.server.listener.manager.ClientPacketConsumer;
import net.minestom.server.listener.manager.ServerPacketConsumer; import net.minestom.server.listener.manager.ServerPacketConsumer;
import net.minestom.server.network.packet.client.login.LoginStartPacket;
import net.minestom.server.network.packet.server.login.LoginSuccessPacket; import net.minestom.server.network.packet.server.login.LoginSuccessPacket;
import net.minestom.server.network.packet.server.play.DisconnectPacket; import net.minestom.server.network.packet.server.play.DisconnectPacket;
import net.minestom.server.network.packet.server.play.KeepAlivePacket; import net.minestom.server.network.packet.server.play.KeepAlivePacket;
@ -29,7 +27,6 @@ import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.CopyOnWriteArraySet;
import java.util.function.Consumer;
import java.util.function.Function; import java.util.function.Function;
/** /**
@ -50,9 +47,9 @@ public final class ConnectionManager {
// All the consumers to call once a packet is sent // All the consumers to call once a packet is sent
private final List<ServerPacketConsumer> sendClientPacketConsumers = new CopyOnWriteArrayList<>(); private final List<ServerPacketConsumer> sendClientPacketConsumers = new CopyOnWriteArrayList<>();
// The uuid provider once a player login // The uuid provider once a player login
private UuidProvider uuidProvider; private volatile UuidProvider uuidProvider = (playerConnection, username) -> UUID.randomUUID();
// The player provider to have your own Player implementation // The player provider to have your own Player implementation
private PlayerProvider playerProvider; private volatile PlayerProvider playerProvider = Player::new;
private Component shutdownText = Component.text("The server is shutting down.", NamedTextColor.RED); private Component shutdownText = Component.text("The server is shutting down.", NamedTextColor.RED);
@ -191,7 +188,7 @@ public final class ConnectionManager {
* @see #getPlayerConnectionUuid(PlayerConnection, String) * @see #getPlayerConnectionUuid(PlayerConnection, String)
*/ */
public void setUuidProvider(@Nullable UuidProvider uuidProvider) { public void setUuidProvider(@Nullable UuidProvider uuidProvider) {
this.uuidProvider = uuidProvider; this.uuidProvider = uuidProvider != null ? uuidProvider : (playerConnection, username) -> UUID.randomUUID();
} }
/** /**
@ -205,8 +202,6 @@ public final class ConnectionManager {
* return a random UUID if no UUID provider is defined see {@link #setUuidProvider(UuidProvider)} * return a random UUID if no UUID provider is defined see {@link #setUuidProvider(UuidProvider)}
*/ */
public @NotNull UUID getPlayerConnectionUuid(@NotNull PlayerConnection playerConnection, @NotNull String username) { public @NotNull UUID getPlayerConnectionUuid(@NotNull PlayerConnection playerConnection, @NotNull String username) {
if (uuidProvider == null)
return UUID.randomUUID();
return uuidProvider.provide(playerConnection, username); return uuidProvider.provide(playerConnection, username);
} }
@ -216,7 +211,7 @@ public final class ConnectionManager {
* @param playerProvider the new {@link PlayerProvider}, can be set to null to apply the default provider * @param playerProvider the new {@link PlayerProvider}, can be set to null to apply the default provider
*/ */
public void setPlayerProvider(@Nullable PlayerProvider playerProvider) { public void setPlayerProvider(@Nullable PlayerProvider playerProvider) {
this.playerProvider = playerProvider; this.playerProvider = playerProvider != null ? playerProvider : Player::new;
} }
/** /**
@ -225,7 +220,7 @@ public final class ConnectionManager {
* @return the current {@link PlayerProvider} * @return the current {@link PlayerProvider}
*/ */
public @NotNull PlayerProvider getPlayerProvider() { public @NotNull PlayerProvider getPlayerProvider() {
return playerProvider == null ? playerProvider = Player::new : playerProvider; return playerProvider;
} }
/** /**
@ -247,14 +242,6 @@ public final class ConnectionManager {
this.shutdownText = shutdownText; this.shutdownText = shutdownText;
} }
/**
* Adds a new {@link Player} in the players list.
* Is currently used at
* {@link LoginStartPacket#process(PlayerConnection)}
* and in {@link FakePlayer#initPlayer(UUID, String, Consumer)}.
*
* @param player the player to add
*/
public synchronized void registerPlayer(@NotNull Player player) { public synchronized void registerPlayer(@NotNull Player player) {
this.players.add(player); this.players.add(player);
this.connectionPlayerMap.put(player.getPlayerConnection(), player); this.connectionPlayerMap.put(player.getPlayerConnection(), player);
@ -269,11 +256,9 @@ public final class ConnectionManager {
* @see PlayerConnection#disconnect() to properly disconnect a player * @see PlayerConnection#disconnect() to properly disconnect a player
*/ */
public synchronized void removePlayer(@NotNull PlayerConnection connection) { public synchronized void removePlayer(@NotNull PlayerConnection connection) {
final Player player = this.connectionPlayerMap.get(connection); final Player player = this.connectionPlayerMap.remove(connection);
if (player == null) if (player == null) return;
return;
this.players.remove(player); this.players.remove(player);
this.connectionPlayerMap.remove(connection);
} }
/** /**
@ -316,11 +301,8 @@ public final class ConnectionManager {
playerConnection.sendPacket(loginSuccessPacket); playerConnection.sendPacket(loginSuccessPacket);
} }
playerConnection.setConnectionState(ConnectionState.PLAY); playerConnection.setConnectionState(ConnectionState.PLAY);
// Add the player to the waiting list if (register) registerPlayer(player);
this.waitingPlayers.relaxedOffer(player); this.waitingPlayers.relaxedOffer(player);
if (register) {
registerPlayer(player);
}
}); });
} }
@ -334,7 +316,7 @@ public final class ConnectionManager {
public @NotNull Player startPlayState(@NotNull PlayerConnection connection, public @NotNull Player startPlayState(@NotNull PlayerConnection connection,
@NotNull UUID uuid, @NotNull String username, @NotNull UUID uuid, @NotNull String username,
boolean register) { boolean register) {
final Player player = getPlayerProvider().createPlayer(uuid, username, connection); final Player player = playerProvider.createPlayer(uuid, username, connection);
startPlayState(player, register); startPlayState(player, register);
return player; return player;
} }