Sealed Seam

This commit is contained in:
Brian Neumann-Fopiano
2026-06-12 02:44:54 -04:00
parent df888e5516
commit af3035088a
8 changed files with 70 additions and 33 deletions
@@ -19,8 +19,8 @@
package art.arcane.iris.engine.framework; package art.arcane.iris.engine.framework;
import art.arcane.iris.core.loader.IrisData; import art.arcane.iris.core.loader.IrisData;
import art.arcane.iris.core.nms.INMS;
import art.arcane.iris.engine.object.IrisWorld; import art.arcane.iris.engine.object.IrisWorld;
import art.arcane.iris.platform.bukkit.BukkitWorld;
import art.arcane.iris.spi.IrisPlatforms; import art.arcane.iris.spi.IrisPlatforms;
import art.arcane.volmlib.util.collection.KList; import art.arcane.volmlib.util.collection.KList;
@@ -85,7 +85,7 @@ public final class StructureReachability {
return Collections.emptySet(); return Collections.emptySet();
} }
Set<String> reachable = new LinkedHashSet<>(); Set<String> reachable = new LinkedHashSet<>();
for (String key : INMS.get().getReachableStructureKeys(world.realWorld())) { for (String key : IrisPlatforms.get().structureHooks().reachableStructureKeys(new BukkitWorld(world.realWorld()))) {
if (key != null && !key.isEmpty()) { if (key != null && !key.isEmpty()) {
reachable.add(key.toLowerCase()); reachable.add(key.toLowerCase());
} }
@@ -108,7 +108,7 @@ public final class StructureReachability {
return missing; return missing;
} }
Set<String> possible = new LinkedHashSet<>(); Set<String> possible = new LinkedHashSet<>();
for (String key : INMS.get().getPossibleBiomeKeys(world.realWorld())) { for (String key : IrisPlatforms.get().structureHooks().possibleBiomeKeys(new BukkitWorld(world.realWorld()))) {
if (key != null) { if (key != null) {
possible.add(key.toLowerCase()); possible.add(key.toLowerCase());
} }
@@ -22,10 +22,10 @@ import art.arcane.iris.Iris;
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;
import art.arcane.iris.core.loader.IrisRegistrant; import art.arcane.iris.core.loader.IrisRegistrant;
import art.arcane.iris.core.nms.INMS;
import art.arcane.iris.engine.data.cache.AtomicCache; import art.arcane.iris.engine.data.cache.AtomicCache;
import art.arcane.iris.engine.object.annotations.*; import art.arcane.iris.engine.object.annotations.*;
import art.arcane.iris.platform.bukkit.BukkitBlockState; import art.arcane.iris.platform.bukkit.BukkitBlockState;
import art.arcane.iris.platform.bukkit.BukkitPlatform;
import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformBlockState;
import art.arcane.volmlib.util.collection.KList; import art.arcane.volmlib.util.collection.KList;
import art.arcane.volmlib.util.collection.KMap; import art.arcane.volmlib.util.collection.KMap;
@@ -215,7 +215,7 @@ public class IrisBlockData extends IrisRegistrant {
entity.putIfAbsent("id", Identifier.fromString(id).toString()); entity.putIfAbsent("id", Identifier.fromString(id).toString());
} }
if (!INMS.get().hasTile(type) || tileData == null || tileData.isEmpty()) if (!BukkitPlatform.hasTile(type) || tileData == null || tileData.isEmpty())
return null; return null;
return new TileData(type, this.tileData); return new TileData(type, this.tileData);
} }
@@ -23,9 +23,9 @@ import art.arcane.iris.core.IrisSettings;
import art.arcane.iris.core.ServerConfigurator.DimensionHeight; import art.arcane.iris.core.ServerConfigurator.DimensionHeight;
import art.arcane.iris.core.loader.IrisData; import art.arcane.iris.core.loader.IrisData;
import art.arcane.iris.platform.bukkit.BukkitBlockState; import art.arcane.iris.platform.bukkit.BukkitBlockState;
import art.arcane.iris.platform.bukkit.BukkitPlatform;
import art.arcane.iris.spi.PlatformBlockState; import art.arcane.iris.spi.PlatformBlockState;
import art.arcane.iris.core.loader.IrisRegistrant; import art.arcane.iris.core.loader.IrisRegistrant;
import art.arcane.iris.core.nms.INMS;
import art.arcane.iris.core.nms.datapack.IDataFixer; import art.arcane.iris.core.nms.datapack.IDataFixer;
import art.arcane.iris.core.nms.datapack.IDataFixer.Dimension; import art.arcane.iris.core.nms.datapack.IDataFixer.Dimension;
import art.arcane.iris.engine.data.cache.AtomicCache; import art.arcane.iris.engine.data.cache.AtomicCache;
@@ -601,7 +601,7 @@ public class IrisDimension extends IrisRegistrant {
"max_format": {} "max_format": {}
} }
} }
""".replace("{}", INMS.get().getDataVersion().getPackFormat() + ""); """.replace("{}", BukkitPlatform.dataPackFormat() + "");
for (File datapacks : folders) { for (File datapacks : folders) {
File mcm = new File(datapacks, "iris/pack.mcmeta"); File mcm = new File(datapacks, "iris/pack.mcmeta");
@@ -20,10 +20,10 @@ package art.arcane.iris.engine.object;
import art.arcane.iris.Iris; import art.arcane.iris.Iris;
import art.arcane.iris.core.link.Identifier; import art.arcane.iris.core.link.Identifier;
import art.arcane.iris.core.nms.INMS;
import art.arcane.iris.core.service.ExternalDataSVC; import art.arcane.iris.core.service.ExternalDataSVC;
import art.arcane.iris.engine.data.cache.AtomicCache; import art.arcane.iris.engine.data.cache.AtomicCache;
import art.arcane.iris.engine.object.annotations.*; import art.arcane.iris.engine.object.annotations.*;
import art.arcane.iris.platform.bukkit.BukkitPlatform;
import art.arcane.volmlib.util.collection.KList; import art.arcane.volmlib.util.collection.KList;
import art.arcane.volmlib.util.collection.KMap; import art.arcane.volmlib.util.collection.KMap;
import art.arcane.iris.util.common.data.B; import art.arcane.iris.util.common.data.B;
@@ -116,7 +116,7 @@ public class IrisLoot {
if (is == null) if (is == null)
return new ItemStack(Material.AIR); return new ItemStack(Material.AIR);
is.setItemMeta(applyProperties(is, rng, debug, null)); is.setItemMeta(applyProperties(is, rng, debug, null));
return INMS.get().applyCustomNbt(is, customNbt); return BukkitPlatform.applyCustomNbt(is, customNbt);
} catch (Throwable e) { } catch (Throwable e) {
Iris.reportError(e); Iris.reportError(e);
return new ItemStack(Material.AIR); return new ItemStack(Material.AIR);
@@ -134,7 +134,7 @@ public class IrisLoot {
if (is == null) if (is == null)
return null; return null;
is.setItemMeta(applyProperties(is, rng, debug, table)); is.setItemMeta(applyProperties(is, rng, debug, table));
return INMS.get().applyCustomNbt(is, customNbt); return BukkitPlatform.applyCustomNbt(is, customNbt);
} catch (Throwable e) { } catch (Throwable e) {
//Iris.reportError(e); //Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
@@ -22,7 +22,7 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import com.google.gson.Strictness; import com.google.gson.Strictness;
import art.arcane.iris.Iris; import art.arcane.iris.Iris;
import art.arcane.iris.core.nms.INMS; import art.arcane.iris.platform.bukkit.BukkitPlatform;
import art.arcane.iris.util.common.reflect.KeyedType; import art.arcane.iris.util.common.reflect.KeyedType;
import art.arcane.volmlib.util.collection.KMap; import art.arcane.volmlib.util.collection.KMap;
import lombok.*; import lombok.*;
@@ -56,7 +56,7 @@ public class TileData implements Cloneable {
} }
public static TileData getTileState(Block block, boolean useLegacy) { public static TileData getTileState(Block block, boolean useLegacy) {
if (!INMS.get().hasTile(block.getType())) if (!BukkitPlatform.hasTile(block.getType()))
return null; return null;
if (useLegacy) { if (useLegacy) {
var legacy = LegacyTileData.fromBukkit(block.getState()); var legacy = LegacyTileData.fromBukkit(block.getState());
@@ -91,14 +91,14 @@ public class TileData implements Cloneable {
if (material == null) throw new IllegalStateException("Material not set"); if (material == null) throw new IllegalStateException("Material not set");
if (block.getType() != material) if (block.getType() != material)
throw new IllegalStateException("Material mismatch: " + block.getType() + " vs " + material); throw new IllegalStateException("Material mismatch: " + block.getType() + " vs " + material);
INMS.get().deserializeTile(properties, block.getLocation()); BukkitPlatform.deserializeTile(properties, block.getLocation());
} }
public TileData fromBukkit(Block block) { public TileData fromBukkit(Block block) {
if (material != null && block.getType() != material) if (material != null && block.getType() != material)
throw new IllegalStateException("Material mismatch: " + block.getType() + " vs " + material); throw new IllegalStateException("Material mismatch: " + block.getType() + " vs " + material);
if (material == null) material = block.getType(); if (material == null) material = block.getType();
properties = INMS.get().serializeTile(block.getLocation()); properties = BukkitPlatform.serializeTile(block.getLocation());
return this; return this;
} }
@@ -31,9 +31,11 @@ import art.arcane.iris.spi.PlatformScheduler;
import art.arcane.iris.spi.PlatformStructureHooks; import art.arcane.iris.spi.PlatformStructureHooks;
import art.arcane.iris.spi.PlatformWorld; import art.arcane.iris.spi.PlatformWorld;
import art.arcane.iris.util.common.scheduling.J; import art.arcane.iris.util.common.scheduling.J;
import art.arcane.volmlib.util.collection.KMap;
import art.arcane.volmlib.util.math.Vector3d; import art.arcane.volmlib.util.math.Vector3d;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.Biome; import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
@@ -41,6 +43,7 @@ import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import java.io.File; import java.io.File;
@@ -105,6 +108,26 @@ public final class BukkitPlatform implements IrisPlatform {
return INMS.get().getBoundingbox(type); return INMS.get().getBoundingbox(type);
} }
public static boolean hasTile(Material material) {
return INMS.get().hasTile(material);
}
public static KMap<String, Object> serializeTile(Location location) {
return INMS.get().serializeTile(location);
}
public static void deserializeTile(KMap<String, Object> properties, Location location) {
INMS.get().deserializeTile(properties, location);
}
public static ItemStack applyCustomNbt(ItemStack itemStack, KMap<String, Object> customNbt) {
return INMS.get().applyCustomNbt(itemStack, customNbt);
}
public static int dataPackFormat() {
return INMS.get().getDataVersion().getPackFormat();
}
@Override @Override
public String platformName() { public String platformName() {
return "bukkit"; return "bukkit";
@@ -50,6 +50,16 @@ public final class BukkitStructureHooks implements PlatformStructureHooks {
return new ArrayList<>(INMS.get().getObjectFeatureKeys()); return new ArrayList<>(INMS.get().getObjectFeatureKeys());
} }
@Override
public List<String> reachableStructureKeys(PlatformWorld world) {
return new ArrayList<>(INMS.get().getReachableStructureKeys(BukkitPlatform.unwrapWorld(world)));
}
@Override
public List<String> possibleBiomeKeys(PlatformWorld world) {
return new ArrayList<>(INMS.get().getPossibleBiomeKeys(BukkitPlatform.unwrapWorld(world)));
}
@Override @Override
public boolean placeFeature(PlatformWorld world, int x, int y, int z, String featureKey, long seed) { public boolean placeFeature(PlatformWorld world, int x, int y, int z, String featureKey, long seed) {
return INMS.get().placeFeature(BukkitPlatform.unwrapWorld(world), x, y, z, featureKey, seed); return INMS.get().placeFeature(BukkitPlatform.unwrapWorld(world), x, y, z, featureKey, seed);
@@ -32,6 +32,10 @@ public interface PlatformStructureHooks {
List<String> objectFeatureKeys(); List<String> objectFeatureKeys();
List<String> reachableStructureKeys(PlatformWorld world);
List<String> possibleBiomeKeys(PlatformWorld world);
boolean placeFeature(PlatformWorld world, int x, int y, int z, String featureKey, long seed); boolean placeFeature(PlatformWorld world, int x, int y, int z, String featureKey, long seed);
int[] placeStructure(PlatformWorld world, int chunkX, int chunkZ, String structureKey, long seed, int maxSpan); int[] placeStructure(PlatformWorld world, int chunkX, int chunkZ, String structureKey, long seed, int maxSpan);