Eviction Seams

This commit is contained in:
Brian Neumann-Fopiano
2026-06-11 18:12:24 -04:00
parent 56a0c75a39
commit 88c87175b3
16 changed files with 92 additions and 48 deletions
+6 -1
View File
@@ -39,9 +39,11 @@ import art.arcane.iris.core.pack.PackValidationRegistry;
import art.arcane.iris.core.pack.PackValidationResult;
import art.arcane.iris.core.pack.PackValidator;
import art.arcane.iris.core.gui.PregeneratorJob;
import art.arcane.iris.core.service.EditSVC;
import art.arcane.iris.core.service.StudioSVC;
import art.arcane.iris.core.tools.IrisToolbelt;
import art.arcane.iris.engine.EnginePanic;
import art.arcane.iris.engine.framework.BlockEditAccess;
import art.arcane.iris.engine.framework.Engine;
import art.arcane.iris.engine.object.IrisCompat;
import art.arcane.iris.engine.object.IrisDimension;
@@ -577,6 +579,7 @@ public class Iris extends VolmitPlugin implements Listener, ReloadAware {
services.put((Class<? extends IrisService>) i.getClass(), (IrisService) i);
IrisServices.register(i.getClass(), i);
});
IrisServices.register(BlockEditAccess.class, services.get(EditSVC.class));
IO.delete(new File("iris"));
compat = IrisCompat.configured(getDataFile("compat.json"));
IrisServices.register(IrisCompat.class, compat);
@@ -584,7 +587,9 @@ public class Iris extends VolmitPlugin implements Listener, ReloadAware {
validateAllPacks();
IrisSafeguard.execute();
getSender().setTag(getTag());
IrisSafeguard.splash();
splash();
IrisSafeguard.printReports();
IrisSafeguard.printFooter();
tickets = new ChunkTickets();
linkMultiverseCore = new MultiverseCoreLink();
IrisServices.register(MultiverseCoreLink.class, linkMultiverseCore);
@@ -1,9 +1,10 @@
package art.arcane.iris.core.events;
import art.arcane.iris.Iris;
import art.arcane.iris.engine.framework.Engine;
import art.arcane.iris.engine.object.InventorySlotType;
import art.arcane.iris.engine.object.IrisLootTable;
import art.arcane.iris.platform.bukkit.BukkitPlatform;
import art.arcane.iris.spi.IrisLogging;
import art.arcane.volmlib.util.collection.KList;
import art.arcane.iris.util.common.scheduling.J;
import lombok.Getter;
@@ -32,7 +33,7 @@ public class IrisLootEvent extends Event {
@NotNull
@Override
public NamespacedKey getKey() {
return new NamespacedKey(Iris.instance, "empty");
return new NamespacedKey(BukkitPlatform.plugin(), "empty");
}
@NotNull
@@ -103,13 +104,13 @@ public class IrisLootEvent extends Event {
LootContext context = new LootContext.Builder(loc).build();
LootGenerateEvent event = new LootGenerateEvent(world, null, holder, EMPTY, context, loot, true);
if (!Bukkit.isPrimaryThread()) {
Iris.warn("LootGenerateEvent was not called on the main thread, please report this issue.");
IrisLogging.warn("LootGenerateEvent was not called on the main thread, please report this issue.");
Thread.dumpStack();
J.sfut(() -> {
try {
Bukkit.getPluginManager().callEvent(event);
} catch (Throwable e) {
Iris.reportError("LootGenerateEvent dispatch failed at "
IrisLogging.reportError("LootGenerateEvent dispatch failed at "
+ world.getName() + " [" + x + "," + y + "," + z + "].", e);
if (e instanceof RuntimeException runtimeException) {
throw runtimeException;
@@ -124,7 +125,7 @@ public class IrisLootEvent extends Event {
try {
Bukkit.getPluginManager().callEvent(event);
} catch (Throwable e) {
Iris.reportError("LootGenerateEvent dispatch failed at "
IrisLogging.reportError("LootGenerateEvent dispatch failed at "
+ world.getName() + " [" + x + "," + y + "," + z + "].", e);
if (e instanceof RuntimeException runtimeException) {
throw runtimeException;
@@ -19,8 +19,8 @@
package art.arcane.iris.core.gui;
import art.arcane.iris.Iris;
import art.arcane.iris.core.gui.components.IrisRenderer;
import art.arcane.iris.core.gui.components.RenderType;
import art.arcane.iris.engine.framework.render.IrisRenderer;
import art.arcane.iris.engine.framework.render.RenderType;
import art.arcane.iris.core.tools.IrisToolbelt;
import art.arcane.iris.engine.IrisComplex;
import art.arcane.iris.engine.framework.Engine;
@@ -1,10 +1,10 @@
package art.arcane.iris.core.safeguard;
import art.arcane.iris.Iris;
import art.arcane.iris.core.safeguard.task.Diagnostic;
import art.arcane.iris.core.safeguard.task.Task;
import art.arcane.iris.core.safeguard.task.Tasks;
import art.arcane.iris.core.safeguard.task.ValueWithDiagnostics;
import art.arcane.iris.spi.IrisLogging;
import art.arcane.iris.util.common.format.C;
import art.arcane.iris.util.common.scheduling.J;
@@ -38,7 +38,7 @@ public final class IrisSafeguard {
try {
result = task.run();
} catch (Throwable e) {
Iris.reportError(e);
IrisLogging.reportError(e);
result = new ValueWithDiagnostics<>(
Mode.WARNING,
new Diagnostic(Diagnostic.Logger.ERROR, "Error while running task " + task.getId(), e)
@@ -80,17 +80,11 @@ public final class IrisSafeguard {
return attachment;
}
public static void splash() {
Iris.instance.splash();
printReports();
printFooter();
}
public static void printReports() {
switch (mode) {
case STABLE -> Iris.info(C.BLUE + "0 Conflicts found");
case WARNING -> Iris.warn(C.GOLD + "%s Issues found", count);
case UNSTABLE -> Iris.error(C.DARK_RED + "%s Issues found", count);
case STABLE -> IrisLogging.info(C.BLUE + "0 Conflicts found");
case WARNING -> IrisLogging.warn(C.GOLD + "%s Issues found", count);
case UNSTABLE -> IrisLogging.error(C.DARK_RED + "%s Issues found", count);
}
for (ValueWithDiagnostics<Mode> value : results.values()) {
@@ -100,7 +94,7 @@ public final class IrisSafeguard {
public static void printFooter() {
switch (mode) {
case STABLE -> Iris.info(C.BLUE + "Iris is running Stable");
case STABLE -> IrisLogging.info(C.BLUE + "Iris is running Stable");
case WARNING -> warning();
case UNSTABLE -> unstable();
}
@@ -111,19 +105,19 @@ public final class IrisSafeguard {
}
private static void warning() {
Iris.warn(C.GOLD + "Iris is running in Warning Mode");
Iris.warn(C.GRAY + "Some startup checks need attention. Review the messages above for tuning suggestions.");
Iris.warn(C.GRAY + "Iris will continue startup normally.");
Iris.warn("");
IrisLogging.warn(C.GOLD + "Iris is running in Warning Mode");
IrisLogging.warn(C.GRAY + "Some startup checks need attention. Review the messages above for tuning suggestions.");
IrisLogging.warn(C.GRAY + "Iris will continue startup normally.");
IrisLogging.warn("");
}
private static void unstable() {
Iris.error(C.DARK_RED + "Iris is running in Danger Mode");
Iris.error("");
Iris.error(C.DARK_GRAY + "--==<" + C.RED + " IMPORTANT " + C.DARK_GRAY + ">==--");
Iris.error("Critical startup checks failed. Iris will continue startup in 10 seconds.");
Iris.error("Review and resolve the errors above as soon as possible.");
IrisLogging.error(C.DARK_RED + "Iris is running in Danger Mode");
IrisLogging.error("");
IrisLogging.error(C.DARK_GRAY + "--==<" + C.RED + " IMPORTANT " + C.DARK_GRAY + ">==--");
IrisLogging.error("Critical startup checks failed. Iris will continue startup in 10 seconds.");
IrisLogging.error("Review and resolve the errors above as soon as possible.");
J.sleep(10000L);
Iris.info("");
IrisLogging.info("");
}
}
@@ -1,8 +1,9 @@
package art.arcane.iris.core.safeguard;
import art.arcane.iris.BuildConstants;
import art.arcane.iris.Iris;
import art.arcane.iris.core.IrisSettings;
import art.arcane.iris.platform.bukkit.BukkitPlatform;
import art.arcane.iris.spi.IrisLogging;
import art.arcane.iris.util.common.format.C;
import art.arcane.volmlib.util.format.Form;
import org.bukkit.Bukkit;
@@ -63,7 +64,7 @@ public enum Mode {
public void splash() {
String padd = Form.repeat(" ", 4);
String padd2 = Form.repeat(" ", 4);
String version = Iris.instance.getDescription().getVersion();
String version = BukkitPlatform.plugin().getDescription().getVersion();
String releaseTrain = getReleaseTrain(version);
String serverVersion = getServerVersion();
String startupDate = getStartupDate();
@@ -90,7 +91,7 @@ public enum Mode {
builder.append(padd).append(splash[i]).append(info[i]).append("\n");
}
Iris.info(builder.toString());
IrisLogging.info(builder.toString());
}
private String[] renderSplashLogo() {
@@ -21,6 +21,7 @@ package art.arcane.iris.core.service;
import art.arcane.iris.Iris;
import art.arcane.iris.core.edit.BlockEditor;
import art.arcane.iris.core.edit.BukkitBlockEditor;
import art.arcane.iris.engine.framework.BlockEditAccess;
import art.arcane.volmlib.util.collection.KMap;
import art.arcane.volmlib.util.math.M;
import art.arcane.iris.util.common.plugin.IrisService;
@@ -31,7 +32,7 @@ import org.bukkit.block.data.BlockData;
import org.bukkit.event.EventHandler;
import org.bukkit.event.world.WorldUnloadEvent;
public class EditSVC implements IrisService {
public class EditSVC implements IrisService, BlockEditAccess<World, BlockData, Biome> {
private KMap<World, BlockEditor> editors;
private int updateTaskId = -1;
public static boolean deletingWorld = false;
@@ -0,0 +1,29 @@
/*
* Iris is a World Generator for Minecraft Bukkit Servers
* Copyright (c) 2026 Arcane Arts (Volmit Software)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package art.arcane.iris.engine.framework;
public interface BlockEditAccess<W, B, M> {
B get(W world, int x, int y, int z);
void set(W world, int x, int y, int z, B block);
M getBiome(W world, int x, int y, int z);
void setBiome(W world, int x, int y, int z, M biome);
}
@@ -21,8 +21,8 @@ package art.arcane.iris.engine.framework;
import art.arcane.iris.spi.IrisServices;
import art.arcane.iris.core.IrisSettings;
import art.arcane.iris.core.events.IrisLootEvent;
import art.arcane.iris.core.gui.components.RenderType;
import art.arcane.iris.core.gui.components.Renderer;
import art.arcane.iris.engine.framework.render.RenderType;
import art.arcane.iris.engine.framework.render.Renderer;
import art.arcane.iris.core.gui.PregeneratorJob;
import art.arcane.iris.core.link.Identifier;
import art.arcane.iris.core.loader.IrisData;
@@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package art.arcane.iris.core.gui.components;
package art.arcane.iris.engine.framework.render;
import art.arcane.iris.engine.framework.Engine;
import art.arcane.iris.engine.object.IrisBiome;
@@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package art.arcane.iris.core.gui.components;
package art.arcane.iris.engine.framework.render;
public enum RenderType {
BIOME, BIOME_LAND, BIOME_SEA, REGION, CAVE_LAND, HEIGHT, OBJECT_LOAD, DECORATOR_LOAD, CONTINENT, LAYER_LOAD
@@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package art.arcane.iris.core.gui.components;
package art.arcane.iris.engine.framework.render;
import java.awt.*;
@@ -18,7 +18,7 @@
package art.arcane.iris.engine.object;
import art.arcane.iris.core.gui.components.RenderType;
import art.arcane.iris.engine.framework.render.RenderType;
import art.arcane.iris.core.loader.IrisData;
import art.arcane.iris.core.loader.IrisRegistrant;
import art.arcane.iris.engine.IrisComplex;
@@ -137,7 +137,6 @@ public class IrisLoot {
is.setItemMeta(applyProperties(is, rng, debug, table));
return BukkitPlatform.applyCustomNbt(is, customNbt);
} catch (Throwable e) {
//Iris.reportError(e);
e.printStackTrace();
}
}
@@ -18,7 +18,7 @@
package art.arcane.iris.engine.object;
import art.arcane.iris.core.gui.components.RenderType;
import art.arcane.iris.engine.framework.render.RenderType;
import art.arcane.iris.core.loader.IrisData;
import art.arcane.iris.spi.IrisLogging;
import art.arcane.iris.spi.PlatformBlockState;
@@ -18,20 +18,27 @@
package art.arcane.iris.util.project.hunk.view;
import art.arcane.iris.engine.framework.BlockEditAccess;
import art.arcane.iris.spi.IrisServices;
import art.arcane.iris.core.service.EditSVC;
import art.arcane.iris.platform.bukkit.BukkitBiome;
import art.arcane.iris.spi.PlatformBiome;
import art.arcane.iris.util.project.hunk.Hunk;
import org.bukkit.Chunk;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
@SuppressWarnings("ClassCanBeRecord")
public class ChunkBiomeHunkView extends art.arcane.volmlib.util.hunk.view.ChunkWorldHunkView<PlatformBiome> implements Hunk<PlatformBiome> {
public ChunkBiomeHunkView(Chunk chunk) {
super(chunk,
chunk.getWorld().getMaxHeight(),
(wx, y, wz, t) -> IrisServices.get(EditSVC.class).setBiome(chunk.getWorld(), wx, y, wz, (Biome) t.nativeHandle()),
(wx, y, wz) -> BukkitBiome.of(IrisServices.get(EditSVC.class).getBiome(chunk.getWorld(), wx, y, wz)));
(wx, y, wz, t) -> edits().setBiome(chunk.getWorld(), wx, y, wz, (Biome) t.nativeHandle()),
(wx, y, wz) -> BukkitBiome.of(edits().getBiome(chunk.getWorld(), wx, y, wz)));
}
@SuppressWarnings("unchecked")
private static BlockEditAccess<World, BlockData, Biome> edits() {
return (BlockEditAccess<World, BlockData, Biome>) IrisServices.get(BlockEditAccess.class);
}
}
@@ -18,12 +18,14 @@
package art.arcane.iris.util.project.hunk.view;
import art.arcane.iris.engine.framework.BlockEditAccess;
import art.arcane.iris.spi.IrisServices;
import art.arcane.iris.core.service.EditSVC;
import art.arcane.iris.platform.bukkit.BukkitBlockState;
import art.arcane.iris.spi.PlatformBlockState;
import art.arcane.iris.util.project.hunk.Hunk;
import org.bukkit.Chunk;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
@SuppressWarnings("ClassCanBeRecord")
@@ -31,7 +33,12 @@ public class ChunkHunkView extends art.arcane.volmlib.util.hunk.view.ChunkWorldH
public ChunkHunkView(Chunk chunk) {
super(chunk,
chunk.getWorld().getMaxHeight(),
(wx, y, wz, t) -> IrisServices.get(EditSVC.class).set(chunk.getWorld(), wx, y, wz, (BlockData) t.nativeHandle()),
(wx, y, wz) -> BukkitBlockState.of(IrisServices.get(EditSVC.class).get(chunk.getWorld(), wx, y, wz)));
(wx, y, wz, t) -> edits().set(chunk.getWorld(), wx, y, wz, (BlockData) t.nativeHandle()),
(wx, y, wz) -> BukkitBlockState.of(edits().get(chunk.getWorld(), wx, y, wz)));
}
@SuppressWarnings("unchecked")
private static BlockEditAccess<World, BlockData, Biome> edits() {
return (BlockEditAccess<World, BlockData, Biome>) IrisServices.get(BlockEditAccess.class);
}
}