SurfaceRule handling

This commit is contained in:
Frank 2022-05-25 14:00:24 +02:00
parent 7a891d71ee
commit 919e3c25c5
15 changed files with 147 additions and 96 deletions

View file

@ -16,7 +16,7 @@ import org.betterx.bclib.api.datafixer.DataFixerAPI;
import org.betterx.bclib.api.datafixer.ForcedLevelPatch; import org.betterx.bclib.api.datafixer.ForcedLevelPatch;
import org.betterx.bclib.api.datafixer.MigrationProfile; import org.betterx.bclib.api.datafixer.MigrationProfile;
import org.betterx.bclib.config.Configs; import org.betterx.bclib.config.Configs;
import org.betterx.bclib.presets.worldgen.WorldGenUtilities; import org.betterx.bclib.api.worldgen.WorldGenUtil;
import org.betterx.bclib.util.MHelper; import org.betterx.bclib.util.MHelper;
import org.betterx.bclib.world.generator.GeneratorOptions; import org.betterx.bclib.world.generator.GeneratorOptions;
@ -45,7 +45,7 @@ final class BiomeSourcePatch extends ForcedLevelPatch {
@Override @Override
protected Boolean runLevelDatPatch(CompoundTag root, MigrationProfile profile) { protected Boolean runLevelDatPatch(CompoundTag root, MigrationProfile profile) {
//make sure we have a working generators file before attempting to patch //make sure we have a working generators file before attempting to patch
WorldGenUtilities.migrateGeneratorSettings(); WorldGenUtil.migrateGeneratorSettings();
final CompoundTag worldGenSettings = root.getCompound("Data").getCompound("WorldGenSettings"); final CompoundTag worldGenSettings = root.getCompound("Data").getCompound("WorldGenSettings");
final CompoundTag dimensions = worldGenSettings.getCompound("dimensions"); final CompoundTag dimensions = worldGenSettings.getCompound("dimensions");
@ -115,10 +115,10 @@ final class BiomeSourcePatch extends ForcedLevelPatch {
.resultOrPartial(BCLib.LOGGER::error); .resultOrPartial(BCLib.LOGGER::error);
Optional<ChunkGenerator> netherGenerator = oLevelStem.map(l -> l.generator()); Optional<ChunkGenerator> netherGenerator = oLevelStem.map(l -> l.generator());
int biomeSourceVersion = WorldGenUtilities.getBiomeVersionForGenerator(netherGenerator.orElse(null)); int biomeSourceVersion = WorldGenUtil.getBiomeVersionForGenerator(netherGenerator.orElse(null));
int targetVersion = WorldGenUtilities.getBiomeVersionForCurrentWorld(dimensionKey); int targetVersion = WorldGenUtil.getBiomeVersionForCurrentWorld(dimensionKey);
if (biomeSourceVersion != targetVersion) { if (biomeSourceVersion != targetVersion) {
Optional<Holder<LevelStem>> refLevelStem = WorldGenUtilities.referenceStemForVersion( Optional<Holder<LevelStem>> refLevelStem = WorldGenUtil.referenceStemForVersion(
dimensionKey, dimensionKey,
targetVersion, targetVersion,
registryAccess, registryAccess,

View file

@ -128,7 +128,6 @@ public class BiomeAPI {
private static final Map<ResourceKey, List<BiConsumer<ResourceLocation, Holder<Biome>>>> MODIFICATIONS = Maps.newHashMap(); private static final Map<ResourceKey, List<BiConsumer<ResourceLocation, Holder<Biome>>>> MODIFICATIONS = Maps.newHashMap();
private static final Map<ResourceKey, List<BiConsumer<ResourceLocation, Holder<Biome>>>> TAG_ADDERS = Maps.newHashMap(); private static final Map<ResourceKey, List<BiConsumer<ResourceLocation, Holder<Biome>>>> TAG_ADDERS = Maps.newHashMap();
private static final Map<ResourceLocation, SurfaceRules.RuleSource> SURFACE_RULES = Maps.newHashMap();
private static final Set<SurfaceRuleProvider> MODIFIED_SURFACE_PROVIDERS = new HashSet<>(8); private static final Set<SurfaceRuleProvider> MODIFIED_SURFACE_PROVIDERS = new HashSet<>(8);
public static final BCLBiome NETHER_WASTES_BIOME = registerNetherBiome(getFromRegistry(Biomes.NETHER_WASTES).value()); public static final BCLBiome NETHER_WASTES_BIOME = registerNetherBiome(getFromRegistry(Biomes.NETHER_WASTES).value());
@ -728,45 +727,7 @@ public class BiomeAPI {
} }
accessor.bclib_setFeatures(featureList); accessor.bclib_setFeatures(featureList);
} }
private static List<SurfaceRules.RuleSource> getRuleSourcesForBiomes(Set<Holder<Biome>> biomes) {
Set<ResourceLocation> biomeIDs = biomes
.stream()
.map(biome -> getBiomeID(biome))
.collect(Collectors.toSet());
return getRuleSourcesFromIDs(biomeIDs);
}
/**
* Creates a list of SurfaceRules for all Biomes that are managed by the passed {@link BiomeSource}.
* If we have Surface rules for any of the Biomes from the given set of {@link BiomeSource}, they
* will be added to the result
* <p>
* Note: This Method is used in the {@link NoiseGeneratorSettingsMixin} which in turn
* is called from {@link #applyModifications(ServerLevel)}.
*
* @param sources The Set of {@link BiomeSource} we want to consider
* @return A list of {@link RuleSource}-Objects that are needed to create those Biomes
*/
public static List<SurfaceRules.RuleSource> getRuleSources(Set<BiomeSource> sources) {
final Set<Holder<Biome>> biomes = new HashSet<>();
for (BiomeSource s : sources) {
biomes.addAll(s.possibleBiomes());
}
return getRuleSourcesForBiomes(biomes);
}
private static List<SurfaceRules.RuleSource> getRuleSourcesFromIDs(Set<ResourceLocation> biomeIDs) {
List<SurfaceRules.RuleSource> rules = Lists.newArrayList();
SURFACE_RULES.forEach((biomeID, rule) -> {
if (biomeIDs.contains(biomeID)) {
rules.add(rule);
}
});
return rules;
}
/** /**
* Adds new features to existing biome. * Adds new features to existing biome.
* *
@ -827,20 +788,8 @@ public class BiomeAPI {
accessor.bclib_setFeatureSet(featureSet); accessor.bclib_setFeatureSet(featureSet);
accessor.bclib_setFlowerFeatures(flowerFeatures); accessor.bclib_setFlowerFeatures(flowerFeatures);
} }
/**
* Adds surface rule to specified biome.
*
* @param biomeID biome {@link ResourceLocation}.
* @param source {@link SurfaceRules.RuleSource}.
*/
public static void addSurfaceRule(ResourceLocation biomeID, SurfaceRules.RuleSource source) {
SURFACE_RULES.put(biomeID, source);
//NOISE_GENERATOR_SETTINGS.forEach(BiomeAPI::changeSurfaceRulesForGenerator);
}
/** /**
* Adds mob spawning to specified biome. * Adds mob spawning to specified biome.
* *

View file

@ -24,7 +24,7 @@ import org.betterx.bclib.gui.screens.ConfirmFixScreen;
import org.betterx.bclib.gui.screens.LevelFixErrorScreen; import org.betterx.bclib.gui.screens.LevelFixErrorScreen;
import org.betterx.bclib.gui.screens.LevelFixErrorScreen.Listener; import org.betterx.bclib.gui.screens.LevelFixErrorScreen.Listener;
import org.betterx.bclib.gui.screens.ProgressScreen; import org.betterx.bclib.gui.screens.ProgressScreen;
import org.betterx.bclib.presets.worldgen.WorldGenUtilities; import org.betterx.bclib.api.worldgen.WorldGenUtil;
import org.betterx.bclib.util.Logger; import org.betterx.bclib.util.Logger;
import java.io.*; import java.io.*;
@ -181,7 +181,7 @@ public class DataFixerAPI {
public static void createWorldData(LevelStorageAccess access, WorldGenSettings settings) { public static void createWorldData(LevelStorageAccess access, WorldGenSettings settings) {
initializeWorldData(access, true); initializeWorldData(access, true);
WorldGenUtilities.initializeWorldData(settings); WorldGenUtil.initializeWorldData(settings);
WorldDataAPI.saveFile(BCLib.MOD_ID); WorldDataAPI.saveFile(BCLib.MOD_ID);
} }

View file

@ -1,4 +1,4 @@
package org.betterx.bclib.presets.worldgen; package org.betterx.bclib.api.worldgen;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;

View file

@ -0,0 +1,77 @@
package org.betterx.bclib.api.worldgen;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import net.minecraft.core.Holder;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.BiomeSource;
import net.minecraft.world.level.levelgen.SurfaceRules;
import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource;
import org.betterx.bclib.api.biomes.BiomeAPI;
import org.betterx.bclib.mixin.common.NoiseGeneratorSettingsMixin;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
public class SurfaceRuleUtil {
private static final Map<ResourceLocation, RuleSource> SURFACE_RULES = Maps.newHashMap();
private static List<RuleSource> getRuleSourcesForBiomes(Set<Holder<Biome>> biomes) {
Set<ResourceLocation> biomeIDs = biomes
.stream()
.map(biome -> BiomeAPI.getBiomeID(biome))
.collect(Collectors.toSet());
return getRuleSourcesFromIDs(biomeIDs);
}
/**
* Creates a list of SurfaceRules for all Biomes that are managed by the passed {@link BiomeSource}.
* If we have Surface rules for any of the Biomes from the given set of {@link BiomeSource}, they
* will be added to the result
* <p>
* Note: This Method is used in the {@link NoiseGeneratorSettingsMixin} which in turn
* is called from {@link #applyModifications(ServerLevel)}.
*
* @param sources The Set of {@link BiomeSource} we want to consider
* @return A list of {@link RuleSource}-Objects that are needed to create those Biomes
*/
public static List<RuleSource> getRuleSources(Set<BiomeSource> sources) {
final Set<Holder<Biome>> biomes = new HashSet<>();
for (BiomeSource s : sources) {
biomes.addAll(s.possibleBiomes());
}
return getRuleSourcesForBiomes(biomes);
}
public static List<RuleSource> getRuleSources(BiomeSource biomeSource) {
return getRuleSourcesForBiomes(Sets.newHashSet(biomeSource.possibleBiomes()));
}
private static List<RuleSource> getRuleSourcesFromIDs(Set<ResourceLocation> biomeIDs) {
List<RuleSource> rules = Lists.newArrayList();
SURFACE_RULES.forEach((biomeID, rule) -> {
if (biomeIDs.contains(biomeID)) {
rules.add(rule);
}
});
return rules;
}
/**
* Adds surface rule to specified biome.
*
* @param biomeID biome {@link ResourceLocation}.
* @param source {@link RuleSource}.
*/
public static void addSurfaceRule(ResourceLocation biomeID, RuleSource source) {
SURFACE_RULES.put(biomeID, source);
//NOISE_GENERATOR_SETTINGS.forEach(BiomeAPI::changeSurfaceRulesForGenerator);
}
}

View file

@ -1,4 +1,4 @@
package org.betterx.bclib.presets.worldgen; package org.betterx.bclib.api.worldgen;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.MappedRegistry; import net.minecraft.core.MappedRegistry;
@ -16,6 +16,8 @@ import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.dimension.LevelStem;
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
import net.minecraft.world.level.levelgen.SurfaceRules;
import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource;
import net.minecraft.world.level.levelgen.WorldGenSettings; import net.minecraft.world.level.levelgen.WorldGenSettings;
import net.minecraft.world.level.levelgen.presets.WorldPreset; import net.minecraft.world.level.levelgen.presets.WorldPreset;
import net.minecraft.world.level.levelgen.structure.StructureSet; import net.minecraft.world.level.levelgen.structure.StructureSet;
@ -27,16 +29,22 @@ import com.mojang.serialization.Lifecycle;
import org.betterx.bclib.BCLib; import org.betterx.bclib.BCLib;
import org.betterx.bclib.api.WorldDataAPI; import org.betterx.bclib.api.WorldDataAPI;
import org.betterx.bclib.mixin.common.RegistryOpsAccessor; import org.betterx.bclib.mixin.common.RegistryOpsAccessor;
import org.betterx.bclib.presets.worldgen.BCLWorldPresetSettings;
import org.betterx.bclib.presets.worldgen.BCLWorldPresets;
import org.betterx.bclib.presets.worldgen.WorldPresetSettings;
import org.betterx.bclib.util.ModUtil; import org.betterx.bclib.util.ModUtil;
import org.betterx.bclib.world.generator.BCLBiomeSource; import org.betterx.bclib.world.generator.BCLBiomeSource;
import org.betterx.bclib.world.generator.BCLibEndBiomeSource; import org.betterx.bclib.world.generator.BCLibEndBiomeSource;
import org.betterx.bclib.world.generator.BCLibNetherBiomeSource; import org.betterx.bclib.world.generator.BCLibNetherBiomeSource;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class WorldGenUtilities { public class WorldGenUtil {
private static final String TAG_VERSION = "version"; private static final String TAG_VERSION = "version";
private static final String TAG_BN_GEN_VERSION = "generator_version"; private static final String TAG_BN_GEN_VERSION = "generator_version";
private static String TAG_GENERATOR = "generator"; private static String TAG_GENERATOR = "generator";
@ -379,4 +387,17 @@ public class WorldGenUtilities {
this.biomes = biomes; this.biomes = biomes;
} }
} }
public static RuleSource addRulesForBiomeSource(RuleSource org, BiomeSource biomeSource) {
List<RuleSource> additionalRules = SurfaceRuleUtil.getRuleSources(biomeSource);
if (org instanceof SurfaceRules.SequenceRuleSource sequenceRule) {
List<RuleSource> existingSequence = sequenceRule.sequence();
additionalRules = additionalRules.stream().filter(r -> existingSequence.indexOf(r) < 0).collect(Collectors.toList());
additionalRules.addAll(sequenceRule.sequence());
} else {
additionalRules.add(org);
}
return SurfaceRules.sequence(additionalRules.toArray(new RuleSource[additionalRules.size()]));
}
} }

View file

@ -15,7 +15,7 @@ import net.fabricmc.api.Environment;
import org.betterx.bclib.BCLib; import org.betterx.bclib.BCLib;
import org.betterx.bclib.gui.gridlayout.GridCheckboxCell; import org.betterx.bclib.gui.gridlayout.GridCheckboxCell;
import org.betterx.bclib.gui.gridlayout.GridLayout; import org.betterx.bclib.gui.gridlayout.GridLayout;
import org.betterx.bclib.presets.worldgen.WorldGenUtilities; import org.betterx.bclib.api.worldgen.WorldGenUtil;
import org.betterx.bclib.world.generator.BCLBiomeSource; import org.betterx.bclib.world.generator.BCLBiomeSource;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -39,14 +39,14 @@ public class WorldSetupScreen extends BCLibScreen {
@Override @Override
protected void initLayout() { protected void initLayout() {
final int netherVersion = WorldGenUtilities.getBiomeVersionForGenerator(context final int netherVersion = WorldGenUtil.getBiomeVersionForGenerator(context
.worldGenSettings() .worldGenSettings()
.dimensions() .dimensions()
.getOrCreateHolderOrThrow( .getOrCreateHolderOrThrow(
LevelStem.NETHER) LevelStem.NETHER)
.value() .value()
.generator()); .generator());
final int endVersion = WorldGenUtilities.getBiomeVersionForGenerator(context final int endVersion = WorldGenUtil.getBiomeVersionForGenerator(context
.worldGenSettings() .worldGenSettings()
.dimensions() .dimensions()
.getOrCreateHolderOrThrow( .getOrCreateHolderOrThrow(
@ -149,7 +149,7 @@ public class WorldSetupScreen extends BCLibScreen {
int biomeSourceVersion int biomeSourceVersion
) { ) {
createWorldScreen.worldGenSettingsComponent.updateSettings( createWorldScreen.worldGenSettingsComponent.updateSettings(
(registryAccess, worldGenSettings) -> WorldGenUtilities.replaceGenerator( (registryAccess, worldGenSettings) -> WorldGenUtil.replaceGenerator(
dimensionKey, dimensionKey,
dimensionTypeKey, dimensionTypeKey,
biomeSourceVersion, biomeSourceVersion,

View file

@ -14,7 +14,7 @@ import net.minecraft.world.level.levelgen.presets.WorldPreset;
import com.mojang.datafixers.util.Pair; import com.mojang.datafixers.util.Pair;
import org.betterx.bclib.api.biomes.BiomeAPI; import org.betterx.bclib.api.biomes.BiomeAPI;
import org.betterx.bclib.presets.worldgen.BCLWorldPresets; import org.betterx.bclib.presets.worldgen.BCLWorldPresets;
import org.betterx.bclib.presets.worldgen.WorldGenUtilities; import org.betterx.bclib.api.worldgen.WorldGenUtil;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
@ -44,7 +44,7 @@ public class CreateWorldScreenMixin {
private static WorldLoader.WorldDataSupplier<WorldGenSettings> bcl_NewDefaultSettings(WorldLoader.WorldDataSupplier<WorldGenSettings> worldDataSupplier) { private static WorldLoader.WorldDataSupplier<WorldGenSettings> bcl_NewDefaultSettings(WorldLoader.WorldDataSupplier<WorldGenSettings> worldDataSupplier) {
return (resourceManager, dataPackConfig) -> { return (resourceManager, dataPackConfig) -> {
Pair<WorldGenSettings, RegistryAccess.Frozen> res = worldDataSupplier.get(resourceManager, dataPackConfig); Pair<WorldGenSettings, RegistryAccess.Frozen> res = worldDataSupplier.get(resourceManager, dataPackConfig);
return WorldGenUtilities.defaultWorldDataSupplier(res.getSecond()); return WorldGenUtil.defaultWorldDataSupplier(res.getSecond());
}; };
} }
} }

View file

@ -6,7 +6,7 @@ import net.minecraft.world.level.chunk.ChunkGenerators;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import org.betterx.bclib.BCLib; import org.betterx.bclib.BCLib;
import org.betterx.bclib.presets.worldgen.BCLChunkGenerator; import org.betterx.bclib.api.worldgen.BCLChunkGenerator;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;

View file

@ -5,7 +5,7 @@ import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
import net.minecraft.world.level.levelgen.SurfaceRules; import net.minecraft.world.level.levelgen.SurfaceRules;
import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource; import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource;
import org.betterx.bclib.api.biomes.BiomeAPI; import org.betterx.bclib.api.worldgen.SurfaceRuleUtil;
import org.betterx.bclib.interfaces.SurfaceRuleProvider; import org.betterx.bclib.interfaces.SurfaceRuleProvider;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@ -28,7 +28,7 @@ public class NoiseGeneratorSettingsMixin implements SurfaceRuleProvider {
private final Set<BiomeSource> bclib_biomeSources = new HashSet<>(); private final Set<BiomeSource> bclib_biomeSources = new HashSet<>();
private void bclib_updateCustomRules() { private void bclib_updateCustomRules() {
bclib_setCustomRules(BiomeAPI.getRuleSources(bclib_biomeSources)); bclib_setCustomRules(SurfaceRuleUtil.getRuleSources(bclib_biomeSources));
} }
@Override @Override

View file

@ -11,7 +11,7 @@ import net.minecraft.world.level.storage.PrimaryLevelData;
import com.mojang.datafixers.DataFixer; import com.mojang.datafixers.DataFixer;
import com.mojang.serialization.Dynamic; import com.mojang.serialization.Dynamic;
import com.mojang.serialization.Lifecycle; import com.mojang.serialization.Lifecycle;
import org.betterx.bclib.presets.worldgen.WorldGenUtilities; import org.betterx.bclib.api.worldgen.WorldGenUtil;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
@ -44,7 +44,7 @@ public class PrimaryLevelDataMixin {
@ModifyArg(method = "parse", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/storage/PrimaryLevelData;<init>(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")) @ModifyArg(method = "parse", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/storage/PrimaryLevelData;<init>(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) { private static WorldGenSettings bcl_fixSettings(WorldGenSettings settings) {
Optional<RegistryOps<Tag>> registryOps = bcl_lastRegistryAccess.get(); Optional<RegistryOps<Tag>> registryOps = bcl_lastRegistryAccess.get();
settings = WorldGenUtilities.fixSettingsInCurrentWorld(registryOps, settings); settings = WorldGenUtil.fixSettingsInCurrentWorld(registryOps, settings);
bcl_lastRegistryAccess.set(Optional.empty()); bcl_lastRegistryAccess.set(Optional.empty());
return settings; return settings;

View file

@ -12,7 +12,7 @@ import net.minecraft.world.level.levelgen.structure.StructureSet;
import net.minecraft.world.level.levelgen.synth.NormalNoise; import net.minecraft.world.level.levelgen.synth.NormalNoise;
import org.betterx.bclib.presets.worldgen.BCLWorldPresets; import org.betterx.bclib.presets.worldgen.BCLWorldPresets;
import org.betterx.bclib.presets.worldgen.WorldGenUtilities; import org.betterx.bclib.api.worldgen.WorldGenUtil;
import org.betterx.bclib.presets.worldgen.WorldPresetSettings; import org.betterx.bclib.presets.worldgen.WorldPresetSettings;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@ -52,12 +52,12 @@ public abstract class WorldPresetsBootstrapMixin {
@ModifyArg(method = "run", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/level/levelgen/presets/WorldPresets$Bootstrap;registerCustomOverworldPreset(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/dimension/LevelStem;)Lnet/minecraft/core/Holder;")) @ModifyArg(method = "run", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/level/levelgen/presets/WorldPresets$Bootstrap;registerCustomOverworldPreset(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/dimension/LevelStem;)Lnet/minecraft/core/Holder;"))
private LevelStem bcl_getOverworldStem(LevelStem overworldStem) { private LevelStem bcl_getOverworldStem(LevelStem overworldStem) {
WorldPresetSettings.bootstrap(); WorldPresetSettings.bootstrap();
WorldGenUtilities.Context netherContext = new WorldGenUtilities.Context(this.biomes, WorldGenUtil.Context netherContext = new WorldGenUtil.Context(this.biomes,
this.netherDimensionType, this.netherDimensionType,
this.structureSets, this.structureSets,
this.noises, this.noises,
this.netherNoiseSettings); this.netherNoiseSettings);
WorldGenUtilities.Context endContext = new WorldGenUtilities.Context(this.biomes, WorldGenUtil.Context endContext = new WorldGenUtil.Context(this.biomes,
this.endDimensionType, this.endDimensionType,
this.structureSets, this.structureSets,
this.noises, this.noises,

View file

@ -15,6 +15,8 @@ import net.minecraft.world.level.levelgen.WorldGenSettings;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
import org.betterx.bclib.BCLib; import org.betterx.bclib.BCLib;
import org.betterx.bclib.api.worldgen.BCLChunkGenerator;
import org.betterx.bclib.api.worldgen.WorldGenUtil;
import org.betterx.bclib.interfaces.ChunkGeneratorAccessor; import org.betterx.bclib.interfaces.ChunkGeneratorAccessor;
import org.betterx.bclib.interfaces.NoiseGeneratorSettingsProvider; import org.betterx.bclib.interfaces.NoiseGeneratorSettingsProvider;
import org.betterx.bclib.world.generator.BCLBiomeSource; import org.betterx.bclib.world.generator.BCLBiomeSource;
@ -60,14 +62,14 @@ public class BCLWorldPresetSettings extends WorldPresetSettings {
} }
public BCLWorldPreset buildPreset(LevelStem overworldStem, public BCLWorldPreset buildPreset(LevelStem overworldStem,
WorldGenUtilities.Context netherContext, WorldGenUtil.Context netherContext,
WorldGenUtilities.Context endContext) { WorldGenUtil.Context endContext) {
return new BCLWorldPreset(buildDimensionMap(overworldStem, netherContext, endContext), 1000, this); return new BCLWorldPreset(buildDimensionMap(overworldStem, netherContext, endContext), 1000, this);
} }
public Map<ResourceKey<LevelStem>, LevelStem> buildDimensionMap(LevelStem overworldStem, public Map<ResourceKey<LevelStem>, LevelStem> buildDimensionMap(LevelStem overworldStem,
WorldGenUtilities.Context netherContext, WorldGenUtil.Context netherContext,
WorldGenUtilities.Context endContext) { WorldGenUtil.Context endContext) {
return Map.of(LevelStem.OVERWORLD, return Map.of(LevelStem.OVERWORLD,
overworldStem, overworldStem,
LevelStem.NETHER, LevelStem.NETHER,
@ -84,18 +86,18 @@ public class BCLWorldPresetSettings extends WorldPresetSettings {
return BCLBiomeSource.BIOME_SOURCE_VERSION_VANILLA; return BCLBiomeSource.BIOME_SOURCE_VERSION_VANILLA;
} }
public LevelStem createStem(WorldGenUtilities.Context ctx, ResourceKey<LevelStem> key) { public LevelStem createStem(WorldGenUtil.Context ctx, ResourceKey<LevelStem> key) {
if (key == LevelStem.NETHER) return createNetherStem(ctx); if (key == LevelStem.NETHER) return createNetherStem(ctx);
if (key == LevelStem.END) return createEndStem(ctx); if (key == LevelStem.END) return createEndStem(ctx);
return null; return null;
} }
public LevelStem createNetherStem(WorldGenUtilities.Context ctx) { public LevelStem createNetherStem(WorldGenUtil.Context ctx) {
return WorldGenUtilities.getBCLNetherLevelStem(ctx, Optional.of(netherVersion)); return WorldGenUtil.getBCLNetherLevelStem(ctx, Optional.of(netherVersion));
} }
public LevelStem createEndStem(WorldGenUtilities.Context ctx) { public LevelStem createEndStem(WorldGenUtil.Context ctx) {
return WorldGenUtilities.getBCLEndLevelStem(ctx, Optional.of(endVersion)); return WorldGenUtil.getBCLEndLevelStem(ctx, Optional.of(endVersion));
} }
public BiomeSource fixBiomeSource(BiomeSource biomeSource, Set<Holder<Biome>> datapackBiomes) { public BiomeSource fixBiomeSource(BiomeSource biomeSource, Set<Holder<Biome>> datapackBiomes) {
@ -112,7 +114,7 @@ public class BCLWorldPresetSettings extends WorldPresetSettings {
old.defaultBlock(), old.defaultBlock(),
old.defaultFluid(), old.defaultFluid(),
old.noiseRouter(), old.noiseRouter(),
old.surfaceRule(), WorldGenUtil.addRulesForBiomeSource(old.surfaceRule(), biomeSource),
old.spawnTarget(), old.spawnTarget(),
old.seaLevel(), old.seaLevel(),
old.disableMobGeneration(), old.disableMobGeneration(),
@ -138,7 +140,7 @@ public class BCLWorldPresetSettings extends WorldPresetSettings {
ResourceKey<DimensionType> dimensionTypeKey, ResourceKey<DimensionType> dimensionTypeKey,
WorldGenSettings settings) { WorldGenSettings settings) {
var oldNether = settings.dimensions().getHolder(dimensionKey); var oldNether = settings.dimensions().getHolder(dimensionKey);
int loaderVersion = WorldGenUtilities.getBiomeVersionForGenerator(oldNether int loaderVersion = WorldGenUtil.getBiomeVersionForGenerator(oldNether
.map(h -> h.value().generator()) .map(h -> h.value().generator())
.orElse(null)); .orElse(null));
@ -146,7 +148,7 @@ public class BCLWorldPresetSettings extends WorldPresetSettings {
if (loaderVersion != targetVersion) { if (loaderVersion != targetVersion) {
BCLib.LOGGER.info("Enforcing Correct Generator for " + dimensionKey.location().toString() + "."); BCLib.LOGGER.info("Enforcing Correct Generator for " + dimensionKey.location().toString() + ".");
var chunkGenerator = oldNether.map(h -> h.value().generator()).orElse(null); var chunkGenerator = oldNether.map(h -> h.value().generator()).orElse(null);
Optional<Holder<LevelStem>> refLevelStem = WorldGenUtilities.referenceStemForVersion( Optional<Holder<LevelStem>> refLevelStem = WorldGenUtil.referenceStemForVersion(
dimensionKey, dimensionKey,
targetVersion, targetVersion,
access, access,
@ -173,7 +175,7 @@ public class BCLWorldPresetSettings extends WorldPresetSettings {
} }
} }
return WorldGenUtilities.replaceGenerator(dimensionKey, return WorldGenUtil.replaceGenerator(dimensionKey,
dimensionTypeKey, dimensionTypeKey,
access, access,
settings, settings,

View file

@ -12,6 +12,7 @@ import com.google.common.collect.Maps;
import org.betterx.bclib.BCLib; import org.betterx.bclib.BCLib;
import org.betterx.bclib.api.tag.TagAPI; import org.betterx.bclib.api.tag.TagAPI;
import org.betterx.bclib.api.tag.TagType; import org.betterx.bclib.api.tag.TagType;
import org.betterx.bclib.api.worldgen.WorldGenUtil;
import org.betterx.bclib.world.generator.BCLBiomeSource; import org.betterx.bclib.world.generator.BCLBiomeSource;
import java.util.Map; import java.util.Map;
@ -82,8 +83,8 @@ public class BCLWorldPresets {
public static void bootstrapPresets(Registry<WorldPreset> presets, public static void bootstrapPresets(Registry<WorldPreset> presets,
LevelStem overworldStem, LevelStem overworldStem,
WorldGenUtilities.Context netherContext, WorldGenUtil.Context netherContext,
WorldGenUtilities.Context endContext) { WorldGenUtil.Context endContext) {
for (Map.Entry<ResourceKey<WorldPreset>, PresetBuilder> e : BUILDERS.entrySet()) { for (Map.Entry<ResourceKey<WorldPreset>, PresetBuilder> e : BUILDERS.entrySet()) {
BCLWorldPreset preset = e.getValue().create(overworldStem, netherContext, endContext); BCLWorldPreset preset = e.getValue().create(overworldStem, netherContext, endContext);
@ -100,7 +101,7 @@ public class BCLWorldPresets {
@FunctionalInterface @FunctionalInterface
public interface PresetBuilder { public interface PresetBuilder {
BCLWorldPreset create(LevelStem overworldStem, BCLWorldPreset create(LevelStem overworldStem,
WorldGenUtilities.Context netherContext, WorldGenUtil.Context netherContext,
WorldGenUtilities.Context endContext); WorldGenUtil.Context endContext);
} }
} }

View file

@ -18,6 +18,7 @@ import org.betterx.bclib.BCLib;
import org.betterx.bclib.api.biomes.BCLBiomeBuilder; import org.betterx.bclib.api.biomes.BCLBiomeBuilder;
import org.betterx.bclib.api.biomes.BiomeAPI; import org.betterx.bclib.api.biomes.BiomeAPI;
import org.betterx.bclib.api.tag.TagAPI; import org.betterx.bclib.api.tag.TagAPI;
import org.betterx.bclib.api.worldgen.SurfaceRuleUtil;
import org.betterx.bclib.util.WeightedList; import org.betterx.bclib.util.WeightedList;
import java.util.List; import java.util.List;
@ -341,7 +342,7 @@ public class BCLBiome extends BCLBiomeSettings {
if (key == null) { if (key == null) {
BCLib.LOGGER.warning("BCL Biome " + biomeID + " does not have registry key!"); BCLib.LOGGER.warning("BCL Biome " + biomeID + " does not have registry key!");
} else { } else {
BiomeAPI.addSurfaceRule(biomeID, SurfaceRules.ifTrue(SurfaceRules.isBiome(key), surface)); SurfaceRuleUtil.addSurfaceRule(biomeID, SurfaceRules.ifTrue(SurfaceRules.isBiome(key), surface));
} }
}; };
} }