switch from world preset to direct level stems

This commit is contained in:
Julian Krings 2025-03-09 19:18:13 +01:00 committed by Julian Krings
parent a911685aaf
commit 686ae57b5b
10 changed files with 177 additions and 78 deletions

View File

@ -516,7 +516,6 @@ public class Iris extends VolmitPlugin implements Listener {
Iris.info(C.LIGHT_PURPLE + "Preparing Spawn for " + s + "' using Iris:" + generator + "..."); Iris.info(C.LIGHT_PURPLE + "Preparing Spawn for " + s + "' using Iris:" + generator + "...");
WorldCreator c = new WorldCreator(s) WorldCreator c = new WorldCreator(s)
.type(IrisWorldCreator.IRIS)
.generator(getDefaultWorldGenerator(s, generator)) .generator(getDefaultWorldGenerator(s, generator))
.environment(IrisData.loadAnyDimension(generator).getEnvironment()); .environment(IrisData.loadAnyDimension(generator).getEnvironment());
INMS.get().createWorld(c); INMS.get().createWorld(c);

View File

@ -20,46 +20,6 @@ public interface IDataFixer {
return obj; return obj;
} }
default JSONObject createPreset() {
return new JSONObject("""
{
"dimensions": {
"minecraft:overworld": {
"type": "iris:overworld",
"generator": {
"type": "minecraft:noise",
"biome_source": {
"type": "minecraft:multi_noise",
"preset": "minecraft:overworld"
},
"settings": "minecraft:overworld"
}
},
"minecraft:the_end": {
"type": "iris:the_end",
"generator": {
"type": "minecraft:noise",
"biome_source": {
"type": "minecraft:the_end"
},
"settings": "minecraft:end"
}
},
"minecraft:the_nether": {
"type": "iris:the_nether",
"generator": {
"type": "minecraft:noise",
"biome_source": {
"type": "minecraft:multi_noise",
"preset": "minecraft:nether"
},
"settings": "minecraft:nether"
}
}
}
}""");
}
enum Dimension { enum Dimension {
OVERRWORLD, OVERRWORLD,
NETHER, NETHER,

View File

@ -32,8 +32,6 @@ import sun.misc.Unsafe;
import java.io.File; import java.io.File;
public class IrisWorldCreator { public class IrisWorldCreator {
public static final WorldType IRIS;
private String name; private String name;
private boolean studio = false; private boolean studio = false;
private String dimensionName = null; private String dimensionName = null;
@ -85,7 +83,6 @@ public class IrisWorldCreator {
return new WorldCreator(name) return new WorldCreator(name)
.type(IRIS)
.environment(findEnvironment()) .environment(findEnvironment())
.generateStructures(true) .generateStructures(true)
.generator(g).seed(seed); .generator(g).seed(seed);
@ -104,17 +101,4 @@ public class IrisWorldCreator {
this.studio = studio; this.studio = studio;
return this; return this;
} }
static {
try {
var unsafe = new WrappedField<Unsafe, Unsafe>(Unsafe.class, "theUnsafe").get();
var iris = (WorldType) unsafe.allocateInstance(WorldType.class);
unsafe.putIntVolatile(iris, unsafe.objectFieldOffset(Enum.class.getDeclaredField("ordinal")), 0);
unsafe.putObjectVolatile(iris, unsafe.objectFieldOffset(Enum.class.getDeclaredField("name")), "IRIS");
IRIS = iris;
} catch (Throwable e) {
throw new ExceptionInInitializerError(e);
}
}
} }

View File

@ -27,6 +27,7 @@ import net.minecraft.core.Registry;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.nbt.*; import net.minecraft.nbt.*;
import net.minecraft.nbt.Tag; import net.minecraft.nbt.Tag;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.WorldLoader; import net.minecraft.server.WorldLoader;
@ -43,6 +44,8 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.ChunkStatus;
import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.LevelChunk;
import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.dimension.LevelStem;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.block.Biome; import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
@ -571,6 +574,8 @@ public class NMSBinding implements INMSBinding {
public void inject(long seed, Engine engine, World world) { public void inject(long seed, Engine engine, World world) {
var chunkMap = ((CraftWorld)world).getHandle().getChunkSource().chunkMap; var chunkMap = ((CraftWorld)world).getHandle().getChunkSource().chunkMap;
if (!chunkMap.level.dimension().location().getPath().startsWith("iris"))
Iris.error("Loaded world %s with invalid dimension type!", world.getName());
chunkMap.generator = new IrisChunkGenerator(chunkMap.generator, seed, engine, world); chunkMap.generator = new IrisChunkGenerator(chunkMap.generator, seed, engine, world);
} }
@ -645,9 +650,7 @@ public class NMSBinding implements INMSBinding {
old.resources(), old.resources(),
old.dataConfiguration(), old.dataConfiguration(),
old.datapackWorldgen(), old.datapackWorldgen(),
new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of( createRegistryAccess()
new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental()).freeze()
)).freeze()
))); )));
try { try {
@ -656,4 +659,24 @@ public class NMSBinding implements INMSBinding {
field.set(nmsServer, old); field.set(nmsServer, old);
} }
} }
private RegistryAccess.Frozen createRegistryAccess() {
var access = registry();
var dimensions = access.registryOrThrow(Registries.DIMENSION_TYPE);
var levelStems = access.registryOrThrow(Registries.LEVEL_STEM);
var fake = new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental());
register(fake, levelStems, dimensions, LevelStem.OVERWORLD);
register(fake, levelStems, dimensions, LevelStem.NETHER);
register(fake, levelStems, dimensions, LevelStem.END);
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze();
}
private void register(MappedRegistry<LevelStem> target, Registry<LevelStem> levelStems, Registry<DimensionType> dimensions, ResourceKey<LevelStem> key) {
target.register(key, new LevelStem(
dimensions.getHolderOrThrow(ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()))),
levelStems.getOrThrow(key).generator()
), Lifecycle.stable());
}
} }

