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

@@ -27,6 +27,7 @@ import net.minecraft.core.Registry;
import net.minecraft.core.registries.Registries;
import net.minecraft.nbt.*;
import net.minecraft.nbt.Tag;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
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.ChunkStatus;
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.block.Biome;
import org.bukkit.block.data.BlockData;
@@ -571,6 +574,8 @@ public class NMSBinding implements INMSBinding {
public void inject(long seed, Engine engine, World world) {
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);
}
@@ -645,9 +650,7 @@ public class NMSBinding implements INMSBinding {
old.resources(),
old.dataConfiguration(),
old.datapackWorldgen(),
new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(
new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental()).freeze()
)).freeze()
createRegistryAccess()
)));
try {
@@ -656,4 +659,24 @@ public class NMSBinding implements INMSBinding {
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.world.level.LevelReader;
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.block.Biome;
import org.bukkit.block.data.BlockData;
@@ -541,6 +543,8 @@ public class NMSBinding implements INMSBinding {
public void inject(long seed, Engine engine, World world) {
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);
}
@@ -647,9 +651,7 @@ public class NMSBinding implements INMSBinding {
old.resources(),
old.dataConfiguration(),
old.datapackWorldgen(),
new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(
new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental()).freeze()
)).freeze()
createRegistryAccess()
)));
try {
@@ -658,4 +660,24 @@ public class NMSBinding implements INMSBinding {
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.world.level.LevelReader;
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.block.Biome;
import org.bukkit.block.data.BlockData;
@@ -541,6 +543,8 @@ public class NMSBinding implements INMSBinding {
public void inject(long seed, Engine engine, World world) {
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);
}
@@ -648,9 +652,7 @@ public class NMSBinding implements INMSBinding {
old.resources(),
old.dataConfiguration(),
old.datapackWorldgen(),
new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(
new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental()).freeze()
)).freeze()
createRegistryAccess()
)));
try {
@@ -659,4 +661,24 @@ public class NMSBinding implements INMSBinding {
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.entity.BlockEntityType;
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.block.Biome;
import org.bukkit.block.data.BlockData;
@@ -549,6 +551,9 @@ public class NMSBinding implements INMSBinding {
public void inject(long seed, Engine engine, World world) {
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);
}
@@ -669,9 +674,7 @@ public class NMSBinding implements INMSBinding {
old.resources(),
old.dataConfiguration(),
old.datapackWorldgen(),
new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(
new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental()).freeze()
)).freeze()
createRegistryAccess()
)));
try {
@@ -680,4 +683,24 @@ public class NMSBinding implements INMSBinding {
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.chunk.status.ChunkStatus;
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.block.Biome;
import org.bukkit.block.data.BlockData;
@@ -549,6 +551,8 @@ public class NMSBinding implements INMSBinding {
var worldGenContextField = getField(chunkMap.getClass(), WorldGenContext.class);
worldGenContextField.setAccessible(true);
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(
worldGenContext.level(), new IrisChunkGenerator(worldGenContext.generator(), seed, engine, world),
@@ -674,9 +678,7 @@ public class NMSBinding implements INMSBinding {
old.resources(),
old.dataConfiguration(),
old.datapackWorldgen(),
new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(
new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental()).freeze()
)).freeze()
createRegistryAccess()
)));
try {
@@ -685,4 +687,24 @@ public class NMSBinding implements INMSBinding {
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.chunk.status.ChunkStatus;
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.block.Biome;
import org.bukkit.block.data.BlockData;
@@ -538,6 +540,8 @@ public class NMSBinding implements INMSBinding {
var worldGenContextField = getField(chunkMap.getClass(), WorldGenContext.class);
worldGenContextField.setAccessible(true);
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(
worldGenContext.level(), new IrisChunkGenerator(worldGenContext.generator(), seed, engine, world),
@@ -663,9 +667,7 @@ public class NMSBinding implements INMSBinding {
old.resources(),
old.dataConfiguration(),
old.datapackWorldgen(),
new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(
new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental()).freeze()
)).freeze()
createRegistryAccess()
)));
try {
@@ -674,4 +676,24 @@ public class NMSBinding implements INMSBinding {
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.status.ChunkStatus;
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.block.Biome;
import org.bukkit.block.data.BlockData;
@@ -537,6 +539,8 @@ public class NMSBinding implements INMSBinding {
var worldGenContextField = getField(chunkMap.getClass(), WorldGenContext.class);
worldGenContextField.setAccessible(true);
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(
worldGenContext.level(), new IrisChunkGenerator(worldGenContext.generator(), seed, engine, world),
@@ -662,9 +666,7 @@ public class NMSBinding implements INMSBinding {
old.resources(),
old.dataConfiguration(),
old.datapackWorldgen(),
new RegistryAccess.Frozen.ImmutableRegistryAccess(List.of(
new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.experimental()).freeze()
)).freeze()
createRegistryAccess()
)));
try {
@@ -673,4 +675,24 @@ public class NMSBinding implements INMSBinding {
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);
}
}