From 23d88c80992ccf86240c379504f991dd566a3f6f Mon Sep 17 00:00:00 2001 From: Technici4n <13494793+Technici4n@users.noreply.github.com> Date: Tue, 24 May 2022 16:05:44 +0200 Subject: [PATCH] Fix #2206: Client chunk cache grows unbounded (#2248) * Fix missing some chunk unloads events leading to a possible memory leak. (#1820) * Update fix for 1.18.2. Fixes #2206 Co-authored-by: modmuss50 <modmuss50@gmail.com> --- .../event/lifecycle/client/ClientChunkManagerMixin.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/fabric-lifecycle-events-v1/src/main/java/net/fabricmc/fabric/mixin/event/lifecycle/client/ClientChunkManagerMixin.java b/fabric-lifecycle-events-v1/src/main/java/net/fabricmc/fabric/mixin/event/lifecycle/client/ClientChunkManagerMixin.java index e7dd9c0c6..eb1def764 100644 --- a/fabric-lifecycle-events-v1/src/main/java/net/fabricmc/fabric/mixin/event/lifecycle/client/ClientChunkManagerMixin.java +++ b/fabric-lifecycle-events-v1/src/main/java/net/fabricmc/fabric/mixin/event/lifecycle/client/ClientChunkManagerMixin.java @@ -33,6 +33,7 @@ import net.minecraft.client.world.ClientWorld; import net.minecraft.nbt.NbtCompound; import net.minecraft.network.PacketByteBuf; import net.minecraft.world.chunk.WorldChunk; +import net.minecraft.util.math.ChunkPos; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -50,6 +51,13 @@ public abstract class ClientChunkManagerMixin { ClientChunkEvents.CHUNK_LOAD.invoker().onChunkLoad(this.world, info.getReturnValue()); } + @Inject(method = "loadChunkFromPacket", at = @At(value = "NEW", target = "net/minecraft/world/chunk/WorldChunk", shift = At.Shift.BEFORE), locals = LocalCapture.CAPTURE_FAILHARD) + private void onChunkUnload(int x, int z, PacketByteBuf buf, NbtCompound tag, Consumer<ChunkData.BlockEntityVisitor> consumer, CallbackInfoReturnable<WorldChunk> info, int index, WorldChunk worldChunk, ChunkPos chunkPos) { + if (worldChunk != null) { + ClientChunkEvents.CHUNK_UNLOAD.invoker().onChunkUnload(this.world, worldChunk); + } + } + @Inject(method = "unload", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/world/ClientChunkManager$ClientChunkMap;compareAndSet(ILnet/minecraft/world/chunk/WorldChunk;Lnet/minecraft/world/chunk/WorldChunk;)Lnet/minecraft/world/chunk/WorldChunk;", shift = At.Shift.AFTER), locals = LocalCapture.CAPTURE_FAILEXCEPTION) private void onChunkUnload(int chunkX, int chunkZ, CallbackInfo ci, int i, WorldChunk chunk) { ClientChunkEvents.CHUNK_UNLOAD.invoker().onChunkUnload(this.world, chunk);