View File

@ -29,6 +29,8 @@ import net.minecraft.server.commands.data.BlockDataAccessor;
import net.minecraft.tags.TagKey; import net.minecraft.tags.TagKey;
import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.dimension.LevelStem;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.block.Biome; import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
@ -541,6 +543,8 @@ public class NMSBinding implements INMSBinding {
public void inject(long seed, Engine engine, World world) { public void inject(long seed, Engine engine, World world) {
var chunkMap = ((CraftWorld)world).getHandle().getChunkSource().chunkMap; var chunkMap = ((CraftWorld)world).getHandle().getChunkSource().chunkMap;
if (!chunkMap.level.dimension().location().getPath().startsWith("iris"))
Iris.error("Loaded world %s with invalid dimension type!", world.getName());
chunkMap.generator = new IrisChunkGenerator(chunkMap.generator, seed, engine, world); chunkMap.generator = new IrisChunkGenerator(chunkMap.generator, seed, engine, world);
} }
@ -647,9 +651,7 @@ public class NMSBinding implements INMSBinding {
old.resources(), old.resources(),
old.dataConfiguration(), old.dataConfiguration(),
old.datapackWorldgen(), old.datapackWorldgen(),
new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of( createRegistryAccess()
new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental()).freeze()
)).freeze()
))); )));
try { try {
@ -658,4 +660,24 @@ public class NMSBinding implements INMSBinding {
field.set(nmsServer, old); field.set(nmsServer, old);
} }
} }
private RegistryAccess.Frozen createRegistryAccess() {
var access = registry();
var dimensions = access.registryOrThrow(Registries.DIMENSION_TYPE);
var levelStems = access.registryOrThrow(Registries.LEVEL_STEM);
var fake = new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental());
register(fake, levelStems, dimensions, LevelStem.OVERWORLD);
register(fake, levelStems, dimensions, LevelStem.NETHER);
register(fake, levelStems, dimensions, LevelStem.END);
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze();
}
private void register(MappedRegistry<LevelStem> target, Registry<LevelStem> levelStems, Registry<DimensionType> dimensions, ResourceKey<LevelStem> key) {
target.register(key, new LevelStem(
dimensions.getHolderOrThrow(ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()))),
levelStems.getOrThrow(key).generator()
), Lifecycle.stable());
}
} }

View File

