diff --git a/src/main/java/org/betterx/bclib/mixin/common/BiomeSourceMixin.java b/src/main/java/org/betterx/bclib/mixin/common/BiomeSourceMixin.java index e70401de..f64afc71 100644 --- a/src/main/java/org/betterx/bclib/mixin/common/BiomeSourceMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/common/BiomeSourceMixin.java @@ -7,7 +7,11 @@ import org.betterx.bclib.BCLib; import org.betterx.bclib.interfaces.BiomeSourceAccessor; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +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.List; import java.util.Set; @Mixin(BiomeSource.class) @@ -21,4 +25,14 @@ public abstract class BiomeSourceMixin implements BiomeSourceAccessor { BCLib.LOGGER.info("Rebuilding features in BiomeSource " + this); //featuresPerStep = Suppliers.memoize(() -> FeatureSorter.buildFeaturesPerStep(this.possibleBiomes().stream().toList(), true)); } + + @Inject(method = "(Ljava/util/List;)V", at = @At("TAIL")) + public void bcl_init(List list, CallbackInfo ci) { + System.out.println("new BiomeSource (" + Integer.toHexString(hashCode()) + ", biomes=" + possibleBiomes().size() + ")"); + if (possibleBiomes().size() == 27) { + System.out.println("Nether????"); + } else if (possibleBiomes().size() == 2) { + System.out.println("Datapack Nether???"); + } + } } diff --git a/src/main/java/org/betterx/bclib/mixin/common/MultiPackResourceManagerMixin.java b/src/main/java/org/betterx/bclib/mixin/common/MultiPackResourceManagerMixin.java index 4cf31f22..f6ed11c6 100644 --- a/src/main/java/org/betterx/bclib/mixin/common/MultiPackResourceManagerMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/common/MultiPackResourceManagerMixin.java @@ -22,14 +22,14 @@ public class MultiPackResourceManagerMixin { @Inject(method = "getResource", at = @At("HEAD"), cancellable = true) private void bclib_hasResource(ResourceLocation resourceLocation, CallbackInfoReturnable> info) { -// if (resourceLocation.getNamespace().equals("minecraft")) { -// for (String key : BCLIB_MISSING_RESOURCES) { -// if (resourceLocation.getPath().equals(key)) { + if (resourceLocation.getNamespace().equals("minecraft")) { + for (String key : BCLIB_MISSING_RESOURCES) { + if (resourceLocation.getPath().equals(key)) { // info.setReturnValue(Optional.empty()); // info.cancel(); -// return; -// } -// } -// } + return; + } + } + } } } diff --git a/src/main/java/org/betterx/bclib/mixin/common/PrimaryLevelDataMixin.java b/src/main/java/org/betterx/bclib/mixin/common/PrimaryLevelDataMixin.java new file mode 100644 index 00000000..ccd668bf --- /dev/null +++ b/src/main/java/org/betterx/bclib/mixin/common/PrimaryLevelDataMixin.java @@ -0,0 +1,26 @@ +package org.betterx.bclib.mixin.common; + +import net.minecraft.world.level.LevelSettings; +import net.minecraft.world.level.dimension.BuiltinDimensionTypes; +import net.minecraft.world.level.dimension.LevelStem; +import net.minecraft.world.level.levelgen.WorldGenSettings; +import net.minecraft.world.level.storage.PrimaryLevelData; + +import org.betterx.bclib.presets.worldgen.WorldPresets; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +@Mixin(PrimaryLevelData.class) +public class PrimaryLevelDataMixin { + @Shadow + private LevelSettings settings; + + @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) { + settings = WorldPresets.fixSettingsInCurrentWorld(LevelStem.NETHER, BuiltinDimensionTypes.NETHER, settings); + settings = WorldPresets.fixSettingsInCurrentWorld(LevelStem.END, BuiltinDimensionTypes.END, settings); + return settings; + } +} 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 eae0c1c2..f7eae3ec 100644 --- a/src/main/java/org/betterx/bclib/mixin/common/WorldOpenFlowsMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/common/WorldOpenFlowsMixin.java @@ -3,12 +3,20 @@ package org.betterx.bclib.mixin.common; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.worldselection.WorldOpenFlows; import net.minecraft.core.RegistryAccess; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.RegistryOps; import net.minecraft.server.ReloadableServerResources; +import net.minecraft.server.WorldLoader; +import net.minecraft.server.WorldStem; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.world.level.DataPackConfig; import net.minecraft.world.level.LevelSettings; import net.minecraft.world.level.levelgen.WorldGenSettings; import net.minecraft.world.level.storage.LevelStorageSource; import net.minecraft.world.level.storage.WorldData; +import com.mojang.datafixers.util.Pair; import org.betterx.bclib.api.LifeCycleAPI; import org.betterx.bclib.api.biomes.BiomeAPI; import org.betterx.bclib.api.dataexchange.DataExchangeAPI; @@ -20,6 +28,7 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(WorldOpenFlows.class) public abstract class WorldOpenFlowsMixin { @@ -77,4 +86,24 @@ public abstract class WorldOpenFlowsMixin { DataFixerAPI.createWorldData(levelStorageAccess, worldData.worldGenSettings()); LifeCycleAPI._runBeforeLevelLoad(); } + + @Inject(method = "loadWorldStem(Lnet/minecraft/server/WorldLoader$PackConfig;Lnet/minecraft/server/WorldLoader$WorldDataSupplier;)Lnet/minecraft/server/WorldStem;", at = @At("RETURN")) + public void bcl_loadWorldStem(WorldLoader.PackConfig packConfig, + WorldLoader.WorldDataSupplier worldDataSupplier, + CallbackInfoReturnable cir) { + WorldStem result = cir.getReturnValue(); + } + + @Inject(method = "method_41887", at = @At("RETURN")) + private static void bcl_loadWorldStem(LevelStorageSource.LevelStorageAccess levelStorageAccess, + ResourceManager resourceManager, + DataPackConfig dataPackConfig, + CallbackInfoReturnable cir) { + RegistryAccess.Writable writable = RegistryAccess.builtinCopy(); + RegistryOps dynamicOps = RegistryOps.create(NbtOps.INSTANCE, writable); + WorldData worldData = levelStorageAccess.getDataTag(dynamicOps, + dataPackConfig, + writable.allElementsLifecycle()); + Pair p = cir.getReturnValue(); + } } diff --git a/src/main/java/org/betterx/bclib/presets/worldgen/WorldPresets.java b/src/main/java/org/betterx/bclib/presets/worldgen/WorldPresets.java index e2890e7f..70425f82 100644 --- a/src/main/java/org/betterx/bclib/presets/worldgen/WorldPresets.java +++ b/src/main/java/org/betterx/bclib/presets/worldgen/WorldPresets.java @@ -132,6 +132,29 @@ public class WorldPresets { return createDefaultWorldFromPreset(registryAccess, RandomSource.create().nextLong()); } + public static WorldGenSettings fixSettingsInCurrentWorld(ResourceKey dimensionKey, + ResourceKey dimensionTypeKey, + WorldGenSettings settings) { + var oldNether = settings.dimensions().getHolder(dimensionKey); + //TODO: Make sure our BiomeSource reuses the BiomeList from the Datapack Source + + int loaderVersion = BCLChunkGenerator.getBiomeVersionForGenerator(oldNether + .map(h -> h.value().generator()) + .orElse(null)); + + int targetVersion = BCLChunkGenerator.getBiomeVersionForCurrentWorld(dimensionKey); + if (loaderVersion != targetVersion) { + BCLib.LOGGER.info("Enforcing Correct Generator for " + dimensionKey.location().toString() + "."); + RegistryAccess access = RegistryAccess.builtinCopy(); + return WorldPresets.replaceGenerator(dimensionKey, + dimensionTypeKey, + targetVersion, + access, + settings); + } + return settings; + } + public static WorldGenSettings replaceGenerator( ResourceKey dimensionKey, ResourceKey dimensionTypeKey, diff --git a/src/main/java/org/betterx/bclib/world/generator/BCLibEndBiomeSource.java b/src/main/java/org/betterx/bclib/world/generator/BCLibEndBiomeSource.java index e9a62930..e4daba4a 100644 --- a/src/main/java/org/betterx/bclib/world/generator/BCLibEndBiomeSource.java +++ b/src/main/java/org/betterx/bclib/world/generator/BCLibEndBiomeSource.java @@ -256,6 +256,6 @@ public class BCLibEndBiomeSource extends BCLBiomeSource { @Override public String toString() { - return "BCLib - The End BiomeSource (" + Integer.toHexString(hashCode()) + ", version=" + biomeSourceVersion + ", seed=" + currentSeed + ")"; + return "BCLib - The End BiomeSource (" + Integer.toHexString(hashCode()) + ", version=" + biomeSourceVersion + ", seed=" + currentSeed + ", biomes=" + possibleBiomes().size() + ")"; } } diff --git a/src/main/java/org/betterx/bclib/world/generator/BCLibNetherBiomeSource.java b/src/main/java/org/betterx/bclib/world/generator/BCLibNetherBiomeSource.java index da7fb447..ef84d0fd 100644 --- a/src/main/java/org/betterx/bclib/world/generator/BCLibNetherBiomeSource.java +++ b/src/main/java/org/betterx/bclib/world/generator/BCLibNetherBiomeSource.java @@ -176,6 +176,6 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource { @Override public String toString() { - return "BCLib - Nether BiomeSource (" + Integer.toHexString(hashCode()) + ", version=" + biomeSourceVersion + ", seed=" + currentSeed + ")"; + return "BCLib - Nether BiomeSource (" + Integer.toHexString(hashCode()) + ", version=" + biomeSourceVersion + ", seed=" + currentSeed + ", biomes=" + possibleBiomes().size() + ")"; } } diff --git a/src/main/resources/bclib.mixins.common.json b/src/main/resources/bclib.mixins.common.json index 7e45db03..7c0a96bf 100644 --- a/src/main/resources/bclib.mixins.common.json +++ b/src/main/resources/bclib.mixins.common.json @@ -23,6 +23,7 @@ "MainMixin", "MinecraftServerMixin", "MobSpawnSettingsAccessor", + "MultiPackResourceManagerMixin", "NetherBiomeDataMixin", "NoiseBasedChunkGeneratorMixin", "NoiseGeneratorSettingsMixin", @@ -30,6 +31,7 @@ "PortalShapeMixin", "PotionBrewingAccessor", "PresetEditorMixin", + "PrimaryLevelDataMixin", "RecipeManagerAccessor", "RecipeManagerMixin", "ServerLevelMixin",