From 88c87175b392b9f5403f922bd425e2e0f1f15d41 Mon Sep 17 00:00:00 2001 From: Brian Neumann-Fopiano Date: Thu, 11 Jun 2026 18:12:24 -0400 Subject: [PATCH] Eviction Seams --- core/src/main/java/art/arcane/iris/Iris.java | 7 +++- .../iris/core/events/IrisLootEvent.java | 11 +++--- .../art/arcane/iris/core/gui/VisionGUI.java | 4 +- .../iris/core/safeguard/IrisSafeguard.java | 38 ++++++++----------- .../art/arcane/iris/core/safeguard/Mode.java | 7 ++-- .../art/arcane/iris/core/service/EditSVC.java | 3 +- .../engine/framework/BlockEditAccess.java | 29 ++++++++++++++ .../arcane/iris/engine/framework/Engine.java | 4 +- .../framework/render}/IrisRenderer.java | 2 +- .../framework/render}/RenderType.java | 2 +- .../framework/render}/Renderer.java | 2 +- .../arcane/iris/engine/object/IrisBiome.java | 2 +- .../arcane/iris/engine/object/IrisLoot.java | 1 - .../arcane/iris/engine/object/IrisRegion.java | 2 +- .../project/hunk/view/ChunkBiomeHunkView.java | 13 +++++-- .../util/project/hunk/view/ChunkHunkView.java | 13 +++++-- 16 files changed, 92 insertions(+), 48 deletions(-) create mode 100644 core/src/main/java/art/arcane/iris/engine/framework/BlockEditAccess.java rename core/src/main/java/art/arcane/iris/{core/gui/components => engine/framework/render}/IrisRenderer.java (98%) rename core/src/main/java/art/arcane/iris/{core/gui/components => engine/framework/render}/RenderType.java (94%) rename core/src/main/java/art/arcane/iris/{core/gui/components => engine/framework/render}/Renderer.java (94%) diff --git a/core/src/main/java/art/arcane/iris/Iris.java b/core/src/main/java/art/arcane/iris/Iris.java index dada0b675..5988bf2cc 100644 --- a/core/src/main/java/art/arcane/iris/Iris.java +++ b/core/src/main/java/art/arcane/iris/Iris.java @@ -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) 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); diff --git a/core/src/main/java/art/arcane/iris/core/events/IrisLootEvent.java b/core/src/main/java/art/arcane/iris/core/events/IrisLootEvent.java index 0173eb7eb..3249ae125 100644 --- a/core/src/main/java/art/arcane/iris/core/events/IrisLootEvent.java +++ b/core/src/main/java/art/arcane/iris/core/events/IrisLootEvent.java @@ -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; diff --git a/core/src/main/java/art/arcane/iris/core/gui/VisionGUI.java b/core/src/main/java/art/arcane/iris/core/gui/VisionGUI.java index b9276c0fe..4ba1d7596 100644 --- a/core/src/main/java/art/arcane/iris/core/gui/VisionGUI.java +++ b/core/src/main/java/art/arcane/iris/core/gui/VisionGUI.java @@ -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; diff --git a/core/src/main/java/art/arcane/iris/core/safeguard/IrisSafeguard.java b/core/src/main/java/art/arcane/iris/core/safeguard/IrisSafeguard.java index 77d7a96c4..55f27129d 100644 --- a/core/src/main/java/art/arcane/iris/core/safeguard/IrisSafeguard.java +++ b/core/src/main/java/art/arcane/iris/core/safeguard/IrisSafeguard.java @@ -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 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(""); } } diff --git a/core/src/main/java/art/arcane/iris/core/safeguard/Mode.java b/core/src/main/java/art/arcane/iris/core/safeguard/Mode.java index 371d21c0a..8a198d47b 100644 --- a/core/src/main/java/art/arcane/iris/core/safeguard/Mode.java +++ b/core/src/main/java/art/arcane/iris/core/safeguard/Mode.java @@ -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() { diff --git a/core/src/main/java/art/arcane/iris/core/service/EditSVC.java b/core/src/main/java/art/arcane/iris/core/service/EditSVC.java index c7ae592da..b34d7f77a 100644 --- a/core/src/main/java/art/arcane/iris/core/service/EditSVC.java +++ b/core/src/main/java/art/arcane/iris/core/service/EditSVC.java @@ -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 { private KMap editors; private int updateTaskId = -1; public static boolean deletingWorld = false; diff --git a/core/src/main/java/art/arcane/iris/engine/framework/BlockEditAccess.java b/core/src/main/java/art/arcane/iris/engine/framework/BlockEditAccess.java new file mode 100644 index 000000000..65873fb71 --- /dev/null +++ b/core/src/main/java/art/arcane/iris/engine/framework/BlockEditAccess.java @@ -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 . + */ + +package art.arcane.iris.engine.framework; + +public interface BlockEditAccess { + 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); +} diff --git a/core/src/main/java/art/arcane/iris/engine/framework/Engine.java b/core/src/main/java/art/arcane/iris/engine/framework/Engine.java index 9aaa02f1d..26c73a273 100644 --- a/core/src/main/java/art/arcane/iris/engine/framework/Engine.java +++ b/core/src/main/java/art/arcane/iris/engine/framework/Engine.java @@ -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; diff --git a/core/src/main/java/art/arcane/iris/core/gui/components/IrisRenderer.java b/core/src/main/java/art/arcane/iris/engine/framework/render/IrisRenderer.java similarity index 98% rename from core/src/main/java/art/arcane/iris/core/gui/components/IrisRenderer.java rename to core/src/main/java/art/arcane/iris/engine/framework/render/IrisRenderer.java index d69c9ecfd..a903d7394 100644 --- a/core/src/main/java/art/arcane/iris/core/gui/components/IrisRenderer.java +++ b/core/src/main/java/art/arcane/iris/engine/framework/render/IrisRenderer.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -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; diff --git a/core/src/main/java/art/arcane/iris/core/gui/components/RenderType.java b/core/src/main/java/art/arcane/iris/engine/framework/render/RenderType.java similarity index 94% rename from core/src/main/java/art/arcane/iris/core/gui/components/RenderType.java rename to core/src/main/java/art/arcane/iris/engine/framework/render/RenderType.java index 866aa49ae..2ec4a17d1 100644 --- a/core/src/main/java/art/arcane/iris/core/gui/components/RenderType.java +++ b/core/src/main/java/art/arcane/iris/engine/framework/render/RenderType.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -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 diff --git a/core/src/main/java/art/arcane/iris/core/gui/components/Renderer.java b/core/src/main/java/art/arcane/iris/engine/framework/render/Renderer.java similarity index 94% rename from core/src/main/java/art/arcane/iris/core/gui/components/Renderer.java rename to core/src/main/java/art/arcane/iris/engine/framework/render/Renderer.java index eebf3f3e0..5d21b8883 100644 --- a/core/src/main/java/art/arcane/iris/core/gui/components/Renderer.java +++ b/core/src/main/java/art/arcane/iris/engine/framework/render/Renderer.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package art.arcane.iris.core.gui.components; +package art.arcane.iris.engine.framework.render; import java.awt.*; diff --git a/core/src/main/java/art/arcane/iris/engine/object/IrisBiome.java b/core/src/main/java/art/arcane/iris/engine/object/IrisBiome.java index 12384c129..03668e8df 100644 --- a/core/src/main/java/art/arcane/iris/engine/object/IrisBiome.java +++ b/core/src/main/java/art/arcane/iris/engine/object/IrisBiome.java @@ -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; diff --git a/core/src/main/java/art/arcane/iris/engine/object/IrisLoot.java b/core/src/main/java/art/arcane/iris/engine/object/IrisLoot.java index f457663b7..10bfcb34b 100644 --- a/core/src/main/java/art/arcane/iris/engine/object/IrisLoot.java +++ b/core/src/main/java/art/arcane/iris/engine/object/IrisLoot.java @@ -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(); } } diff --git a/core/src/main/java/art/arcane/iris/engine/object/IrisRegion.java b/core/src/main/java/art/arcane/iris/engine/object/IrisRegion.java index 8299223b8..48d882ecb 100644 --- a/core/src/main/java/art/arcane/iris/engine/object/IrisRegion.java +++ b/core/src/main/java/art/arcane/iris/engine/object/IrisRegion.java @@ -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; diff --git a/core/src/main/java/art/arcane/iris/util/project/hunk/view/ChunkBiomeHunkView.java b/core/src/main/java/art/arcane/iris/util/project/hunk/view/ChunkBiomeHunkView.java index 12eb9cba0..5e0a6fe19 100644 --- a/core/src/main/java/art/arcane/iris/util/project/hunk/view/ChunkBiomeHunkView.java +++ b/core/src/main/java/art/arcane/iris/util/project/hunk/view/ChunkBiomeHunkView.java @@ -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 implements Hunk { 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 edits() { + return (BlockEditAccess) IrisServices.get(BlockEditAccess.class); } } diff --git a/core/src/main/java/art/arcane/iris/util/project/hunk/view/ChunkHunkView.java b/core/src/main/java/art/arcane/iris/util/project/hunk/view/ChunkHunkView.java index 02cfadb2d..172e3c518 100644 --- a/core/src/main/java/art/arcane/iris/util/project/hunk/view/ChunkHunkView.java +++ b/core/src/main/java/art/arcane/iris/util/project/hunk/view/ChunkHunkView.java @@ -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 edits() { + return (BlockEditAccess) IrisServices.get(BlockEditAccess.class); } }