[skip ci] Still a mess
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+2
-70
@@ -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));
|
||||
|
||||
+3
-9
@@ -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
|
||||
|
||||
+12
-52
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
+1
@@ -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();
|
||||
|
||||
-3
@@ -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
-2
@@ -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."); }
|
||||
|
||||
-1
@@ -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;
|
||||
|
||||
/**
|
||||
|
||||
-1
@@ -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
|
||||
|
||||
-6
@@ -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 + '\'');
|
||||
}
|
||||
|
||||
}
|
||||
-6
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
-9
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
-11
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
-1
@@ -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;
|
||||
|
||||
-6
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
+2
-1
@@ -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;
|
||||
}
|
||||
|
||||
+4
-4
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user