From e1883409fad4e120ec5fb240c871dbe381ffd1c2 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 22 Jun 2022 00:54:15 +0200 Subject: [PATCH] Change Surface Rules later to catch Biomes added by FAPI --- .../worldgen/BCLWorldPresetSettings.java | 7 +++- .../mixin/common/MinecraftServerMixin.java | 34 +++++++++++++++++++ .../settings/VanillaWorldPresetSettings.java | 6 +++- .../settings/WorldPresetSettings.java | 1 + 4 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/betterx/worlds/together/mixin/common/MinecraftServerMixin.java diff --git a/src/main/java/org/betterx/bclib/presets/worldgen/BCLWorldPresetSettings.java b/src/main/java/org/betterx/bclib/presets/worldgen/BCLWorldPresetSettings.java index 8cbf37cd..2ccbb307 100644 --- a/src/main/java/org/betterx/bclib/presets/worldgen/BCLWorldPresetSettings.java +++ b/src/main/java/org/betterx/bclib/presets/worldgen/BCLWorldPresetSettings.java @@ -133,6 +133,12 @@ public class BCLWorldPresetSettings extends WorldPresetSettings { return biomeSource; } + @Override + public void injectSurfaceRules(RegistryAccess registryAccess, WorldGenSettings settings) { + //END and NETHER are handled in #repairSettingsOnLoad + SurfaceRuleUtil.injectSurfaceRules(settings, SurfaceRuleRegistry.NON_MANAGED_DIMENSIONS); + } + private static Holder injectSurfaceRules( Holder reference, Holder settings, @@ -236,7 +242,6 @@ public class BCLWorldPresetSettings extends WorldPresetSettings { public WorldGenSettings repairSettingsOnLoad(RegistryAccess registryAccess, WorldGenSettings settings) { settings = fixSettingsInCurrentWorld(registryAccess, LevelStem.NETHER, BuiltinDimensionTypes.NETHER, settings); settings = fixSettingsInCurrentWorld(registryAccess, LevelStem.END, BuiltinDimensionTypes.END, settings); - SurfaceRuleUtil.injectSurfaceRules(settings, SurfaceRuleRegistry.NON_MANAGED_DIMENSIONS); return settings; } diff --git a/src/main/java/org/betterx/worlds/together/mixin/common/MinecraftServerMixin.java b/src/main/java/org/betterx/worlds/together/mixin/common/MinecraftServerMixin.java new file mode 100644 index 00000000..3d51e5b7 --- /dev/null +++ b/src/main/java/org/betterx/worlds/together/mixin/common/MinecraftServerMixin.java @@ -0,0 +1,34 @@ +package org.betterx.worlds.together.mixin.common; + +import org.betterx.worlds.together.world.WorldGenUtil; + +import net.minecraft.core.RegistryAccess; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.progress.ChunkProgressListener; +import net.minecraft.world.level.storage.WorldData; + +import org.spongepowered.asm.mixin.Final; +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; + +/** + * We need a hook here to alter surface rules after Fabric did add its biomes + * in {@link net.fabricmc.fabric.mixin.biome.MixinMinecraftServer} + */ +@Mixin(value = MinecraftServer.class, priority = 500) +public class MinecraftServerMixin { + @Shadow + @Final + private RegistryAccess.Frozen registryHolder; + @Shadow + @Final + protected WorldData worldData; + + @Inject(method = "createLevels", at = @At("HEAD")) + private void together_addSurfaceRules(ChunkProgressListener worldGenerationProgressListener, CallbackInfo ci) { + WorldGenUtil.getWorldSettings().injectSurfaceRules(registryHolder, this.worldData.worldGenSettings()); + } +} diff --git a/src/main/java/org/betterx/worlds/together/worldPreset/settings/VanillaWorldPresetSettings.java b/src/main/java/org/betterx/worlds/together/worldPreset/settings/VanillaWorldPresetSettings.java index ff0d0405..63bc175c 100644 --- a/src/main/java/org/betterx/worlds/together/worldPreset/settings/VanillaWorldPresetSettings.java +++ b/src/main/java/org/betterx/worlds/together/worldPreset/settings/VanillaWorldPresetSettings.java @@ -23,7 +23,6 @@ public class VanillaWorldPresetSettings extends WorldPresetSettings { @Override public WorldGenSettings repairSettingsOnLoad(RegistryAccess registryAccess, WorldGenSettings settings) { - SurfaceRuleUtil.injectSurfaceRules(settings, SurfaceRuleRegistry.ALL_DIMENSIONS); return settings; } @@ -31,4 +30,9 @@ public class VanillaWorldPresetSettings extends WorldPresetSettings { public BiomeSource addDatapackBiomes(BiomeSource biomeSource, Set> datapackBiomes) { return biomeSource; } + + + public void injectSurfaceRules(RegistryAccess registryAccess, WorldGenSettings settings) { + SurfaceRuleUtil.injectSurfaceRules(settings, SurfaceRuleRegistry.ALL_DIMENSIONS); + } } diff --git a/src/main/java/org/betterx/worlds/together/worldPreset/settings/WorldPresetSettings.java b/src/main/java/org/betterx/worlds/together/worldPreset/settings/WorldPresetSettings.java index a507afda..c909bf02 100644 --- a/src/main/java/org/betterx/worlds/together/worldPreset/settings/WorldPresetSettings.java +++ b/src/main/java/org/betterx/worlds/together/worldPreset/settings/WorldPresetSettings.java @@ -52,4 +52,5 @@ public abstract class WorldPresetSettings { public abstract Codec codec(); public abstract WorldGenSettings repairSettingsOnLoad(RegistryAccess registryAccess, WorldGenSettings settings); public abstract BiomeSource addDatapackBiomes(BiomeSource biomeSource, Set> datapackBiomes); + public abstract void injectSurfaceRules(RegistryAccess registryAccess, WorldGenSettings settings); }