Put messages received before player joining into queue

This commit is contained in:
s809
2024-06-16 00:45:16 +05:00
parent acb299530d
commit d2f4972693
3 changed files with 33 additions and 16 deletions
@@ -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);
}
}
@@ -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<IServerPlayerWrapper, ServerPlayerState> connectedPlayers = new ConcurrentHashMap<>();
private final ConcurrentMap<IServerPlayerWrapper, Queue<PluginChannelMessage>> 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<PluginChannelMessage> 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;
}
@@ -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();
}
}