diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java b/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java index 63a7489a0..223c6fed8 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java @@ -953,19 +953,6 @@ public class Config + "Limits the amount of sent/processed LOD *update* requests concurrently, per player." + "") .build(); - - public static ConfigUIComment immersivePortalsSectionNote = new ConfigUIComment(); - public static ConfigEntry generateMultipleDimensions = new ConfigEntry.Builder() - .setServersideShortName("generateMultipleDimensions") - .set(false) - .comment("" - + "Controls whether clients will request for the server to generate LODs in multiple dimensions at once.\n" - + "" - + "Note that all dimensions share the same thread pool.\n" - + "This means that dimensions without any connected clients inside could slow down LOD updates for\n" - + "all connected clients in other dimensions." - + "") - .build(); } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldRemoteGenerationQueue.java b/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldRemoteGenerationQueue.java index 171c2463b..8d2f058c5 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldRemoteGenerationQueue.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldRemoteGenerationQueue.java @@ -9,8 +9,6 @@ import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.multiplayer.client.AbstractFullDataRequestQueue; import com.seibel.distanthorizons.core.multiplayer.client.ClientNetworkState; import com.seibel.distanthorizons.core.network.exceptions.RateLimitedException; -import com.seibel.distanthorizons.core.network.messages.plugin.fullData.generation.GenTaskPriorityRequestMessage; -import com.seibel.distanthorizons.core.network.messages.plugin.fullData.generation.GenTaskPriorityResponseMessage; import com.seibel.distanthorizons.core.pos.DhBlockPos2D; import com.seibel.distanthorizons.core.pos.DhSectionPos; import com.seibel.distanthorizons.core.render.renderer.IDebugRenderable; @@ -29,9 +27,6 @@ public class WorldRemoteGenerationQueue extends AbstractFullDataRequestQueue imp private int estimatedTotalTaskCount; - private CompletableFuture genTaskPriorityRequest = CompletableFuture.completedFuture(null); - private final Semaphore genTaskPriorityRequestSemaphore = new Semaphore(1, true); - @Override protected int getRequestConcurrencyLimit() { return this.networkState.config.fullDataRequestConcurrencyLimit; } @@ -75,54 +70,7 @@ public class WorldRemoteGenerationQueue extends AbstractFullDataRequestQueue imp @Override public void startAndSetTargetPos(DhBlockPos2D targetPos) { - if (!super.tick(targetPos)) - { - return; - } - - if (this.genTaskPriorityRequestSemaphore.tryAcquire()) { - List posList = this.waitingTasks.entrySet().stream() - .filter(task -> task.getValue().request == null && task.getValue().priority == 0) - .sorted((x, y) -> this.posDistanceSquared(targetPos, x.getKey()) - this.posDistanceSquared(targetPos, y.getKey())) - .limit(this.networkState.config.genTaskPriorityRequestRateLimit) - .map(Map.Entry::getKey) - .collect(Collectors.toList()); - if (posList.isEmpty()) { - this.genTaskPriorityRequestSemaphore.release(); - return; - }; - - CompletableFuture request = this.networkState.getSession().sendRequest(new GenTaskPriorityRequestMessage(posList, this.level), GenTaskPriorityResponseMessage.class); - this.genTaskPriorityRequest = request; - request.handleAsync((response, throwable) -> { - try - { - if (throwable != null) - { - throw throwable; - } - - for (Map.Entry mapEntry : response.posList.entrySet()) - { - RequestQueueEntry entry = this.waitingTasks.get(mapEntry.getKey()); - if (entry != null) - { - entry.priority = mapEntry.getValue(); - } - } - } - catch (ChannelException | CancellationException | RateLimitedException ignored) - { - } - catch (Throwable e) - { - LOGGER.error("Error while fetching gen task priorities", e); - } - - this.genTaskPriorityRequestSemaphore.release(); - return null; - }); - } + super.tick(targetPos); } @@ -134,22 +82,6 @@ public class WorldRemoteGenerationQueue extends AbstractFullDataRequestQueue imp @Override public CompletableFuture startClosing(boolean cancelCurrentGeneration, boolean alsoInterruptRunning) { - return CompletableFuture.allOf(super.startClosing(alsoInterruptRunning), CompletableFuture.runAsync(() -> { - Stopwatch stopwatch = Stopwatch.createStarted(); - - do - { - if (this.genTaskPriorityRequest.cancel(false)) - { - this.genTaskPriorityRequestSemaphore.release(); - } - } - while (!this.genTaskPriorityRequestSemaphore.tryAcquire() && stopwatch.elapsed(TimeUnit.SECONDS) < SHUTDOWN_TIMEOUT_SECONDS); - - if (stopwatch.elapsed(TimeUnit.SECONDS) >= SHUTDOWN_TIMEOUT_SECONDS) - { - LOGGER.warn("Priority request queue for " + this.level.getLevelWrapper() + " did not shutdown in " + SHUTDOWN_TIMEOUT_SECONDS + " seconds! It might be left hanging."); - } - })); + return super.startClosing(alsoInterruptRunning); } } \ No newline at end of file diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java index edfef8a36..4411f229a 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java @@ -31,10 +31,8 @@ import com.seibel.distanthorizons.core.generation.WorldRemoteGenerationQueue; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.multiplayer.client.ClientNetworkState; import com.seibel.distanthorizons.core.multiplayer.client.FullDataRefreshQueue; -import com.seibel.distanthorizons.core.network.netty.NettyClient; import com.seibel.distanthorizons.core.network.ScopedNetworkEventSource; import com.seibel.distanthorizons.core.network.messages.plugin.fullData.FullDataPartialUpdateMessage; -import com.seibel.distanthorizons.core.network.netty.NettyMessage; import com.seibel.distanthorizons.core.pos.DhBlockPos; import com.seibel.distanthorizons.core.pos.DhBlockPos2D; import com.seibel.distanthorizons.core.pos.DhSectionPos; @@ -75,7 +73,7 @@ public class DhClientLevel extends AbstractDhLevel implements IDhClientLevel @CheckForNull private final ClientNetworkState networkState; @Nullable - private final ScopedNetworkEventSource eventSource; + private final ScopedNetworkEventSource eventSource; public final WorldGenModule worldGenModule; public final AppliedConfigState worldGeneratorEnabledConfig; @@ -102,7 +100,7 @@ public class DhClientLevel extends AbstractDhLevel implements IDhClientLevel this.networkState = networkState; if (networkState != null) { - this.eventSource = new ScopedNetworkEventSource<>(networkState.getSession()); + this.eventSource = new ScopedNetworkEventSource(networkState.getSession()); this.dataRefreshQueue = new FullDataRefreshQueue(this, networkState); this.registerNetworkHandlers(); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java index 7a9b2ae1c..09372f3be 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java @@ -25,30 +25,34 @@ import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.file.structure.AbstractSaveStructure; import com.seibel.distanthorizons.core.multiplayer.server.ServerPlayerState; import com.seibel.distanthorizons.core.multiplayer.server.RemotePlayerConnectionHandler; -import com.seibel.distanthorizons.core.network.ScopedNetworkEventSource; -import com.seibel.distanthorizons.core.network.netty.NettyServer; +import com.seibel.distanthorizons.core.network.exceptions.InvalidLevelException; import com.seibel.distanthorizons.core.network.exceptions.RequestRejectedException; +import com.seibel.distanthorizons.core.network.messages.plugin.ILevelRelatedMessage; import com.seibel.distanthorizons.core.network.messages.plugin.base.CancelMessage; import com.seibel.distanthorizons.core.network.messages.plugin.fullData.FullDataSourceRequestMessage; import com.seibel.distanthorizons.core.network.messages.plugin.fullData.FullDataSourceResponseMessage; -import com.seibel.distanthorizons.core.network.messages.plugin.fullData.generation.GenTaskPriorityRequestMessage; -import com.seibel.distanthorizons.core.network.messages.plugin.fullData.generation.GenTaskPriorityResponseMessage; import com.seibel.distanthorizons.core.network.messages.plugin.fullData.FullDataPartialUpdateMessage; -import com.seibel.distanthorizons.core.network.netty.NettyMessage; +import com.seibel.distanthorizons.core.network.plugin.PluginChannelMessage; +import com.seibel.distanthorizons.core.network.plugin.PluginChannelSession; +import com.seibel.distanthorizons.core.network.plugin.TrackableMessage; import com.seibel.distanthorizons.core.pos.DhBlockPos2D; import com.seibel.distanthorizons.core.pos.DhSectionPos; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper; import com.seibel.distanthorizons.coreapi.util.math.Vec3d; import org.apache.logging.log4j.Logger; +import java.text.MessageFormat; import java.util.concurrent.CompletableFuture; import javax.annotation.CheckForNull; import java.util.Map; import java.util.concurrent.*; +import java.util.function.BiConsumer; +import java.util.function.Consumer; public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel { @@ -58,7 +62,6 @@ public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel private final IServerLevelWrapper serverLevelWrapper; private final RemotePlayerConnectionHandler remotePlayerConnectionHandler; - private final ScopedNetworkEventSource eventSource; private final ConcurrentLinkedQueue worldGenLoopingQueue = new ConcurrentLinkedQueue<>(); private final ConcurrentMap incompleteDataSources = new ConcurrentHashMap<>(); @@ -75,13 +78,11 @@ public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel LOGGER.info("Started DHLevel for {} with saves at {}", serverLevelWrapper, saveStructure); this.remotePlayerConnectionHandler = remotePlayerConnectionHandler; - this.eventSource = new ScopedNetworkEventSource<>(remotePlayerConnectionHandler.server()); - this.registerNetworkHandlers(); } - private void registerNetworkHandlers() + public void registerNetworkHandlers(ServerPlayerState serverPlayerState) { - this.eventSource.registerHandler(FullDataSourceRequestMessage.class, this.remotePlayerConnectionHandler.currentLevelOnly(this, (msg, serverPlayerState) -> + serverPlayerState.session.registerHandler(FullDataSourceRequestMessage.class, this.currentLevelOnly(msg -> { ServerPlayerState.RateLimiterSet rateLimiterSet = serverPlayerState.getRateLimiterSet(this); @@ -149,16 +150,7 @@ public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel } })); - this.eventSource.registerHandler(GenTaskPriorityRequestMessage.class, this.remotePlayerConnectionHandler.currentLevelOnly(this, (msg, serverPlayerState) -> - { - msg.sendResponse(new GenTaskPriorityResponseMessage( - this.serverside.fullDataFileHandler.getLoadStates(msg.posList.stream() - .limit(serverPlayerState.getRateLimiterSet(this).genTaskPriorityRequestRateLimiter.acquireOrDrain(msg.posList.size())) - ::iterator) - )); - })); - - this.eventSource.registerHandler(CancelMessage.class, msg -> + serverPlayerState.session.registerHandler(CancelMessage.class, msg -> { IncompleteDataSourceEntry entry = this.fullDataRequests.remove(msg.futureId); if (entry == null) @@ -167,11 +159,7 @@ public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel } FullDataSourceRequestMessage requestMessage = entry.requestMessages.remove(msg.futureId); - ServerPlayerState serverPlayerState = this.remotePlayerConnectionHandler.getConnectedPlayer(msg); - if (serverPlayerState != null) - { - serverPlayerState.getRateLimiterSet(this).fullDataRequestConcurrencyLimiter.release(); - } + serverPlayerState.getRateLimiterSet(this).fullDataRequestConcurrencyLimiter.release(); entry.requestCollectionSemaphore.acquireUninterruptibly(Short.MAX_VALUE); if (entry.requestMessages.isEmpty()) @@ -184,6 +172,39 @@ public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel }); } + public Consumer currentLevelOnly(Consumer next) + { + return msg -> + { + LodUtil.assertTrue(msg instanceof ILevelRelatedMessage, "Received message does not implement " + ILevelRelatedMessage.class.getSimpleName() + ": " + msg.getClass().getSimpleName()); + + // Handle only in requested dimension + if (!((ILevelRelatedMessage) msg).isSameLevelAs(this.getLevelWrapper())) + { + return; + } + + // If player is not in this dimension and handling multiple dimensions at once is not allowed + assert msg.session.serverPlayer != null; + if (msg.session.serverPlayer.getLevel() != this.getLevelWrapper()) + { + // If the message can be replied to - reply with error, otherwise just ignore + if (msg instanceof TrackableMessage) + { + ((TrackableMessage) msg).sendResponse(new InvalidLevelException(MessageFormat.format( + "Generation not allowed. Requested dimension: {0}, player dimension: {1}", + this.getLevelWrapper().getDimensionType().getDimensionName(), + msg.session.serverPlayer.getLevel().getDimensionType().getDimensionName() + ))); + } + + return; + } + + next.accept(msg); + }; + } + public void addPlayer(IServerPlayerWrapper serverPlayer) { this.worldGenLoopingQueue.add(serverPlayer); @@ -218,7 +239,7 @@ public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel { this.fullDataRequests.remove(msg.futureId); - ServerPlayerState serverPlayerState = this.remotePlayerConnectionHandler.getConnectedPlayer(msg); + ServerPlayerState serverPlayerState = this.remotePlayerConnectionHandler.getConnectedPlayer(msg.serverPlayer()); if (serverPlayerState == null) { continue; @@ -245,9 +266,9 @@ public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel continue; } - Vec3d playerPosition = serverPlayerState.serverPlayer.getPosition(); + Vec3d playerPosition = serverPlayerState.serverPlayer().getPosition(); int distanceFromPlayer = data.getPos().getManhattanBlockDistance(new DhBlockPos2D((int) playerPosition.x, (int) playerPosition.z)) / 16; - if (distanceFromPlayer >= serverPlayerState.serverPlayer.getViewDistance() && + if (distanceFromPlayer >= serverPlayerState.serverPlayer().getViewDistance() && distanceFromPlayer <= serverPlayerState.config.getRenderDistanceRadius()) { serverPlayerState.session.sendMessage(new FullDataPartialUpdateMessage(this.serverLevelWrapper, data)); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/client/ClientNetworkState.java b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/client/ClientNetworkState.java index 8bc900b5b..37c06b364 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/client/ClientNetworkState.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/client/ClientNetworkState.java @@ -51,7 +51,7 @@ public class ClientNetworkState implements Closeable this.session.registerHandler(HelloMessage.class, helloMessage -> { LOGGER.info("Server reported full DH support."); - serverSupportStatus = EServerSupportStatus.FULL; + this.serverSupportStatus = EServerSupportStatus.FULL; this.getSession().sendRequest(new PlayerUUIDMessage(this.playerUUID), AckMessage.class) .thenAccept(ack -> this.getSession().sendMessage(new RemotePlayerConfigMessage(new MultiplayerConfig()))) @@ -89,15 +89,9 @@ public class ClientNetworkState implements Closeable }; } - if (!this.configReceived) - { - return new String[]{"Server does not support DH"}; - } - - if (!this.session.isClosed()) return new String[]{ - "Server has full DH support" + return new String[]{ + this.serverSupportStatus.message }; - return } @Override 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 480b006e2..cc3958425 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 @@ -1,30 +1,18 @@ package com.seibel.distanthorizons.core.multiplayer.server; import com.seibel.distanthorizons.core.config.Config; -import com.seibel.distanthorizons.core.config.types.ConfigEntry; -import com.seibel.distanthorizons.core.level.DhServerLevel; import com.seibel.distanthorizons.core.logging.ConfigBasedLogger; -import com.seibel.distanthorizons.core.network.exceptions.InvalidLevelException; -import com.seibel.distanthorizons.core.network.messages.plugin.ILevelRelatedMessage; -import com.seibel.distanthorizons.core.network.netty.NettyMessage; -import com.seibel.distanthorizons.core.network.plugin.TrackableNettyMessage; -import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper; import io.netty.buffer.ByteBuf; import org.apache.logging.log4j.LogManager; -import java.io.Closeable; -import java.text.MessageFormat; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import java.util.function.BiConsumer; -import java.util.function.Consumer; -public class RemotePlayerConnectionHandler implements Closeable +public class RemotePlayerConnectionHandler { private static final ConfigBasedLogger LOGGER = new ConfigBasedLogger(LogManager.getLogger(), () -> Config.Client.Advanced.Logging.logNetworkEvent.get()); - private static final ConfigEntry GENERATE_MULTIPLE_DIMENSIONS_CONFIG = Config.Client.Advanced.Multiplayer.ServerNetworking.generateMultipleDimensions; private final ConcurrentMap connectedPlayers = new ConcurrentHashMap<>(); @@ -34,43 +22,21 @@ public class RemotePlayerConnectionHandler implements Closeable this.connectedPlayers.get(player).session.decodeAndHandle(buffer); } - - public Consumer currentLevelOnly(DhServerLevel level, BiConsumer next) + public ServerPlayerState getConnectedPlayer(IServerPlayerWrapper player) { - return (msg) -> - { - LodUtil.assertTrue(msg instanceof ILevelRelatedMessage, "Received message does not implement " + ILevelRelatedMessage.class.getSimpleName() + ": " + msg.getClass().getSimpleName()); - - // Handle only in requested dimension - if (!((ILevelRelatedMessage) msg).isSameLevelAs(level.getLevelWrapper())) - { - return; - } - - // If player is not in this dimension and handling multiple dimensions at once is not allowed - if (serverPlayerState.serverPlayer.getLevel() != level.getLevelWrapper() - && !GENERATE_MULTIPLE_DIMENSIONS_CONFIG.get()) - { - // If the message can be replied to - reply with error, otherwise just ignore - if (msg instanceof TrackableNettyMessage) - { - ((TrackableNettyMessage) msg).sendResponse(new InvalidLevelException(MessageFormat.format( - "Generation not allowed. Requested dimension: {0}, player dimension: {1}", - level.getLevelWrapper().getDimensionType().getDimensionName(), - serverPlayerState.serverPlayer.getLevel().getDimensionType().getDimensionName() - ))); - } - - return; - } - - next.accept(msg, serverPlayerState); - }; + return this.connectedPlayers.get(player); + } + public Iterable getConnectedPlayers() + { + return this.connectedPlayers.values(); } - public void registerJoinedPlayer(IServerPlayerWrapper serverPlayer) + + public ServerPlayerState registerJoinedPlayer(IServerPlayerWrapper serverPlayer) { - this.connectedPlayers.put(serverPlayer, new ServerPlayerState(serverPlayer)); + ServerPlayerState state = new ServerPlayerState(serverPlayer); + this.connectedPlayers.put(serverPlayer, state); + return state; } public void unregisterLeftPlayer(IServerPlayerWrapper serverPlayer) @@ -82,10 +48,4 @@ public class RemotePlayerConnectionHandler implements Closeable } } - @Override - public void close() - { - this.configChangeListener.close(); - } - } \ No newline at end of file diff --git a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/ServerPlayerState.java b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/ServerPlayerState.java index 7f97ff472..283517343 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/ServerPlayerState.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/ServerPlayerState.java @@ -26,6 +26,7 @@ public class ServerPlayerState () -> Config.Client.Advanced.Logging.logNetworkEvent.get()); public final PluginChannelSession session; + public IServerPlayerWrapper serverPlayer() { return this.session.serverPlayer; } @NotNull public ConstrainedMultiplayerConfig config = new ConstrainedMultiplayerConfig(); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/PluginMessageRegistry.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/PluginMessageRegistry.java index 341af3237..24c7009ac 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/PluginMessageRegistry.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/PluginMessageRegistry.java @@ -23,7 +23,6 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.seibel.distanthorizons.core.network.messages.plugin.CurrentLevelKeyMessage; import com.seibel.distanthorizons.core.network.messages.plugin.base.HelloMessage; -import com.seibel.distanthorizons.core.network.messages.plugin.PluginMessageRegistry; import com.seibel.distanthorizons.core.network.messages.plugin.base.AckMessage; import com.seibel.distanthorizons.core.network.messages.plugin.base.CancelMessage; import com.seibel.distanthorizons.core.network.messages.plugin.base.CloseReasonMessage; @@ -31,8 +30,6 @@ import com.seibel.distanthorizons.core.network.messages.plugin.base.ExceptionMes import com.seibel.distanthorizons.core.network.messages.plugin.fullData.FullDataPartialUpdateMessage; import com.seibel.distanthorizons.core.network.messages.plugin.fullData.FullDataSourceRequestMessage; import com.seibel.distanthorizons.core.network.messages.plugin.fullData.FullDataSourceResponseMessage; -import com.seibel.distanthorizons.core.network.messages.plugin.fullData.generation.GenTaskPriorityRequestMessage; -import com.seibel.distanthorizons.core.network.messages.plugin.fullData.generation.GenTaskPriorityResponseMessage; import com.seibel.distanthorizons.core.network.messages.plugin.session.PlayerUUIDMessage; import com.seibel.distanthorizons.core.network.messages.plugin.session.RemotePlayerConfigMessage; import com.seibel.distanthorizons.core.network.plugin.PluginChannelMessage; diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/PluginCloseEvent.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/PluginCloseEvent.java index 0174680eb..8d2fbb693 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/PluginCloseEvent.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/PluginCloseEvent.java @@ -1,6 +1,5 @@ package com.seibel.distanthorizons.core.network.messages.plugin; -import com.seibel.distanthorizons.core.network.messages.ICloseEvent; import com.seibel.distanthorizons.core.network.plugin.PluginChannelMessage; import com.seibel.distanthorizons.core.network.protocol.INetworkObject; import io.netty.buffer.ByteBuf; @@ -8,7 +7,7 @@ import io.netty.buffer.ByteBuf; /** * This is not a "real" message, and only used to indicate a disconnection. */ -public class PluginCloseEvent extends PluginChannelMessage implements ICloseEvent, INetworkObject +public class PluginCloseEvent extends PluginChannelMessage { @Override public void encode(ByteBuf out) { throw new UnsupportedOperationException(this.getClass().getSimpleName() + " is not a real message, and cannot be sent."); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/base/AckMessage.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/base/AckMessage.java index 3b5d23823..09488217d 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/base/AckMessage.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/base/AckMessage.java @@ -20,7 +20,6 @@ package com.seibel.distanthorizons.core.network.messages.plugin.base; import com.seibel.distanthorizons.core.network.plugin.TrackableMessage; -import com.seibel.distanthorizons.core.network.plugin.TrackableNettyMessage; import io.netty.buffer.ByteBuf; /** diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/base/CancelMessage.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/base/CancelMessage.java index 2fb9b6ac0..15c173901 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/base/CancelMessage.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/base/CancelMessage.java @@ -20,7 +20,6 @@ package com.seibel.distanthorizons.core.network.messages.plugin.base; import com.seibel.distanthorizons.core.network.plugin.TrackableMessage; -import com.seibel.distanthorizons.core.network.plugin.TrackableNettyMessage; import io.netty.buffer.ByteBuf; public class CancelMessage extends TrackableMessage diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/base/CloseReasonMessage.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/base/CloseReasonMessage.java index 3b38ccd0d..42ef502c4 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/base/CloseReasonMessage.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/base/CloseReasonMessage.java @@ -19,7 +19,6 @@ package com.seibel.distanthorizons.core.network.messages.plugin.base; -import com.seibel.distanthorizons.core.network.netty.NettyMessage; import com.seibel.distanthorizons.core.network.plugin.PluginChannelMessage; import io.netty.buffer.ByteBuf; @@ -39,9 +38,4 @@ public class CloseReasonMessage extends PluginChannelMessage @Override public void decode(ByteBuf in) { this.reason = this.readString(in); } - @Override public String toString() - { - return super.toString("reason='" + this.reason + '\''); - } - } \ No newline at end of file diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/base/ExceptionMessage.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/base/ExceptionMessage.java index f22678c78..d327196d0 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/base/ExceptionMessage.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/base/ExceptionMessage.java @@ -24,7 +24,6 @@ import com.seibel.distanthorizons.core.network.exceptions.InvalidSectionPosExcep import com.seibel.distanthorizons.core.network.exceptions.RateLimitedException; import com.seibel.distanthorizons.core.network.exceptions.RequestRejectedException; import com.seibel.distanthorizons.core.network.plugin.TrackableMessage; -import com.seibel.distanthorizons.core.network.plugin.TrackableNettyMessage; import io.netty.buffer.ByteBuf; import java.util.ArrayList; @@ -62,9 +61,4 @@ public class ExceptionMessage extends TrackableMessage this.exception = exceptionMap.get(id).getDeclaredConstructor(String.class).newInstance(message); } - @Override public String toString() - { - return super.toString("exception=" + this.exception); - } - } \ No newline at end of file diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/fullData/FullDataPartialUpdateMessage.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/fullData/FullDataPartialUpdateMessage.java index c3bd8d20d..055205e17 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/fullData/FullDataPartialUpdateMessage.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/fullData/FullDataPartialUpdateMessage.java @@ -23,7 +23,6 @@ import com.seibel.distanthorizons.api.enums.config.EDhApiDataCompressionMode; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dataObjects.fullData.sources.FullDataSourceV2; import com.seibel.distanthorizons.core.network.messages.plugin.ILevelRelatedMessage; -import com.seibel.distanthorizons.core.network.netty.NettyMessage; import com.seibel.distanthorizons.core.network.plugin.PluginChannelMessage; import com.seibel.distanthorizons.core.network.protocol.INetworkObject; import com.seibel.distanthorizons.core.sql.dto.FullDataSourceV2DTO; @@ -75,12 +74,4 @@ public class FullDataPartialUpdateMessage extends PluginChannelMessage implement this.dataSourceDto = INetworkObject.readToObject(new FullDataSourceV2DTO(), in); } - @Override - public String toString() - { - return super.toString( - "levelHashCode=" + this.levelName - ); - } - } \ No newline at end of file diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/fullData/FullDataSourceRequestMessage.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/fullData/FullDataSourceRequestMessage.java index 4a3417759..47bfa6c22 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/fullData/FullDataSourceRequestMessage.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/fullData/FullDataSourceRequestMessage.java @@ -21,7 +21,6 @@ package com.seibel.distanthorizons.core.network.messages.plugin.fullData; import com.seibel.distanthorizons.core.network.messages.plugin.ILevelRelatedMessage; import com.seibel.distanthorizons.core.network.plugin.TrackableMessage; -import com.seibel.distanthorizons.core.network.plugin.TrackableNettyMessage; import com.seibel.distanthorizons.core.network.protocol.INetworkObject; import com.seibel.distanthorizons.core.pos.DhSectionPos; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; @@ -69,14 +68,4 @@ public class FullDataSourceRequestMessage extends TrackableMessage implements IL this.clientTimestamp = this.readOptional(in, in::readLong); } - @Override - public String toString() - { - return super.toString( - "dhSectionPos=" + this.sectionPos + - ", levelHashCode=" + this.levelName + - ", checksum=" + this.clientTimestamp - ); - } - } \ No newline at end of file diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/fullData/FullDataSourceResponseMessage.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/fullData/FullDataSourceResponseMessage.java index 2d423875c..efa7b003b 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/fullData/FullDataSourceResponseMessage.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/fullData/FullDataSourceResponseMessage.java @@ -23,7 +23,6 @@ import com.seibel.distanthorizons.api.enums.config.EDhApiDataCompressionMode; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dataObjects.fullData.sources.FullDataSourceV2; import com.seibel.distanthorizons.core.network.plugin.TrackableMessage; -import com.seibel.distanthorizons.core.network.plugin.TrackableNettyMessage; import com.seibel.distanthorizons.core.network.protocol.INetworkObject; import com.seibel.distanthorizons.core.sql.dto.FullDataSourceV2DTO; import io.netty.buffer.ByteBuf; diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/session/PlayerUUIDMessage.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/session/PlayerUUIDMessage.java index 571950061..699d66cf6 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/session/PlayerUUIDMessage.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/plugin/session/PlayerUUIDMessage.java @@ -20,7 +20,6 @@ package com.seibel.distanthorizons.core.network.messages.plugin.session; import com.seibel.distanthorizons.core.network.plugin.TrackableMessage; -import com.seibel.distanthorizons.core.network.plugin.TrackableNettyMessage; import io.netty.buffer.ByteBuf; import java.util.UUID; @@ -42,9 +41,4 @@ public class PlayerUUIDMessage extends TrackableMessage @Override public void decode0(ByteBuf in) { this.playerUUID = new UUID(in.readLong(), in.readLong()); } - @Override public String toString() - { - return super.toString("playerUUID=" + this.playerUUID); - } - } \ No newline at end of file diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/plugin/PluginChannelMessage.java b/core/src/main/java/com/seibel/distanthorizons/core/network/plugin/PluginChannelMessage.java index 0d85d53e8..ad2004bfe 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/plugin/PluginChannelMessage.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/plugin/PluginChannelMessage.java @@ -6,6 +6,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapp public abstract class PluginChannelMessage implements INetworkObject { public PluginChannelSession session = null; + public IServerPlayerWrapper serverPlayer() { return this.session.serverPlayer; } public boolean warnWhenUnhandled() { return true; } @@ -18,7 +19,7 @@ public abstract class PluginChannelMessage implements INetworkObject { if (this.session != null) { - throw new IllegalStateException("Session cannot be changed after initialization."); + throw new IllegalStateException("Session object cannot be changed after initialization."); } this.session = connection; } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/plugin/PluginChannelSession.java b/core/src/main/java/com/seibel/distanthorizons/core/network/plugin/PluginChannelSession.java index 0fd42135f..15123e643 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/plugin/PluginChannelSession.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/plugin/PluginChannelSession.java @@ -23,7 +23,7 @@ public class PluginChannelSession extends NetworkEventSource private static final ConfigBasedLogger LOGGER = new ConfigBasedLogger(LogManager.getLogger(), () -> Config.Client.Advanced.Logging.logNetworkEvent.get()); - private final IPluginPacketSender packetSender = SingletonInjector.INSTANCE.get(IPluginPacketSender.class); + private static final IPluginPacketSender PACKET_SENDER = SingletonInjector.INSTANCE.get(IPluginPacketSender.class); /** * When non-null, any received data will be ignored.
@@ -35,7 +35,7 @@ public class PluginChannelSession extends NetworkEventSource public boolean isClosed() { return this.closeReason.get() != null; } @Nullable - private final IServerPlayerWrapper serverPlayer; + public final IServerPlayerWrapper serverPlayer; public PluginChannelSession(@Nullable IServerPlayerWrapper serverPlayer) { @@ -93,11 +93,11 @@ public class PluginChannelSession extends NetworkEventSource if (this.serverPlayer != null) { - this.packetSender.sendPluginPacketServer(this.serverPlayer, encoder); + PACKET_SENDER.sendPluginPacketServer(this.serverPlayer, encoder); } else { - this.packetSender.sendPluginPacketClient(encoder); + PACKET_SENDER.sendPluginPacketClient(encoder); } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/plugin/TrackableMessage.java b/core/src/main/java/com/seibel/distanthorizons/core/network/plugin/TrackableMessage.java index 878a2d6d5..bbaa3de68 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/plugin/TrackableMessage.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/plugin/TrackableMessage.java @@ -39,7 +39,7 @@ public abstract class TrackableMessage extends PluginChannelMessage | ((Objects.requireNonNull(SharedApi.getEnvironment()) == EWorldEnvironment.Server_Only ? 1 : 0) << 31); private static final AtomicInteger lastContextId = new AtomicInteger(); - private static final ConcurrentMap connectionToIdMap = new MapMaker().weakKeys().makeMap(); + private static final ConcurrentMap connectionToIdMap = new MapMaker().weakKeys().makeMap(); public void sendResponse(TrackableMessage responseMessage) { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/world/DhServerWorld.java b/core/src/main/java/com/seibel/distanthorizons/core/world/DhServerWorld.java index 8a60c0aaf..724fbcc3d 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/world/DhServerWorld.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/world/DhServerWorld.java @@ -23,6 +23,7 @@ import com.seibel.distanthorizons.core.file.structure.LocalSaveStructure; import com.seibel.distanthorizons.core.level.DhServerLevel; import com.seibel.distanthorizons.core.level.IDhLevel; import com.seibel.distanthorizons.core.multiplayer.server.RemotePlayerConnectionHandler; +import com.seibel.distanthorizons.core.multiplayer.server.ServerPlayerState; import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; @@ -65,13 +66,20 @@ public class DhServerWorld extends AbstractDhWorld implements IDhServerWorld public void addPlayer(IServerPlayerWrapper serverPlayer) { - this.remotePlayerConnectionHandler.registerJoinedPlayer(serverPlayer); + ServerPlayerState playerState = this.remotePlayerConnectionHandler.registerJoinedPlayer(serverPlayer); this.getLevel(serverPlayer.getLevel()).addPlayer(serverPlayer); + + for (DhServerLevel level : this.levels.values()) + { + level.registerNetworkHandlers(playerState); + } } public void removePlayer(IServerPlayerWrapper serverPlayer) { this.getLevel(serverPlayer.getLevel()).removePlayer(serverPlayer); this.remotePlayerConnectionHandler.unregisterLeftPlayer(serverPlayer); + + // If player's left, session is already closed } public void changePlayerLevel(IServerPlayerWrapper player, IServerLevelWrapper origin, IServerLevelWrapper dest) { @@ -142,8 +150,6 @@ public class DhServerWorld extends AbstractDhWorld implements IDhServerWorld @Override public void close() { - this.remotePlayerConnectionHandler.close(); - for (DhServerLevel level : this.levels.values()) { LOGGER.info("Unloading level " + level.getLevelWrapper().getDimensionType().getDimensionName()); @@ -162,4 +168,4 @@ public class DhServerWorld extends AbstractDhWorld implements IDhServerWorld LOGGER.info("Closed DhWorld of type " + this.environment); } -} +} \ No newline at end of file