Eviction Seams

This commit is contained in:
Brian Neumann-Fopiano committed 2026-06-12 02:46:13 -04:00
1 parent 56a0c75a39
commit 88c87175b3
16 files changed
+92 -48

No files matched your search

+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.PackValidationResult;
import art.arcane.iris.core.pack.PackValidator; import art.arcane.iris.core.pack.PackValidator;
import art.arcane.iris.core.gui.PregeneratorJob; 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.service.StudioSVC;
import art.arcane.iris.core.tools.IrisToolbelt; import art.arcane.iris.core.tools.IrisToolbelt;
import art.arcane.iris.engine.EnginePanic; 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.framework.Engine;
import art.arcane.iris.engine.object.IrisCompat; import art.arcane.iris.engine.object.IrisCompat;
import art.arcane.iris.engine.object.IrisDimension; 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); services.put((Class<? extends IrisService>) i.getClass(), (IrisService) i);
IrisServices.register(i.getClass(), i); IrisServices.register(i.getClass(), i);
}); });
IrisServices.register(BlockEditAccess.class, services.get(EditSVC.class));
IO.delete(new File("iris")); IO.delete(new File("iris"));
compat = IrisCompat.configured(getDataFile("compat.json")); compat = IrisCompat.configured(getDataFile("compat.json"));
IrisServices.register(IrisCompat.class, compat); IrisServices.register(IrisCompat.class, compat);
@@ -584,7 +587,9 @@ public class Iris extends VolmitPlugin implements Listener, ReloadAware {
validateAllPacks(); validateAllPacks();
IrisSafeguard.execute(); IrisSafeguard.execute();
getSender().setTag(getTag()); getSender().setTag(getTag());
IrisSafeguard.splash(); splash();
IrisSafeguard.printReports();
IrisSafeguard.printFooter();
tickets = new ChunkTickets(); tickets = new ChunkTickets();
linkMultiverseCore = new MultiverseCoreLink(); linkMultiverseCore = new MultiverseCoreLink();
IrisServices.register(MultiverseCoreLink.class, linkMultiverseCore); IrisServices.register(MultiverseCoreLink.class, linkMultiverseCore);
@@ -1,9 +1,10 @@
package art.arcane.iris.core.events; package art.arcane.iris.core.events;
import art.arcane.iris.Iris;
import art.arcane.iris.engine.framework.Engine; import art.arcane.iris.engine.framework.Engine;
import art.arcane.iris.engine.object.InventorySlotType; import art.arcane.iris.engine.object.InventorySlotType;
import art.arcane.iris.engine.object.IrisLootTable; 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.volmlib.util.collection.KList;
import art.arcane.iris.util.common.scheduling.J; import art.arcane.iris.util.common.scheduling.J;
import lombok.Getter; import lombok.Getter;
@@ -32,7 +33,7 @@ public class IrisLootEvent extends Event {
@NotNull @NotNull
@Override @Override
public NamespacedKey getKey() { public NamespacedKey getKey() {
return new NamespacedKey(Iris.instance, "empty"); return new NamespacedKey(BukkitPlatform.plugin(), "empty");
} }
@NotNull @NotNull
@@ -103,13 +104,13 @@ public class IrisLootEvent extends Event {
LootContext context = new LootContext.Builder(loc).build(); LootContext context = new LootContext.Builder(loc).build();
LootGenerateEvent event = new LootGenerateEvent(world, null, holder, EMPTY, context, loot, true); LootGenerateEvent event = new LootGenerateEvent(world, null, holder, EMPTY, context, loot, true);
if (!Bukkit.isPrimaryThread()) { 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(); Thread.dumpStack();
J.sfut(() -> { J.sfut(() -> {
try { try {
Bukkit.getPluginManager().callEvent(event); Bukkit.getPluginManager().callEvent(event);
} catch (Throwable e) { } catch (Throwable e) {
Iris.reportError("LootGenerateEvent dispatch failed at " IrisLogging.reportError("LootGenerateEvent dispatch failed at "
+ world.getName() + " [" + x + "," + y + "," + z + "].", e); + world.getName() + " [" + x + "," + y + "," + z + "].", e);
if (e instanceof RuntimeException runtimeException) { if (e instanceof RuntimeException runtimeException) {
throw runtimeException; throw runtimeException;
@@ -124,7 +125,7 @@ public class IrisLootEvent extends Event {
try { try {
Bukkit.getPluginManager().callEvent(event); Bukkit.getPluginManager().callEvent(event);
} catch (Throwable e) { } catch (Throwable e) {
Iris.reportError("LootGenerateEvent dispatch failed at " IrisLogging.reportError("LootGenerateEvent dispatch failed at "
+ world.getName() + " [" + x + "," + y + "," + z + "].", e); + world.getName() + " [" + x + "," + y + "," + z + "].", e);
if (e instanceof RuntimeException runtimeException) { if (e instanceof RuntimeException runtimeException) {
throw runtimeException; throw runtimeException;
@@ -19,8 +19,8 @@
package art.arcane.iris.core.gui; package art.arcane.iris.core.gui;
import art.arcane.iris.Iris; import art.arcane.iris.Iris;
import art.arcane.iris.core.gui.components.IrisRenderer; import art.arcane.iris.engine.framework.render.IrisRenderer;
import art.arcane.iris.core.gui.components.RenderType; import art.arcane.iris.engine.framework.render.RenderType;
import art.arcane.iris.core.tools.IrisToolbelt; import art.arcane.iris.core.tools.IrisToolbelt;
import art.arcane.iris.engine.IrisComplex; import art.arcane.iris.engine.IrisComplex;
import art.arcane.iris.engine.framework.Engine; import art.arcane.iris.engine.framework.Engine;
@@ -1,10 +1,10 @@
package art.arcane.iris.core.safeguard; 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.Diagnostic;
import art.arcane.iris.core.safeguard.task.Task; import art.arcane.iris.core.safeguard.task.Task;
import art.arcane.iris.core.safeguard.task.Tasks; import art.arcane.iris.core.safeguard.task.Tasks;
import art.arcane.iris.core.safeguard.task.ValueWithDiagnostics; 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.format.C;
import art.arcane.iris.util.common.scheduling.J; import art.arcane.iris.util.common.scheduling.J;
@@ -38,7 +38,7 @@ public final class IrisSafeguard {
try { try {
result = task.run(); result = task.run();
} catch (Throwable e) { } catch (Throwable e) {
Iris.reportError(e); IrisLogging.reportError(e);
result = new ValueWithDiagnostics<>( result = new ValueWithDiagnostics<>(
Mode.WARNING, Mode.WARNING,
new Diagnostic(Diagnostic.Logger.ERROR, "Error while running task " + task.getId(), e) new Diagnostic(Diagnostic.Logger.ERROR, "Error while running task " + task.getId(), e)
@@ -80,17 +80,11 @@ public final class IrisSafeguard {
return attachment; return attachment;
} }
public static void splash() {
Iris.instance.splash();
printReports();
printFooter();
}
public static void printReports() { public static void printReports() {
switch (mode) { switch (mode) {
case STABLE -> Iris.info(C.BLUE + "0 Conflicts found"); case STABLE -> IrisLogging.info(C.BLUE + "0 Conflicts found");
case WARNING -> Iris.warn(C.GOLD + "%s Issues found", count); case WARNING -> IrisLogging.warn(C.GOLD + "%s Issues found", count);
case UNSTABLE -> Iris.error(C.DARK_RED + "%s Issues found", count); case UNSTABLE -> IrisLogging.error(C.DARK_RED + "%s Issues found", count);
} }
for (ValueWithDiagnostics<Mode> value : results.values()) { for (ValueWithDiagnostics<Mode> value : results.values()) {
@@ -100,7 +94,7 @@ public final class IrisSafeguard {
public static void printFooter() { public static void printFooter() {
switch (mode) { 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 WARNING -> warning();
case UNSTABLE -> unstable(); case UNSTABLE -> unstable();
} }
@@ -111,19 +105,19 @@ public final class IrisSafeguard {
} }
private static void warning() { private static void warning() {
Iris.warn(C.GOLD + "Iris is running in Warning Mode"); IrisLogging.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."); IrisLogging.warn(C.GRAY + "Some startup checks need attention. Review the messages above for tuning suggestions.");
Iris.warn(C.GRAY + "Iris will continue startup normally."); IrisLogging.warn(C.GRAY + "Iris will continue startup normally.");
Iris.warn(""); IrisLogging.warn("");
} }
private static void unstable() { private static void unstable() {
Iris.error(C.DARK_RED + "Iris is running in Danger Mode"); IrisLogging.error(C.DARK_RED + "Iris is running in Danger Mode");
Iris.error(""); IrisLogging.error("");
Iris.error(C.DARK_GRAY + "--==<" + C.RED + " IMPORTANT " + C.DARK_GRAY + ">==--"); IrisLogging.error(C.DARK_GRAY + "--==<" + C.RED + " IMPORTANT " + C.DARK_GRAY + ">==--");
Iris.error("Critical startup checks failed. Iris will continue startup in 10 seconds."); IrisLogging.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("Review and resolve the errors above as soon as possible.");
J.sleep(10000L); J.sleep(10000L);
Iris.info(""); IrisLogging.info("");
} }
} }
@@ -1,8 +1,9 @@
package art.arcane.iris.core.safeguard; package art.arcane.iris.core.safeguard;
import art.arcane.iris.BuildConstants; import art.arcane.iris.BuildConstants;
import art.arcane.iris.Iris;
import art.arcane.iris.core.IrisSettings; 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.iris.util.common.format.C;
import art.arcane.volmlib.util.format.Form; import art.arcane.volmlib.util.format.Form;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@@ -63,7 +64,7 @@ public enum Mode {
public void splash() { public void splash() {
String padd = Form.repeat(" ", 4); String padd = Form.repeat(" ", 4);
String padd2 = 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 releaseTrain = getReleaseTrain(version);
String serverVersion = getServerVersion(); String serverVersion = getServerVersion();
String startupDate = getStartupDate(); String startupDate = getStartupDate();
@@ -90,7 +91,7 @@ public enum Mode {
builder.append(padd).append(splash[i]).append(info[i]).append("\n"); builder.append(padd).append(splash[i]).append(info[i]).append("\n");
} }
Iris.info(builder.toString()); IrisLogging.info(builder.toString());
} }
private String[] renderSplashLogo() { private String[] renderSplashLogo() {
@@ -21,6 +21,7 @@ package art.arcane.iris.core.service;
import art.arcane.iris.Iris; import art.arcane.iris.Iris;
import art.arcane.iris.core.edit.BlockEditor; import art.arcane.iris.core.edit.BlockEditor;
import art.arcane.iris.core.edit.BukkitBlockEditor; 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.collection.KMap;
import art.arcane.volmlib.util.math.M; import art.arcane.volmlib.util.math.M;
import art.arcane.iris.util.common.plugin.IrisService; 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.EventHandler;
import org.bukkit.event.world.WorldUnloadEvent; 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 KMap<World, BlockEditor> editors;
private int updateTaskId = -1; private int updateTaskId = -1;
public static boolean deletingWorld = false; 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.spi.IrisServices;
import art.arcane.iris.core.IrisSettings; import art.arcane.iris.core.IrisSettings;
import art.arcane.iris.core.events.IrisLootEvent; import art.arcane.iris.core.events.IrisLootEvent;
import art.arcane.iris.core.gui.components.RenderType; import art.arcane.iris.engine.framework.render.RenderType;
import art.arcane.iris.core.gui.components.Renderer; import art.arcane.iris.engine.framework.render.Renderer;
import art.arcane.iris.core.gui.PregeneratorJob; import art.arcane.iris.core.gui.PregeneratorJob;
import art.arcane.iris.core.link.Identifier; import art.arcane.iris.core.link.Identifier;
import art.arcane.iris.core.loader.IrisData; import art.arcane.iris.core.loader.IrisData;
@@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * 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.framework.Engine;
import art.arcane.iris.engine.object.IrisBiome; import art.arcane.iris.engine.object.IrisBiome;
@@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * 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 { public enum RenderType {
BIOME, BIOME_LAND, BIOME_SEA, REGION, CAVE_LAND, HEIGHT, OBJECT_LOAD, DECORATOR_LOAD, CONTINENT, LAYER_LOAD 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/>. * 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.*; import java.awt.*;
@@ -18,7 +18,7 @@
package art.arcane.iris.engine.object; 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.IrisData;
import art.arcane.iris.core.loader.IrisRegistrant; import art.arcane.iris.core.loader.IrisRegistrant;
import art.arcane.iris.engine.IrisComplex; import art.arcane.iris.engine.IrisComplex;
@@ -137,7 +137,6 @@ public class IrisLoot {
is.setItemMeta(applyProperties(is, rng, debug, table)); is.setItemMeta(applyProperties(is, rng, debug, table));
return BukkitPlatform.applyCustomNbt(is, customNbt); return BukkitPlatform.applyCustomNbt(is, customNbt);
} catch (Throwable e) { } catch (Throwable e) {
//Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
} }
} }
@@ -18,7 +18,7 @@
package art.arcane.iris.engine.object; 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.IrisData;
import art.arcane.iris.spi.IrisLogging; import art.arcane.iris.spi.IrisLogging;
import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformBlockState;
@@ -18,20 +18,27 @@
package art.arcane.iris.util.project.hunk.view; 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.spi.IrisServices;
import art.arcane.iris.core.service.EditSVC;
import art.arcane.iris.platform.bukkit.BukkitBiome; import art.arcane.iris.platform.bukkit.BukkitBiome;
import art.arcane.iris.spi.PlatformBiome; import art.arcane.iris.spi.PlatformBiome;
import art.arcane.iris.util.project.hunk.Hunk; import art.arcane.iris.util.project.hunk.Hunk;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.World;
import org.bukkit.block.Biome; import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData;
@SuppressWarnings("ClassCanBeRecord") @SuppressWarnings("ClassCanBeRecord")
public class ChunkBiomeHunkView extends art.arcane.volmlib.util.hunk.view.ChunkWorldHunkView<PlatformBiome> implements Hunk<PlatformBiome> { public class ChunkBiomeHunkView extends art.arcane.volmlib.util.hunk.view.ChunkWorldHunkView<PlatformBiome> implements Hunk<PlatformBiome> {
public ChunkBiomeHunkView(Chunk chunk) { public ChunkBiomeHunkView(Chunk chunk) {
super(chunk, super(chunk,
chunk.getWorld().getMaxHeight(), chunk.getWorld().getMaxHeight(),
(wx, y, wz, t) -> IrisServices.get(EditSVC.class).setBiome(chunk.getWorld(), wx, y, wz, (Biome) t.nativeHandle()), (wx, y, wz, t) -> edits().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) -> 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; 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.spi.IrisServices;
import art.arcane.iris.core.service.EditSVC;
import art.arcane.iris.platform.bukkit.BukkitBlockState; import art.arcane.iris.platform.bukkit.BukkitBlockState;
import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformBlockState;
import art.arcane.iris.util.project.hunk.Hunk; import art.arcane.iris.util.project.hunk.Hunk;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
@SuppressWarnings("ClassCanBeRecord") @SuppressWarnings("ClassCanBeRecord")
@@ -31,7 +33,12 @@ public class ChunkHunkView extends art.arcane.volmlib.util.hunk.view.ChunkWorldH
public ChunkHunkView(Chunk chunk) { public ChunkHunkView(Chunk chunk) {
super(chunk, super(chunk,
chunk.getWorld().getMaxHeight(), chunk.getWorld().getMaxHeight(),
(wx, y, wz, t) -> IrisServices.get(EditSVC.class).set(chunk.getWorld(), wx, y, wz, (BlockData) t.nativeHandle()), (wx, y, wz, t) -> edits().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) -> 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);
} }
} }