@ -29,6 +29,8 @@ import net.minecraft.server.commands.data.BlockDataAccessor;
import net.minecraft.tags.TagKey; import net.minecraft.tags.TagKey;
import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.dimension.LevelStem;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.block.Biome; import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
@ -541,6 +543,8 @@ public class NMSBinding implements INMSBinding {
public void inject(long seed, Engine engine, World world) { public void inject(long seed, Engine engine, World world) {
var chunkMap = ((CraftWorld)world).getHandle().getChunkSource().chunkMap; var chunkMap = ((CraftWorld)world).getHandle().getChunkSource().chunkMap;
if (!chunkMap.level.dimension().location().getPath().startsWith("iris"))
Iris.error("Loaded world %s with invalid dimension type!", world.getName());
chunkMap.generator = new IrisChunkGenerator(chunkMap.generator, seed, engine, world); chunkMap.generator = new IrisChunkGenerator(chunkMap.generator, seed, engine, world);
} }
@ -648,9 +652,7 @@ public class NMSBinding implements INMSBinding {
old.resources(), old.resources(),
old.dataConfiguration(), old.dataConfiguration(),
old.datapackWorldgen(), old.datapackWorldgen(),
new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of( createRegistryAccess()
new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental()).freeze()
)).freeze()
))); )));
try { try {
@ -659,4 +661,24 @@ public class NMSBinding implements INMSBinding {
field.set(nmsServer, old); field.set(nmsServer, old);
} }
} }
private RegistryAccess.Frozen createRegistryAccess() {
var access = registry();
var dimensions = access.registryOrThrow(Registries.DIMENSION_TYPE);
var levelStems = access.registryOrThrow(Registries.LEVEL_STEM);
var fake = new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental());
register(fake, levelStems, dimensions, LevelStem.OVERWORLD);
register(fake, levelStems, dimensions, LevelStem.NETHER);
register(fake, levelStems, dimensions, LevelStem.END);
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze();
}
private void register(MappedRegistry<LevelStem> target, Registry<LevelStem> levelStems, Registry<DimensionType> dimensions, ResourceKey<LevelStem> key) {
target.register(key, new LevelStem(
dimensions.getHolderOrThrow(ResourceKey.create(Registries.DIMENSION_TYPE, new ResourceLocation("iris", key.location().getPath()))),
levelStems.getOrThrow(key).generator()
), Lifecycle.stable());
}
} }

View File

@ -38,6 +38,8 @@ import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.chunk.status.ChunkStatus;
import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.dimension.LevelStem;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.block.Biome; import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
@ -549,6 +551,9 @@ public class NMSBinding implements INMSBinding {
public void inject(long seed, Engine engine, World world) { public void inject(long seed, Engine engine, World world) {
var chunkMap = ((CraftWorld)world).getHandle().getChunkSource().chunkMap; var chunkMap = ((CraftWorld)world).getHandle().getChunkSource().chunkMap;
if (!chunkMap.level.dimension().location().getPath().startsWith("iris"))
Iris.error("Loaded world %s with invalid dimension type!", world.getName());
chunkMap.generator = new IrisChunkGenerator(chunkMap.generator, seed, engine, world); chunkMap.generator = new IrisChunkGenerator(chunkMap.generator, seed, engine, world);
} }
@ -669,9 +674,7 @@ public class NMSBinding implements INMSBinding {
old.resources(), old.resources(),
old.dataConfiguration(), old.dataConfiguration(),
old.datapackWorldgen(), old.datapackWorldgen(),
new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of( createRegistryAccess()
new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental()).freeze()
)).freeze()
))); )));
try { try {
@ -680,4 +683,24 @@ public class NMSBinding implements INMSBinding {
field.set(nmsServer, old); field.set(nmsServer, old);
} }
} }
private RegistryAccess.Frozen createRegistryAccess() {
var access = registry();
var dimensions = access.registryOrThrow(Registries.DIMENSION_TYPE);
var levelStems = access.registryOrThrow(Registries.LEVEL_STEM);
var fake = new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental());
register(fake, levelStems, dimensions, LevelStem.OVERWORLD);
register(fake, levelStems, dimensions, LevelStem.NETHER);
register(fake, levelStems, dimensions, LevelStem.END);
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze();
}
private void register(MappedRegistry<LevelStem> target, Registry<LevelStem> levelStems, Registry<DimensionType> dimensions, ResourceKey<LevelStem> key) {
target.register(key, new LevelStem(
dimensions.getHolder(new ResourceLocation("iris", key.location().getPath())).orElseThrow(),
levelStems.getOrThrow(key).generator()
), RegistrationInfo.BUILT_IN);
}
} }

