fix pregen save chunk failing

This commit is contained in:
Julian Krings
2025-06-19 18:28:22 +02:00
parent cf0bc81778
commit fa3e35f702

View File

@@ -23,16 +23,17 @@ import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.core.pregenerator.PregenListener;
import com.volmit.iris.core.pregenerator.PregeneratorMethod; import com.volmit.iris.core.pregenerator.PregeneratorMethod;
import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.core.tools.IrisToolbelt;
import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KMap;
import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.mantle.Mantle;
import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.M;
import com.volmit.iris.util.parallel.MultiBurst; import com.volmit.iris.util.parallel.MultiBurst;
import com.volmit.iris.util.scheduling.J;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.World; import org.bukkit.World;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.util.Map; import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore; import java.util.concurrent.Semaphore;
@@ -58,26 +59,28 @@ public class AsyncPregenMethod implements PregeneratorMethod {
private void unloadAndSaveAllChunks() { private void unloadAndSaveAllChunks() {
try { try {
J.sfut(() -> { if (world == null) {
if (world == null) { Iris.warn("World was null somehow...");
Iris.warn("World was null somehow..."); return;
return; }
}
long minTime = M.ms() - 10_000; long minTime = M.ms() - 10_000;
lastUse.entrySet().removeIf(i -> { KList<CompletableFuture<?>> futures = new KList<>();
final Chunk chunk = i.getKey(); lastUse.entrySet().removeIf(i -> {
final Long lastUseTime = i.getValue(); final Chunk chunk = i.getKey();
if (!chunk.isLoaded() || lastUseTime == null) final Long lastUseTime = i.getValue();
return true; if (!chunk.isLoaded() || lastUseTime == null)
if (lastUseTime < minTime) { return true;
chunk.unload(); if (lastUseTime < minTime) {
return true; futures.add(Iris.platform.getRegionScheduler()
} .run(chunk.getWorld(), chunk.getX(), chunk.getZ(), () -> chunk.unload())
return false; .getResult());
}); return true;
world.save(); }
}).get(); return false;
});
futures.add(Iris.platform.getRegionScheduler().run(world, 0, 0, world::save).getResult());
CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)).join();
} catch (Throwable e) { } catch (Throwable e) {
e.printStackTrace(); e.printStackTrace();
} }