From e0a0ba522256ca3d3e417404de8b11b968f7414c Mon Sep 17 00:00:00 2001 From: s809 <43530948+s809@users.noreply.github.com> Date: Thu, 23 Jan 2025 22:06:20 +0500 Subject: [PATCH 1/2] Fix full data source being released too early --- .../file/fullDatafile/RemoteFullDataSourceProvider.java | 5 ++++- .../core/generation/RemoteWorldRetrievalQueue.java | 7 ++++++- .../seibel/distanthorizons/core/level/DhClientLevel.java | 7 +++---- .../client/AbstractFullDataNetworkRequestQueue.java | 7 +++---- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/RemoteFullDataSourceProvider.java b/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/RemoteFullDataSourceProvider.java index 46ebd66f7..f136ae5cf 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/RemoteFullDataSourceProvider.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/RemoteFullDataSourceProvider.java @@ -99,7 +99,10 @@ public class RemoteFullDataSourceProvider extends GeneratedFullDataSourceProvide Long timestamp = this.getTimestampForPos(pos); if (timestamp != null) { - this.syncOnLoadRequestQueue.submitRequest(pos, timestamp, this::updateDataSource); + this.syncOnLoadRequestQueue.submitRequest(pos, timestamp, fullDataSource -> + { + this.updateDataSourceAsync(fullDataSource).whenComplete((result, throwable) -> fullDataSource.close()); + }); } return super.get(pos); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/generation/RemoteWorldRetrievalQueue.java b/core/src/main/java/com/seibel/distanthorizons/core/generation/RemoteWorldRetrievalQueue.java index b9784cb47..f45953741 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/generation/RemoteWorldRetrievalQueue.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/generation/RemoteWorldRetrievalQueue.java @@ -16,6 +16,7 @@ import org.apache.logging.log4j.Logger; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.concurrent.*; public class RemoteWorldRetrievalQueue extends AbstractFullDataNetworkRequestQueue implements IFullDataSourceRetrievalQueue, IDebugRenderable @@ -56,7 +57,11 @@ public class RemoteWorldRetrievalQueue extends AbstractFullDataNetworkRequestQue { long generationStartMsTime = System.currentTimeMillis(); - return super.submitRequest(sectionPos, tracker.getDataSourceConsumer()) + + return super.submitRequest(sectionPos, fullDataSource -> { + Objects.requireNonNull(tracker.getDataSourceConsumer()).accept(fullDataSource); + fullDataSource.close(); + }) .thenApply(requestResult -> { long totalGenTimeInMs = System.currentTimeMillis() - generationStartMsTime; 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 11e615898..314078b1b 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 @@ -142,10 +142,9 @@ public class DhClientLevel extends AbstractDhLevel implements IDhClientLevel } this.updateBeaconBeamsForSectionPos(dataSourceDto.pos, message.payload.beaconBeams); - try (FullDataSourceV2 fullDataSource = dataSourceDto.createDataSource(this.levelWrapper)) - { - this.updateDataSourcesAsync(fullDataSource); - } + + FullDataSourceV2 fullDataSource = dataSourceDto.createDataSource(this.levelWrapper); + this.updateDataSourcesAsync(fullDataSource).whenComplete((result, e) -> fullDataSource.close()); } catch (Exception e) { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/client/AbstractFullDataNetworkRequestQueue.java b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/client/AbstractFullDataNetworkRequestQueue.java index d78d3736f..bd8830d47 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/client/AbstractFullDataNetworkRequestQueue.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/client/AbstractFullDataNetworkRequestQueue.java @@ -241,10 +241,9 @@ public abstract class AbstractFullDataNetworkRequestQueue implements IDebugRende try { this.level.updateBeaconBeamsForSectionPos(dataSourceDto.pos, response.payload.beaconBeams); - try (FullDataSourceV2 fullDataSource = dataSourceDto.createDataSource(this.level.getLevelWrapper())) - { - entry.dataSourceConsumer.accept(fullDataSource); - } + + FullDataSourceV2 fullDataSource = dataSourceDto.createDataSource(this.level.getLevelWrapper()); + entry.dataSourceConsumer.accept(fullDataSource); } catch (Exception e) { From cdca7723a73c15282bacc3bc3ed167948a3061d7 Mon Sep 17 00:00:00 2001 From: s809 <43530948+s809@users.noreply.github.com> Date: Thu, 23 Jan 2025 23:21:13 +0500 Subject: [PATCH 2/2] Ignore local chunks if realtime updates are enabled --- .../distanthorizons/core/api/internal/SharedApi.java | 9 +++++++++ .../core/level/AbstractDhServerLevel.java | 3 +-- .../seibel/distanthorizons/core/level/DhClientLevel.java | 2 ++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/SharedApi.java b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/SharedApi.java index 09da292b5..6553720b1 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/SharedApi.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/SharedApi.java @@ -25,6 +25,7 @@ import com.seibel.distanthorizons.core.Initializer; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.generation.DhLightingEngine; +import com.seibel.distanthorizons.core.level.DhClientLevel; import com.seibel.distanthorizons.core.level.IDhLevel; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.logging.f3.F3Screen; @@ -231,6 +232,14 @@ public class SharedApi return; } + if (dhLevel instanceof DhClientLevel) + { + if (!((DhClientLevel) dhLevel).shouldProcessLocalChunkUpdates()) + { + return; + } + } + // shoudln't normally happen, but just in case if (UPDATE_POS_MANAGER.contains(chunkWrapper.getChunkPos())) { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhServerLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhServerLevel.java index b843c0135..f7bedcc62 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhServerLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhServerLevel.java @@ -278,8 +278,7 @@ public abstract class AbstractDhServerLevel extends AbstractDhLevel implements I Vec3d playerPosition = serverPlayerState.getServerPlayer().getPosition(); int distanceFromPlayer = DhSectionPos.getChebyshevSignedBlockDistance(data.getPos(), new DhBlockPos2D((int) playerPosition.x, (int) playerPosition.z)) / 16; - if (distanceFromPlayer >= serverPlayerState.getServerPlayer().getViewDistance() - && distanceFromPlayer <= serverPlayerState.sessionConfig.getMaxUpdateDistanceRadius()) + if (distanceFromPlayer <= serverPlayerState.sessionConfig.getMaxUpdateDistanceRadius()) { serverPlayerState.fullDataPayloadSender.sendInChunks(payload, () -> { 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 314078b1b..a34a7560f 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 @@ -283,6 +283,8 @@ public class DhClientLevel extends AbstractDhLevel implements IDhClientLevel return (renderState != null) ? renderState.renderBufferHandler : null; } + public boolean shouldProcessLocalChunkUpdates() { return this.networkState == null || !this.networkState.sessionConfig.isRealTimeUpdatesEnabled(); } + //===========//