View File

@ -32,6 +32,8 @@ import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.chunk.status.ChunkStatus;
import net.minecraft.world.level.chunk.status.WorldGenContext; import net.minecraft.world.level.chunk.status.WorldGenContext;
import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.dimension.LevelStem;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.block.Biome; import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
@ -549,6 +551,8 @@ public class NMSBinding implements INMSBinding {
var worldGenContextField = getField(chunkMap.getClass(), WorldGenContext.class); var worldGenContextField = getField(chunkMap.getClass(), WorldGenContext.class);
worldGenContextField.setAccessible(true); worldGenContextField.setAccessible(true);
var worldGenContext = (WorldGenContext) worldGenContextField.get(chunkMap); var worldGenContext = (WorldGenContext) worldGenContextField.get(chunkMap);
if (!chunkMap.level.dimension().location().getPath().startsWith("iris"))
Iris.error("Loaded world %s with invalid dimension type!", world.getName());
var newContext = new WorldGenContext( var newContext = new WorldGenContext(
worldGenContext.level(), new IrisChunkGenerator(worldGenContext.generator(), seed, engine, world), worldGenContext.level(), new IrisChunkGenerator(worldGenContext.generator(), seed, engine, world),
@ -674,9 +678,7 @@ public class NMSBinding implements INMSBinding {
old.resources(), old.resources(),
old.dataConfiguration(), old.dataConfiguration(),
old.datapackWorldgen(), old.datapackWorldgen(),
new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of( createRegistryAccess()
new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental()).freeze()
)).freeze()
))); )));
try { try {
@ -685,4 +687,24 @@ public class NMSBinding implements INMSBinding {
field.set(nmsServer, old); field.set(nmsServer, old);
} }
} }
private RegistryAccess.Frozen createRegistryAccess() {
var access = registry();
var dimensions = access.registryOrThrow(Registries.DIMENSION_TYPE);
var levelStems = access.registryOrThrow(Registries.LEVEL_STEM);
var fake = new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental());
register(fake, levelStems, dimensions, LevelStem.OVERWORLD);
register(fake, levelStems, dimensions, LevelStem.NETHER);
register(fake, levelStems, dimensions, LevelStem.END);
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze();
}
private void register(MappedRegistry<LevelStem> target, Registry<LevelStem> levelStems, Registry<DimensionType> dimensions, ResourceKey<LevelStem> key) {
target.register(key, new LevelStem(
dimensions.getHolder(ResourceLocation.fromNamespaceAndPath("iris", key.location().getPath())).orElseThrow(),
levelStems.getOrThrow(key).generator()
), RegistrationInfo.BUILT_IN);
}
} }

View File

