From b4789a91f919c054032fbd087956ccf35c076622 Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Fri, 20 Jun 2025 14:03:28 -0700 Subject: [PATCH] Add chunk unload delay config option The default config option is no unload delay, so that it maintains parity with Vanilla. Fixes https://github.com/Tuinity/Moonrise/issues/115 --- .../common/config/moonrise/MoonriseConfig.java | 17 ++++++++++++++++- .../player/RegionizedPlayerChunkLoader.java | 6 +++++- src/main/resources/moonrise.accesswidener | 1 + 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/java/ca/spottedleaf/moonrise/common/config/moonrise/MoonriseConfig.java b/src/main/java/ca/spottedleaf/moonrise/common/config/moonrise/MoonriseConfig.java index 9a4a682..b91529d 100644 --- a/src/main/java/ca/spottedleaf/moonrise/common/config/moonrise/MoonriseConfig.java +++ b/src/main/java/ca/spottedleaf/moonrise/common/config/moonrise/MoonriseConfig.java @@ -2,6 +2,7 @@ package ca.spottedleaf.moonrise.common.config.moonrise; import ca.spottedleaf.moonrise.common.config.ui.ClothConfig; import ca.spottedleaf.moonrise.common.util.MoonriseCommon; +import ca.spottedleaf.moonrise.patches.chunk_system.player.RegionizedPlayerChunkLoader; import ca.spottedleaf.moonrise.patches.chunk_system.scheduling.ChunkTaskScheduler; import ca.spottedleaf.yamlconfig.InitialiseHook; import ca.spottedleaf.yamlconfig.annotation.Adaptable; @@ -38,7 +39,7 @@ public final class MoonriseConfig { @Adaptable - public static final class Basic { + public static final class Basic implements InitialiseHook { @Serializable( comment = """ The maximum rate of chunks to send to any given player, per second. If this value is <= 0, @@ -72,6 +73,20 @@ public final class MoonriseConfig { section = CHUNK_SYSTEM_SECTION ) public double playerMaxGenRate = -1.0; + + @Serializable( + comment = """ + The delay before chunks are unloaded around players once they leave their view distance. + The Vanilla value is 0 ticks. Setting this value higher (i.e 5s) will allow pets to teleport + to their owners when they teleport. + """ + ) + public Duration playerChunkUnloadDelay = Duration.parse("0t"); + + @Override + public void initialise() { + RegionizedPlayerChunkLoader.setUnloadDelay(this.playerChunkUnloadDelay.getTimeTicks()); + } } @Serializable( diff --git a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/player/RegionizedPlayerChunkLoader.java b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/player/RegionizedPlayerChunkLoader.java index b3610f6..cceed50 100644 --- a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/player/RegionizedPlayerChunkLoader.java +++ b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/player/RegionizedPlayerChunkLoader.java @@ -46,7 +46,7 @@ import java.util.function.Function; public final class RegionizedPlayerChunkLoader { public static final TicketType PLAYER_TICKET = TicketType.create("chunk_system:player_ticket", Long::compareTo); - public static final TicketType PLAYER_TICKET_DELAYED = TicketType.create("chunk_system:player_ticket_delayed", Long::compareTo, 5 * 20); + public static final TicketType PLAYER_TICKET_DELAYED = TicketType.create("chunk_system:player_ticket_delayed", Long::compareTo, 1); public static final int MIN_VIEW_DISTANCE = 2; public static final int MAX_VIEW_DISTANCE = 32; @@ -55,6 +55,10 @@ public final class RegionizedPlayerChunkLoader { public static final int LOADED_TICKET_LEVEL = ChunkTaskScheduler.getTicketLevel(ChunkStatus.EMPTY); public static final int TICK_TICKET_LEVEL = ChunkHolderManager.ENTITY_TICKING_TICKET_LEVEL; + public static void setUnloadDelay(final long ticks) { + PLAYER_TICKET_DELAYED.timeout = Math.max(1, ticks); + } + public static final class ViewDistanceHolder { private volatile ViewDistances viewDistances; diff --git a/src/main/resources/moonrise.accesswidener b/src/main/resources/moonrise.accesswidener index 103c46c..0ef06b4 100644 --- a/src/main/resources/moonrise.accesswidener +++ b/src/main/resources/moonrise.accesswidener @@ -220,6 +220,7 @@ accessible class net/minecraft/server/level/DistanceManager$FixedPlayerDistanceC # Ticket accessible field net/minecraft/server/level/Ticket key Ljava/lang/Object; accessible field net/minecraft/server/level/TicketType timeout J +mutable field net/minecraft/server/level/TicketType timeout J # ServerChunkCache