From b4f9fdf95fd20240a91ecb92fbf060ea82d487f9 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 28 Oct 2022 15:58:46 +0200 Subject: [PATCH] Streamlined WorldBootstrap --- .../bclib/api/v2/levelgen/LevelGenEvents.java | 38 ++-- .../bclib/mixin/client/ModelManagerMixin.java | 32 +++- .../together/levelgen/WorldGenUtil.java | 3 +- .../mixin/client/CreateWorldScreen_Mixin.java | 7 +- .../mixin/client/WorldOpenFlowsMixin.java | 4 +- .../DedicatedServerPropertiesMixin.java | 2 +- .../together/mixin/common/MainMixin.java | 13 +- .../mixin/common/WorldStem_Mixin.java | 5 +- .../together/world/event/BeforeWorldLoad.java | 3 +- .../together/world/event/WorldBootstrap.java | 164 +++++++++--------- .../together/world/event/WorldEvents.java | 1 - .../together/world/event/WorldEventsImpl.java | 3 +- .../worldPreset/TogetherWorldPreset.java | 38 +++- 13 files changed, 172 insertions(+), 141 deletions(-) diff --git a/src/main/java/org/betterx/bclib/api/v2/levelgen/LevelGenEvents.java b/src/main/java/org/betterx/bclib/api/v2/levelgen/LevelGenEvents.java index d94254b3..0589f993 100644 --- a/src/main/java/org/betterx/bclib/api/v2/levelgen/LevelGenEvents.java +++ b/src/main/java/org/betterx/bclib/api/v2/levelgen/LevelGenEvents.java @@ -38,22 +38,21 @@ public class LevelGenEvents { } public static void register() { - WorldEvents.BEFORE_WORLD_LOAD.on(LevelGenEvents::prepareWorld); - WorldEvents.BEFORE_SERVER_WORLD_LOAD.on(LevelGenEvents::prepareServerWorld); + WorldEvents.BEFORE_WORLD_LOAD.on(LevelGenEvents::beforeWorldLoad); WorldEvents.ON_WORLD_LOAD.on(LevelGenEvents::onWorldLoad); - WorldEvents.WORLD_REGISTRY_READY.on(LevelGenEvents::onRegistryReady); + WorldEvents.WORLD_REGISTRY_READY.on(LevelGenEvents::worldRegistryReady); WorldEvents.ON_FINALIZE_LEVEL_STEM.on(LevelGenEvents::finalizeStem); WorldEvents.ON_FINALIZED_WORLD_LOAD.on(LevelGenEvents::finalizedWorldLoad); WorldEvents.PATCH_WORLD.on(LevelGenEvents::patchExistingWorld); - WorldEvents.ADAPT_WORLD_PRESET.on(LevelGenEvents::adaptWorldPresetSettings); + WorldEvents.ADAPT_WORLD_PRESET.on(LevelGenEvents::adaptWorldPreset); - WorldEvents.BEFORE_ADDING_TAGS.on(LevelGenEvents::appplyTags); + WorldEvents.BEFORE_ADDING_TAGS.on(LevelGenEvents::applyBiomeTags); } - private static void appplyTags( + private static void applyBiomeTags( String directory, Map> tagsMap ) { @@ -67,10 +66,10 @@ public class LevelGenEvents { LevelStorageSource.LevelStorageAccess storageAccess, Consumer allDone ) { - return DataFixerAPI.fixData(storageAccess, true, allDone); + return DataFixerAPI.fixData(storageAccess, allDone != null, allDone); } - private static Optional> adaptWorldPresetSettings( + private static Optional> adaptWorldPreset( Optional> currentPreset, WorldDimensions worldDims ) { @@ -110,14 +109,15 @@ public class LevelGenEvents { return currentPreset; } - private static void onRegistryReady(RegistryAccess a) { + private static void worldRegistryReady(RegistryAccess a) { InternalBiomeAPI.initRegistry(a); } - private static void prepareWorld( + private static void beforeWorldLoad( LevelStorageSource.LevelStorageAccess storageAccess, Map, ChunkGenerator> dimensions, - boolean isNewWorld + boolean isNewWorld, + boolean isServer ) { setupWorld(); if (isNewWorld) { @@ -128,22 +128,6 @@ public class LevelGenEvents { } } - private static void prepareServerWorld( - LevelStorageSource.LevelStorageAccess storageAccess, - Map, ChunkGenerator> dimensions, - boolean isNewWorld - ) { - setupWorld(); - - if (isNewWorld) { - WorldConfig.saveFile(BCLib.MOD_ID); - DataFixerAPI.initializePatchData(); - } else { - LevelGenUtil.migrateGeneratorSettings(); - DataFixerAPI.fixData(storageAccess, false, (didFix) -> {/* not called when showUI==false */}); - } - } - private static void onWorldLoad() { LifeCycleAPI._runBeforeLevelLoad(); } diff --git a/src/main/java/org/betterx/bclib/mixin/client/ModelManagerMixin.java b/src/main/java/org/betterx/bclib/mixin/client/ModelManagerMixin.java index f65b8ba0..850b0679 100644 --- a/src/main/java/org/betterx/bclib/mixin/client/ModelManagerMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/client/ModelManagerMixin.java @@ -1,18 +1,32 @@ package org.betterx.bclib.mixin.client; +import org.betterx.bclib.client.BCLibClient; + import net.minecraft.client.resources.model.ModelManager; +import net.minecraft.server.packs.resources.PreparableReloadListener; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.util.profiling.ProfilerFiller; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; @Mixin(ModelManager.class) public class ModelManagerMixin { - //TODO: 1.19.3 Disabled for now -// @Inject(method = "prepare", at = @At("HEAD")) -// private void bclib_loadCustomModels( -// ResourceManager resourceManager, -// ProfilerFiller profilerFiller, -// CallbackInfoReturnable info -// ) { -// BCLibClient.modelBakery.loadCustomModels(resourceManager); -// } + @Inject(method = "reload", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/util/profiling/ProfilerFiller;startTick()V")) + private void bclib_loadCustomModels( + PreparableReloadListener.PreparationBarrier preparationBarrier, + ResourceManager resourceManager, + ProfilerFiller profilerFiller, + ProfilerFiller profilerFiller2, + Executor executor, + Executor executor2, + CallbackInfoReturnable> cir + ) { + BCLibClient.modelBakery.loadCustomModels(resourceManager); + } } diff --git a/src/main/java/org/betterx/worlds/together/levelgen/WorldGenUtil.java b/src/main/java/org/betterx/worlds/together/levelgen/WorldGenUtil.java index a540123e..5229938b 100644 --- a/src/main/java/org/betterx/worlds/together/levelgen/WorldGenUtil.java +++ b/src/main/java/org/betterx/worlds/together/levelgen/WorldGenUtil.java @@ -29,6 +29,7 @@ import net.minecraft.world.level.levelgen.presets.WorldPreset; import net.minecraft.world.level.levelgen.structure.StructureSet; import net.minecraft.world.level.levelgen.synth.NormalNoise; +import java.util.Map; import org.jetbrains.annotations.ApiStatus; public class WorldGenUtil { @@ -228,7 +229,7 @@ public class WorldGenUtil { RegistryAccess registryAccess, Registry dimensionRegistry ) { - var dimensions = TogetherWorldPreset.loadWorldDimensions(); + Map, ChunkGenerator> dimensions = TogetherWorldPreset.loadWorldDimensions(); for (var entry : dimensionRegistry.entrySet()) { boolean didRepair = false; ResourceKey key = entry.getKey(); diff --git a/src/main/java/org/betterx/worlds/together/mixin/client/CreateWorldScreen_Mixin.java b/src/main/java/org/betterx/worlds/together/mixin/client/CreateWorldScreen_Mixin.java index 386e3afd..224c0eab 100644 --- a/src/main/java/org/betterx/worlds/together/mixin/client/CreateWorldScreen_Mixin.java +++ b/src/main/java/org/betterx/worlds/together/mixin/client/CreateWorldScreen_Mixin.java @@ -36,7 +36,7 @@ public class CreateWorldScreen_Mixin { WorldGenSettingsComponent worldGenSettingsComponent, CallbackInfo ci ) { - WorldBootstrap.InGUI.registryReadyOnNewWorld(worldGenSettingsComponent); + //WorldBootstrap.InGUI.registryReadyOnNewWorld(worldGenSettingsComponent); } //Change the WorldPreset that is selected by default on the Create World Screen @@ -51,9 +51,4 @@ public class CreateWorldScreen_Mixin { WorldBootstrap.InGUI.registryReadyOnNewWorld(this.worldGenSettingsComponent); WorldBootstrap.InGUI.setupNewWorld(cir.getReturnValue(), this.worldGenSettingsComponent); } - - @Inject(method = "onCreate", at = @At("HEAD")) - void wt_onCreate(CallbackInfo ci) { - System.out.println("there"); - } } diff --git a/src/main/java/org/betterx/worlds/together/mixin/client/WorldOpenFlowsMixin.java b/src/main/java/org/betterx/worlds/together/mixin/client/WorldOpenFlowsMixin.java index af33c08d..a5be8e10 100644 --- a/src/main/java/org/betterx/worlds/together/mixin/client/WorldOpenFlowsMixin.java +++ b/src/main/java/org/betterx/worlds/together/mixin/client/WorldOpenFlowsMixin.java @@ -35,13 +35,13 @@ public abstract class WorldOpenFlowsMixin { WorldBootstrap.InGUI.setupLoadedWorld(levelID, this.levelSource); if (WorldBootstrap.InGUI.applyWorldPatches(levelSource, levelID, (appliedFixes) -> { - WorldBootstrap.InGUI.finishedWorldLoad(levelID, this.levelSource); + WorldBootstrap.finishedWorldLoad(); this.doLoadLevel(screen, levelID, false, false); })) { //cancel call when fix-screen is presented ci.cancel(); } else { - WorldBootstrap.InGUI.finishedWorldLoad(levelID, this.levelSource); + WorldBootstrap.finishedWorldLoad(); if (WorldsTogether.SURPRESS_EXPERIMENTAL_DIALOG) { this.doLoadLevel(screen, levelID, false, false); //cancel call as we manually start the level load here diff --git a/src/main/java/org/betterx/worlds/together/mixin/common/DedicatedServerPropertiesMixin.java b/src/main/java/org/betterx/worlds/together/mixin/common/DedicatedServerPropertiesMixin.java index a26d5be1..a3dfd93c 100644 --- a/src/main/java/org/betterx/worlds/together/mixin/common/DedicatedServerPropertiesMixin.java +++ b/src/main/java/org/betterx/worlds/together/mixin/common/DedicatedServerPropertiesMixin.java @@ -14,7 +14,7 @@ import java.util.Properties; @Mixin(DedicatedServerProperties.class) public class DedicatedServerPropertiesMixin { //Make sure the default server properties use our Default World Preset by default (read from "level-type") - @ModifyArg(method = "", index = 3, at = @At(value = "INVOKE", target = "Lnet/minecraft/server/dedicated/DedicatedServerProperties$WorldGenProperties;(Ljava/lang/String;Lcom/google/gson/JsonObject;ZLjava/lang/String;)V")) + @ModifyArg(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/dedicated/DedicatedServerProperties$WorldDimensionData;(Lcom/google/gson/JsonObject;Ljava/lang/String;)V")) protected String wt_defaultPreset(String string) { if (WorldsTogether.FORCE_SERVER_TO_BETTERX_PRESET) { return WorldPresets.getDEFAULT().location().toString(); diff --git a/src/main/java/org/betterx/worlds/together/mixin/common/MainMixin.java b/src/main/java/org/betterx/worlds/together/mixin/common/MainMixin.java index f364aba0..57639e95 100644 --- a/src/main/java/org/betterx/worlds/together/mixin/common/MainMixin.java +++ b/src/main/java/org/betterx/worlds/together/mixin/common/MainMixin.java @@ -15,9 +15,12 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable; @Mixin(value = Main.class, priority = 200) abstract public class MainMixin { + private static LevelStorageSource.LevelStorageAccess bcl_levelStorageAccess = null; + @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) { - WorldBootstrap.DedicatedServer.setupWorld(levelStorageAccess); + bcl_levelStorageAccess = levelStorageAccess; + WorldBootstrap.DedicatedServer.applyWorldPatches(levelStorageAccess); return levelStorageAccess; } @@ -27,13 +30,7 @@ abstract public class MainMixin { if (dynamicOps instanceof RegistryOps regOps) { WorldBootstrap.DedicatedServer.registryReady(regOps); } + WorldBootstrap.DedicatedServer.setupWorld(bcl_levelStorageAccess); return dynamicOps; } - - //TODO: 1.19.3 this may be obsolete, as datapacks are handled differently now -// @ModifyArg(method = "method_43613", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/storage/PrimaryLevelData;(Lnet/minecraft/world/level/LevelSettings;Lnet/minecraft/world/level/levelgen/WorldOptions;Lnet/minecraft/world/level/storage/PrimaryLevelData$SpecialWorldProperty;Lcom/mojang/serialization/Lifecycle;)V")) -// private static WorldGenSettings bcl_onCreateLevelData(WorldGenSettings worldGenSettings) { -// WorldBootstrap.DedicatedServer.applyDatapackChangesOnNewWorld(worldGenSettings); -// return worldGenSettings; -// } } diff --git a/src/main/java/org/betterx/worlds/together/mixin/common/WorldStem_Mixin.java b/src/main/java/org/betterx/worlds/together/mixin/common/WorldStem_Mixin.java index 6b5ecb74..da4706c7 100644 --- a/src/main/java/org/betterx/worlds/together/mixin/common/WorldStem_Mixin.java +++ b/src/main/java/org/betterx/worlds/together/mixin/common/WorldStem_Mixin.java @@ -12,11 +12,10 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable; @Mixin(WorldStem.class) public class WorldStem_Mixin { - - //TODO:1.19.3 no general registry access available yet as the layerd access is generated after this @ModifyVariable(method = "", argsOnly = true, at = @At(value = "INVOKE", target = "Ljava/lang/Record;()V", shift = At.Shift.AFTER)) LayeredRegistryAccess wt_bake(LayeredRegistryAccess registries) { - return WorldBootstrap.enforceInLayeredRegistry(registries); + LayeredRegistryAccess rNew = WorldBootstrap.enforceInLayeredRegistry(registries); + return rNew; } } diff --git a/src/main/java/org/betterx/worlds/together/world/event/BeforeWorldLoad.java b/src/main/java/org/betterx/worlds/together/world/event/BeforeWorldLoad.java index 2f3a3929..4335a9d3 100644 --- a/src/main/java/org/betterx/worlds/together/world/event/BeforeWorldLoad.java +++ b/src/main/java/org/betterx/worlds/together/world/event/BeforeWorldLoad.java @@ -11,6 +11,7 @@ public interface BeforeWorldLoad { void prepareWorld( LevelStorageSource.LevelStorageAccess storageAccess, Map, ChunkGenerator> settings, - boolean isNewWorld + boolean isNewWorld, + boolean isServer ); } diff --git a/src/main/java/org/betterx/worlds/together/world/event/WorldBootstrap.java b/src/main/java/org/betterx/worlds/together/world/event/WorldBootstrap.java index 798c7f97..75b891e7 100644 --- a/src/main/java/org/betterx/worlds/together/world/event/WorldBootstrap.java +++ b/src/main/java/org/betterx/worlds/together/world/event/WorldBootstrap.java @@ -78,17 +78,17 @@ public class WorldBootstrap { ); } - private static Map, ChunkGenerator> defaultServerDimensions() { + private static WorldDimensions defaultServerDimensions() { final Holder defaultPreset = defaultServerPreset(); return defaultServerDimensions(defaultPreset); } - private static Map, ChunkGenerator> defaultServerDimensions(Holder defaultPreset) { - final Map, ChunkGenerator> dimensions; + private static WorldDimensions defaultServerDimensions(Holder defaultPreset) { + final WorldDimensions dimensions; if (defaultPreset.value() instanceof TogetherWorldPreset t) { - dimensions = t.getDimensionsMap(); + dimensions = t.getWorldDimensions(); } else { - dimensions = TogetherWorldPreset.getDimensionsMap(net.minecraft.world.level.levelgen.presets.WorldPresets.NORMAL); + dimensions = TogetherWorldPreset.getWorldDimensions(net.minecraft.world.level.levelgen.presets.WorldPresets.NORMAL); } return dimensions; } @@ -118,35 +118,38 @@ public class WorldBootstrap { File levelDat = levelStorageAccess.getLevelPath(LevelResource.LEVEL_DATA_FILE).toFile(); if (!levelDat.exists()) { WorldsTogether.LOGGER.info("Creating a new World, no fixes needed"); - final Map, ChunkGenerator> settings = Helpers.defaultServerDimensions(); + final WorldDimensions dimensions = Helpers.defaultServerDimensions(); - Helpers.initializeWorldConfig(levelStorageAccess, true); - WorldEventsImpl.BEFORE_SERVER_WORLD_LOAD.emit(e -> e.prepareWorld( - levelStorageAccess, settings, true - )); + WorldBootstrap.setupWorld( + levelStorageAccess, TogetherWorldPreset.getDimensionMap(dimensions), + true, true + ); + + Optional> currentPreset = Optional.of(Helpers.defaultServerPreset()); + writeWorldPresets(dimensions, currentPreset); + finishedWorldLoad(); } else { - Helpers.initializeWorldConfig(levelStorageAccess, false); - WorldEventsImpl.BEFORE_SERVER_WORLD_LOAD.emit(e -> e.prepareWorld( - levelStorageAccess, - TogetherWorldPreset.loadWorldDimensions(), - false - )); - WorldEventsImpl.ON_WORLD_LOAD.emit(OnWorldLoad::onLoad); + WorldBootstrap.setupWorld( + levelStorageAccess, TogetherWorldPreset.loadWorldDimensions(), + false, true + ); + finishedWorldLoad(); } } - //Needs to get called after setupWorld - public static void applyDatapackChangesOnNewWorld(WorldDimensions worldDims) { - Optional> currentPreset = Optional.of(Helpers.defaultServerPreset()); - currentPreset = WorldEventsImpl.ADAPT_WORLD_PRESET.emit(currentPreset, worldDims); - - if (currentPreset.map(Holder::value).orElse(null) instanceof WorldPresetAccessor acc) { - TogetherWorldPreset.writeWorldPresetSettings(acc.bcl_getDimensions()); - } else { - WorldsTogether.LOGGER.error("Failed writing together File"); - TogetherWorldPreset.writeWorldPresetSettings(worldDims.dimensions()); + public static boolean applyWorldPatches( + LevelStorageSource.LevelStorageAccess levelStorageAccess + ) { + boolean result = false; + if (levelStorageAccess.getLevelPath(LevelResource.LEVEL_DATA_FILE).toFile().exists()) { + try { + result = WorldEventsImpl.PATCH_WORLD.applyPatches(levelStorageAccess, null); + } catch (Exception e) { + WorldsTogether.LOGGER.error("Failed to initialize data in world", e); + } } - WorldEventsImpl.ON_WORLD_LOAD.emit(OnWorldLoad::onLoad); + + return result; } } @@ -156,13 +159,13 @@ public class WorldBootstrap { } public static void registryReadyOnLoadedWorld(Optional> registryOps) { - if (registryOps.orElse(null) instanceof RegistryOpsAccessor acc) { - Helpers.onRegistryReady(acc.bcl_getRegistryAccess()); - } +// if (registryOps.orElse(null) instanceof RegistryOpsAccessor acc) { +// Helpers.onRegistryReady(acc.bcl_getRegistryAccess()); +// } } public static void registryReady(RegistryAccess access) { - Helpers.onRegistryReady(access); + //Helpers.onRegistryReady(access); } public static void setupNewWorld( @@ -195,35 +198,16 @@ public class WorldBootstrap { Optional> currentPreset, WorldDimensions worldDims ) { - Helpers.initializeWorldConfig(levelStorageAccess, true); - - - final Map, ChunkGenerator> dimensions; + final WorldDimensions dimensions; if (currentPreset.map(Holder::value).orElse(null) instanceof TogetherWorldPreset t) { - dimensions = t.getDimensionsMap(); + dimensions = t.getWorldDimensions(); } else { - dimensions = TogetherWorldPreset.getDimensionsMap(net.minecraft.world.level.levelgen.presets.WorldPresets.NORMAL); + dimensions = TogetherWorldPreset.getWorldDimensions(net.minecraft.world.level.levelgen.presets.WorldPresets.NORMAL); } - // Helpers.setupWorld(); - // DataFixerAPI.initializePatchData(); - WorldEventsImpl.BEFORE_WORLD_LOAD.emit(e -> e.prepareWorld( - levelStorageAccess, - dimensions, - true - )); - - currentPreset = WorldEventsImpl.ADAPT_WORLD_PRESET.emit(currentPreset, worldDims); - - if (currentPreset.map(Holder::value).orElse(null) instanceof WorldPresetAccessor acc) { - TogetherWorldPreset.writeWorldPresetSettings(acc.bcl_getDimensions()); - } else { - WorldsTogether.LOGGER.error("Failed writing together File"); - TogetherWorldPreset.writeWorldPresetSettings(worldDims.dimensions()); - } - - //LifeCycleAPI._runBeforeLevelLoad(); - WorldEventsImpl.ON_WORLD_LOAD.emit(OnWorldLoad::onLoad); + setupWorld(levelStorageAccess, TogetherWorldPreset.getDimensionMap(dimensions), true, false); + writeWorldPresets(worldDims, currentPreset); + finishedWorldLoad(); return currentPreset; } @@ -238,18 +222,11 @@ public class WorldBootstrap { WorldGenUtil.clearPreloadedWorldPresets(); try { var levelStorageAccess = levelSource.createAccess(levelID); - try { - Helpers.initializeWorldConfig(levelStorageAccess, false); - - //Helpers.setupWorld(); - WorldEventsImpl.BEFORE_WORLD_LOAD.emit(e -> e.prepareWorld( - levelStorageAccess, - TogetherWorldPreset.loadWorldDimensions(), - false - )); - } catch (Exception e) { - WorldsTogether.LOGGER.error("Failed to initialize data in world", e); - } + WorldBootstrap.setupWorld( + levelStorageAccess, + TogetherWorldPreset.loadWorldDimensions(), + false, false + ); levelStorageAccess.close(); } catch (Exception e) { WorldsTogether.LOGGER.error("Failed to acquire storage access", e); @@ -273,14 +250,6 @@ public class WorldBootstrap { return result; } - public static void finishedWorldLoad( - String levelID, - LevelStorageSource levelSource - ) { - //LifeCycleAPI._runBeforeLevelLoad(); - WorldEventsImpl.ON_WORLD_LOAD.emit(OnWorldLoad::onLoad); - WorldGenUtil.clearPreloadedWorldPresets(); - } } public static class InFreshLevel { @@ -300,6 +269,39 @@ public class WorldBootstrap { } } + private static void setupWorld( + LevelStorageSource.LevelStorageAccess levelStorageAccess, + Map, ChunkGenerator> dimensions, + boolean newWorld, boolean isServer + ) { + try { + Helpers.initializeWorldConfig(levelStorageAccess, newWorld); + WorldEventsImpl.BEFORE_WORLD_LOAD.emit(e -> e.prepareWorld( + levelStorageAccess, + dimensions, + newWorld, isServer + )); + } catch (Exception e) { + WorldsTogether.LOGGER.error("Failed to initialize data in world", e); + } + } + + private static void writeWorldPresets(WorldDimensions dimensions, Optional> currentPreset) { + currentPreset = WorldEventsImpl.ADAPT_WORLD_PRESET.emit(currentPreset, dimensions); + + if (currentPreset.map(Holder::value).orElse(null) instanceof WorldPresetAccessor acc) { + TogetherWorldPreset.writeWorldPresetSettings(acc.bcl_getDimensions()); + } else { + WorldsTogether.LOGGER.error("Failed writing together File"); + TogetherWorldPreset.writeWorldPresetSettings(dimensions); + } + } + + public static void finishedWorldLoad() { + WorldEventsImpl.ON_WORLD_LOAD.emit(OnWorldLoad::onLoad); + WorldGenUtil.clearPreloadedWorldPresets(); + } + public static void finalizeWorldGenSettings(Registry dimensionRegistry) { String output = "World Dimensions: "; for (var entry : dimensionRegistry.entrySet()) { @@ -327,18 +329,22 @@ public class WorldBootstrap { public static LayeredRegistryAccess enforceInLayeredRegistry(LayeredRegistryAccess registries) { RegistryAccess access = registries.compositeAccess(); - InGUI.registryReady(access); + Helpers.onRegistryReady(access); final Registry dimensions = access.registryOrThrow(Registry.LEVEL_STEM_REGISTRY); final Registry changedDimensions = WorldGenUtil.repairBiomeSourceInAllDimensions(access, dimensions); if (dimensions != changedDimensions) { if (Configs.MAIN_CONFIG.verboseLogging()) { WorldsTogether.LOGGER.info("Loading originally configured Dimensions in World."); } - return registries.replaceFrom( + registries = registries.replaceFrom( RegistryLayer.DIMENSIONS, new RegistryAccess.ImmutableRegistryAccess(List.of(changedDimensions)).freeze() ); + //this will generate a new access object we have to use from now on... + Helpers.onRegistryReady(registries.compositeAccess()); } return registries; } + + } diff --git a/src/main/java/org/betterx/worlds/together/world/event/WorldEvents.java b/src/main/java/org/betterx/worlds/together/world/event/WorldEvents.java index 49f57a17..7206592c 100644 --- a/src/main/java/org/betterx/worlds/together/world/event/WorldEvents.java +++ b/src/main/java/org/betterx/worlds/together/world/event/WorldEvents.java @@ -3,7 +3,6 @@ package org.betterx.worlds.together.world.event; public class WorldEvents { public static final Event WORLD_REGISTRY_READY = WorldEventsImpl.WORLD_REGISTRY_READY; public static final Event BEFORE_WORLD_LOAD = WorldEventsImpl.BEFORE_WORLD_LOAD; - public static final Event BEFORE_SERVER_WORLD_LOAD = WorldEventsImpl.BEFORE_SERVER_WORLD_LOAD; public static final Event ON_WORLD_LOAD = WorldEventsImpl.ON_WORLD_LOAD; public static final Event ON_FINALIZE_LEVEL_STEM = WorldEventsImpl.ON_FINALIZE_LEVEL_STEM; public static final Event ON_FINALIZED_WORLD_LOAD = WorldEventsImpl.ON_FINALIZED_WORLD_LOAD; diff --git a/src/main/java/org/betterx/worlds/together/world/event/WorldEventsImpl.java b/src/main/java/org/betterx/worlds/together/world/event/WorldEventsImpl.java index 14818400..3833af5f 100644 --- a/src/main/java/org/betterx/worlds/together/world/event/WorldEventsImpl.java +++ b/src/main/java/org/betterx/worlds/together/world/event/WorldEventsImpl.java @@ -6,8 +6,7 @@ import org.jetbrains.annotations.ApiStatus; public class WorldEventsImpl { public static final EventImpl WORLD_REGISTRY_READY = new EventImpl<>(); public static final EventImpl BEFORE_WORLD_LOAD = new EventImpl<>(); - public static final EventImpl BEFORE_SERVER_WORLD_LOAD = new EventImpl<>(); - + public static final EventImpl ON_WORLD_LOAD = new EventImpl<>(); public static final EventImpl ON_FINALIZE_LEVEL_STEM = new EventImpl<>(); public static final EventImpl ON_FINALIZED_WORLD_LOAD = new EventImpl<>(); diff --git a/src/main/java/org/betterx/worlds/together/worldPreset/TogetherWorldPreset.java b/src/main/java/org/betterx/worlds/together/worldPreset/TogetherWorldPreset.java index bc4fd3dc..6913767a 100644 --- a/src/main/java/org/betterx/worlds/together/worldPreset/TogetherWorldPreset.java +++ b/src/main/java/org/betterx/worlds/together/worldPreset/TogetherWorldPreset.java @@ -9,9 +9,12 @@ import org.betterx.worlds.together.world.event.WorldBootstrap; import com.mojang.serialization.Codec; import com.mojang.serialization.Dynamic; +import com.mojang.serialization.Lifecycle; import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.MappedRegistry; import net.minecraft.core.Registry; import net.minecraft.core.RegistryAccess; +import net.minecraft.data.BuiltinRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; @@ -19,6 +22,7 @@ import net.minecraft.resources.RegistryOps; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.dimension.LevelStem; +import net.minecraft.world.level.levelgen.WorldDimensions; import net.minecraft.world.level.levelgen.presets.WorldPreset; import java.util.HashMap; @@ -30,6 +34,8 @@ public class TogetherWorldPreset extends WorldPreset { public final int sortOrder; private static int NEXT_IN_SORT_ORDER = 1000; + private final WorldDimensions worldDimensions; + public TogetherWorldPreset( Map, LevelStem> map, @@ -44,6 +50,20 @@ public class TogetherWorldPreset extends WorldPreset { ) { super(map); this.sortOrder = sortOrder; + this.worldDimensions = buildWorldDimensions(map); + } + + public static WorldDimensions buildWorldDimensions(Map, LevelStem> map) { + Registry registry = new MappedRegistry<>(Registry.LEVEL_STEM_REGISTRY, Lifecycle.experimental()); + for (var entry : map.entrySet()) { + Registry.register(registry, entry.getKey(), entry.getValue()); + } + + return new WorldDimensions(registry); + } + + public WorldDimensions getWorldDimensions() { + return this.worldDimensions; } public TogetherWorldPreset withDimensions(Registry dimensions) { @@ -68,6 +88,10 @@ public class TogetherWorldPreset extends WorldPreset { return getDimensions().get(key); } + public static void writeWorldPresetSettings(WorldDimensions dimensions) { + writeWorldPresetSettings(dimensions.dimensions()); + } + public static void writeWorldPresetSettings(Registry dimensions) { DimensionsWrapper wrapper = new DimensionsWrapper(dimensions); writeWorldPresetSettings(wrapper); @@ -129,7 +153,10 @@ public class TogetherWorldPreset extends WorldPreset { public static Registry getDimensions(ResourceKey key) { RegistryAccess access = WorldBootstrap.getLastRegistryAccessOrElseBuiltin(); - var preset = access.registryOrThrow(Registry.WORLD_PRESET_REGISTRY).getHolder(key); + var preset = (access == null + ? BuiltinRegistries.WORLD_PRESET + : access.registryOrThrow(Registry.WORLD_PRESET_REGISTRY)) + .getHolder(key); if (preset.isEmpty()) return null; return preset .get() @@ -144,6 +171,15 @@ public class TogetherWorldPreset extends WorldPreset { return DimensionsWrapper.build(reg); } + public static @NotNull Map, ChunkGenerator> getDimensionMap(WorldDimensions worldDims) { + return DimensionsWrapper.build(worldDims.dimensions()); + } + + public static @NotNull WorldDimensions getWorldDimensions(ResourceKey key) { + Registry reg = getDimensions(key); + return new WorldDimensions(reg); + } + private static class DimensionsWrapper { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance .group(Codec.unboundedMap(