From a7578b2a72dd6cac0db8087a6a511357e92a80f9 Mon Sep 17 00:00:00 2001 From: s809 <43530948+s809@users.noreply.github.com> Date: Thu, 30 Jan 2025 20:46:04 +0500 Subject: [PATCH] Process chunks only once with real-time updates enabled --- .../core/api/internal/SharedApi.java | 2 +- .../core/level/DhClientLevel.java | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 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 217c9cc9f..85d4290d7 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 @@ -233,7 +233,7 @@ public class SharedApi if (dhLevel instanceof DhClientLevel) { - if (!((DhClientLevel) dhLevel).shouldProcessLocalChunkUpdates()) + if (!((DhClientLevel) dhLevel).shouldProcessChunkUpdate(chunkWrapper.getChunkPos())) { return; } 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 f0f6e76df..47c7ff133 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 @@ -19,6 +19,7 @@ package com.seibel.distanthorizons.core.level; +import com.google.common.cache.CacheBuilder; import com.seibel.distanthorizons.api.methods.events.sharedParameterObjects.DhApiRenderParam; import com.seibel.distanthorizons.core.config.AppliedConfigState; import com.seibel.distanthorizons.core.config.Config; @@ -33,6 +34,7 @@ import com.seibel.distanthorizons.core.multiplayer.client.ClientNetworkState; import com.seibel.distanthorizons.core.multiplayer.client.SyncOnLoadRequestQueue; import com.seibel.distanthorizons.core.network.event.ScopedNetworkEventSource; import com.seibel.distanthorizons.core.network.messages.fullData.FullDataPartialUpdateMessage; +import com.seibel.distanthorizons.core.pos.DhChunkPos; import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos; import com.seibel.distanthorizons.core.render.RenderBufferHandler; import com.seibel.distanthorizons.core.render.renderer.generic.GenericObjectRenderer; @@ -51,8 +53,11 @@ import org.jetbrains.annotations.Nullable; import javax.annotation.CheckForNull; import java.awt.*; import java.io.File; +import java.util.*; import java.util.List; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; /** The level used when connected to a server */ public class DhClientLevel extends AbstractDhLevel implements IDhClientLevel @@ -70,6 +75,13 @@ public class DhClientLevel extends AbstractDhLevel implements IDhClientLevel @Nullable private final ScopedNetworkEventSource networkEventSource; + private final Set loadedOnceChunks = Collections.newSetFromMap( + CacheBuilder.newBuilder() + .expireAfterWrite(10, TimeUnit.MINUTES) + .build() + .asMap() + ); + public final WorldGenModule worldGenModule; public final AppliedConfigState worldGeneratorEnabledConfig; @@ -283,14 +295,14 @@ public class DhClientLevel extends AbstractDhLevel implements IDhClientLevel return (renderState != null) ? renderState.renderBufferHandler : null; } - public boolean shouldProcessLocalChunkUpdates() + public boolean shouldProcessChunkUpdate(DhChunkPos chunkPos) { if (this.networkState == null || !this.networkState.isReady()) { return true; } - return !this.networkState.sessionConfig.isRealTimeUpdatesEnabled(); + return !this.networkState.sessionConfig.isRealTimeUpdatesEnabled() || this.loadedOnceChunks.add(chunkPos); }