diff --git a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ServerApi.java b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ServerApi.java index 4ae6a3d57..11793c1e0 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ServerApi.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ServerApi.java @@ -21,14 +21,9 @@ package com.seibel.distanthorizons.core.api.internal; import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiLevelLoadEvent; import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiLevelUnloadEvent; -import com.seibel.distanthorizons.core.config.Config; -import com.seibel.distanthorizons.core.generation.DhLightingEngine; import com.seibel.distanthorizons.core.network.plugin.PluginChannelMessage; -import com.seibel.distanthorizons.core.util.ThreadUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper; -import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector; -import com.seibel.distanthorizons.core.level.IDhLevel; import com.seibel.distanthorizons.core.world.AbstractDhWorld; import com.seibel.distanthorizons.core.world.DhClientServerWorld; import com.seibel.distanthorizons.core.world.DhServerWorld; @@ -37,7 +32,6 @@ import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper; -import io.netty.buffer.ByteBuf; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; @@ -157,7 +151,7 @@ public class ServerApi IDhServerWorld serverWorld = SharedApi.getIDhServerWorld(); if (serverWorld instanceof DhServerWorld) // TODO add support for DhClientServerWorld's (lan worlds) as well { - LOGGER.debug("Waiting for player to connect: " + player.getUUID()); + LOGGER.info("Creating state for player: " + player.getName()); ((DhServerWorld) serverWorld).addPlayer(player); } } @@ -166,7 +160,7 @@ public class ServerApi IDhServerWorld serverWorld = SharedApi.getIDhServerWorld(); if (serverWorld instanceof DhServerWorld) // TODO add support for DhClientServerWorld's (lan worlds) as well { - LOGGER.debug("Removing player from connect wait list: " + player.getUUID()); + LOGGER.info("Destroying state for player: " + player.getName()); ((DhServerWorld) serverWorld).removePlayer(player); } } @@ -175,7 +169,7 @@ public class ServerApi IDhServerWorld serverWorld = SharedApi.getIDhServerWorld(); if (serverWorld instanceof DhServerWorld) // TODO add support for DhClientServerWorld's (lan worlds) as well { - LOGGER.debug("Player changed level: " + player.getUUID()); + LOGGER.info("Player changed level: " + player.getName()); ((DhServerWorld) serverWorld).changePlayerLevel(player, origin, dest); } } @@ -185,7 +179,6 @@ public class ServerApi IDhServerWorld serverWorld = SharedApi.getIDhServerWorld(); if (serverWorld instanceof DhServerWorld) // TODO add support for DhClientServerWorld's (lan worlds) as well { - LOGGER.debug("Player " + player.getUUID() + " sent plugin message: " + message); ((DhServerWorld) serverWorld).remotePlayerConnectionHandler.handlePluginMessage(player, message); } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/RemotePlayerConnectionHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/RemotePlayerConnectionHandler.java index 36d49a866..97b28c093 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/RemotePlayerConnectionHandler.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/RemotePlayerConnectionHandler.java @@ -4,19 +4,30 @@ import com.seibel.distanthorizons.core.network.plugin.PluginChannelMessage; import com.seibel.distanthorizons.core.network.plugin.PluginChannelSession; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper; +import java.util.Queue; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentMap; public class RemotePlayerConnectionHandler { private final ConcurrentMap connectedPlayers = new ConcurrentHashMap<>(); + private final ConcurrentMap> messageQueue = new ConcurrentHashMap<>(); public void handlePluginMessage(IServerPlayerWrapper player, PluginChannelMessage message) { - PluginChannelSession session = this.connectedPlayers.get(player).session; - message.setSession(session); - session.tryHandleMessage(message); + ServerPlayerState playerState = this.connectedPlayers.get(player); + if (playerState != null) + { + PluginChannelSession session = playerState.session; + message.setSession(session); + session.tryHandleMessage(message); + } + else + { + this.messageQueue.computeIfAbsent(player, k -> new ConcurrentLinkedQueue<>()).add(message); + } } public ServerPlayerState getConnectedPlayer(IServerPlayerWrapper player) @@ -33,6 +44,20 @@ public class RemotePlayerConnectionHandler { ServerPlayerState state = new ServerPlayerState(serverPlayer); this.connectedPlayers.put(serverPlayer, state); + + Queue queuedMessages = this.messageQueue.get(serverPlayer); + if (queuedMessages != null) + { + PluginChannelSession session = state.session; + for (PluginChannelMessage message : queuedMessages) + { + message.setSession(session); + session.tryHandleMessage(message); + } + + this.messageQueue.remove(serverPlayer); + } + return state; } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/misc/IServerPlayerWrapper.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/misc/IServerPlayerWrapper.java index e162a8059..f33d53354 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/misc/IServerPlayerWrapper.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/misc/IServerPlayerWrapper.java @@ -24,11 +24,10 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapp import com.seibel.distanthorizons.coreapi.util.math.Vec3d; import java.net.SocketAddress; -import java.util.UUID; public interface IServerPlayerWrapper extends IDhApiUnsafeWrapper { - UUID getUUID(); + String getName(); IServerLevelWrapper getLevel(); @@ -37,4 +36,4 @@ public interface IServerPlayerWrapper extends IDhApiUnsafeWrapper int getViewDistance(); SocketAddress getRemoteAddress(); -} +} \ No newline at end of file