[skip ci] Still a mess

This commit is contained in:
s809
2024-05-27 22:01:57 +05:00
parent 1f63bdf124
commit a3e34c9738
21 changed files with 87 additions and 232 deletions
@@ -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<Boolean> generateMultipleDimensions = new ConfigEntry.Builder<Boolean>()
.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();
}
}
@@ -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<DhSectionPos> 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<GenTaskPriorityResponseMessage> 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<DhSectionPos, Integer> 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<Void> 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);
}
}
@@ -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<NettyClient, NettyMessage> eventSource;
private final ScopedNetworkEventSource eventSource;
public final WorldGenModule worldGenModule;
public final AppliedConfigState<Boolean> 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();
}
@@ -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<NettyServer, NettyMessage> eventSource;
private final ConcurrentLinkedQueue<IServerPlayerWrapper> worldGenLoopingQueue = new ConcurrentLinkedQueue<>();
private final ConcurrentMap<DhSectionPos, IncompleteDataSourceEntry> 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 <T extends PluginChannelMessage> Consumer<T> currentLevelOnly(Consumer<T> 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));
@@ -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
@@ -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<Boolean> GENERATE_MULTIPLE_DIMENSIONS_CONFIG = Config.Client.Advanced.Multiplayer.ServerNetworking.generateMultipleDimensions;
private final ConcurrentMap<IServerPlayerWrapper, ServerPlayerState> connectedPlayers = new ConcurrentHashMap<>();
@@ -34,43 +22,21 @@ public class RemotePlayerConnectionHandler implements Closeable
this.connectedPlayers.get(player).session.decodeAndHandle(buffer);
}
public <T extends NettyMessage> Consumer<T> currentLevelOnly(DhServerLevel level, BiConsumer<T, ServerPlayerState> 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<ServerPlayerState> 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();
}
}
@@ -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();
@@ -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;
@@ -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."); }
@@ -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;
/**
@@ -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
@@ -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 + '\'');
}
}
@@ -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);
}
}
@@ -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
);
}
}
@@ -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
);
}
}
@@ -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;
@@ -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);
}
}
@@ -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;
}
@@ -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. <br>
@@ -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);
}
}
@@ -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<PluginChannelSessionAAAAA, Integer> connectionToIdMap = new MapMaker().weakKeys().makeMap();
private static final ConcurrentMap<PluginChannelSession, Integer> connectionToIdMap = new MapMaker().weakKeys().makeMap();
public void sendResponse(TrackableMessage responseMessage)
{
@@ -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);
}
}
}