diff --git a/core/src/main/java/art/arcane/iris/engine/actuator/IrisBiomeActuator.java b/core/src/main/java/art/arcane/iris/engine/actuator/IrisBiomeActuator.java index 9fed0ae86..1e304510d 100644 --- a/core/src/main/java/art/arcane/iris/engine/actuator/IrisBiomeActuator.java +++ b/core/src/main/java/art/arcane/iris/engine/actuator/IrisBiomeActuator.java @@ -18,7 +18,6 @@ package art.arcane.iris.engine.actuator; -import art.arcane.iris.core.nms.INMS; import art.arcane.iris.engine.framework.Engine; import art.arcane.iris.engine.framework.EngineAssignedActuator; import art.arcane.iris.engine.object.IrisBiome; @@ -31,6 +30,7 @@ import art.arcane.volmlib.util.matter.MatterBiomeInject; import art.arcane.volmlib.util.matter.slices.BiomeInjectMatter; import art.arcane.volmlib.util.scheduling.ChronoLatch; import art.arcane.volmlib.util.scheduling.PrecisionStopwatch; +import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBiome; import org.bukkit.block.Biome; @@ -56,7 +56,7 @@ public class IrisBiomeActuator extends EngineAssignedActuator { if (ib.isCustom()) { IrisBiomeCustom custom = ib.getCustomBiome(rng, x, 0, z); - matter = BiomeInjectMatter.get(INMS.get().getBiomeBaseIdForKey(getDimension().getLoadKey() + ":" + custom.getId())); + matter = BiomeInjectMatter.get(IrisPlatforms.get().biomeWriter().biomeIdFor(getDimension().getLoadKey() + ":" + custom.getId())); } else { Biome v = ib.getSkyBiome(rng, x, 0, z); matter = BiomeInjectMatter.get(v); diff --git a/core/src/main/java/art/arcane/iris/engine/modifier/IrisFloatingChildBiomeModifier.java b/core/src/main/java/art/arcane/iris/engine/modifier/IrisFloatingChildBiomeModifier.java index 63c5644e7..229cf743f 100644 --- a/core/src/main/java/art/arcane/iris/engine/modifier/IrisFloatingChildBiomeModifier.java +++ b/core/src/main/java/art/arcane/iris/engine/modifier/IrisFloatingChildBiomeModifier.java @@ -20,7 +20,6 @@ package art.arcane.iris.engine.modifier; import art.arcane.iris.Iris; import art.arcane.iris.core.loader.IrisData; -import art.arcane.iris.core.nms.INMS; import art.arcane.iris.engine.IrisComplex; import art.arcane.iris.engine.decorator.FloatingDecorator; import art.arcane.iris.engine.decorator.IrisSeaSurfaceDecorator; @@ -47,6 +46,7 @@ import art.arcane.volmlib.util.matter.MatterBiomeInject; import art.arcane.volmlib.util.matter.slices.BiomeInjectMatter; import art.arcane.volmlib.util.scheduling.PrecisionStopwatch; import art.arcane.iris.platform.bukkit.BukkitBlockState; +import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.PlatformBlockState; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; @@ -403,7 +403,7 @@ public class IrisFloatingChildBiomeModifier extends EngineAssignedModifier ALL = INMS.get().getBiomes(); + private final List ALL = resolveAll(); + + private static List resolveAll() { + List platformBiomes = IrisPlatforms.get().biomeWriter().allBiomes(); + List biomes = new ArrayList<>(platformBiomes.size()); + for (PlatformBiome biome : platformBiomes) { + biomes.add((Biome) biome.nativeHandle()); + } + return biomes; + } @NotNull @Override diff --git a/core/src/main/java/art/arcane/iris/platform/bukkit/BukkitBiomeWriter.java b/core/src/main/java/art/arcane/iris/platform/bukkit/BukkitBiomeWriter.java new file mode 100644 index 000000000..866b4584b --- /dev/null +++ b/core/src/main/java/art/arcane/iris/platform/bukkit/BukkitBiomeWriter.java @@ -0,0 +1,46 @@ +/* + * 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.platform.bukkit; + +import art.arcane.iris.core.nms.INMS; +import art.arcane.iris.spi.PlatformBiome; +import art.arcane.iris.spi.PlatformBiomeWriter; + +import java.util.ArrayList; +import java.util.List; + +/** + * Bukkit adapter for biome resolution backed by the active NMS binding. + */ +public final class BukkitBiomeWriter implements PlatformBiomeWriter { + @Override + public int biomeIdFor(String key) { + return INMS.get().getBiomeBaseIdForKey(key); + } + + @Override + public List allBiomes() { + List natives = INMS.get().getBiomes(); + List biomes = new ArrayList<>(natives.size()); + for (Object biome : natives) { + biomes.add(BukkitPlatform.wrapBiome(biome)); + } + return biomes; + } +} diff --git a/core/src/main/java/art/arcane/iris/platform/bukkit/BukkitPlatform.java b/core/src/main/java/art/arcane/iris/platform/bukkit/BukkitPlatform.java index ddea24f91..aff68e822 100644 --- a/core/src/main/java/art/arcane/iris/platform/bukkit/BukkitPlatform.java +++ b/core/src/main/java/art/arcane/iris/platform/bukkit/BukkitPlatform.java @@ -23,6 +23,8 @@ import art.arcane.iris.core.nms.INMS; import art.arcane.iris.engine.object.IrisPosition; import art.arcane.iris.spi.IrisPlatform; import art.arcane.iris.spi.LogLevel; +import art.arcane.iris.spi.PlatformBiome; +import art.arcane.iris.spi.PlatformBiomeWriter; import art.arcane.iris.spi.PlatformCapabilities; import art.arcane.iris.spi.PlatformRegistries; import art.arcane.iris.spi.PlatformScheduler; @@ -32,6 +34,7 @@ import art.arcane.iris.util.common.scheduling.J; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; +import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Entity; import org.bukkit.event.Listener; @@ -47,11 +50,16 @@ public final class BukkitPlatform implements IrisPlatform { private final BukkitScheduler scheduler = new BukkitScheduler(); private final PlatformCapabilities capabilities = new BukkitCapabilities(); private final BukkitStructureHooks structureHooks = new BukkitStructureHooks(); + private final BukkitBiomeWriter biomeWriter = new BukkitBiomeWriter(); public static World unwrapWorld(PlatformWorld world) { return (World) world.nativeHandle(); } + public static PlatformBiome wrapBiome(Object biome) { + return BukkitBiome.of((Biome) biome); + } + public static Class classifyMantleValue(Object value) { if (value instanceof World) { return World.class; @@ -116,6 +124,11 @@ public final class BukkitPlatform implements IrisPlatform { return structureHooks; } + @Override + public PlatformBiomeWriter biomeWriter() { + return biomeWriter; + } + @Override public File dataFolder() { return Iris.instance.getDataFolder(); diff --git a/spi/src/main/java/art/arcane/iris/spi/IrisPlatform.java b/spi/src/main/java/art/arcane/iris/spi/IrisPlatform.java index 1d35c96cf..8a341f7b6 100644 --- a/spi/src/main/java/art/arcane/iris/spi/IrisPlatform.java +++ b/spi/src/main/java/art/arcane/iris/spi/IrisPlatform.java @@ -36,6 +36,8 @@ public interface IrisPlatform { PlatformStructureHooks structureHooks(); + PlatformBiomeWriter biomeWriter(); + File dataFolder(); void dispatchConsoleCommand(String command); diff --git a/spi/src/main/java/art/arcane/iris/spi/PlatformBiomeWriter.java b/spi/src/main/java/art/arcane/iris/spi/PlatformBiomeWriter.java new file mode 100644 index 000000000..bd4903ba4 --- /dev/null +++ b/spi/src/main/java/art/arcane/iris/spi/PlatformBiomeWriter.java @@ -0,0 +1,30 @@ +/* + * 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.spi; + +import java.util.List; + +/** + * Resolves pack biome keys to platform biome ids for mantle injection and enumerates the platform's biome registry. + */ +public interface PlatformBiomeWriter { + int biomeIdFor(String key); + + List allBiomes(); +}