From bd938e6e352c932ba636bca66b28213c6c90f6eb Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Sun, 1 Dec 2024 14:24:33 -0800 Subject: [PATCH] Clamp simulation distance Values above MAX_VIEW_DISTANCE do not make sense to configure, as it is clamped to the load view distance. --- .../mixin/chunk_system/DistanceManagerMixin.java | 7 ++++++- .../mixin/chunk_system/PlayerListMixin.java | 13 +++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/DistanceManagerMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/DistanceManagerMixin.java index 9ba247c..612b5a8 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/DistanceManagerMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/DistanceManagerMixin.java @@ -1,5 +1,6 @@ package ca.spottedleaf.moonrise.mixin.chunk_system; +import ca.spottedleaf.moonrise.common.util.MoonriseConstants; import ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemServerLevel; import ca.spottedleaf.moonrise.patches.chunk_system.level.chunk.ChunkSystemDistanceManager; import ca.spottedleaf.moonrise.patches.chunk_system.scheduling.ChunkHolderManager; @@ -13,6 +14,7 @@ import net.minecraft.server.level.DistanceManager; import net.minecraft.server.level.Ticket; import net.minecraft.server.level.TicketType; import net.minecraft.server.level.TickingTracker; +import net.minecraft.util.Mth; import net.minecraft.util.SortedArraySet; import net.minecraft.util.thread.ProcessorHandle; import net.minecraft.world.level.ChunkPos; @@ -296,7 +298,10 @@ abstract class DistanceManagerMixin implements ChunkSystemDistanceManager { */ @Overwrite public void updateSimulationDistance(final int simulationDistance) { - ((ChunkSystemServerLevel)this.moonrise$getChunkMap().level).moonrise$getPlayerChunkLoader().setTickDistance(simulationDistance); + // note: vanilla does not clamp to 0, but we do simply because we need a min of 0 + final int clamped = Mth.clamp(simulationDistance, 0, MoonriseConstants.MAX_VIEW_DISTANCE); + + ((ChunkSystemServerLevel)this.moonrise$getChunkMap().level).moonrise$getPlayerChunkLoader().setTickDistance(clamped); } /** diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/PlayerListMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/PlayerListMixin.java index 50ff8f1..607fe78 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/PlayerListMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/PlayerListMixin.java @@ -43,4 +43,17 @@ abstract class PlayerListMixin { ) private void doNotAdjustVD(final PlayerList instance, final Packet packet) {} + + /** + * @reason The RegionizedPlayerChunkLoader will handle the SD packet + * @author Spottedleaf + */ + @Redirect( + method = "setSimulationDistance", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/players/PlayerList;broadcastAll(Lnet/minecraft/network/protocol/Packet;)V" + ) + ) + private void doNotAdjustSD(final PlayerList instance, final Packet packet) {} }