diff --git a/adapters/fabric/build.gradle b/adapters/fabric/build.gradle
index c50dbc03c..42ed74232 100644
--- a/adapters/fabric/build.gradle
+++ b/adapters/fabric/build.gradle
@@ -41,6 +41,17 @@ java {
}
}
+sourceSets {
+ main {
+ java {
+ srcDir '../modded-common/src/main/java'
+ }
+ resources {
+ srcDir '../modded-common/src/main/resources'
+ }
+ }
+}
+
repositories {
mavenCentral()
maven {
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricModdedLoader.java b/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricModdedLoader.java
new file mode 100644
index 000000000..13fb2a285
--- /dev/null
+++ b/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricModdedLoader.java
@@ -0,0 +1,60 @@
+/*
+ * Iris is a World Generator for Minecraft 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.fabric;
+
+import art.arcane.iris.modded.ModdedLoader;
+import net.fabricmc.loader.api.FabricLoader;
+import net.fabricmc.loader.api.ModContainer;
+import net.minecraft.server.MinecraftServer;
+
+import java.io.File;
+import java.nio.file.Path;
+
+public final class FabricModdedLoader implements ModdedLoader {
+ @Override
+ public String platformName() {
+ return "fabric";
+ }
+
+ @Override
+ public String minecraftVersion() {
+ return FabricLoader.getInstance().getModContainer("minecraft")
+ .map((ModContainer container) -> container.getMetadata().getVersion().getFriendlyString())
+ .orElse("unknown");
+ }
+
+ @Override
+ public MinecraftServer currentServer() {
+ Object instance = FabricLoader.getInstance().getGameInstance();
+ return instance instanceof MinecraftServer server ? server : null;
+ }
+
+ @Override
+ public Path configDir() {
+ return FabricLoader.getInstance().getConfigDir();
+ }
+
+ @Override
+ public File modJar() {
+ return FabricLoader.getInstance().getModContainer("irisworldgen")
+ .flatMap((ModContainer container) -> container.getOrigin().getPaths().stream().findFirst())
+ .map((Path p) -> p.toFile())
+ .orElse(null);
+ }
+}
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/IrisFabricBootstrap.java b/adapters/fabric/src/main/java/art/arcane/iris/fabric/IrisFabricBootstrap.java
index cd3204c36..79c28c7a7 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/IrisFabricBootstrap.java
+++ b/adapters/fabric/src/main/java/art/arcane/iris/fabric/IrisFabricBootstrap.java
@@ -18,6 +18,11 @@
package art.arcane.iris.fabric;
+import art.arcane.iris.modded.IrisModdedChunkGenerator;
+import art.arcane.iris.modded.ModdedEngineBootstrap;
+import art.arcane.iris.modded.ModdedParityProbe;
+import art.arcane.iris.modded.ModdedWorldCheck;
+import art.arcane.iris.modded.ModdedWorldEngines;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.fabricmc.loader.api.FabricLoader;
@@ -31,14 +36,10 @@ import org.slf4j.LoggerFactory;
public final class IrisFabricBootstrap implements ModInitializer {
private static final Logger LOGGER = LoggerFactory.getLogger("Iris");
- private static final String[] CORE_SELF_TEST_CLASSES = {
- "art.arcane.iris.engine.IrisEngine",
- "art.arcane.iris.util.common.data.B",
- "art.arcane.iris.core.loader.IrisData"
- };
@Override
public void onInitialize() {
+ ModdedEngineBootstrap.initialize(new FabricModdedLoader());
FabricLoader loader = FabricLoader.getInstance();
String modVersion = loader.getModContainer("irisworldgen")
.map((ModContainer container) -> container.getMetadata().getVersion().getFriendlyString())
@@ -48,37 +49,22 @@ public final class IrisFabricBootstrap implements ModInitializer {
.orElse("unknown");
LOGGER.info("Iris {} bootstrapping on Minecraft {} (Fabric)", modVersion, minecraftVersion);
- int loadedClasses = 0;
- for (String className : CORE_SELF_TEST_CLASSES) {
- try {
- Class.forName(className, true, IrisFabricBootstrap.class.getClassLoader());
- loadedClasses++;
- } catch (Throwable error) {
- LOGGER.error("Iris core self-test failed to initialize {}", className, error);
- }
- }
-
- if (loadedClasses != CORE_SELF_TEST_CLASSES.length) {
- throw new IllegalStateException("Iris core self-test failed: only " + loadedClasses + " of " + CORE_SELF_TEST_CLASSES.length + " engine classes initialized");
- }
-
- LOGGER.info("Iris core loaded ({} classes ok)", loadedClasses);
-
- FabricEngineBootstrap.bind();
- Registry.register(BuiltInRegistries.CHUNK_GENERATOR, Identifier.fromNamespaceAndPath("irisworldgen", "iris"), IrisFabricChunkGenerator.CODEC);
+ ModdedEngineBootstrap.selfTest(IrisFabricBootstrap.class.getClassLoader());
+ ModdedEngineBootstrap.bind();
+ Registry.register(BuiltInRegistries.CHUNK_GENERATOR, Identifier.fromNamespaceAndPath("irisworldgen", "iris"), IrisModdedChunkGenerator.CODEC);
LOGGER.info("Iris chunk generator registered as irisworldgen:iris");
- ServerLifecycleEvents.SERVER_STOPPING.register((MinecraftServer server) -> FabricWorldEngines.shutdown());
+ ServerLifecycleEvents.SERVER_STOPPING.register((MinecraftServer server) -> ModdedWorldEngines.shutdown());
String parity = System.getProperty("iris.parity");
if (parity != null) {
LOGGER.info("Iris parity probe armed: {}", parity);
- FabricParityProbe.schedule(parity);
+ ModdedParityProbe.schedule(parity);
}
String worldCheck = System.getProperty("iris.worldcheck");
if (worldCheck != null) {
LOGGER.info("Iris world check armed");
- FabricWorldCheck.schedule();
+ ModdedWorldCheck.schedule();
}
}
}
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/IrisFabricChunkGenerator.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/IrisModdedChunkGenerator.java
similarity index 93%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/IrisFabricChunkGenerator.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/IrisModdedChunkGenerator.java
index 972cd0bca..c6e6da0c4 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/IrisFabricChunkGenerator.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/IrisModdedChunkGenerator.java
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.engine.framework.Engine;
import art.arcane.iris.spi.IrisPlatforms;
@@ -68,19 +68,19 @@ import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
-public final class IrisFabricChunkGenerator extends ChunkGenerator {
+public final class IrisModdedChunkGenerator extends ChunkGenerator {
private static final Logger LOGGER = LoggerFactory.getLogger("Iris");
- public static final MapCodec CODEC = RecordCodecBuilder.mapCodec((RecordCodecBuilder.Instance instance) -> instance.group(
- BiomeSource.CODEC.fieldOf("biome_source").forGetter((IrisFabricChunkGenerator generator) -> generator.biomeSource),
- Codec.STRING.optionalFieldOf("dimension", "overworld").forGetter((IrisFabricChunkGenerator generator) -> generator.dimensionKey)
- ).apply(instance, IrisFabricChunkGenerator::new));
+ public static final MapCodec CODEC = RecordCodecBuilder.mapCodec((RecordCodecBuilder.Instance instance) -> instance.group(
+ BiomeSource.CODEC.fieldOf("biome_source").forGetter((IrisModdedChunkGenerator generator) -> generator.biomeSource),
+ Codec.STRING.optionalFieldOf("dimension", "overworld").forGetter((IrisModdedChunkGenerator generator) -> generator.dimensionKey)
+ ).apply(instance, IrisModdedChunkGenerator::new));
private final String dimensionKey;
private final ConcurrentHashMap> biomeHolders = new ConcurrentHashMap<>();
private final AtomicBoolean announced = new AtomicBoolean(false);
private volatile Engine engine;
- public IrisFabricChunkGenerator(BiomeSource biomeSource, String dimensionKey) {
+ public IrisModdedChunkGenerator(BiomeSource biomeSource, String dimensionKey) {
super(biomeSource);
this.dimensionKey = dimensionKey;
}
@@ -91,7 +91,7 @@ public final class IrisFabricChunkGenerator extends ChunkGenerator {
}
private ServerLevel boundLevel() {
- MinecraftServer server = FabricEngineBootstrap.currentServer();
+ MinecraftServer server = ModdedEngineBootstrap.currentServer();
if (server == null) {
return null;
}
@@ -116,7 +116,7 @@ public final class IrisFabricChunkGenerator extends ChunkGenerator {
if (level == null) {
throw new IllegalStateException("Iris generator '" + dimensionKey + "' has no bound ServerLevel yet");
}
- Engine created = FabricWorldEngines.get(level, dimensionKey);
+ Engine created = ModdedWorldEngines.get(level, dimensionKey);
engine = created;
return created;
}
@@ -139,7 +139,7 @@ public final class IrisFabricChunkGenerator extends ChunkGenerator {
Engine generationEngine = engine();
ChunkPos pos = chunk.getPos();
if (announced.compareAndSet(false, true)) {
- LOGGER.info("Iris generating {} through IrisFabricChunkGenerator (dim={} first chunk {},{})",
+ LOGGER.info("Iris generating {} through IrisModdedChunkGenerator (dim={} first chunk {},{})",
dimensionKey, generationEngine.getDimension().getLoadKey(), pos.x(), pos.z());
}
LOGGER.debug("Iris generating chunk {},{}", pos.x(), pos.z());
@@ -148,7 +148,7 @@ public final class IrisFabricChunkGenerator extends ChunkGenerator {
int dimMaxY = generationEngine.getMaxHeight();
int height = dimMaxY - dimMinY;
PlatformBlockState air = IrisPlatforms.get().registries().air();
- FabricBlockBuffer blocks = new FabricBlockBuffer(height, air);
+ ModdedBlockBuffer blocks = new ModdedBlockBuffer(height, air);
Hunk biomes = Hunk.newArrayHunk(16, height, 16);
try {
generationEngine.generate(pos.getMinBlockX(), pos.getMinBlockZ(), blocks, biomes, false);
@@ -192,7 +192,7 @@ public final class IrisFabricChunkGenerator extends ChunkGenerator {
return raced != null ? raced : resolved;
}
- private void writeBlocks(ChunkAccess chunk, FabricBlockBuffer blocks, int dimMinY, int height) {
+ private void writeBlocks(ChunkAccess chunk, ModdedBlockBuffer blocks, int dimMinY, int height) {
int chunkMinY = chunk.getMinY();
int chunkMaxY = chunkMinY + chunk.getHeight();
int from = Math.max(dimMinY, chunkMinY);
@@ -226,14 +226,14 @@ public final class IrisFabricChunkGenerator extends ChunkGenerator {
}
private static final class HunkBiomeResolver implements BiomeResolver {
- private final IrisFabricChunkGenerator generator;
+ private final IrisModdedChunkGenerator generator;
private final Hunk biomes;
private final Registry registry;
private final ChunkPos pos;
private final int dimMinY;
private final int height;
- private HunkBiomeResolver(IrisFabricChunkGenerator generator, Hunk biomes, Registry registry, ChunkPos pos, int dimMinY, int height) {
+ private HunkBiomeResolver(IrisModdedChunkGenerator generator, Hunk biomes, Registry registry, ChunkPos pos, int dimMinY, int height) {
this.generator = generator;
this.biomes = biomes;
this.registry = registry;
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricBiome.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedBiome.java
similarity index 80%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricBiome.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedBiome.java
index eaa4c4210..18867b739 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricBiome.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedBiome.java
@@ -16,29 +16,29 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.spi.PlatformBiome;
import net.minecraft.world.level.biome.Biome;
import java.util.concurrent.ConcurrentHashMap;
-public final class FabricBiome implements PlatformBiome {
- private static final ConcurrentHashMap CACHE = new ConcurrentHashMap<>();
+public final class ModdedBiome implements PlatformBiome {
+ private static final ConcurrentHashMap CACHE = new ConcurrentHashMap<>();
private final Biome biome;
private final String key;
private final String namespace;
- private FabricBiome(Biome biome, String key) {
+ private ModdedBiome(Biome biome, String key) {
this.biome = biome;
this.key = key;
int colon = key.indexOf(':');
this.namespace = colon >= 0 ? key.substring(0, colon) : "minecraft";
}
- public static FabricBiome of(Biome biome, String key) {
- return CACHE.computeIfAbsent(key, (String k) -> new FabricBiome(biome, k));
+ public static ModdedBiome of(Biome biome, String key) {
+ return CACHE.computeIfAbsent(key, (String k) -> new ModdedBiome(biome, k));
}
@Override
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricBiomeWriter.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedBiomeWriter.java
similarity index 91%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricBiomeWriter.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedBiomeWriter.java
index 750846fb2..8160c4807 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricBiomeWriter.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedBiomeWriter.java
@@ -16,14 +16,14 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.spi.PlatformBiome;
import art.arcane.iris.spi.PlatformBiomeWriter;
import java.util.List;
-public final class FabricBiomeWriter implements PlatformBiomeWriter {
+public final class ModdedBiomeWriter implements PlatformBiomeWriter {
@Override
public int biomeIdFor(String key) {
return 0;
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricBlockBuffer.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedBlockBuffer.java
similarity index 93%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricBlockBuffer.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedBlockBuffer.java
index 00d2eeaa5..7b1a5633c 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricBlockBuffer.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedBlockBuffer.java
@@ -16,17 +16,17 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.spi.PlatformBlockState;
import art.arcane.iris.util.project.hunk.Hunk;
-public final class FabricBlockBuffer implements Hunk {
+public final class ModdedBlockBuffer implements Hunk {
private final PlatformBlockState[] data;
private final PlatformBlockState air;
private final int height;
- public FabricBlockBuffer(int height, PlatformBlockState air) {
+ public ModdedBlockBuffer(int height, PlatformBlockState air) {
this.data = new PlatformBlockState[16 * height * 16];
this.air = air;
this.height = height;
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricBlockResolution.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedBlockResolution.java
similarity index 96%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricBlockResolution.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedBlockResolution.java
index 869e1b2fe..466ff1968 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricBlockResolution.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedBlockResolution.java
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.core.IrisSettings;
import art.arcane.iris.spi.IrisLogging;
@@ -44,7 +44,7 @@ import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
-public final class FabricBlockResolution {
+public final class ModdedBlockResolution {
private static final Set FOLIAGE = blockSet(
"poppy", "dandelion", "cornflower", "sweet_berry_bush", "crimson_roots", "warped_roots",
"nether_sprouts", "allium", "azure_bluet", "blue_orchid", "oxeye_daisy", "lily_of_the_valley",
@@ -84,7 +84,7 @@ public final class FabricBlockResolution {
private static final BlockState AIR = Blocks.AIR.defaultBlockState();
private static long lastWarnMs;
- private FabricBlockResolution() {
+ private ModdedBlockResolution() {
}
record Parsed(BlockState state, Map, Comparable>> properties) {
@@ -162,27 +162,27 @@ public final class FabricBlockResolution {
return AIR;
}
- public static FabricBlockState getAir() {
- return FabricBlockState.of(AIR, null);
+ public static ModdedBlockState getAir() {
+ return ModdedBlockState.of(AIR, null);
}
- public static FabricBlockState get(String bdxf) {
+ public static ModdedBlockState get(String bdxf) {
Parsed parsed = resolveGet(bdxf);
- return FabricBlockState.of(parsed.state(), parsed.properties());
+ return ModdedBlockState.of(parsed.state(), parsed.properties());
}
- public static FabricBlockState getNoCompat(String bdxf) {
+ public static ModdedBlockState getNoCompat(String bdxf) {
Parsed parsed = resolveNoCompat(bdxf);
- return FabricBlockState.of(parsed.state(), parsed.properties());
+ return ModdedBlockState.of(parsed.state(), parsed.properties());
}
- public static FabricBlockState getOrNull(String bdxf) {
+ public static ModdedBlockState getOrNull(String bdxf) {
return getOrNull(bdxf, false);
}
- public static FabricBlockState getOrNull(String bdxf, boolean warn) {
+ public static ModdedBlockState getOrNull(String bdxf, boolean warn) {
Parsed parsed = resolveOrNull(bdxf, warn);
- return parsed == null ? null : FabricBlockState.of(parsed.state(), parsed.properties());
+ return parsed == null ? null : ModdedBlockState.of(parsed.state(), parsed.properties());
}
static Parsed resolveGet(String bdxf) {
@@ -234,9 +234,9 @@ public final class FabricBlockResolution {
return null;
}
- public static FabricBlockState strictParse(String key) {
+ public static ModdedBlockState strictParse(String key) {
Parsed parsed = parseStrict(key);
- return FabricBlockState.of(parsed.state(), parsed.properties());
+ return ModdedBlockState.of(parsed.state(), parsed.properties());
}
private static Parsed parseStrict(String key) {
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricBlockState.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedBlockState.java
similarity index 82%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricBlockState.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedBlockState.java
index 6315595f3..45425c505 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricBlockState.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedBlockState.java
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.spi.PlatformBlockState;
import net.minecraft.core.registries.BuiltInRegistries;
@@ -28,8 +28,8 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
-public final class FabricBlockState implements PlatformBlockState {
- private static final ConcurrentHashMap CACHE = new ConcurrentHashMap<>();
+public final class ModdedBlockState implements PlatformBlockState {
+ private static final ConcurrentHashMap CACHE = new ConcurrentHashMap<>();
private final BlockState state;
private final Map, Comparable>> parsedProperties;
@@ -43,16 +43,16 @@ public final class FabricBlockState implements PlatformBlockState {
private volatile Boolean foliage;
private volatile Boolean decorant;
- private FabricBlockState(BlockState state, Map, Comparable>> parsedProperties, String key) {
+ private ModdedBlockState(BlockState state, Map, Comparable>> parsedProperties, String key) {
this.state = state;
this.parsedProperties = parsedProperties;
this.key = key;
this.namespace = parseNamespace(key);
}
- public static FabricBlockState of(BlockState state, Map, Comparable>> parsedProperties) {
+ public static ModdedBlockState of(BlockState state, Map, Comparable>> parsedProperties) {
String key = serialize(state);
- return CACHE.computeIfAbsent(key, (String k) -> new FabricBlockState(state, parsedProperties, k));
+ return CACHE.computeIfAbsent(key, (String k) -> new ModdedBlockState(state, parsedProperties, k));
}
public static String serialize(BlockState state) {
@@ -80,7 +80,7 @@ public final class FabricBlockState implements PlatformBlockState {
if (this == other) {
return true;
}
- if (!(other instanceof FabricBlockState blockState)) {
+ if (!(other instanceof ModdedBlockState blockState)) {
return false;
}
return state.equals(blockState.state);
@@ -143,7 +143,7 @@ public final class FabricBlockState implements PlatformBlockState {
public boolean isAir() {
Boolean cached = air;
if (cached == null) {
- cached = FabricBlockResolution.isAir(state);
+ cached = ModdedBlockResolution.isAir(state);
air = cached;
}
return cached;
@@ -153,7 +153,7 @@ public final class FabricBlockState implements PlatformBlockState {
public boolean isSolid() {
Boolean cached = solid;
if (cached == null) {
- cached = FabricBlockResolution.isSolid(state);
+ cached = ModdedBlockResolution.isSolid(state);
solid = cached;
}
return cached;
@@ -163,7 +163,7 @@ public final class FabricBlockState implements PlatformBlockState {
public boolean isOccluding() {
Boolean cached = occluding;
if (cached == null) {
- cached = FabricBlockResolution.isOccluding(state);
+ cached = ModdedBlockResolution.isOccluding(state);
occluding = cached;
}
return cached;
@@ -178,7 +178,7 @@ public final class FabricBlockState implements PlatformBlockState {
public boolean isFluid() {
Boolean cached = fluid;
if (cached == null) {
- cached = FabricBlockResolution.isFluid(state);
+ cached = ModdedBlockResolution.isFluid(state);
fluid = cached;
}
return cached;
@@ -188,7 +188,7 @@ public final class FabricBlockState implements PlatformBlockState {
public boolean isWater() {
Boolean cached = water;
if (cached == null) {
- cached = FabricBlockResolution.isWater(state);
+ cached = ModdedBlockResolution.isWater(state);
water = cached;
}
return cached;
@@ -196,24 +196,24 @@ public final class FabricBlockState implements PlatformBlockState {
@Override
public boolean isWaterLogged() {
- return FabricBlockResolution.isWaterLogged(state);
+ return ModdedBlockResolution.isWaterLogged(state);
}
@Override
public boolean isLit() {
- return FabricBlockResolution.isLit(state);
+ return ModdedBlockResolution.isLit(state);
}
@Override
public boolean isUpdatable() {
- return FabricBlockResolution.isUpdatable(state);
+ return ModdedBlockResolution.isUpdatable(state);
}
@Override
public boolean isFoliage() {
Boolean cached = foliage;
if (cached == null) {
- cached = FabricBlockResolution.isFoliage(state);
+ cached = ModdedBlockResolution.isFoliage(state);
foliage = cached;
}
return cached;
@@ -221,14 +221,14 @@ public final class FabricBlockState implements PlatformBlockState {
@Override
public boolean isFoliagePlantable() {
- return FabricBlockResolution.isFoliagePlantable(state);
+ return ModdedBlockResolution.isFoliagePlantable(state);
}
@Override
public boolean isDecorant() {
Boolean cached = decorant;
if (cached == null) {
- cached = FabricBlockResolution.isDecorant(state);
+ cached = ModdedBlockResolution.isDecorant(state);
decorant = cached;
}
return cached;
@@ -236,37 +236,37 @@ public final class FabricBlockState implements PlatformBlockState {
@Override
public boolean isStorage() {
- return FabricBlockResolution.isStorage(state);
+ return ModdedBlockResolution.isStorage(state);
}
@Override
public boolean isStorageChest() {
- return FabricBlockResolution.isStorageChest(state);
+ return ModdedBlockResolution.isStorageChest(state);
}
@Override
public boolean isOre() {
- return FabricBlockResolution.isOre(state);
+ return ModdedBlockResolution.isOre(state);
}
@Override
public boolean isDeepSlate() {
- return FabricBlockResolution.isDeepSlate(state);
+ return ModdedBlockResolution.isDeepSlate(state);
}
@Override
public boolean isVineBlock() {
- return FabricBlockResolution.isVineBlock(state);
+ return ModdedBlockResolution.isVineBlock(state);
}
@Override
public boolean canPlaceOnto(PlatformBlockState onto) {
- return FabricBlockResolution.canPlaceOnto(state.getBlock(), ((BlockState) onto.nativeHandle()).getBlock());
+ return ModdedBlockResolution.canPlaceOnto(state.getBlock(), ((BlockState) onto.nativeHandle()).getBlock());
}
@Override
public boolean matches(PlatformBlockState other) {
- if (!(other instanceof FabricBlockState blockState)) {
+ if (!(other instanceof ModdedBlockState blockState)) {
return false;
}
if (state.getBlock() != blockState.state.getBlock()) {
@@ -292,13 +292,13 @@ public final class FabricBlockState implements PlatformBlockState {
@Override
public boolean hasTileEntity() {
- return FabricBlockResolution.hasTileEntity(state);
+ return ModdedBlockResolution.hasTileEntity(state);
}
@Override
public PlatformBlockState withProperty(String name, String value) {
String merged = mergeProperty(key, name, value);
- return FabricBlockResolution.strictParse(merged);
+ return ModdedBlockResolution.strictParse(merged);
}
@Override
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricDecoratorHooks.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedDecoratorHooks.java
similarity index 95%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricDecoratorHooks.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedDecoratorHooks.java
index f3cabc57b..6f8ddd9f5 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricDecoratorHooks.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedDecoratorHooks.java
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.engine.decorator.DecoratorPlatformHooks;
import art.arcane.iris.engine.mantle.EngineMantle;
@@ -33,13 +33,13 @@ import net.minecraft.world.level.block.state.properties.Property;
import java.util.LinkedHashMap;
import java.util.Map;
-public final class FabricDecoratorHooks implements DecoratorPlatformHooks.FaceFixer, DecoratorPlatformHooks.SurfaceSturdiness {
+public final class ModdedDecoratorHooks implements DecoratorPlatformHooks.FaceFixer, DecoratorPlatformHooks.SurfaceSturdiness {
private static final Direction[] CARTESIAN = {Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST, Direction.UP, Direction.DOWN};
private static final String[] FACE_NAMES = {"north", "east", "south", "west", "up", "down"};
@Override
public PlatformBlockState fixFaces(PlatformBlockState state, Hunk hunk, int rX, int rZ, int x, int y, int z, EngineMantle mantle) {
- FabricBlockState fabric = (FabricBlockState) state;
+ ModdedBlockState fabric = (ModdedBlockState) state;
BlockState cloned = fabric.handle();
Map allowed = faceProperties(cloned);
@@ -91,7 +91,7 @@ public final class FabricDecoratorHooks implements DecoratorPlatformHooks.FaceFi
}
}
- return FabricBlockState.of(cloned, fabric.parsedProperties());
+ return ModdedBlockState.of(cloned, fabric.parsedProperties());
}
@Override
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricEngineBootstrap.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedEngineBootstrap.java
similarity index 62%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricEngineBootstrap.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedEngineBootstrap.java
index 6a930ed2d..8b4804893 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricEngineBootstrap.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedEngineBootstrap.java
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.engine.decorator.DecoratorPlatformHooks;
import art.arcane.iris.engine.framework.Engine;
@@ -29,33 +29,64 @@ import art.arcane.iris.engine.object.IrisObjectRotation;
import art.arcane.iris.engine.object.TileData;
import art.arcane.iris.spi.IrisPlatforms;
import art.arcane.iris.spi.IrisServices;
-import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.server.MinecraftServer;
import org.bukkit.Chunk;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import java.util.function.Supplier;
-
-public final class FabricEngineBootstrap {
+public final class ModdedEngineBootstrap {
+ private static final Logger LOGGER = LoggerFactory.getLogger("Iris");
+ private static final String[] CORE_SELF_TEST_CLASSES = {
+ "art.arcane.iris.engine.IrisEngine",
+ "art.arcane.iris.util.common.data.B",
+ "art.arcane.iris.core.loader.IrisData"
+ };
private static final Object LOCK = new Object();
- private static volatile FabricPlatform platform;
+ private static volatile ModdedLoader loader;
+ private static volatile ModdedPlatform platform;
- private FabricEngineBootstrap() {
+ private ModdedEngineBootstrap() {
+ }
+
+ public static void initialize(ModdedLoader moddedLoader) {
+ loader = moddedLoader;
+ }
+
+ public static ModdedLoader loader() {
+ ModdedLoader bound = loader;
+ if (bound == null) {
+ throw new IllegalStateException("Iris modded loader is not initialized; the loader bootstrap must call ModdedEngineBootstrap.initialize first");
+ }
+ return bound;
}
public static MinecraftServer currentServer() {
- Object instance = FabricLoader.getInstance().getGameInstance();
- return instance instanceof MinecraftServer server ? server : null;
+ return loader().currentServer();
}
- public static FabricPlatform bind() {
- return bind(FabricEngineBootstrap::currentServer);
+ public static void selfTest(ClassLoader classLoader) {
+ int loadedClasses = 0;
+ for (String className : CORE_SELF_TEST_CLASSES) {
+ try {
+ Class.forName(className, true, classLoader);
+ loadedClasses++;
+ } catch (Throwable error) {
+ LOGGER.error("Iris core self-test failed to initialize {}", className, error);
+ }
+ }
+
+ if (loadedClasses != CORE_SELF_TEST_CLASSES.length) {
+ throw new IllegalStateException("Iris core self-test failed: only " + loadedClasses + " of " + CORE_SELF_TEST_CLASSES.length + " engine classes initialized");
+ }
+
+ LOGGER.info("Iris core loaded ({} classes ok)", loadedClasses);
}
- public static FabricPlatform bind(Supplier server) {
- FabricPlatform bound = platform;
+ public static ModdedPlatform bind() {
+ ModdedPlatform bound = platform;
if (bound != null) {
return bound;
}
@@ -63,12 +94,13 @@ public final class FabricEngineBootstrap {
if (platform != null) {
return platform;
}
- FabricPlatform created = new FabricPlatform(server);
+ ModdedLoader boundLoader = loader();
+ ModdedPlatform created = new ModdedPlatform(boundLoader);
IrisPlatforms.bind(created);
- IrisObjectRotation.bindFallbackRotator(new FabricStateRotator());
- BlockDataMergeSupport.bindFallbackMerger(new FabricStateMerger());
- TileData.bindFallbackReader(new FabricTileReader(server));
- FabricDecoratorHooks decoratorHooks = new FabricDecoratorHooks();
+ IrisObjectRotation.bindFallbackRotator(new ModdedStateRotator());
+ BlockDataMergeSupport.bindFallbackMerger(new ModdedStateMerger());
+ TileData.bindFallbackReader(new ModdedTileReader(boundLoader::currentServer));
+ ModdedDecoratorHooks decoratorHooks = new ModdedDecoratorHooks();
DecoratorPlatformHooks.bind(decoratorHooks, decoratorHooks);
IrisServices.register(PreservationRegistry.class, new InertPreservation());
IrisServices.register(EngineWorldManagerProvider.class, (EngineWorldManagerProvider) (Engine engine) -> new InertWorldManager());
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricEntityType.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedEntityType.java
similarity index 79%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricEntityType.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedEntityType.java
index 5bac41a1f..f8629cbd7 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricEntityType.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedEntityType.java
@@ -16,29 +16,29 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.spi.PlatformEntityType;
import net.minecraft.world.entity.EntityType;
import java.util.concurrent.ConcurrentHashMap;
-public final class FabricEntityType implements PlatformEntityType {
- private static final ConcurrentHashMap CACHE = new ConcurrentHashMap<>();
+public final class ModdedEntityType implements PlatformEntityType {
+ private static final ConcurrentHashMap CACHE = new ConcurrentHashMap<>();
private final EntityType> type;
private final String key;
private final String namespace;
- private FabricEntityType(EntityType> type, String key) {
+ private ModdedEntityType(EntityType> type, String key) {
this.type = type;
this.key = key;
int colon = key.indexOf(':');
this.namespace = colon >= 0 ? key.substring(0, colon) : "minecraft";
}
- public static FabricEntityType of(EntityType> type, String key) {
- return CACHE.computeIfAbsent(key, (String k) -> new FabricEntityType(type, k));
+ public static ModdedEntityType of(EntityType> type, String key) {
+ return CACHE.computeIfAbsent(key, (String k) -> new ModdedEntityType(type, k));
}
@Override
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricItem.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedItem.java
similarity index 80%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricItem.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedItem.java
index 0dfa4e15e..b2f5d7414 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricItem.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedItem.java
@@ -16,29 +16,29 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.spi.PlatformItem;
import net.minecraft.world.item.Item;
import java.util.concurrent.ConcurrentHashMap;
-public final class FabricItem implements PlatformItem {
- private static final ConcurrentHashMap CACHE = new ConcurrentHashMap<>();
+public final class ModdedItem implements PlatformItem {
+ private static final ConcurrentHashMap CACHE = new ConcurrentHashMap<>();
private final Item item;
private final String key;
private final String namespace;
- private FabricItem(Item item, String key) {
+ private ModdedItem(Item item, String key) {
this.item = item;
this.key = key;
int colon = key.indexOf(':');
this.namespace = colon >= 0 ? key.substring(0, colon) : "minecraft";
}
- public static FabricItem of(Item item, String key) {
- return CACHE.computeIfAbsent(key, (String k) -> new FabricItem(item, k));
+ public static ModdedItem of(Item item, String key) {
+ return CACHE.computeIfAbsent(key, (String k) -> new ModdedItem(item, k));
}
@Override
diff --git a/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedLoader.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedLoader.java
new file mode 100644
index 000000000..109b9a0bb
--- /dev/null
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedLoader.java
@@ -0,0 +1,36 @@
+/*
+ * Iris is a World Generator for Minecraft 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.modded;
+
+import net.minecraft.server.MinecraftServer;
+
+import java.io.File;
+import java.nio.file.Path;
+
+public interface ModdedLoader {
+ String platformName();
+
+ String minecraftVersion();
+
+ MinecraftServer currentServer();
+
+ Path configDir();
+
+ File modJar();
+}
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricParityProbe.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedParityProbe.java
similarity index 95%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricParityProbe.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedParityProbe.java
index 18423c48b..345dbea92 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricParityProbe.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedParityProbe.java
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.core.loader.IrisData;
import art.arcane.iris.engine.IrisEngine;
@@ -28,7 +28,6 @@ import art.arcane.iris.spi.IrisPlatforms;
import art.arcane.iris.spi.PlatformBiome;
import art.arcane.iris.spi.PlatformBlockState;
import art.arcane.iris.util.project.hunk.Hunk;
-import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.server.MinecraftServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -48,7 +47,7 @@ import java.util.List;
import java.util.Map;
import java.util.TreeMap;
-public final class FabricParityProbe {
+public final class ModdedParityProbe {
private static final Logger LOGGER = LoggerFactory.getLogger("Iris");
private static final String DIMENSION_KEY = "overworld";
private static final long SEED = 1337L;
@@ -56,7 +55,7 @@ public final class FabricParityProbe {
private static final String DEFAULT_EXPECTED = "922bbcbe766d";
private static final List REPORTED = Collections.synchronizedList(new ArrayList<>());
- private FabricParityProbe() {
+ private ModdedParityProbe() {
}
public static void schedule(String config) {
@@ -69,8 +68,8 @@ public final class FabricParityProbe {
long start = System.currentTimeMillis();
MinecraftServer server = null;
while (System.currentTimeMillis() - start < 600000L) {
- Object instance = FabricLoader.getInstance().getGameInstance();
- if (instance instanceof MinecraftServer candidate && candidate.isReady()) {
+ MinecraftServer candidate = ModdedEngineBootstrap.currentServer();
+ if (candidate != null && candidate.isReady()) {
server = candidate;
break;
}
@@ -117,8 +116,8 @@ public final class FabricParityProbe {
return false;
}
- FabricEngineBootstrap.bind();
- FabricPlatform.errorSink(REPORTED::add);
+ ModdedEngineBootstrap.bind();
+ ModdedPlatform.errorSink(REPORTED::add);
File workRoot = Files.createTempDirectory("iris-parity").toFile();
File pack = clonePack(packSource, workRoot);
@@ -186,7 +185,7 @@ public final class FabricParityProbe {
int cx = at[0];
int cz = at[1];
drainReported();
- FabricBlockBuffer blocks = new FabricBlockBuffer(height, airState);
+ ModdedBlockBuffer blocks = new ModdedBlockBuffer(height, airState);
Hunk biomes = Hunk.newArrayHunk(16, height, 16);
List failures = new ArrayList<>();
try {
@@ -238,7 +237,7 @@ public final class FabricParityProbe {
return match;
}
- private static void diffDeep(int cx, int cz, FabricBlockBuffer blocks, int height, int minY) {
+ private static void diffDeep(int cx, int cz, ModdedBlockBuffer blocks, int height, int minY) {
String deepDir = System.getProperty("iris.parity.deep");
if (deepDir == null) {
return;
@@ -294,7 +293,7 @@ public final class FabricParityProbe {
return targets;
}
- private static String hashChunk(int chunkX, int chunkZ, FabricBlockBuffer blocks, Hunk biomes, int height) {
+ private static String hashChunk(int chunkX, int chunkZ, ModdedBlockBuffer blocks, Hunk biomes, int height) {
MessageDigest blockDigest = sha256();
MessageDigest biomeDigest = sha256();
Map blockCache = new HashMap<>();
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricPlatform.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedPlatform.java
similarity index 70%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricPlatform.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedPlatform.java
index 4d82c7480..1200cb7bb 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricPlatform.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedPlatform.java
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.spi.IrisPlatform;
import art.arcane.iris.spi.LogLevel;
@@ -25,34 +25,31 @@ import art.arcane.iris.spi.PlatformCapabilities;
import art.arcane.iris.spi.PlatformRegistries;
import art.arcane.iris.spi.PlatformScheduler;
import art.arcane.iris.spi.PlatformStructureHooks;
-import net.fabricmc.loader.api.FabricLoader;
-import net.fabricmc.loader.api.ModContainer;
import net.minecraft.server.MinecraftServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.util.function.Consumer;
-import java.util.function.Supplier;
-public final class FabricPlatform implements IrisPlatform {
+public final class ModdedPlatform implements IrisPlatform {
private static final Logger LOGGER = LoggerFactory.getLogger("Iris");
private static volatile Consumer ERROR_SINK = null;
- private final Supplier server;
- private final FabricRegistries registries;
- private final FabricScheduler scheduler;
- private final FabricCapabilities capabilities;
- private final FabricStructureHooks structureHooks;
- private final FabricBiomeWriter biomeWriter;
+ private final ModdedLoader loader;
+ private final ModdedRegistries registries;
+ private final ModdedScheduler scheduler;
+ private final ModdedCapabilities capabilities;
+ private final ModdedStructureHooks structureHooks;
+ private final ModdedBiomeWriter biomeWriter;
- public FabricPlatform(Supplier server) {
- this.server = server;
- this.registries = new FabricRegistries(server);
- this.scheduler = new FabricScheduler();
- this.capabilities = new FabricCapabilities();
- this.structureHooks = new FabricStructureHooks(server);
- this.biomeWriter = new FabricBiomeWriter();
+ public ModdedPlatform(ModdedLoader loader) {
+ this.loader = loader;
+ this.registries = new ModdedRegistries(loader::currentServer);
+ this.scheduler = new ModdedScheduler();
+ this.capabilities = new ModdedCapabilities();
+ this.structureHooks = new ModdedStructureHooks(loader::currentServer);
+ this.biomeWriter = new ModdedBiomeWriter();
}
public static void errorSink(Consumer sink) {
@@ -60,19 +57,17 @@ public final class FabricPlatform implements IrisPlatform {
}
public MinecraftServer server() {
- return server.get();
+ return loader.currentServer();
}
@Override
public String platformName() {
- return "fabric";
+ return loader.platformName();
}
@Override
public String minecraftVersion() {
- return FabricLoader.getInstance().getModContainer("minecraft")
- .map((ModContainer container) -> container.getMetadata().getVersion().getFriendlyString())
- .orElse("unknown");
+ return loader.minecraftVersion();
}
@Override
@@ -102,7 +97,7 @@ public final class FabricPlatform implements IrisPlatform {
@Override
public File dataFolder() {
- File folder = FabricLoader.getInstance().getConfigDir().resolve("iris").toFile();
+ File folder = loader.configDir().resolve("iris").toFile();
folder.mkdirs();
return folder;
}
@@ -116,10 +111,8 @@ public final class FabricPlatform implements IrisPlatform {
@Override
public File pluginJar() {
- return FabricLoader.getInstance().getModContainer("irisworldgen")
- .flatMap((ModContainer container) -> container.getOrigin().getPaths().stream().findFirst())
- .map((java.nio.file.Path p) -> p.toFile())
- .orElse(new File(dataFolder(), "iris-fabric.jar"));
+ File jar = loader.modJar();
+ return jar != null ? jar : new File(dataFolder(), "iris-" + loader.platformName() + ".jar");
}
@Override
@@ -167,7 +160,7 @@ public final class FabricPlatform implements IrisPlatform {
}
}
- private static final class FabricCapabilities implements PlatformCapabilities {
+ private static final class ModdedCapabilities implements PlatformCapabilities {
@Override
public boolean customBiomes() {
return true;
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricRegistries.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedRegistries.java
similarity index 87%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricRegistries.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedRegistries.java
index 8e82a99d4..99f906c76 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricRegistries.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedRegistries.java
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.spi.PlatformBiome;
import art.arcane.iris.spi.PlatformBlockState;
@@ -38,37 +38,37 @@ import java.util.List;
import java.util.Locale;
import java.util.function.Supplier;
-public final class FabricRegistries implements PlatformRegistries {
+public final class ModdedRegistries implements PlatformRegistries {
private final Supplier server;
- public FabricRegistries(Supplier server) {
+ public ModdedRegistries(Supplier server) {
this.server = server;
}
@Override
public PlatformBlockState block(String key) {
- return FabricBlockResolution.get(key);
+ return ModdedBlockResolution.get(key);
}
@Override
public PlatformBlockState blockOrNull(String key) {
- return FabricBlockResolution.getOrNull(key);
+ return ModdedBlockResolution.getOrNull(key);
}
@Override
public PlatformBlockState blockOrNull(String key, boolean warn) {
- return FabricBlockResolution.getOrNull(key, warn);
+ return ModdedBlockResolution.getOrNull(key, warn);
}
@Override
public PlatformBlockState air() {
- return FabricBlockResolution.getAir();
+ return ModdedBlockResolution.getAir();
}
@Override
public PlatformBlockState deepSlateOre(PlatformBlockState block, PlatformBlockState ore) {
- BlockState result = FabricBlockResolution.toDeepSlateOre((BlockState) block.nativeHandle(), (BlockState) ore.nativeHandle());
- return FabricBlockState.of(result, null);
+ BlockState result = ModdedBlockResolution.toDeepSlateOre((BlockState) block.nativeHandle(), (BlockState) ore.nativeHandle());
+ return ModdedBlockState.of(result, null);
}
@Override
@@ -82,7 +82,7 @@ public final class FabricRegistries implements PlatformRegistries {
return null;
}
Biome biome = registry.getValue(identifier);
- return biome == null ? null : FabricBiome.of(biome, identifier.toString());
+ return biome == null ? null : ModdedBiome.of(biome, identifier.toString());
}
@Override
@@ -96,7 +96,7 @@ public final class FabricRegistries implements PlatformRegistries {
return null;
}
Item item = BuiltInRegistries.ITEM.getValue(identifier);
- return FabricItem.of(item, identifier.toString());
+ return ModdedItem.of(item, identifier.toString());
}
@Override
@@ -106,7 +106,7 @@ public final class FabricRegistries implements PlatformRegistries {
return null;
}
EntityType> type = BuiltInRegistries.ENTITY_TYPE.getValue(identifier);
- return FabricEntityType.of(type, identifier.toString());
+ return ModdedEntityType.of(type, identifier.toString());
}
@Override
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricScheduler.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedScheduler.java
similarity index 93%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricScheduler.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedScheduler.java
index 28e98d46c..be564079e 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricScheduler.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedScheduler.java
@@ -16,12 +16,12 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.spi.PlatformScheduler;
import art.arcane.iris.spi.PlatformWorld;
-public final class FabricScheduler implements PlatformScheduler {
+public final class ModdedScheduler implements PlatformScheduler {
@Override
public void global(Runnable task) {
task.run();
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricStateMerger.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedStateMerger.java
similarity index 78%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricStateMerger.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedStateMerger.java
index 6a56b52a0..615461fc4 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricStateMerger.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedStateMerger.java
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.engine.object.BlockDataMergeSupport;
import art.arcane.iris.spi.PlatformBlockState;
@@ -25,28 +25,28 @@ import net.minecraft.world.level.block.state.properties.Property;
import java.util.Map;
-public final class FabricStateMerger implements BlockDataMergeSupport.StateMerger {
+public final class ModdedStateMerger implements BlockDataMergeSupport.StateMerger {
@Override
public PlatformBlockState merge(PlatformBlockState base, PlatformBlockState update) {
- FabricBlockState fabricBase = (FabricBlockState) base;
- FabricBlockState fabricUpdate = (FabricBlockState) update;
+ ModdedBlockState fabricBase = (ModdedBlockState) base;
+ ModdedBlockState fabricUpdate = (ModdedBlockState) update;
try {
- return FabricBlockState.of(mergeStates(fabricBase.handle(), fabricUpdate.handle(), fabricUpdate.parsedProperties()), null);
+ return ModdedBlockState.of(mergeStates(fabricBase.handle(), fabricUpdate.handle(), fabricUpdate.parsedProperties()), null);
} catch (IllegalArgumentException e) {
- FabricBlockResolution.Parsed normalizedBase = FabricBlockResolution.resolveGet(FabricBlockState.serialize(fabricBase.handle()));
- FabricBlockResolution.Parsed normalizedUpdate = FabricBlockResolution.resolveGet(FabricBlockState.serialize(fabricUpdate.handle()));
+ ModdedBlockResolution.Parsed normalizedBase = ModdedBlockResolution.resolveGet(ModdedBlockState.serialize(fabricBase.handle()));
+ ModdedBlockResolution.Parsed normalizedUpdate = ModdedBlockResolution.resolveGet(ModdedBlockState.serialize(fabricUpdate.handle()));
if (normalizedBase != null && normalizedUpdate != null) {
try {
- return FabricBlockState.of(mergeStates(normalizedBase.state(), normalizedUpdate.state(), normalizedUpdate.properties()), null);
+ return ModdedBlockState.of(mergeStates(normalizedBase.state(), normalizedUpdate.state(), normalizedUpdate.properties()), null);
} catch (IllegalArgumentException ignored) {
- return FabricBlockState.of(normalizedUpdate.state(), normalizedUpdate.properties());
+ return ModdedBlockState.of(normalizedUpdate.state(), normalizedUpdate.properties());
}
}
if (normalizedUpdate != null) {
- return FabricBlockState.of(normalizedUpdate.state(), normalizedUpdate.properties());
+ return ModdedBlockState.of(normalizedUpdate.state(), normalizedUpdate.properties());
}
return update;
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricStateRotator.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedStateRotator.java
similarity index 97%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricStateRotator.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedStateRotator.java
index 99d05fffc..418741c7b 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricStateRotator.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedStateRotator.java
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.engine.object.IrisObjectRotation;
import art.arcane.iris.spi.IrisLogging;
@@ -37,7 +37,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
-public final class FabricStateRotator implements IrisObjectRotation.StateRotator {
+public final class ModdedStateRotator implements IrisObjectRotation.StateRotator {
private static final String[] FACE_NAMES = {"north", "east", "south", "west", "up", "down"};
private static final String[] WALL_FACE_NAMES = {"north", "south", "east", "west"};
private static final int[][] ROTATION_CYCLE_MODS = {
@@ -47,7 +47,7 @@ public final class FabricStateRotator implements IrisObjectRotation.StateRotator
@Override
public PlatformBlockState rotate(IrisObjectRotation rotation, PlatformBlockState state, int spinxx, int spinyy, int spinzz) {
- FabricBlockState fabric = (FabricBlockState) state;
+ ModdedBlockState fabric = (ModdedBlockState) state;
BlockState d = fabric.handle();
boolean deleted = false;
@@ -75,7 +75,7 @@ public final class FabricStateRotator implements IrisObjectRotation.StateRotator
if (facing.getPossibleValues().contains(t)) {
d = apply(d, facing, t);
- } else if (!FabricBlockResolution.isSolid(d.getBlock().defaultBlockState())) {
+ } else if (!ModdedBlockResolution.isSolid(d.getBlock().defaultBlockState())) {
deleted = true;
}
} else if (rotationProperty != null) {
@@ -168,7 +168,7 @@ public final class FabricStateRotator implements IrisObjectRotation.StateRotator
return null;
}
- return d == fabric.handle() ? state : FabricBlockState.of(d, fabric.parsedProperties());
+ return d == fabric.handle() ? state : ModdedBlockState.of(d, fabric.parsedProperties());
}
private static Property> findFacing(BlockState state) {
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricStructureHooks.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedStructureHooks.java
similarity index 95%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricStructureHooks.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedStructureHooks.java
index fa8debe45..978824977 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricStructureHooks.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedStructureHooks.java
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.spi.PlatformStructureHooks;
import art.arcane.iris.spi.PlatformWorld;
@@ -32,10 +32,10 @@ import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
-public final class FabricStructureHooks implements PlatformStructureHooks {
+public final class ModdedStructureHooks implements PlatformStructureHooks {
private final Supplier server;
- public FabricStructureHooks(Supplier server) {
+ public ModdedStructureHooks(Supplier server) {
this.server = server;
}
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricTileData.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedTileData.java
similarity index 90%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricTileData.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedTileData.java
index 6650feb70..7545c5aba 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricTileData.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedTileData.java
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.engine.object.TileData;
import art.arcane.volmlib.util.collection.KMap;
@@ -24,11 +24,11 @@ import art.arcane.volmlib.util.collection.KMap;
import java.io.DataOutputStream;
import java.io.IOException;
-public final class FabricTileData extends TileData {
+public final class ModdedTileData extends TileData {
private final byte[] raw;
private final KMap tileProperties;
- FabricTileData(byte[] raw, KMap tileProperties) {
+ ModdedTileData(byte[] raw, KMap tileProperties) {
super();
this.raw = raw;
this.tileProperties = tileProperties == null ? new KMap<>() : tileProperties;
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricTileReader.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedTileReader.java
similarity index 96%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricTileReader.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedTileReader.java
index ac6d2a0a9..3afc1afb2 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricTileReader.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedTileReader.java
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.engine.object.TileData;
import art.arcane.volmlib.util.collection.KMap;
@@ -37,13 +37,13 @@ import java.util.Arrays;
import java.util.Locale;
import java.util.function.Supplier;
-public final class FabricTileReader implements TileData.TileReader {
+public final class ModdedTileReader implements TileData.TileReader {
private static final Gson GSON = new GsonBuilder().disableHtmlEscaping().setStrictness(Strictness.LENIENT).create();
private static final int DYE_COLOR_COUNT = 16;
private final Supplier server;
- public FabricTileReader(Supplier server) {
+ public ModdedTileReader(Supplier server) {
this.server = server;
}
@@ -135,7 +135,7 @@ public final class FabricTileReader implements TileData.TileReader {
if (properties == null) {
throw new NullPointerException("properties is marked non-null but is null");
}
- return new FabricTileData(replay.consumed(), properties);
+ return new ModdedTileData(replay.consumed(), properties);
} catch (Throwable e) {
replay.rewind();
return parseLegacy(din, replay);
@@ -156,7 +156,7 @@ public final class FabricTileReader implements TileData.TileReader {
case 3 -> readLootable(din);
default -> throw new IOException("Unknown tile type: " + id);
}
- return new FabricTileData(replay.consumed(), new KMap<>());
+ return new ModdedTileData(replay.consumed(), new KMap<>());
}
private static void readSign(DataInputStream din) throws IOException {
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricWorldCheck.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedWorldCheck.java
similarity index 93%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricWorldCheck.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedWorldCheck.java
index b5529a190..70a9b2d2b 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricWorldCheck.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedWorldCheck.java
@@ -16,9 +16,8 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
-import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.core.BlockPos;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.server.MinecraftServer;
@@ -40,14 +39,14 @@ import java.util.List;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
-public final class FabricWorldCheck {
+public final class ModdedWorldCheck {
private static final Logger LOGGER = LoggerFactory.getLogger("Iris");
- private FabricWorldCheck() {
+ private ModdedWorldCheck() {
}
public static void schedule() {
- Thread thread = new Thread(FabricWorldCheck::waitAndRun, "Iris World Check");
+ Thread thread = new Thread(ModdedWorldCheck::waitAndRun, "Iris World Check");
thread.setDaemon(true);
thread.start();
}
@@ -56,8 +55,8 @@ public final class FabricWorldCheck {
long start = System.currentTimeMillis();
MinecraftServer server = null;
while (System.currentTimeMillis() - start < 600000L) {
- Object instance = FabricLoader.getInstance().getGameInstance();
- if (instance instanceof MinecraftServer candidate && candidate.isReady()) {
+ MinecraftServer candidate = ModdedEngineBootstrap.currentServer();
+ if (candidate != null && candidate.isReady()) {
server = candidate;
break;
}
@@ -90,9 +89,9 @@ public final class FabricWorldCheck {
ServerLevel overworld = server.overworld();
String generatorClass = overworld.getChunkSource().getGenerator().getClass().getName();
LOGGER.info("[worldcheck] overworld generator: {}", generatorClass);
- boolean irisGenerator = overworld.getChunkSource().getGenerator() instanceof IrisFabricChunkGenerator;
+ boolean irisGenerator = overworld.getChunkSource().getGenerator() instanceof IrisModdedChunkGenerator;
if (!irisGenerator) {
- LOGGER.error("[worldcheck] overworld is NOT using IrisFabricChunkGenerator");
+ LOGGER.error("[worldcheck] overworld is NOT using IrisModdedChunkGenerator");
}
BlockPos spawn = overworld.getRespawnData().pos();
diff --git a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricWorldEngines.java b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedWorldEngines.java
similarity index 95%
rename from adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricWorldEngines.java
rename to adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedWorldEngines.java
index 4888c3f34..991b115a1 100644
--- a/adapters/fabric/src/main/java/art/arcane/iris/fabric/FabricWorldEngines.java
+++ b/adapters/modded-common/src/main/java/art/arcane/iris/modded/ModdedWorldEngines.java
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-package art.arcane.iris.fabric;
+package art.arcane.iris.modded;
import art.arcane.iris.core.loader.IrisData;
import art.arcane.iris.engine.IrisEngine;
@@ -24,7 +24,6 @@ import art.arcane.iris.engine.framework.Engine;
import art.arcane.iris.engine.framework.EngineTarget;
import art.arcane.iris.engine.object.IrisDimension;
import art.arcane.iris.engine.object.IrisWorld;
-import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.storage.LevelResource;
@@ -35,11 +34,11 @@ import java.io.File;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
-public final class FabricWorldEngines {
+public final class ModdedWorldEngines {
private static final Logger LOGGER = LoggerFactory.getLogger("Iris");
private static final ConcurrentHashMap ENGINES = new ConcurrentHashMap<>();
- private FabricWorldEngines() {
+ private ModdedWorldEngines() {
}
public static Engine get(ServerLevel level, String dimensionKey) {
@@ -51,7 +50,7 @@ public final class FabricWorldEngines {
}
private static Engine create(ServerLevel level, String dimensionKey) {
- FabricEngineBootstrap.bind();
+ ModdedEngineBootstrap.bind();
File pack = resolvePack(dimensionKey);
IrisData data = IrisData.get(pack);
IrisDimension dimension = data.getDimensionLoader().load(dimensionKey);
@@ -85,7 +84,7 @@ public final class FabricWorldEngines {
}
private static File resolvePack(String dimensionKey) {
- File pack = FabricLoader.getInstance().getConfigDir()
+ File pack = ModdedEngineBootstrap.loader().configDir()
.resolve("irisworldgen")
.resolve("packs")
.resolve(dimensionKey)
diff --git a/adapters/fabric/src/main/resources/data/irisworldgen/dimension_type/overworld.json b/adapters/modded-common/src/main/resources/data/irisworldgen/dimension_type/overworld.json
similarity index 100%
rename from adapters/fabric/src/main/resources/data/irisworldgen/dimension_type/overworld.json
rename to adapters/modded-common/src/main/resources/data/irisworldgen/dimension_type/overworld.json
diff --git a/adapters/fabric/src/main/resources/data/minecraft/dimension/overworld.json b/adapters/modded-common/src/main/resources/data/minecraft/dimension/overworld.json
similarity index 100%
rename from adapters/fabric/src/main/resources/data/minecraft/dimension/overworld.json
rename to adapters/modded-common/src/main/resources/data/minecraft/dimension/overworld.json
diff --git a/adapters/neoforge/build.gradle b/adapters/neoforge/build.gradle
index 02f44592b..20f0bdb49 100644
--- a/adapters/neoforge/build.gradle
+++ b/adapters/neoforge/build.gradle
@@ -1,9 +1,39 @@
+/*
+ * Iris is a World Generator for Minecraft 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 .
+ */
+
+import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
+import org.gradle.api.tasks.compile.JavaCompile
+import org.gradle.jvm.toolchain.JavaLanguageVersion
+
plugins {
id 'java'
+ id 'net.neoforged.moddev' version '2.0.141'
+ alias(libs.plugins.shadow)
}
+Properties rootProperties = new Properties()
+file('../../gradle.properties').withInputStream { InputStream stream -> rootProperties.load(stream) }
+String irisVersion = providers.gradleProperty('irisVersion').getOrElse(rootProperties.getProperty('irisVersion', '4.0.0-26.1'))
+String minecraftVersion = providers.gradleProperty('minecraftVersion').getOrElse(rootProperties.getProperty('minecraftVersion', '26.1.2'))
+String neoForgeVersion = providers.gradleProperty('neoForgeVersion').getOrElse('26.1.2.75')
+
group = 'art.arcane'
-version = rootProject.version
+version = irisVersion
java {
toolchain {
@@ -11,17 +41,144 @@ java {
}
}
+sourceSets {
+ main {
+ java {
+ srcDir '../modded-common/src/main/java'
+ }
+ resources {
+ srcDir '../modded-common/src/main/resources'
+ }
+ }
+}
+
+repositories {
+ mavenCentral()
+ maven {
+ name = 'NeoForged'
+ url = uri('https://maven.neoforged.net/releases/')
+ }
+ maven { url = uri('https://repo.codemc.org/repository/maven-public/') }
+ maven { url = uri('https://jitpack.io') }
+ maven { url = uri('https://hub.spigotmc.org/nexus/content/repositories/snapshots/') }
+}
+
+configurations {
+ bundle {
+ canBeConsumed = false
+ canBeResolved = true
+ }
+ devBundle {
+ canBeConsumed = false
+ canBeResolved = true
+ }
+}
+
+configurations.named('bundle').configure {
+ exclude(group: 'com.google.code.gson')
+ exclude(group: 'com.google.guava')
+ exclude(group: 'commons-io')
+ exclude(group: 'org.apache.commons', module: 'commons-lang3')
+ exclude(group: 'it.unimi.dsi', module: 'fastutil')
+ exclude(group: 'org.slf4j')
+ exclude(group: 'org.apache.logging.log4j')
+ exclude(group: 'de.crazydev22.slimjar.helper')
+ exclude(group: 'de.crazydev22.slimjar')
+ exclude(group: 'io.github.slimjar')
+}
+
+configurations.compileClasspath.extendsFrom(configurations.devBundle)
+configurations.runtimeClasspath.extendsFrom(configurations.devBundle)
+
dependencies {
- implementation(project(':spi'))
+ compileOnly('org.slf4j:slf4j-api:2.0.17')
+ compileOnly(libs.spigot) {
+ transitive = false
+ }
+
+ List