From 778c2f894e412c69929d5d0aff3df08f3de92bd3 Mon Sep 17 00:00:00 2001 From: s809 <43530948+s809@users.noreply.github.com> Date: Fri, 12 Jul 2024 23:11:36 +0500 Subject: [PATCH] Fix level handling for real time updates --- .../core/level/DhClientLevel.java | 8 +++++- .../core/level/DhServerLevel.java | 26 +++++++++++++------ .../messages/ILevelRelatedMessage.java | 10 +++++-- .../FullDataPartialUpdateMessage.java | 6 ++--- 4 files changed, 36 insertions(+), 14 deletions(-) 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 7656bd83c..3bbe1c2c0 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 @@ -133,7 +133,7 @@ public class DhClientLevel extends AbstractDhLevel implements IDhClientLevel { try { - if (msg.dataSourceDto == null) + if (!msg.isSameLevelAs(this.levelWrapper)) { return; } @@ -288,6 +288,12 @@ public class DhClientLevel extends AbstractDhLevel implements IDhClientLevel { this.worldGenModule.close(); } + + if (this.eventSource != null) + { + this.eventSource.close(); + } + this.clientside.close(); super.close(); this.dataFileHandler.close(); 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 155add792..f2c620089 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 @@ -61,14 +61,19 @@ public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel public final ServerLevelModule serverside; private final IServerLevelWrapper serverLevelWrapper; - - private final RemotePlayerConnectionHandler remotePlayerConnectionHandler; - private final ConcurrentLinkedQueue worldGenLoopingQueue = new ConcurrentLinkedQueue<>(); + /** + * This queue is used for ensuring fair generation speed for each player.
+ * Every tick the first player gets used for centering generation, and then is immediately moved into the back of the queue.
+ * TODO only add players that actually have something to generate + */ + private final ConcurrentLinkedQueue worldGenPlayerCenteringQueue = new ConcurrentLinkedQueue<>(); + private final ConcurrentMap requestGroupsByPos = new ConcurrentHashMap<>(); private final ConcurrentMap requestGroupsByFutureId = new ConcurrentHashMap<>(); + public DhServerLevel(AbstractSaveStructure saveStructure, IServerLevelWrapper serverLevelWrapper, RemotePlayerConnectionHandler remotePlayerConnectionHandler) { if (saveStructure.getFullDataFolder(serverLevelWrapper).mkdirs()) @@ -233,12 +238,12 @@ public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel public void addPlayer(IServerPlayerWrapper serverPlayer) { - this.worldGenLoopingQueue.add(serverPlayer); + this.worldGenPlayerCenteringQueue.add(serverPlayer); } public void removePlayer(IServerPlayerWrapper serverPlayer) { - this.worldGenLoopingQueue.remove(serverPlayer); + this.worldGenPlayerCenteringQueue.remove(serverPlayer); } @Override @@ -307,6 +312,11 @@ public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel FullDataPartialUpdateMessage updateMessage = new FullDataPartialUpdateMessage(this.serverLevelWrapper, data); for (ServerPlayerState serverPlayerState : this.remotePlayerConnectionHandler.getConnectedPlayers()) { + if (serverPlayerState.serverPlayer().getLevel() != this.serverLevelWrapper) + { + continue; + } + if (!serverPlayerState.config.isRealTimeUpdatesEnabled()) { continue; @@ -358,7 +368,7 @@ public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel if (this.serverside.worldGenModule.isWorldGenRunning()) { - IServerPlayerWrapper firstPlayer = this.worldGenLoopingQueue.peek(); + IServerPlayerWrapper firstPlayer = this.worldGenPlayerCenteringQueue.peek(); if (firstPlayer == null) { return; @@ -366,8 +376,8 @@ public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel // Put first player in back before removing from front, so it can be removed by other thread without blocking // - if it gets removed, remove() below will remove the item we just put instead - this.worldGenLoopingQueue.add(firstPlayer); - this.worldGenLoopingQueue.remove(firstPlayer); + this.worldGenPlayerCenteringQueue.add(firstPlayer); + this.worldGenPlayerCenteringQueue.remove(firstPlayer); Vec3d position = firstPlayer.getPosition(); this.serverside.worldGenModule.worldGenTick(new DhBlockPos2D((int) position.x, (int) position.z)); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/ILevelRelatedMessage.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/ILevelRelatedMessage.java index c952d1ca1..6791e098c 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/ILevelRelatedMessage.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/ILevelRelatedMessage.java @@ -1,5 +1,6 @@ package com.seibel.distanthorizons.core.network.messages; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper; public interface ILevelRelatedMessage @@ -10,9 +11,14 @@ public interface ILevelRelatedMessage * Checks whether the message's level matches the given level. */ @SuppressWarnings("BooleanMethodIsAlwaysInverted") - default boolean isSameLevelAs(IServerLevelWrapper levelWrapper) + default boolean isSameLevelAs(ILevelWrapper levelWrapper) { - return this.getLevelName().equals(levelWrapper.getKeyedLevelDimensionName()); + if (levelWrapper instanceof IServerLevelWrapper) + { + return this.getLevelName().equals(((IServerLevelWrapper) levelWrapper).getKeyedLevelDimensionName()); + } + + return this.getLevelName().equals(levelWrapper.getDimensionName()); } } \ No newline at end of file diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/fullData/FullDataPartialUpdateMessage.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/fullData/FullDataPartialUpdateMessage.java index 05b0a4a39..1f06b3888 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/fullData/FullDataPartialUpdateMessage.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/fullData/FullDataPartialUpdateMessage.java @@ -27,7 +27,7 @@ import com.seibel.distanthorizons.core.network.messages.ILevelRelatedMessage; import com.seibel.distanthorizons.core.network.messages.NetworkMessage; import com.seibel.distanthorizons.core.network.INetworkObject; import com.seibel.distanthorizons.core.sql.dto.FullDataSourceV2DTO; -import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper; import io.netty.buffer.ByteBuf; import java.io.IOException; @@ -42,9 +42,9 @@ public class FullDataPartialUpdateMessage extends NetworkMessage implements ILev public FullDataPartialUpdateMessage() { } - public FullDataPartialUpdateMessage(ILevelWrapper level, FullDataSourceV2 fullDataSource) + public FullDataPartialUpdateMessage(IServerLevelWrapper level, FullDataSourceV2 fullDataSource) { - this.levelName = level.getDimensionName(); + this.levelName = level.getKeyedLevelDimensionName(); try {