From 01aa235fff8edfed8923de7dcb3eb9208d0e00ec Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Mon, 24 Feb 2025 17:23:30 -0700 Subject: [PATCH] Clear lastSection on game event listener removal (fixes #87) --- .../DynamicGameEventListenerMixin.java | 25 +++++++++++++++++++ src/main/resources/moonrise.mixins.json | 1 + 2 files changed, 26 insertions(+) create mode 100644 src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/DynamicGameEventListenerMixin.java diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/DynamicGameEventListenerMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/DynamicGameEventListenerMixin.java new file mode 100644 index 00000000..ed0c3baa --- /dev/null +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/DynamicGameEventListenerMixin.java @@ -0,0 +1,25 @@ +package ca.spottedleaf.moonrise.mixin.chunk_system; + +import net.minecraft.core.SectionPos; +import net.minecraft.world.level.gameevent.DynamicGameEventListener; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(DynamicGameEventListener.class) +abstract class DynamicGameEventListenerMixin { + @Shadow @Nullable private SectionPos lastSection; + + @Inject(method = "remove", at = @At("RETURN")) + private void onRemove(final CallbackInfo ci) { + // We need to unset the last section when removed, otherwise if the same instance is re-added at the same position it + // will assume there was no change and fail to re-register. + // In vanilla, chunks rarely unload and re-load quickly enough to trigger this issue. However, our chunk system has a + // quirk where fast chunk reload cycles will often occur on player login (see PR #22). + // So we fix this vanilla oversight as our changes cause it to manifest in bugs much more often (see issue #87). + this.lastSection = null; + } +} diff --git a/src/main/resources/moonrise.mixins.json b/src/main/resources/moonrise.mixins.json index 76f5f54b..bb7be208 100644 --- a/src/main/resources/moonrise.mixins.json +++ b/src/main/resources/moonrise.mixins.json @@ -26,6 +26,7 @@ "chunk_system.ChunkStepMixin", "chunk_system.ChunkStorageMixin", "chunk_system.DistanceManagerMixin", + "chunk_system.DynamicGameEventListenerMixin", "chunk_system.EntityGetterMixin", "chunk_system.EntityMixin", "chunk_system.EntityTickListMixin",