@ -26,6 +26,8 @@ import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.chunk.status.ChunkStatus;
import net.minecraft.world.level.chunk.status.WorldGenContext; import net.minecraft.world.level.chunk.status.WorldGenContext;
import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.dimension.LevelStem;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.block.Biome; import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
@ -538,6 +540,8 @@ public class NMSBinding implements INMSBinding {
var worldGenContextField = getField(chunkMap.getClass(), WorldGenContext.class); var worldGenContextField = getField(chunkMap.getClass(), WorldGenContext.class);
worldGenContextField.setAccessible(true); worldGenContextField.setAccessible(true);
var worldGenContext = (WorldGenContext) worldGenContextField.get(chunkMap); var worldGenContext = (WorldGenContext) worldGenContextField.get(chunkMap);
if (!chunkMap.level.dimension().location().getPath().startsWith("iris"))
Iris.error("Loaded world %s with invalid dimension type!", world.getName());
var newContext = new WorldGenContext( var newContext = new WorldGenContext(
worldGenContext.level(), new IrisChunkGenerator(worldGenContext.generator(), seed, engine, world), worldGenContext.level(), new IrisChunkGenerator(worldGenContext.generator(), seed, engine, world),
@ -663,9 +667,7 @@ public class NMSBinding implements INMSBinding {
old.resources(), old.resources(),
old.dataConfiguration(), old.dataConfiguration(),
old.datapackWorldgen(), old.datapackWorldgen(),
new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of( createRegistryAccess()
new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental()).freeze()
)).freeze()
))); )));
try { try {
@ -674,4 +676,24 @@ public class NMSBinding implements INMSBinding {
field.set(nmsServer, old); field.set(nmsServer, old);
} }
} }
private RegistryAccess.Frozen createRegistryAccess() {
var access = registry();
var dimensions = access.lookupOrThrow(Registries.DIMENSION_TYPE);
var levelStems = access.lookupOrThrow(Registries.LEVEL_STEM);
var fake = new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental());
register(fake, levelStems, dimensions, LevelStem.OVERWORLD);
register(fake, levelStems, dimensions, LevelStem.NETHER);
register(fake, levelStems, dimensions, LevelStem.END);
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze();
}
private void register(MappedRegistry<LevelStem> target, Registry<LevelStem> levelStems, Registry<DimensionType> dimensions, ResourceKey<LevelStem> key) {
target.register(key, new LevelStem(
dimensions.get(ResourceLocation.fromNamespaceAndPath("iris", key.location().getPath())).orElseThrow(),
levelStems.getValueOrThrow(key).generator()
), RegistrationInfo.BUILT_IN);
}
} }

View File

@ -45,6 +45,8 @@ import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.LevelChunk;
import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.chunk.status.ChunkStatus;
import net.minecraft.world.level.chunk.status.WorldGenContext; import net.minecraft.world.level.chunk.status.WorldGenContext;
import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.dimension.LevelStem;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.block.Biome; import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
@ -537,6 +539,8 @@ public class NMSBinding implements INMSBinding {
var worldGenContextField = getField(chunkMap.getClass(), WorldGenContext.class); var worldGenContextField = getField(chunkMap.getClass(), WorldGenContext.class);
worldGenContextField.setAccessible(true); worldGenContextField.setAccessible(true);
var worldGenContext = (WorldGenContext) worldGenContextField.get(chunkMap); var worldGenContext = (WorldGenContext) worldGenContextField.get(chunkMap);
if (!chunkMap.level.dimension().location().getPath().startsWith("iris"))
Iris.error("Loaded world %s with invalid dimension type!", world.getName());
var newContext = new WorldGenContext( var newContext = new WorldGenContext(
worldGenContext.level(), new IrisChunkGenerator(worldGenContext.generator(), seed, engine, world), worldGenContext.level(), new IrisChunkGenerator(worldGenContext.generator(), seed, engine, world),
@ -662,9 +666,7 @@ public class NMSBinding implements INMSBinding {
old.resources(), old.resources(),
old.dataConfiguration(), old.dataConfiguration(),
old.datapackWorldgen(), old.datapackWorldgen(),
new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of( createRegistryAccess()
new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental()).freeze()
)).freeze()
))); )));
try { try {
@ -673,4 +675,24 @@ public class NMSBinding implements INMSBinding {
field.set(nmsServer, old); field.set(nmsServer, old);
} }
} }
private RegistryAccess.Frozen createRegistryAccess() {
var access = registry();
var dimensions = access.lookupOrThrow(Registries.DIMENSION_TYPE);
var levelStems = access.lookupOrThrow(Registries.LEVEL_STEM);
var fake = new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental());
register(fake, levelStems, dimensions, LevelStem.OVERWORLD);
register(fake, levelStems, dimensions, LevelStem.NETHER);
register(fake, levelStems, dimensions, LevelStem.END);
return new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(fake.freeze())).freeze();
}
private void register(MappedRegistry<LevelStem> target, Registry<LevelStem> levelStems, Registry<DimensionType> dimensions, ResourceKey<LevelStem> key) {
target.register(key, new LevelStem(
dimensions.get(ResourceLocation.fromNamespaceAndPath("iris", key.location().getPath())).orElseThrow(),
levelStems.getValueOrThrow(key).generator()
), RegistrationInfo.BUILT_IN);
}
} }