diff --git a/src/main/java/org/betterx/worlds/together/mixin/client/CreateWorldScreenMixin.java b/src/main/java/org/betterx/worlds/together/mixin/client/CreateWorldScreen_Mixin.java similarity index 98% rename from src/main/java/org/betterx/worlds/together/mixin/client/CreateWorldScreenMixin.java rename to src/main/java/org/betterx/worlds/together/mixin/client/CreateWorldScreen_Mixin.java index 86234741..386e3afd 100644 --- a/src/main/java/org/betterx/worlds/together/mixin/client/CreateWorldScreenMixin.java +++ b/src/main/java/org/betterx/worlds/together/mixin/client/CreateWorldScreen_Mixin.java @@ -23,7 +23,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.Optional; @Mixin(CreateWorldScreen.class) -public class CreateWorldScreenMixin { +public class CreateWorldScreen_Mixin { @Shadow @Final public WorldGenSettingsComponent worldGenSettingsComponent; diff --git a/src/main/java/org/betterx/worlds/together/mixin/common/PrimaryLevelDataMixin.java b/src/main/java/org/betterx/worlds/together/mixin/common/PrimaryLevelDataMixin.java index 8ee66955..7dce4fa7 100644 --- a/src/main/java/org/betterx/worlds/together/mixin/common/PrimaryLevelDataMixin.java +++ b/src/main/java/org/betterx/worlds/together/mixin/common/PrimaryLevelDataMixin.java @@ -23,19 +23,6 @@ import org.jetbrains.annotations.Nullable; @Mixin(PrimaryLevelData.class) public class PrimaryLevelDataMixin { - //TODO: 1.19.3 This was changed completley, Replaced by WorldDimensions.bake -// @Shadow -// @Final -// private WorldGenSettings worldGenSettings; - private static final ThreadLocal>> bcl_lastRegistryAccess = ThreadLocal.withInitial( - () -> Optional.empty()); - - // //This is the way a created (new) world is initializing the PrimaryLevelData -// @ModifyArg(method = "(Lnet/minecraft/world/level/LevelSettings;Lnet/minecraft/world/level/levelgen/WorldOptions;Lnet/minecraft/world/level/storage/PrimaryLevelData$SpecialWorldProperty;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) { -// return WorldBootstrap.enforceInNewWorld(worldGenSettings); -// } -// @Inject(method = "parse", at = @At("HEAD")) private static void bcl_parse( Dynamic dynamic, @@ -50,20 +37,7 @@ public class PrimaryLevelDataMixin { CallbackInfoReturnable cir ) { if (dynamic.getOps() instanceof RegistryOps regOps) { - //bcl_lastRegistryAccess.set(Optional.of(regOps)); WorldBootstrap.InGUI.registryReadyOnLoadedWorld(Optional.of(regOps)); } } - - -// //This is the way a loaded (existing) world is initializing the PrimaryLevelData -// @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(); -// WorldBootstrap.InGUI.registryReadyOnLoadedWorld(registryOps); -// settings = WorldBootstrap.enforceInLoadedWorld(registryOps, settings); -// bcl_lastRegistryAccess.set(Optional.empty()); -// return settings; -// } - } diff --git a/src/main/java/org/betterx/worlds/together/mixin/common/WorldDimensionsMixin.java b/src/main/java/org/betterx/worlds/together/mixin/common/WorldDimensionsMixin.java deleted file mode 100644 index 70d9656f..00000000 --- a/src/main/java/org/betterx/worlds/together/mixin/common/WorldDimensionsMixin.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.betterx.worlds.together.mixin.common; - -import net.minecraft.world.level.levelgen.WorldDimensions; - -import org.spongepowered.asm.mixin.Mixin; - -@Mixin(value = WorldDimensions.class, priority = 100) -public class WorldDimensionsMixin { - //TODO:1.19.3 no general registry access available yet as the layerd access is generated after this -// @ModifyVariable(method = "bake", argsOnly = true, at = @At("HEAD")) -// Registry wt_bake(Registry dimensionRegistry) { -// final Registry changedRegistry = WorldBootstrap.enforceInNewWorld(dimensionRegistry); -// return changedRegistry; -// } -} 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 new file mode 100644 index 00000000..6b5ecb74 --- /dev/null +++ b/src/main/java/org/betterx/worlds/together/mixin/common/WorldStem_Mixin.java @@ -0,0 +1,22 @@ +package org.betterx.worlds.together.mixin.common; + +import org.betterx.worlds.together.world.event.WorldBootstrap; + +import net.minecraft.core.LayeredRegistryAccess; +import net.minecraft.server.RegistryLayer; +import net.minecraft.server.WorldStem; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +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); + } + +} 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 a015fa5b..798c7f97 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 @@ -14,11 +14,13 @@ import org.betterx.worlds.together.worldPreset.WorldPresets; import net.minecraft.client.gui.screens.worldselection.WorldGenSettingsComponent; import net.minecraft.core.Holder; +import net.minecraft.core.LayeredRegistryAccess; 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.RegistryLayer; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.levelgen.WorldDimensions; @@ -27,6 +29,7 @@ import net.minecraft.world.level.storage.LevelResource; import net.minecraft.world.level.storage.LevelStorageSource; import java.io.File; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.function.Consumer; @@ -41,11 +44,13 @@ public class WorldBootstrap { } public static RegistryAccess getLastRegistryAccessOrElseBuiltin() { - if (LAST_REGISTRY_ACCESS == null) + if (LAST_REGISTRY_ACCESS == null) { WorldsTogether.LOGGER.error("Tried to read from global registry!"); + } return LAST_REGISTRY_ACCESS; } + public static class Helpers { private static void initializeWorldConfig( LevelStorageSource.LevelStorageAccess levelStorageAccess, @@ -320,7 +325,20 @@ public class WorldBootstrap { WorldEventsImpl.ON_FINALIZED_WORLD_LOAD.emit(e -> e.done(dimensionRegistry)); } - public static Registry enforceInNewWorld(Registry dimensionRegistry) { - return WorldGenUtil.repairBiomeSourceInAllDimensions(LAST_REGISTRY_ACCESS, dimensionRegistry); + public static LayeredRegistryAccess enforceInLayeredRegistry(LayeredRegistryAccess registries) { + RegistryAccess access = registries.compositeAccess(); + InGUI.registryReady(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( + RegistryLayer.DIMENSIONS, + new RegistryAccess.ImmutableRegistryAccess(List.of(changedDimensions)).freeze() + ); + } + return registries; } } diff --git a/src/main/resources/together.mixins.client.json b/src/main/resources/together.mixins.client.json index af54d5ed..872ff870 100644 --- a/src/main/resources/together.mixins.client.json +++ b/src/main/resources/together.mixins.client.json @@ -4,7 +4,7 @@ "package": "org.betterx.worlds.together.mixin.client", "compatibilityLevel": "JAVA_17", "client": [ - "CreateWorldScreenMixin", + "CreateWorldScreen_Mixin", "WorldGenSettingsComponentMixin", "WorldOpenFlowsMixin" ], diff --git a/src/main/resources/together.mixins.common.json b/src/main/resources/together.mixins.common.json index 204fd00b..94c091a8 100644 --- a/src/main/resources/together.mixins.common.json +++ b/src/main/resources/together.mixins.common.json @@ -18,12 +18,12 @@ "RegistryDataLoaderMixin", "RegistryOpsAccessor", "TagLoaderMixin", - "WorldDimensionsMixin", "WorldGenPropertiesMixin", "WorldLoaderMixin", "WorldPresetAccessor", "WorldPresetMixin", - "WorldPresetsBootstrapMixin" + "WorldPresetsBootstrapMixin", + "WorldStem_Mixin" ], "injectors": { "defaultRequire": 1