From c74b7b2d285922959455079e4b6e8c61a8609339 Mon Sep 17 00:00:00 2001 From: Frank Date: Sun, 19 Jun 2022 19:59:29 +0200 Subject: [PATCH] WorldPreset serialization and better structure for BiomeGenerator builder; --- .../betterx/bclib/api/v2/LifeCycleAPI.java | 70 -------- .../betterx/bclib/api/v2/WorldDataAPI.java | 7 +- .../bclib/api/v2/datafixer/DataFixerAPI.java | 68 +------- .../api/v2/generator/BCLChunkGenerator.java | 4 - .../v2/generator/BCLibNetherBiomeSource.java | 13 +- .../bclib/api/v2/levelgen/LevelGenUtil.java | 48 +----- .../v2/levelgen/biomes/InternalBiomeAPI.java | 25 ++- .../WorldGenSettingsComponentAccessor.java | 10 ++ .../mixin/client/CreateWorldScreenMixin.java | 5 +- .../WorldGenSettingsComponentMixin.java | 10 +- .../betterx/bclib/mixin/common/MainMixin.java | 6 +- .../mixin/common/PrimaryLevelDataMixin.java | 9 +- .../bclib/mixin/common/ServerLevelMixin.java | 3 - .../mixin/common/WorldOpenFlowsMixin.java | 10 +- .../bclib/mixin/common/WorldPresetMixin.java | 60 +++++++ .../presets/worldgen/BCLWorldPreset.java | 66 ++++--- .../worldgen/VanillaWorldPresetSettings.java | 30 ++++ .../presets/worldgen/WorldBootstrap.java | 162 ++++++++++++++++++ .../presets/worldgen/WorldPresetSettings.java | 1 + src/main/resources/bclib.mixins.common.json | 2 + 20 files changed, 365 insertions(+), 244 deletions(-) create mode 100644 src/main/java/org/betterx/bclib/interfaces/WorldGenSettingsComponentAccessor.java create mode 100644 src/main/java/org/betterx/bclib/mixin/common/WorldPresetMixin.java create mode 100644 src/main/java/org/betterx/bclib/presets/worldgen/VanillaWorldPresetSettings.java create mode 100644 src/main/java/org/betterx/bclib/presets/worldgen/WorldBootstrap.java diff --git a/src/main/java/org/betterx/bclib/api/v2/LifeCycleAPI.java b/src/main/java/org/betterx/bclib/api/v2/LifeCycleAPI.java index 0ac25ccb..e237ccd4 100644 --- a/src/main/java/org/betterx/bclib/api/v2/LifeCycleAPI.java +++ b/src/main/java/org/betterx/bclib/api/v2/LifeCycleAPI.java @@ -1,16 +1,8 @@ package org.betterx.bclib.api.v2; -import org.betterx.bclib.api.v2.dataexchange.DataExchangeAPI; import org.betterx.bclib.api.v2.datafixer.DataFixerAPI; -import org.betterx.bclib.api.v2.levelgen.LevelGenUtil; -import org.betterx.bclib.api.v2.levelgen.biomes.InternalBiomeAPI; -import org.betterx.bclib.mixin.common.RegistryOpsAccessor; -import net.minecraft.client.gui.screens.worldselection.WorldGenSettingsComponent; import net.minecraft.core.Registry; -import net.minecraft.core.RegistryAccess; -import net.minecraft.nbt.Tag; -import net.minecraft.resources.RegistryOps; import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; @@ -18,13 +10,11 @@ import net.minecraft.server.level.progress.ChunkProgressListener; import net.minecraft.world.level.CustomSpawner; import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.levelgen.WorldGenSettings; import net.minecraft.world.level.storage.LevelStorageSource; import net.minecraft.world.level.storage.ServerLevelData; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import java.util.concurrent.Executor; /** @@ -36,66 +26,6 @@ public class LifeCycleAPI { private final static List beforeLoadLevel = new ArrayList<>(2); - private static void worldCreationStarted(RegistryAccess access) { - InternalBiomeAPI.initRegistry(access); - } - - public static void newWorldSetup( - LevelStorageSource.LevelStorageAccess levelStorageAccess, - WorldGenSettings settings - ) { - DataExchangeAPI.prepareServerside(); - InternalBiomeAPI.prepareNewLevel(); - - DataFixerAPI.createWorldData(levelStorageAccess, settings); - _runBeforeLevelLoad(); - } - - public static void newWorldSetup( - String levelID, - WorldGenSettings worldGenSettings, - LevelStorageSource levelSource - ) { - DataExchangeAPI.prepareServerside(); - InternalBiomeAPI.prepareNewLevel(); - - DataFixerAPI.createWorldData(levelSource, levelID, worldGenSettings); - _runBeforeLevelLoad(); - } - - public static void newWorldSetup(LevelStorageSource.LevelStorageAccess levelStorageAccess) { - InternalBiomeAPI.prepareNewLevel(); - DataFixerAPI.fixData(levelStorageAccess, false, (didFix) -> {/* not called when showUI==false */}); - - _runBeforeLevelLoad(); - } - - public static WorldGenSettings worldLoadStarted(WorldGenSettings settings, Optional> registryOps) { - if (registryOps.orElse(null) instanceof RegistryOpsAccessor acc) { - InternalBiomeAPI.initRegistry(acc.bcl_getRegistryAccess()); - } - settings = LevelGenUtil.fixSettingsInCurrentWorld(registryOps, settings); - - return settings; - } - - public static void worldCreationStarted(RegistryOps regOps) { - if (regOps instanceof RegistryOpsAccessor acc) { - worldCreationStarted(acc.bcl_getRegistryAccess()); - } - } - - public static void worldCreationStarted( - Optional levelStorageAccess, - WorldGenSettingsComponent worldGenSettingsComponent - ) { - worldCreationStarted(worldGenSettingsComponent.registryHolder()); - - if (levelStorageAccess.isPresent()) { - newWorldSetup(levelStorageAccess.get(), worldGenSettingsComponent.settings().worldGenSettings()); - } - } - /** * Register a callback that is called before a level is loaded or created, * but after the {@link WorldDataAPI} was initialized and patches from diff --git a/src/main/java/org/betterx/bclib/api/v2/WorldDataAPI.java b/src/main/java/org/betterx/bclib/api/v2/WorldDataAPI.java index 270d0489..04dbe572 100644 --- a/src/main/java/org/betterx/bclib/api/v2/WorldDataAPI.java +++ b/src/main/java/org/betterx/bclib/api/v2/WorldDataAPI.java @@ -1,13 +1,11 @@ package org.betterx.bclib.api.v2; import org.betterx.bclib.BCLib; -import org.betterx.bclib.api.v2.datafixer.DataFixerAPI; import org.betterx.bclib.util.ModUtil; import net.minecraft.Util; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtIo; -import net.minecraft.world.level.storage.LevelStorageSource.LevelStorageAccess; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; @@ -20,14 +18,13 @@ import java.io.IOException; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.function.Consumer; /** * Mod-specifix data-storage for a world. *

* This class provides the ability for mod to store persistent data inside a world. The Storage for the world is - * currently initialized as part of the {@link DataFixerAPI} in {@link DataFixerAPI#fixData(LevelStorageAccess, boolean, Consumer)} - * or {@link DataFixerAPI#initializeWorldData(File, boolean)} + * currently initialized as part of the {@link org.betterx.bclib.presets.worldgen.WorldBootstrap} in + * {@link org.betterx.bclib.presets.worldgen.WorldBootstrap#initializeWorldDataAPI(File, boolean)} */ public class WorldDataAPI { private static final Map TAGS = Maps.newHashMap(); diff --git a/src/main/java/org/betterx/bclib/api/v2/datafixer/DataFixerAPI.java b/src/main/java/org/betterx/bclib/api/v2/datafixer/DataFixerAPI.java index caec6d57..f1855450 100644 --- a/src/main/java/org/betterx/bclib/api/v2/datafixer/DataFixerAPI.java +++ b/src/main/java/org/betterx/bclib/api/v2/datafixer/DataFixerAPI.java @@ -2,7 +2,6 @@ package org.betterx.bclib.api.v2.datafixer; import org.betterx.bclib.BCLib; import org.betterx.bclib.api.v2.WorldDataAPI; -import org.betterx.bclib.api.v2.levelgen.LevelGenUtil; import org.betterx.bclib.client.gui.screens.AtomicProgressListener; import org.betterx.bclib.client.gui.screens.ConfirmFixScreen; import org.betterx.bclib.client.gui.screens.LevelFixErrorScreen; @@ -19,7 +18,6 @@ import net.minecraft.nbt.*; import net.minecraft.network.chat.Component; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.chunk.storage.RegionFile; -import net.minecraft.world.level.levelgen.WorldGenSettings; import net.minecraft.world.level.storage.LevelResource; import net.minecraft.world.level.storage.LevelStorageSource; import net.minecraft.world.level.storage.LevelStorageSource.LevelStorageAccess; @@ -135,77 +133,17 @@ public class DataFixerAPI { Consumer onResume ) { File levelPath = levelStorageAccess.getLevelPath(LevelResource.ROOT).toFile(); - File levelDat = levelStorageAccess.getLevelPath(LevelResource.LEVEL_DATA_FILE).toFile(); - boolean newWorld = false; - if (!levelDat.exists()) { - BCLib.LOGGER.info("Creating a new World, no fixes needed"); - newWorld = true; - } - - initializeWorldData(levelPath, newWorld); - if (newWorld) return false; - return fixData(levelPath, levelStorageAccess.getLevelId(), showUI, onResume); } /** - * Initializes the DataStorage for this world. If the world is new, the patch registry is initialized to the - * current versions of the plugins. - *

- * This implementation will create a new {@link LevelStorageAccess} and call {@link #initializeWorldData(File, boolean)} - * using the provided root path. - * - * @param levelSource The SourceStorage for this Minecraft instance, You can get this using - * {@code Minecraft.getInstance().getLevelSource()} - * @param levelID The ID of the Level you want to patch - * @param newWorld {@code true} if this is a fresh world + * Creates the patch level file for new worlds */ - public static void initializeWorldData(LevelStorageSource levelSource, String levelID, boolean newWorld) { - wrapCall(levelSource, levelID, (levelStorageAccess) -> { - initializeWorldData(levelStorageAccess, newWorld); - return true; - }); - } - - public static void createWorldData(LevelStorageSource levelSource, String levelID, WorldGenSettings settings) { - wrapCall(levelSource, levelID, (levelStorageAccess) -> { - createWorldData(levelStorageAccess, settings); - return true; - }); - } - - /** - * Initializes the DataStorage for this world. If the world is new, the patch registry is initialized to the - * current versions of the plugins. - * - * @param access levelAccess for the worldd - * @param newWorld {@code true} if this is a fresh world - */ - public static void initializeWorldData(LevelStorageAccess access, boolean newWorld) { - initializeWorldData(access.getLevelPath(LevelResource.ROOT).toFile(), newWorld); - } - - public static void createWorldData(LevelStorageAccess access, WorldGenSettings settings) { - initializeWorldData(access, true); - LevelGenUtil.initializeWorldData(settings); + public static void initializePatchData() { + getMigrationProfile().markApplied(); WorldDataAPI.saveFile(BCLib.MOD_ID); } - /** - * Initializes the DataStorage for this world. If the world is new, the patch registry is initialized to the - * current versions of the plugins. - * - * @param levelBaseDir Folder of the world - * @param newWorld {@code true} if this is a fresh world - */ - public static void initializeWorldData(File levelBaseDir, boolean newWorld) { - WorldDataAPI.load(new File(levelBaseDir, "data")); - - if (newWorld) { - getMigrationProfile().markApplied(); - WorldDataAPI.saveFile(BCLib.MOD_ID); - } - } @Environment(EnvType.CLIENT) private static AtomicProgressListener showProgressScreen() { diff --git a/src/main/java/org/betterx/bclib/api/v2/generator/BCLChunkGenerator.java b/src/main/java/org/betterx/bclib/api/v2/generator/BCLChunkGenerator.java index 39528a2d..70938e95 100644 --- a/src/main/java/org/betterx/bclib/api/v2/generator/BCLChunkGenerator.java +++ b/src/main/java/org/betterx/bclib/api/v2/generator/BCLChunkGenerator.java @@ -104,9 +104,6 @@ public class BCLChunkGenerator extends NoiseBasedChunkGenerator { } } - public static void injectNoiseSettings(WorldGenSettings settings) { - BCLChunkGenerator.injectNoiseSettings(settings, BCLChunkGenerator.ALL_DIMENSIONS); - } public static void injectNoiseSettings( ResourceKey dimensionKey, @@ -127,7 +124,6 @@ public class BCLChunkGenerator extends NoiseBasedChunkGenerator { } public static final Predicate> NON_MANAGED_DIMENSIONS = dim -> dim != LevelStem.NETHER && dim != LevelStem.END; - public static final Predicate> ALL_DIMENSIONS = dim -> true; public static void injectNoiseSettings(WorldGenSettings settings, Predicate> filter) { List> otherDimensions = settings diff --git a/src/main/java/org/betterx/bclib/api/v2/generator/BCLibNetherBiomeSource.java b/src/main/java/org/betterx/bclib/api/v2/generator/BCLibNetherBiomeSource.java index d453e3c2..921842d9 100644 --- a/src/main/java/org/betterx/bclib/api/v2/generator/BCLibNetherBiomeSource.java +++ b/src/main/java/org/betterx/bclib/api/v2/generator/BCLibNetherBiomeSource.java @@ -16,6 +16,7 @@ import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.resources.RegistryOps; import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BiomeTags; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.biome.Climate; @@ -147,13 +148,13 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource { private static boolean isValidNetherBiome(Holder biome, ResourceLocation location) { - return biome.unwrapKey().get().location().toString().equals("betternether:crimson_glowing_woods") - || biome.unwrapKey().get().location().toString().equals("minecraft:crimson_forest") - || biome.unwrapKey().get().location().toString().equals("betternether:crimson_pinewood"); +// return biome.unwrapKey().get().location().toString().equals("betternether:crimson_glowing_woods") +// || biome.unwrapKey().get().location().toString().equals("minecraft:crimson_forest") +// || biome.unwrapKey().get().location().toString().equals("betternether:crimson_pinewood"); -// return NetherBiomes.canGenerateInNether(biome.unwrapKey().get()) || -// biome.is(BiomeTags.IS_NETHER) || -// BiomeAPI.wasRegisteredAsNetherBiome(location); + return NetherBiomes.canGenerateInNether(biome.unwrapKey().get()) || + biome.is(BiomeTags.IS_NETHER) || + BiomeAPI.wasRegisteredAsNetherBiome(location); } private static boolean isValidNonVanillaNetherBiome(Holder biome, ResourceLocation location) { diff --git a/src/main/java/org/betterx/bclib/api/v2/levelgen/LevelGenUtil.java b/src/main/java/org/betterx/bclib/api/v2/levelgen/LevelGenUtil.java index 8899cf3c..69bf27f8 100644 --- a/src/main/java/org/betterx/bclib/api/v2/levelgen/LevelGenUtil.java +++ b/src/main/java/org/betterx/bclib/api/v2/levelgen/LevelGenUtil.java @@ -6,7 +6,7 @@ import org.betterx.bclib.api.v2.generator.BCLBiomeSource; import org.betterx.bclib.api.v2.generator.BCLChunkGenerator; import org.betterx.bclib.api.v2.generator.BCLibEndBiomeSource; import org.betterx.bclib.api.v2.generator.BCLibNetherBiomeSource; -import org.betterx.bclib.mixin.common.RegistryOpsAccessor; +import org.betterx.bclib.presets.worldgen.BCLWorldPreset; import org.betterx.bclib.presets.worldgen.BCLWorldPresetSettings; import org.betterx.bclib.presets.worldgen.BCLWorldPresets; import org.betterx.bclib.presets.worldgen.WorldPresetSettings; @@ -43,7 +43,7 @@ import org.jetbrains.annotations.NotNull; public class LevelGenUtil { private static final String TAG_VERSION = "version"; private static final String TAG_BN_GEN_VERSION = "generator_version"; - private static final String TAG_GENERATOR = "generator"; + public static final String TAG_GENERATOR = "generator"; @NotNull public static LevelStem getBCLNetherLevelStem(Context context, Optional version) { @@ -81,27 +81,6 @@ public class LevelGenUtil { return getBCLEndLevelStem(context, endSource); } - /** - * Datapacks can change the world's generator. This Method will ensure, that the Generators contain - * the correct BiomeSources for this world - * - * @param settings - * @return - * @see BCLChunkGenerator#injectNoiseSettings(WorldGenSettings) for the correcponding behaviour - * for new worlds - */ - public static WorldGenSettings fixSettingsInCurrentWorld( - Optional> registryOps, - WorldGenSettings settings - ) { - if (registryOps.orElse(null) instanceof RegistryOpsAccessor acc) { - return getWorldSettings().repairSettingsOnLoad(acc.bcl_getRegistryAccess(), settings); - } else { - BCLib.LOGGER.error("Unable to obtain registryAccess when enforcing generators."); - } - return settings; - } - public static WorldGenSettings createWorldFromPreset( ResourceKey preset, RegistryAccess registryAccess, @@ -325,27 +304,6 @@ public class LevelGenUtil { generatorSettings.putInt(key.location().toString(), getDimensionVersion(settings, key)); } - public static void initializeWorldData(WorldGenSettings settings) { - updateWorldData(getDimensionVersion(settings, LevelStem.NETHER), getDimensionVersion(settings, LevelStem.END)); - } - - public static void updateWorldData(int netherVersion, int endVersion) { - BCLWorldPresetSettings worldSettings = new BCLWorldPresetSettings(netherVersion, endVersion); - final RegistryAccess registryAccess = RegistryAccess.builtinCopy(); - final RegistryOps registryOps = RegistryOps.create(NbtOps.INSTANCE, registryAccess); - final var codec = WorldPresetSettings.CODEC.orElse(worldSettings); - final var encodeResult = codec.encodeStart(registryOps, worldSettings); - - if (encodeResult.result().isPresent()) { - final CompoundTag settingsNbt = WorldDataAPI.getRootTag(BCLib.TOGETHER_WORLDS); - settingsNbt.put(TAG_GENERATOR, encodeResult.result().get()); - } else { - BCLib.LOGGER.error("Unable to encode world generator settings generator for level.dat."); - } - - WorldDataAPI.saveFile(BCLib.TOGETHER_WORLDS); - } - static CompoundTag getSettingsNbt() { return WorldDataAPI.getCompoundTag(BCLib.TOGETHER_WORLDS, TAG_GENERATOR); } @@ -390,7 +348,7 @@ public class LevelGenUtil { } BCLib.LOGGER.info("Set world to BiomeSource Version " + biomeSourceVersion); - updateWorldData(biomeSourceVersion, biomeSourceVersion); + BCLWorldPreset.writeWorldPresetSettings(new BCLWorldPresetSettings(biomeSourceVersion, biomeSourceVersion)); } } diff --git a/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/InternalBiomeAPI.java b/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/InternalBiomeAPI.java index 61c5e6d4..ad394065 100644 --- a/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/InternalBiomeAPI.java +++ b/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/InternalBiomeAPI.java @@ -5,11 +5,14 @@ import org.betterx.bclib.interfaces.BiomeSourceAccessor; import org.betterx.bclib.interfaces.NoiseGeneratorSettingsProvider; import org.betterx.bclib.interfaces.SurfaceRuleProvider; import org.betterx.bclib.mixin.common.BiomeGenerationSettingsAccessor; +import org.betterx.bclib.mixin.common.RegistryOpsAccessor; import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.core.RegistryAccess; import net.minecraft.data.BuiltinRegistries; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.RegistryOps; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; @@ -65,6 +68,21 @@ public class InternalBiomeAPI { }))); } + public static RegistryAccess worldRegistryAccess() { + return registryAccess; + } + + /** + * Initialize registry for current server. + * + * @param regOps - registryOps for the current Session. + */ + public static void initRegistry(RegistryOps regOps) { + if (regOps instanceof RegistryOpsAccessor acc) { + initRegistry(acc.bcl_getRegistryAccess()); + } + } + /** * Initialize registry for current server. * @@ -159,12 +177,7 @@ public class InternalBiomeAPI { } } } - - /** - * Will apply biome modifications to world, internal usage only. - * - * @param level - */ + @Deprecated(forRemoval = true) public static void applyModificationsDeprecated(ServerLevel level) { //TODO: Now Disabled, because we fix the settings when everything gets loaded diff --git a/src/main/java/org/betterx/bclib/interfaces/WorldGenSettingsComponentAccessor.java b/src/main/java/org/betterx/bclib/interfaces/WorldGenSettingsComponentAccessor.java new file mode 100644 index 00000000..9e142ce2 --- /dev/null +++ b/src/main/java/org/betterx/bclib/interfaces/WorldGenSettingsComponentAccessor.java @@ -0,0 +1,10 @@ +package org.betterx.bclib.interfaces; + +import net.minecraft.core.Holder; +import net.minecraft.world.level.levelgen.presets.WorldPreset; + +import java.util.Optional; + +public interface WorldGenSettingsComponentAccessor { + Optional> bcl_getPreset(); +} diff --git a/src/main/java/org/betterx/bclib/mixin/client/CreateWorldScreenMixin.java b/src/main/java/org/betterx/bclib/mixin/client/CreateWorldScreenMixin.java index 84afca7b..0c4d6bff 100644 --- a/src/main/java/org/betterx/bclib/mixin/client/CreateWorldScreenMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/client/CreateWorldScreenMixin.java @@ -1,9 +1,9 @@ package org.betterx.bclib.mixin.client; -import org.betterx.bclib.api.v2.LifeCycleAPI; import org.betterx.bclib.api.v2.levelgen.LevelGenUtil; import org.betterx.bclib.api.v2.levelgen.biomes.InternalBiomeAPI; import org.betterx.bclib.presets.worldgen.BCLWorldPresets; +import org.betterx.bclib.presets.worldgen.WorldBootstrap; import com.mojang.datafixers.util.Pair; import net.minecraft.client.gui.screens.Screen; @@ -62,6 +62,7 @@ public class CreateWorldScreenMixin { //this is called when a new world is first created @Inject(method = "createNewWorldDirectory", at = @At("RETURN")) void bcl_createNewWorld(CallbackInfoReturnable> cir) { - LifeCycleAPI.worldCreationStarted(cir.getReturnValue(), this.worldGenSettingsComponent); + WorldBootstrap.InGUI.registryReady(this.worldGenSettingsComponent); + WorldBootstrap.InGUI.setupNewWorld(cir.getReturnValue(), this.worldGenSettingsComponent); } } diff --git a/src/main/java/org/betterx/bclib/mixin/client/WorldGenSettingsComponentMixin.java b/src/main/java/org/betterx/bclib/mixin/client/WorldGenSettingsComponentMixin.java index 3bab16b8..61f85204 100644 --- a/src/main/java/org/betterx/bclib/mixin/client/WorldGenSettingsComponentMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/client/WorldGenSettingsComponentMixin.java @@ -1,20 +1,28 @@ package org.betterx.bclib.mixin.client; +import org.betterx.bclib.interfaces.WorldGenSettingsComponentAccessor; + import net.minecraft.client.gui.screens.worldselection.WorldGenSettingsComponent; import net.minecraft.core.Holder; import net.minecraft.world.level.levelgen.presets.WorldPreset; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; import java.util.LinkedList; import java.util.List; +import java.util.Optional; import java.util.function.Predicate; import java.util.stream.Collectors; @Mixin(WorldGenSettingsComponent.class) -public class WorldGenSettingsComponentMixin { +public abstract class WorldGenSettingsComponentMixin implements WorldGenSettingsComponentAccessor { + @Override + @Accessor("preset") + public abstract Optional> bcl_getPreset(); + @ModifyArg(method = "init", index = 0, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/components/CycleButton$Builder;withValues(Ljava/util/List;Ljava/util/List;)Lnet/minecraft/client/gui/components/CycleButton$Builder;")) public List> bcl_SortLists(List> list) { final Predicate> vanilla = (p -> p.unwrapKey() diff --git a/src/main/java/org/betterx/bclib/mixin/common/MainMixin.java b/src/main/java/org/betterx/bclib/mixin/common/MainMixin.java index 203b389c..c6c832d3 100644 --- a/src/main/java/org/betterx/bclib/mixin/common/MainMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/common/MainMixin.java @@ -1,6 +1,6 @@ package org.betterx.bclib.mixin.common; -import org.betterx.bclib.api.v2.LifeCycleAPI; +import org.betterx.bclib.presets.worldgen.WorldBootstrap; import com.mojang.serialization.DynamicOps; import net.minecraft.nbt.Tag; @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable; abstract public class MainMixin { @ModifyVariable(method = "main", ordinal = 0, at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/world/level/storage/LevelStorageSource$LevelStorageAccess;getSummary()Lnet/minecraft/world/level/storage/LevelSummary;")) private static LevelStorageSource.LevelStorageAccess bc_createAccess(LevelStorageSource.LevelStorageAccess levelStorageAccess) { - LifeCycleAPI.newWorldSetup(levelStorageAccess); + WorldBootstrap.DedicatedServer.setupWorld(levelStorageAccess); return levelStorageAccess; } @@ -25,7 +25,7 @@ abstract public class MainMixin { @ModifyArg(method = "method_43613", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/storage/LevelStorageSource$LevelStorageAccess;getDataTag(Lcom/mojang/serialization/DynamicOps;Lnet/minecraft/world/level/DataPackConfig;Lcom/mojang/serialization/Lifecycle;)Lnet/minecraft/world/level/storage/WorldData;")) private static DynamicOps bcl_onCreate(DynamicOps dynamicOps) { if (dynamicOps instanceof RegistryOps regOps) { - LifeCycleAPI.worldCreationStarted(regOps); + WorldBootstrap.DedicatedServer.registryReady(regOps); } return dynamicOps; } diff --git a/src/main/java/org/betterx/bclib/mixin/common/PrimaryLevelDataMixin.java b/src/main/java/org/betterx/bclib/mixin/common/PrimaryLevelDataMixin.java index bef164e0..8816ab4f 100644 --- a/src/main/java/org/betterx/bclib/mixin/common/PrimaryLevelDataMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/common/PrimaryLevelDataMixin.java @@ -1,7 +1,6 @@ package org.betterx.bclib.mixin.common; -import org.betterx.bclib.api.v2.LifeCycleAPI; -import org.betterx.bclib.api.v2.generator.BCLChunkGenerator; +import org.betterx.bclib.presets.worldgen.WorldBootstrap; import com.mojang.datafixers.DataFixer; import com.mojang.serialization.Dynamic; @@ -36,8 +35,7 @@ public class PrimaryLevelDataMixin { //This is the way a created (new) world is initializing the PrimaryLevelData @ModifyArg(method = "(Lnet/minecraft/world/level/LevelSettings;Lnet/minecraft/world/level/levelgen/WorldGenSettings;Lcom/mojang/serialization/Lifecycle;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/storage/PrimaryLevelData;(Lcom/mojang/datafixers/DataFixer;ILnet/minecraft/nbt/CompoundTag;ZIIIFJJIIIZIZZZLnet/minecraft/world/level/border/WorldBorder$Settings;IILjava/util/UUID;Ljava/util/Set;Lnet/minecraft/world/level/timers/TimerQueue;Lnet/minecraft/nbt/CompoundTag;Lnet/minecraft/nbt/CompoundTag;Lnet/minecraft/world/level/LevelSettings;Lnet/minecraft/world/level/levelgen/WorldGenSettings;Lcom/mojang/serialization/Lifecycle;)V")) private static WorldGenSettings bcl_fixOtherSettings(WorldGenSettings worldGenSettings) { - BCLChunkGenerator.injectNoiseSettings(worldGenSettings); - return worldGenSettings; + return WorldBootstrap.enforceInNewWorld(worldGenSettings); } @Inject(method = "parse", at = @At("HEAD")) @@ -62,7 +60,8 @@ public class PrimaryLevelDataMixin { @ModifyArg(method = "parse", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/storage/PrimaryLevelData;(Lcom/mojang/datafixers/DataFixer;ILnet/minecraft/nbt/CompoundTag;ZIIIFJJIIIZIZZZLnet/minecraft/world/level/border/WorldBorder$Settings;IILjava/util/UUID;Ljava/util/Set;Lnet/minecraft/world/level/timers/TimerQueue;Lnet/minecraft/nbt/CompoundTag;Lnet/minecraft/nbt/CompoundTag;Lnet/minecraft/world/level/LevelSettings;Lnet/minecraft/world/level/levelgen/WorldGenSettings;Lcom/mojang/serialization/Lifecycle;)V")) private static WorldGenSettings bcl_fixSettings(WorldGenSettings settings) { Optional> registryOps = bcl_lastRegistryAccess.get(); - settings = LifeCycleAPI.worldLoadStarted(settings, registryOps); + WorldBootstrap.InGUI.registryReady(registryOps); + settings = WorldBootstrap.enforceInLoadedWorld(registryOps, settings); bcl_lastRegistryAccess.set(Optional.empty()); return settings; } diff --git a/src/main/java/org/betterx/bclib/mixin/common/ServerLevelMixin.java b/src/main/java/org/betterx/bclib/mixin/common/ServerLevelMixin.java index 4ef963d5..3d7b9e4a 100644 --- a/src/main/java/org/betterx/bclib/mixin/common/ServerLevelMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/common/ServerLevelMixin.java @@ -3,7 +3,6 @@ package org.betterx.bclib.mixin.common; import org.betterx.bclib.api.v2.LifeCycleAPI; import org.betterx.bclib.api.v2.generator.BCLBiomeSource; import org.betterx.bclib.api.v2.generator.BCLibNetherBiomeSource; -import org.betterx.bclib.api.v2.levelgen.biomes.InternalBiomeAPI; import net.minecraft.core.Holder; import net.minecraft.resources.ResourceKey; @@ -75,8 +74,6 @@ public abstract class ServerLevelMixin extends Level { bl2 ); - InternalBiomeAPI.applyModificationsDeprecated(ServerLevel.class.cast(this)); - if (level.dimension() == Level.NETHER) { BCLibNetherBiomeSource.setWorldHeight(level.getChunkSource().getGenerator().getGenDepth()); } diff --git a/src/main/java/org/betterx/bclib/mixin/common/WorldOpenFlowsMixin.java b/src/main/java/org/betterx/bclib/mixin/common/WorldOpenFlowsMixin.java index a7b33af4..a66a3885 100644 --- a/src/main/java/org/betterx/bclib/mixin/common/WorldOpenFlowsMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/common/WorldOpenFlowsMixin.java @@ -1,10 +1,9 @@ package org.betterx.bclib.mixin.common; import org.betterx.bclib.api.v2.LifeCycleAPI; -import org.betterx.bclib.api.v2.dataexchange.DataExchangeAPI; import org.betterx.bclib.api.v2.datafixer.DataFixerAPI; -import org.betterx.bclib.api.v2.levelgen.biomes.InternalBiomeAPI; import org.betterx.bclib.config.Configs; +import org.betterx.bclib.presets.worldgen.WorldBootstrap; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.worldselection.WorldOpenFlows; @@ -22,6 +21,8 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.Optional; + @Mixin(WorldOpenFlows.class) public abstract class WorldOpenFlowsMixin { @@ -34,8 +35,7 @@ public abstract class WorldOpenFlowsMixin { @Inject(method = "loadLevel", cancellable = true, at = @At("HEAD")) private void bcl_callFixerOnLoad(Screen screen, String levelID, CallbackInfo ci) { - DataExchangeAPI.prepareServerside(); - InternalBiomeAPI.prepareNewLevel(); + WorldBootstrap.InGUI.setupLoadedWorld(levelID, this.levelSource); if (DataFixerAPI.fixData(this.levelSource, levelID, true, (appliedFixes) -> { LifeCycleAPI._runBeforeLevelLoad(); @@ -61,7 +61,7 @@ public abstract class WorldOpenFlowsMixin { WorldGenSettings worldGenSettings, CallbackInfo ci ) { - LifeCycleAPI.newWorldSetup(levelID, worldGenSettings, this.levelSource); + WorldBootstrap.InFreshLevel.setupNewWorld(levelID, worldGenSettings, this.levelSource, Optional.empty()); } @Inject(method = "createLevelFromExistingSettings", at = @At("HEAD")) diff --git a/src/main/java/org/betterx/bclib/mixin/common/WorldPresetMixin.java b/src/main/java/org/betterx/bclib/mixin/common/WorldPresetMixin.java new file mode 100644 index 00000000..9cba651f --- /dev/null +++ b/src/main/java/org/betterx/bclib/mixin/common/WorldPresetMixin.java @@ -0,0 +1,60 @@ +package org.betterx.bclib.mixin.common; + +import org.betterx.bclib.presets.worldgen.BCLWorldPreset; +import org.betterx.bclib.presets.worldgen.WorldPresetSettings; + +import com.mojang.datafixers.kinds.App; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.dimension.LevelStem; +import net.minecraft.world.level.levelgen.presets.WorldPreset; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; + +@Mixin(WorldPreset.class) +public class WorldPresetMixin { + + + @ModifyArg(method = "", at = @At(value = "INVOKE", target = "Lcom/mojang/serialization/codecs/RecordCodecBuilder;create(Ljava/util/function/Function;)Lcom/mojang/serialization/Codec;")) + private static Function, ? extends App, WorldPreset>> foo( + Function, ? extends App, WorldPreset>> builder + ) { + final Function, App, WorldPreset>> CODEC_FUNCTION = builderInstance -> { + RecordCodecBuilder, LevelStem>> dimensionsBuilder = Codec + .unboundedMap( + ResourceKey.codec(Registry.LEVEL_STEM_REGISTRY), + LevelStem.CODEC + ) + .fieldOf("dimensions") + .forGetter((wp) -> (wp instanceof WorldPresetAccessor) + ? ((WorldPresetAccessor) wp).bcl_getDimensions() + : null); + + RecordCodecBuilder> sortBuilder = Codec.INT + .optionalFieldOf("sort_order") + .forGetter(wp -> (wp instanceof BCLWorldPreset) + ? Optional.of(((BCLWorldPreset) wp).sortOrder) + : Optional.empty()); + + RecordCodecBuilder> settingsBuilder = WorldPresetSettings.CODEC + .optionalFieldOf("settings") + .forGetter(wp -> (wp instanceof BCLWorldPreset) + ? Optional.of(((BCLWorldPreset) wp).settings) + : Optional.empty()); + + return builderInstance + .group(dimensionsBuilder, sortBuilder, settingsBuilder) + .apply(builderInstance, BCLWorldPreset::new); + }; + + return CODEC_FUNCTION; + } +} diff --git a/src/main/java/org/betterx/bclib/presets/worldgen/BCLWorldPreset.java b/src/main/java/org/betterx/bclib/presets/worldgen/BCLWorldPreset.java index f29a2e7e..58a642e3 100644 --- a/src/main/java/org/betterx/bclib/presets/worldgen/BCLWorldPreset.java +++ b/src/main/java/org/betterx/bclib/presets/worldgen/BCLWorldPreset.java @@ -1,44 +1,38 @@ package org.betterx.bclib.presets.worldgen; +import org.betterx.bclib.BCLib; +import org.betterx.bclib.api.v2.WorldDataAPI; +import org.betterx.bclib.api.v2.levelgen.LevelGenUtil; import org.betterx.bclib.mixin.common.WorldPresetAccessor; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.Holder; -import net.minecraft.core.Registry; -import net.minecraft.resources.RegistryFileCodec; +import net.minecraft.data.BuiltinRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.RegistryOps; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.levelgen.presets.WorldPreset; import java.util.Map; +import java.util.Optional; public class BCLWorldPreset extends WorldPreset { public final WorldPresetSettings settings; public final int sortOrder; - public static final Codec DIRECT_CODEC = RecordCodecBuilder.create(builderInstance -> { - RecordCodecBuilder, LevelStem>> dimensionsBuidler = Codec - .unboundedMap(ResourceKey.codec(Registry.LEVEL_STEM_REGISTRY), LevelStem.CODEC) - .fieldOf("dimensions") - .forGetter(worldPreset -> worldPreset.getDimensions()); - RecordCodecBuilder sortBuilder = Codec.INT - .fieldOf("sort_order") - .forGetter(wp -> wp.sortOrder); + private static final String TAG_GENERATOR = LevelGenUtil.TAG_GENERATOR; - RecordCodecBuilder settingsBuilder = WorldPresetSettings.CODEC - .fieldOf("settings") - .forGetter(wp -> wp.settings); + private static int NEXT_IN_SORT_ORDER = 1000; - return builderInstance - .group(dimensionsBuidler, sortBuilder, settingsBuilder) - .apply(builderInstance, BCLWorldPreset::new); - }); - - public static final Codec> CODEC = RegistryFileCodec.create( - Registry.WORLD_PRESET_REGISTRY, - (Codec) ((Object) DIRECT_CODEC) - ); + public BCLWorldPreset( + Map, LevelStem> map, + Optional sortOrder, + Optional settings + ) { + this(map, sortOrder.orElse(NEXT_IN_SORT_ORDER++), settings.orElse(VanillaWorldPresetSettings.DEFAULT)); + } public BCLWorldPreset(Map, LevelStem> map, int sortOrder, WorldPresetSettings settings) { super(map); @@ -50,4 +44,28 @@ public class BCLWorldPreset extends WorldPreset { return ((WorldPresetAccessor) this).bcl_getDimensions(); } + public static WorldPresetSettings writeWorldPresetSettings(Optional> worldPreset) { + if (worldPreset.isPresent() && worldPreset.get().value() instanceof BCLWorldPreset wp) { + writeWorldPresetSettings(wp.settings); + return wp.settings; + } else { + writeWorldPresetSettings(VanillaWorldPresetSettings.DEFAULT); + return VanillaWorldPresetSettings.DEFAULT; + } + } + + public static void writeWorldPresetSettings(WorldPresetSettings presetSettings) { + final RegistryOps registryOps = RegistryOps.create(NbtOps.INSTANCE, BuiltinRegistries.ACCESS); + final var codec = WorldPresetSettings.CODEC.orElse(presetSettings); + final var encodeResult = codec.encodeStart(registryOps, presetSettings); + + if (encodeResult.result().isPresent()) { + final CompoundTag settingsNbt = WorldDataAPI.getRootTag(BCLib.TOGETHER_WORLDS); + settingsNbt.put(TAG_GENERATOR, encodeResult.result().get()); + } else { + BCLib.LOGGER.error("Unable to encode world generator settings generator for level.dat."); + } + + WorldDataAPI.saveFile(BCLib.TOGETHER_WORLDS); + } } diff --git a/src/main/java/org/betterx/bclib/presets/worldgen/VanillaWorldPresetSettings.java b/src/main/java/org/betterx/bclib/presets/worldgen/VanillaWorldPresetSettings.java new file mode 100644 index 00000000..1ff10b89 --- /dev/null +++ b/src/main/java/org/betterx/bclib/presets/worldgen/VanillaWorldPresetSettings.java @@ -0,0 +1,30 @@ +package org.betterx.bclib.presets.worldgen; + +import com.mojang.serialization.Codec; +import net.minecraft.core.Holder; +import net.minecraft.core.RegistryAccess; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.levelgen.WorldGenSettings; + +import java.util.Set; + +public class VanillaWorldPresetSettings extends WorldPresetSettings { + public static final VanillaWorldPresetSettings DEFAULT = new VanillaWorldPresetSettings(); + public static final Codec CODEC = Codec.unit(VanillaWorldPresetSettings::new); + + @Override + public Codec codec() { + return CODEC; + } + + @Override + public WorldGenSettings repairSettingsOnLoad(RegistryAccess registryAccess, WorldGenSettings settings) { + return settings; + } + + @Override + public BiomeSource fixBiomeSource(BiomeSource biomeSource, Set> datapackBiomes) { + return biomeSource; + } +} diff --git a/src/main/java/org/betterx/bclib/presets/worldgen/WorldBootstrap.java b/src/main/java/org/betterx/bclib/presets/worldgen/WorldBootstrap.java new file mode 100644 index 00000000..b2c8f9ad --- /dev/null +++ b/src/main/java/org/betterx/bclib/presets/worldgen/WorldBootstrap.java @@ -0,0 +1,162 @@ +package org.betterx.bclib.presets.worldgen; + +import org.betterx.bclib.BCLib; +import org.betterx.bclib.api.v2.LifeCycleAPI; +import org.betterx.bclib.api.v2.WorldDataAPI; +import org.betterx.bclib.api.v2.dataexchange.DataExchangeAPI; +import org.betterx.bclib.api.v2.datafixer.DataFixerAPI; +import org.betterx.bclib.api.v2.levelgen.LevelGenUtil; +import org.betterx.bclib.api.v2.levelgen.biomes.InternalBiomeAPI; +import org.betterx.bclib.interfaces.WorldGenSettingsComponentAccessor; +import org.betterx.bclib.mixin.common.RegistryOpsAccessor; + +import net.minecraft.client.gui.screens.worldselection.WorldGenSettingsComponent; +import net.minecraft.core.Holder; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.RegistryOps; +import net.minecraft.world.level.levelgen.WorldGenSettings; +import net.minecraft.world.level.levelgen.presets.WorldPreset; +import net.minecraft.world.level.storage.LevelResource; +import net.minecraft.world.level.storage.LevelStorageSource; + +import java.io.File; +import java.util.Optional; + +public class WorldBootstrap { + private static class Helpers { + + private static void initializeWorldDataAPI( + LevelStorageSource.LevelStorageAccess levelStorageAccess, + boolean newWorld + ) { + File levelPath = levelStorageAccess.getLevelPath(LevelResource.ROOT).toFile(); + initializeWorldDataAPI(levelPath, newWorld); + } + + private static void setupWorld() { + InternalBiomeAPI.prepareNewLevel(); + DataExchangeAPI.prepareServerside(); + } + + private static void initializeWorldDataAPI(File levelBaseDir, boolean newWorld) { + WorldDataAPI.load(new File(levelBaseDir, "data")); + + if (newWorld) { + WorldDataAPI.saveFile(BCLib.MOD_ID); + } + } + } + + public static class DedicatedServer { + public static void registryReady(RegistryOps regOps) { + InternalBiomeAPI.initRegistry(regOps); + } + + public static void setupWorld(LevelStorageSource.LevelStorageAccess levelStorageAccess) { + Helpers.setupWorld(); + + File levelDat = levelStorageAccess.getLevelPath(LevelResource.LEVEL_DATA_FILE).toFile(); + if (!levelDat.exists()) { + BCLib.LOGGER.info("Creating a new World, no fixes needed"); + Helpers.initializeWorldDataAPI(levelStorageAccess, true); + BCLWorldPreset.writeWorldPresetSettings(Optional.empty()); + DataFixerAPI.initializePatchData(); + } else { + Helpers.initializeWorldDataAPI(levelStorageAccess, false); + DataFixerAPI.fixData(levelStorageAccess, false, (didFix) -> {/* not called when showUI==false */}); + } + + + LifeCycleAPI._runBeforeLevelLoad(); + } + } + + public static class InGUI { + public static void registryReady(WorldGenSettingsComponent worldGenSettingsComponent) { + InternalBiomeAPI.initRegistry(worldGenSettingsComponent.registryHolder()); + } + + public static void registryReady(Optional> registryOps) { + if (registryOps.orElse(null) instanceof RegistryOpsAccessor acc) { + InternalBiomeAPI.initRegistry(acc.bcl_getRegistryAccess()); + } + } + + public static void setupNewWorld( + Optional levelStorageAccess, + WorldGenSettingsComponent worldGenSettingsComponent + ) { + if (levelStorageAccess.isPresent()) { + Helpers.setupWorld(); + + Helpers.initializeWorldDataAPI(levelStorageAccess.get(), true); + + if (worldGenSettingsComponent instanceof WorldGenSettingsComponentAccessor acc) { + BCLWorldPreset.writeWorldPresetSettings(acc.bcl_getPreset()); + } + + DataFixerAPI.initializePatchData(); +// DataFixerAPI.createWorldData( +// levelStorageAccess.get(), +// worldGenSettingsComponent.settings().worldGenSettings() +// ); + + LifeCycleAPI._runBeforeLevelLoad(); + } + } + + /** + * Does not call {@link LifeCycleAPI#_runBeforeLevelLoad()} + */ + public static void setupLoadedWorld( + String levelID, + LevelStorageSource levelSource + ) { + Helpers.setupWorld(); + try { + var levelStorageAccess = levelSource.createAccess(levelID); + Helpers.initializeWorldDataAPI(levelStorageAccess, true); + levelStorageAccess.close(); + } catch (Exception e) { + BCLib.LOGGER.error("Failed to initialize data in world", e); + } + } + } + + public static class InFreshLevel { + public static void setupNewWorld( + String levelID, + WorldGenSettings worldGenSettings, + LevelStorageSource levelSource, + Optional> worldPreset + ) { + InGUI.setupLoadedWorld(levelID, levelSource); + + BCLWorldPreset.writeWorldPresetSettings(worldPreset); + DataFixerAPI.initializePatchData(); + LifeCycleAPI._runBeforeLevelLoad(); + } + } + + public static WorldGenSettings enforceInNewWorld(WorldGenSettings worldGenSettings) { + worldGenSettings = LevelGenUtil + .getWorldSettings() + .repairSettingsOnLoad(InternalBiomeAPI.worldRegistryAccess(), worldGenSettings); + return worldGenSettings; + } + + public static WorldGenSettings enforceInLoadedWorld( + Optional> registryOps, + WorldGenSettings worldGenSettings + ) { + if (registryOps.orElse(null) instanceof RegistryOpsAccessor acc) { + return LevelGenUtil + .getWorldSettings() + .repairSettingsOnLoad(acc.bcl_getRegistryAccess(), worldGenSettings); + //.repairSettingsOnLoad(InternalBiomeAPI.worldRegistryAccess(), worldGenSettings); + } else { + BCLib.LOGGER.error("Unable to obtain registryAccess when enforcing generators."); + } + return worldGenSettings; + } +} diff --git a/src/main/java/org/betterx/bclib/presets/worldgen/WorldPresetSettings.java b/src/main/java/org/betterx/bclib/presets/worldgen/WorldPresetSettings.java index 2b9f745f..7f000fa6 100644 --- a/src/main/java/org/betterx/bclib/presets/worldgen/WorldPresetSettings.java +++ b/src/main/java/org/betterx/bclib/presets/worldgen/WorldPresetSettings.java @@ -47,6 +47,7 @@ public abstract class WorldPresetSettings { public static void bootstrap() { register(BCLib.makeID("bcl_world_preset_settings"), BCLWorldPresetSettings.CODEC); + register(BCLib.makeID("vanilla_world_preset_settings"), VanillaWorldPresetSettings.CODEC); } public abstract Codec codec(); diff --git a/src/main/resources/bclib.mixins.common.json b/src/main/resources/bclib.mixins.common.json index 35a18d72..9a3a31d4 100644 --- a/src/main/resources/bclib.mixins.common.json +++ b/src/main/resources/bclib.mixins.common.json @@ -46,6 +46,8 @@ "WorldGenPropertiesMixin", "WorldGenRegionMixin", "WorldOpenFlowsMixin", + "WorldPresetAccessor", + "WorldPresetMixin", "WorldPresetsBootstrapMixin", "elytra.LivingEntityMixin", "shears.BeehiveBlockMixin",