From 45225a580f0701ac22760b33b148f140b37f482b Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Thu, 20 Apr 2023 20:17:55 -0400 Subject: [PATCH] Clear chunk map from integrated server worlds after server stops --- .../org/embeddedt/modernfix/ModernFix.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/main/java/org/embeddedt/modernfix/ModernFix.java b/src/main/java/org/embeddedt/modernfix/ModernFix.java index 07b69036..dd9c572f 100644 --- a/src/main/java/org/embeddedt/modernfix/ModernFix.java +++ b/src/main/java/org/embeddedt/modernfix/ModernFix.java @@ -1,16 +1,22 @@ package org.embeddedt.modernfix; +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import net.minecraft.server.level.ChunkHolder; +import net.minecraft.server.level.ChunkMap; +import net.minecraft.server.level.ServerLevel; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.*; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; import net.minecraftforge.fml.config.ModConfig; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent; import net.minecraftforge.fml.event.server.FMLServerStartedEvent; import net.minecraftforge.fml.event.server.FMLServerStartingEvent; +import net.minecraftforge.fml.event.server.FMLServerStoppedEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fml.loading.FMLLoader; import net.minecraftforge.fml.network.FMLNetworkConstants; @@ -27,6 +33,7 @@ import org.embeddedt.modernfix.util.ClassInfoManager; import org.embeddedt.modernfix.util.KubeUtil; import java.lang.management.ManagementFactory; +import java.lang.reflect.Field; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; @@ -114,4 +121,25 @@ public class ModernFix { public void onLoadComplete(FMLLoadCompleteEvent event) { ClassInfoManager.clear(); } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public void onServerDead(FMLServerStoppedEvent event) { + /* Clear as much data from the integrated server as possible, in case a mod holds on to it */ + try { + Field updatingMapField = ObfuscationReflectionHelper.findField(ChunkMap.class, "updatingChunkMap"); + Field visibleMapField = ObfuscationReflectionHelper.findField(ChunkMap.class, "visibleChunkMap"); + Field pendingUnloadsField = ObfuscationReflectionHelper.findField(ChunkMap.class, "pendingUnloads"); + for(ServerLevel level : event.getServer().getAllLevels()) { + ChunkMap chunkMap = level.getChunkSource().chunkMap; + Long2ObjectMap map = (Long2ObjectMap)updatingMapField.get(chunkMap); + map.clear(); + map = (Long2ObjectMap)visibleMapField.get(chunkMap); + map.clear(); + map = (Long2ObjectMap)pendingUnloadsField.get(chunkMap); + map.clear(); + } + } catch(RuntimeException | IllegalAccessException e) { + ModernFix.LOGGER.error("Couldn't clear chunk data", e); + } + } }