This commit is contained in:
Brian Neumann-Fopiano
2026-07-03 15:10:16 -04:00
parent 75e8c22268
commit a8e46e3590
104 changed files with 6002 additions and 2692 deletions
@@ -21,7 +21,7 @@ package art.arcane.iris;
import art.arcane.iris.engine.IrisWorldManager;
import art.arcane.iris.engine.framework.EngineWorldManagerProvider;
import art.arcane.iris.core.splash.IrisSplashPackScanner;
import art.arcane.iris.core.splash.IrisSplashComposer;
import art.arcane.iris.core.IrisSettings;
import art.arcane.iris.core.IrisWorlds;
import art.arcane.iris.core.ServerConfigurator;
@@ -1265,55 +1265,8 @@ public class Iris extends VolmitPlugin implements Listener, ReloadAware {
private void printPacks() {
File packFolder = Iris.service(StudioSVC.class).getWorkspaceFolder();
List<SplashPackMetadata> packs = collectSplashPacks(packFolder);
if (packs.isEmpty())
return;
Iris.info("Custom Dimensions: " + packs.size());
for (SplashPackMetadata pack : packs) {
printPack(pack);
}
}
static List<SplashPackMetadata> collectSplashPacks(File packFolder) {
List<IrisSplashPackScanner.SplashPackMetadata> scanned = IrisSplashPackScanner.collect(packFolder, Iris::reportError);
if (scanned.isEmpty()) {
return Collections.emptyList();
}
List<SplashPackMetadata> packs = new ArrayList<>(scanned.size());
for (IrisSplashPackScanner.SplashPackMetadata metadata : scanned) {
packs.add(new SplashPackMetadata(metadata.name(), metadata.version()));
}
return packs;
}
static SplashPackMetadata readSplashPack(File pack) {
IrisSplashPackScanner.SplashPackMetadata metadata = IrisSplashPackScanner.read(pack, Iris::reportError);
if (metadata == null) {
return null;
}
return new SplashPackMetadata(metadata.name(), metadata.version());
}
private void printPack(SplashPackMetadata pack) {
Iris.info(" " + pack.name() + " v" + pack.version());
}
static final class SplashPackMetadata {
private final String name;
private final String version;
SplashPackMetadata(String name, String version) {
this.name = name;
this.version = version;
}
String name() {
return name;
}
String version() {
return version;
for (String line : IrisSplashComposer.composePackLines(packFolder, Iris::reportError)) {
Iris.info(line);
}
}
@@ -26,6 +26,7 @@ import art.arcane.iris.util.common.director.DirectorExecutor;
import art.arcane.volmlib.util.director.annotations.Director;
import art.arcane.volmlib.util.director.annotations.Param;
import art.arcane.iris.util.common.format.C;
import art.arcane.volmlib.util.format.Form;
import art.arcane.volmlib.util.math.Position2;
import org.bukkit.World;
import org.bukkit.util.Vector;
@@ -83,4 +84,23 @@ public class CommandPregen implements DirectorExecutor {
sender().sendMessage(C.YELLOW + "No active pregeneration tasks to pause/unpause.");
}
}
@Director(description = "Show the active pregeneration status")
public void status() {
PregeneratorJob.PregenProgress progress = PregeneratorJob.progressSnapshot();
if (progress == null) {
sender().sendMessage(C.YELLOW + "No active pregeneration task.");
return;
}
String world = progress.worldName() == null ? "?" : progress.worldName();
sender().sendMessage(C.GREEN + "Pregen " + C.GOLD + world + C.GREEN + ": " + C.GOLD + Form.f(progress.generated()) + "/" + Form.f(progress.totalChunks())
+ C.GREEN + " (" + C.GOLD + String.format("%.1f", progress.percent()) + "%" + C.GREEN + ")"
+ (progress.paused() ? C.YELLOW + " PAUSED" : ""));
sender().sendMessage(C.GREEN + "Speed: " + C.GOLD + Form.f((int) progress.chunksPerSecond()) + "/s" + C.GREEN
+ " ETA: " + C.GOLD + Form.duration(progress.eta(), 2) + C.GREEN
+ " Elapsed: " + C.GOLD + Form.duration(progress.elapsed(), 2) + C.GREEN
+ " Method: " + C.GOLD + progress.method()
+ (progress.failed() > 0 ? C.RED + " Failed: " + Form.f(progress.failed()) : ""));
}
}
@@ -94,7 +94,7 @@ public class CommandWhat implements DirectorExecutor {
@Director(description = "What region am i in?", origin = DirectorOrigin.PLAYER)
public void region() {
try {
Chunk chunk = world().getChunkAt(player().getLocation().getBlockZ() / 16, player().getLocation().getBlockZ() / 16);
Chunk chunk = world().getChunkAt(player().getLocation().getBlockX() >> 4, player().getLocation().getBlockZ() >> 4);
IrisRegion r = EngineBukkitOps.getRegion(engine(), chunk);
sender().sendMessage("IRegion: " + r.getLoadKey() + " (" + r.getName() + ")");
@@ -20,6 +20,7 @@ import art.arcane.iris.util.project.stream.utility.CachedDoubleStream2D;
import art.arcane.iris.util.project.stream.utility.CachedStream2D;
import art.arcane.iris.util.project.stream.utility.CachedStream3D;
import art.arcane.iris.core.gui.PregeneratorJob;
import art.arcane.iris.core.pregenerator.MantleHeapPressure;
import lombok.Synchronized;
import org.bukkit.Bukkit;
import org.bukkit.World;
@@ -317,7 +318,11 @@ public class IrisEngineSVC implements IrisService {
}
try {
engine.getMantle().trim(activeIdleDuration(engine), activeTectonicLimit(engine));
if (pregenTargets(engine) && MantleHeapPressure.overHighWater()) {
engine.getMantle().trim(0L, 0);
} else {
engine.getMantle().trim(activeIdleDuration(engine), activeTectonicLimit(engine));
}
} catch (Throwable e) {
if (isMantleClosed(e)) {
close();
@@ -349,7 +354,12 @@ public class IrisEngineSVC implements IrisService {
try {
long unloadStart = System.currentTimeMillis();
int count = engine.getMantle().unloadTectonicPlate(IrisSettings.get().getPerformance().getEngineSVC().forceMulticoreWrite ? 0 : activeTectonicLimit(engine));
boolean heapPressure = pregenTargets(engine) && MantleHeapPressure.overHighWater();
int unloadLimit = (heapPressure || IrisSettings.get().getPerformance().getEngineSVC().forceMulticoreWrite) ? 0 : activeTectonicLimit(engine);
int count = engine.getMantle().unloadTectonicPlate(unloadLimit);
if (heapPressure && MantleHeapPressure.overPanicWater()) {
MantleHeapPressure.requestPanicReclaim();
}
if (count > 0) {
IrisLogging.debug(C.GOLD + "Unloaded " + C.YELLOW + count + " TectonicPlates in " + C.RED + Form.duration(System.currentTimeMillis() - unloadStart, 2));
}
@@ -385,7 +395,7 @@ public class IrisEngineSVC implements IrisService {
return limit;
}
return Math.max(limit, IrisSettings.get().getPregen().getMaxResidentTectonicPlates());
return Math.max(limit, IrisSettings.get().getPregen().getEffectiveResidentTectonicPlates(engine.getHeight()));
}
private long activeIdleDuration(Engine engine) {
@@ -433,7 +443,7 @@ public class IrisEngineSVC implements IrisService {
}
PregeneratorJob pregeneratorJob = PregeneratorJob.getInstance();
boolean pregeneratorTargetsWorld = pregeneratorJob != null && pregeneratorJob.targetsWorld(world);
boolean pregeneratorTargetsWorld = pregeneratorJob != null && pregeneratorJob.targetsWorldName(world.getName());
return shouldSkipMantleReductionForMaintenance(maintenanceActive, pregeneratorTargetsWorld);
}
}
@@ -1,5 +1,6 @@
package art.arcane.iris;
import art.arcane.iris.core.splash.IrisSplashPackScanner;
import org.junit.Test;
import java.io.ByteArrayOutputStream;
@@ -34,7 +35,7 @@ public class IrisDiagnosticsTest {
}
@Test
public void collectSplashPacksSkipsInternalAndInvalidFolders() throws Exception {
public void splashPackScanSkipsInternalAndInvalidFolders() throws Exception {
Path root = Files.createTempDirectory("iris-splash");
try {
Path validPack = root.resolve("overworld");
@@ -50,9 +51,9 @@ public class IrisDiagnosticsTest {
ByteArrayOutputStream output = new ByteArrayOutputStream();
PrintStream originalErr = System.err;
System.setErr(new PrintStream(output, true, StandardCharsets.UTF_8));
List<Iris.SplashPackMetadata> packs;
List<IrisSplashPackScanner.SplashPackMetadata> packs;
try {
packs = Iris.collectSplashPacks(root.toFile());
packs = IrisSplashPackScanner.collect(root.toFile(), Iris::reportError);
} finally {
System.setErr(originalErr);
}