From a592c05b4d9318bd528b78257254ed8399c524bd Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 2 Dec 2022 16:03:00 +0100 Subject: [PATCH] Moved WorldPreset creating to DataGen step --- src/main/java/org/betterx/bclib/BCLib.java | 4 +- .../api/v2/generator/BCLBiomeSource.java | 54 +++-- .../api/v2/generator/BCLibEndBiomeSource.java | 97 +++++---- .../v2/generator/BCLibNetherBiomeSource.java | 77 ++++--- .../bclib/api/v2/generator/BiomePicker.java | 2 +- .../bclib/api/v2/levelgen/LevelGenUtil.java | 4 +- .../v2/levelgen/biomes/BCLBiomeRegistry.java | 11 +- .../mixin/common/BuiltinRegistriesMixin.java | 19 +- .../bclib/registry/PresetsRegistry.java | 114 +---------- .../bclib}/BCLibDatagen.java | 23 ++- .../bclib/preset/WorldPresetDataProvider.java | 143 +++++++++++++ .../bclib/tests}/TestBiomes.java | 3 +- .../bclib/tests}/TestConfiguredFeatures.java | 5 +- .../bclib/tests}/TestPlacedFeatures.java | 3 +- .../bclib/tests}/TestWorldgenProvider.java | 4 +- .../BCLibRegistriesDataProvider.java} | 7 +- .../worldgen/NoiseTypesDataProvider.java} | 4 +- .../WorldgenRegistriesDataProvider.java} | 6 +- .../entrypoints/WorldPresetBootstrap.java | 5 - .../together/levelgen/WorldGenUtil.java | 4 + .../mixin/common/WorldPresetMixin.java | 2 - .../common/WorldPresetsBootstrapMixin.java | 97 --------- .../together/worldPreset/WorldPresets.java | 188 +++++++++--------- .../client/WorldPresetsClient.java | 1 - src/main/resources/fabric.mod.json | 5 +- .../resources/together.mixins.common.json | 1 - 26 files changed, 452 insertions(+), 431 deletions(-) rename src/main/java/org/betterx/{bclib/datagen => datagen/bclib}/BCLibDatagen.java (53%) create mode 100644 src/main/java/org/betterx/datagen/bclib/preset/WorldPresetDataProvider.java rename src/main/java/org/betterx/{bclib/datagen => datagen/bclib/tests}/TestBiomes.java (97%) rename src/main/java/org/betterx/{bclib/datagen => datagen/bclib/tests}/TestConfiguredFeatures.java (95%) rename src/main/java/org/betterx/{bclib/datagen => datagen/bclib/tests}/TestPlacedFeatures.java (92%) rename src/main/java/org/betterx/{bclib/datagen => datagen/bclib/tests}/TestWorldgenProvider.java (92%) rename src/main/java/org/betterx/{bclib/datagen/CustomRegistriesDataProvider.java => datagen/bclib/worldgen/BCLibRegistriesDataProvider.java} (94%) rename src/main/java/org/betterx/{bclib/datagen/NoiseDatagen.java => datagen/bclib/worldgen/NoiseTypesDataProvider.java} (84%) rename src/main/java/org/betterx/{bclib/datagen/WorldgenProvider.java => datagen/bclib/worldgen/WorldgenRegistriesDataProvider.java} (86%) delete mode 100644 src/main/java/org/betterx/worlds/together/entrypoints/WorldPresetBootstrap.java delete mode 100644 src/main/java/org/betterx/worlds/together/mixin/common/WorldPresetsBootstrapMixin.java diff --git a/src/main/java/org/betterx/bclib/BCLib.java b/src/main/java/org/betterx/bclib/BCLib.java index 8bd64de9..f9d6ac4e 100644 --- a/src/main/java/org/betterx/bclib/BCLib.java +++ b/src/main/java/org/betterx/bclib/BCLib.java @@ -20,6 +20,7 @@ import org.betterx.bclib.recipes.AnvilRecipe; import org.betterx.bclib.recipes.CraftingRecipes; import org.betterx.bclib.registry.BaseBlockEntities; import org.betterx.bclib.registry.BaseRegistry; +import org.betterx.bclib.registry.PresetsRegistry; import org.betterx.worlds.together.WorldsTogether; import org.betterx.worlds.together.util.Logger; import org.betterx.worlds.together.world.WorldConfig; @@ -41,13 +42,14 @@ public class BCLib implements ModInitializer { .isPresent(); private void onDatagen() { - + } @Override public void onInitialize() { WorldsTogether.onInitialize(); + PresetsRegistry.register(); LevelGenEvents.register(); BlockPredicates.ensureStaticInitialization(); BCLBiomeRegistry.ensureStaticallyLoaded(); diff --git a/src/main/java/org/betterx/bclib/api/v2/generator/BCLBiomeSource.java b/src/main/java/org/betterx/bclib/api/v2/generator/BCLBiomeSource.java index 766a4ed4..a423386a 100644 --- a/src/main/java/org/betterx/bclib/api/v2/generator/BCLBiomeSource.java +++ b/src/main/java/org/betterx/bclib/api/v2/generator/BCLBiomeSource.java @@ -1,6 +1,7 @@ package org.betterx.bclib.api.v2.generator; import org.betterx.bclib.BCLib; +import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiome; import org.betterx.bclib.api.v2.levelgen.biomes.InternalBiomeAPI; import org.betterx.worlds.together.biomesource.BiomeSourceFromRegistry; import org.betterx.worlds.together.biomesource.BiomeSourceHelper; @@ -10,6 +11,7 @@ import org.betterx.worlds.together.world.BiomeSourceWithSeed; import net.minecraft.core.Holder; import net.minecraft.core.HolderGetter; +import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSource; @@ -17,13 +19,13 @@ import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import com.google.common.collect.Sets; -import java.util.Comparator; -import java.util.List; -import java.util.Set; +import java.lang.reflect.Field; +import java.util.*; import org.jetbrains.annotations.NotNull; public abstract class BCLBiomeSource extends BiomeSource implements BiomeSourceWithSeed, MergeableBiomeSource, BiomeSourceWithNoiseRelatedSettings, BiomeSourceFromRegistry { protected final HolderGetter biomeRegistry; + protected final HolderGetter bclBiomeRegistry; private int registryModificationCounter; protected long currentSeed; protected int maxHeight; @@ -42,12 +44,14 @@ public abstract class BCLBiomeSource extends BiomeSource implements BiomeSourceW protected BCLBiomeSource( HolderGetter biomeRegistry, + HolderGetter bclBiomeRegistry, List> list, long seed ) { super(preInit(biomeRegistry, list)); this.registryModificationCounter = InternalBiomeAPI.getBiomeRegistryModificationCount(biomeRegistry); this.biomeRegistry = biomeRegistry; + this.bclBiomeRegistry = bclBiomeRegistry; this.currentSeed = seed; } @@ -103,27 +107,41 @@ public abstract class BCLBiomeSource extends BiomeSource implements BiomeSourceW } protected static List> getBiomes( - HolderGetter biomeRegistry, + HolderGetter getter, + HolderGetter bclBiomeRegistry, List exclude, List include, BCLibNetherBiomeSource.ValidBiomePredicate test ) { - //TODO: 1.19.3 restore this code - return List.of();/*biomeRegistry.stream() - .filter(biome -> biomeRegistry.getResourceKey(biome).isPresent()) + Optional res = Arrays.stream(getter.getClass().getFields()) + .filter(f -> Registry.class.isAssignableFrom(f.getType())) + .findFirst(); + if (res.isPresent()) { + try { + Registry biomeRegistry = (Registry) res.get().get(getter); - .map(biome -> (Holder) biomeRegistry.getHolderOrThrow( - biomeRegistry.getResourceKey(biome).get()) - ) - .filter(biome -> { - ResourceLocation location = biome.unwrapKey().orElseThrow().location(); - final String strLocation = location.toString(); - if (exclude.contains(strLocation)) return false; - if (include.contains(strLocation)) return true; + return biomeRegistry.stream() + .filter(biome -> biomeRegistry.getResourceKey(biome).isPresent()) + .map(biome -> (Holder) biomeRegistry.getHolderOrThrow( + biomeRegistry.getResourceKey(biome).get()) + ) + .filter(biome -> { + ResourceLocation location = biome.unwrapKey().orElseThrow().location(); + final String strLocation = location.toString(); + if (exclude.contains(strLocation)) return false; + if (include.contains(strLocation)) return true; - return test.isValid(biome, location); - }) - .toList();*/ + return test.isValid(biome, location); + }) + .toList(); + } catch (IllegalAccessException e) { + BCLib.LOGGER.error("Unable to load field", e); + return List.of(); + } + } else { + BCLib.LOGGER.error("Unable to access Biome Registry.."); + return List.of(); + } } @Override diff --git a/src/main/java/org/betterx/bclib/api/v2/generator/BCLibEndBiomeSource.java b/src/main/java/org/betterx/bclib/api/v2/generator/BCLibEndBiomeSource.java index 1a1a1a7f..9a1da740 100644 --- a/src/main/java/org/betterx/bclib/api/v2/generator/BCLibEndBiomeSource.java +++ b/src/main/java/org/betterx/bclib/api/v2/generator/BCLibEndBiomeSource.java @@ -10,6 +10,7 @@ import org.betterx.bclib.config.Configs; import org.betterx.bclib.interfaces.BiomeMap; import org.betterx.worlds.together.biomesource.BiomeSourceWithConfig; import org.betterx.worlds.together.biomesource.ReloadableBiomeSource; +import org.betterx.worlds.together.world.event.WorldBootstrap; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -35,24 +36,25 @@ import org.jetbrains.annotations.NotNull; public class BCLibEndBiomeSource extends BCLBiomeSource implements BiomeSourceWithConfig, ReloadableBiomeSource { public static Codec CODEC - = RecordCodecBuilder.create((instance) -> instance.group( - RegistryOps - .retrieveElement(Registries.BIOME), - Codec - .LONG - .fieldOf("seed") - .stable() - .forGetter(source -> source.currentSeed), - BCLEndBiomeSourceConfig - .CODEC - .fieldOf("config") - .orElse(BCLEndBiomeSourceConfig.DEFAULT) - .forGetter(o -> o.config) - ) - .apply( - instance, - instance.stable(BCLibEndBiomeSource::new) - ) + = RecordCodecBuilder.create((instance) -> instance + .group( + RegistryOps.retrieveGetter(Registries.BIOME), + RegistryOps.retrieveGetter(BCLBiomeRegistry.BCL_BIOMES_REGISTRY), + Codec + .LONG + .fieldOf("seed") + .stable() + .forGetter(source -> source.currentSeed), + BCLEndBiomeSourceConfig + .CODEC + .fieldOf("config") + .orElse(BCLEndBiomeSourceConfig.DEFAULT) + .forGetter(o -> o.config) + ) + .apply( + instance, + instance.stable(BCLibEndBiomeSource::new) + ) ); private final Point pos; private BiomeMap mapLand; @@ -69,38 +71,41 @@ public class BCLibEndBiomeSource extends BCLBiomeSource implements BiomeSourceWi private BCLEndBiomeSourceConfig config; private BCLibEndBiomeSource( - Holder.Reference> registryReference, + HolderGetter biomeRegistry, + HolderGetter bclBiomeRegistry, long seed, - BCLEndBiomeSourceConfig bclEndBiomeSourceConfig + BCLEndBiomeSourceConfig config ) { - this(registryReference.value().asLookup(), seed, bclEndBiomeSourceConfig); + this(biomeRegistry, bclBiomeRegistry, seed, config, true); } - private BCLibEndBiomeSource(HolderGetter biomeRegistry, long seed, BCLEndBiomeSourceConfig config) { - this(biomeRegistry, seed, config, true); - } - - public BCLibEndBiomeSource(HolderGetter biomeRegistry, BCLEndBiomeSourceConfig config) { - this(biomeRegistry, 0, config, false); + public BCLibEndBiomeSource( + HolderGetter biomeRegistry, + HolderGetter bclBiomeRegistry, + BCLEndBiomeSourceConfig config + ) { + this(biomeRegistry, bclBiomeRegistry, 0, config, false); } private BCLibEndBiomeSource( HolderGetter biomeRegistry, + HolderGetter bclBiomeRegistry, long seed, BCLEndBiomeSourceConfig config, boolean initMaps ) { - this(biomeRegistry, getBiomes(biomeRegistry), seed, config, initMaps); + this(biomeRegistry, bclBiomeRegistry, getBiomes(biomeRegistry, bclBiomeRegistry), seed, config, initMaps); } private BCLibEndBiomeSource( HolderGetter biomeRegistry, + HolderGetter bclBiomeRegistry, List> list, long seed, BCLEndBiomeSourceConfig config, boolean initMaps ) { - super(biomeRegistry, list, seed); + super(biomeRegistry, bclBiomeRegistry, list, seed); this.config = config; rebuildBiomePickers(); @@ -114,6 +119,21 @@ public class BCLibEndBiomeSource extends BCLBiomeSource implements BiomeSourceWi @NotNull private void rebuildBiomePickers() { + if (WorldBootstrap.getLastRegistryAccess() == null) { + this.endLandBiomePicker = null; + this.endVoidBiomePicker = null; + this.endCenterBiomePicker = null; + this.endBarrensBiomePicker = null; + this.deciders = List.of(); + return; + } + + HolderLookup.RegistryLookup biomeRegistry = WorldBootstrap.getLastRegistryAccess() + .lookupOrThrow(Registries.BIOME); + Registry bclBiomeRegistry = WorldBootstrap.getLastRegistryAccess() + .registryOrThrow(BCLBiomeRegistry.BCL_BIOMES_REGISTRY); + + var includeMap = Configs.BIOMES_CONFIG.getBiomeIncludeMap(); var excludeList = Configs.BIOMES_CONFIG.getExcludeMatching(BiomeAPI.BiomeType.END); @@ -144,11 +164,11 @@ public class BCLibEndBiomeSource extends BCLBiomeSource implements BiomeSourceWi return; } final BCLBiome bclBiome; - if (!BiomeAPI.hasBiome(biomeID)) { + if (!bclBiomeRegistry.containsKey(biomeID)) { bclBiome = new BCLBiome(biomeID, BiomeAPI.BiomeType.END_LAND); InternalBiomeAPI.registerBCLBiomeData(bclBiome); } else { - bclBiome = BiomeAPI.getBiome(biomeID); + bclBiome = bclBiomeRegistry.get(biomeID); } @@ -238,7 +258,7 @@ public class BCLibEndBiomeSource extends BCLBiomeSource implements BiomeSourceWi } protected BCLBiomeSource cloneForDatapack(Set> datapackBiomes) { - datapackBiomes.addAll(getNonVanillaBiomes(this.biomeRegistry)); + datapackBiomes.addAll(getNonVanillaBiomes(this.biomeRegistry, this.bclBiomeRegistry)); datapackBiomes.addAll(possibleBiomes().stream() .filter(h -> !h.unwrapKey() .orElseThrow() @@ -249,6 +269,7 @@ public class BCLibEndBiomeSource extends BCLBiomeSource implements BiomeSourceWi return new BCLibEndBiomeSource( this.biomeRegistry, + this.bclBiomeRegistry, datapackBiomes.stream() .filter(b -> b.unwrapKey() .orElse(null) != BCLBiomeRegistry.EMPTY_BIOME.getBiomeKey()) @@ -259,18 +280,26 @@ public class BCLibEndBiomeSource extends BCLBiomeSource implements BiomeSourceWi ); } - private static List> getNonVanillaBiomes(HolderGetter biomeRegistry) { + private static List> getNonVanillaBiomes( + HolderGetter biomeRegistry, + HolderGetter bclBiomeRegistry + ) { return getBiomes( biomeRegistry, + bclBiomeRegistry, Configs.BIOMES_CONFIG.getExcludeMatching(BiomeAPI.BiomeType.END), Configs.BIOMES_CONFIG.getIncludeMatching(BiomeAPI.BiomeType.END), BCLibEndBiomeSource::isValidNonVanillaEndBiome ); } - private static List> getBiomes(HolderGetter biomeRegistry) { + private static List> getBiomes( + HolderGetter biomeRegistry, + HolderGetter bclBiomeRegistry + ) { return getBiomes( biomeRegistry, + bclBiomeRegistry, Configs.BIOMES_CONFIG.getExcludeMatching(BiomeAPI.BiomeType.END), Configs.BIOMES_CONFIG.getIncludeMatching(BiomeAPI.BiomeType.END), BCLibEndBiomeSource::isValidEndBiome diff --git a/src/main/java/org/betterx/bclib/api/v2/generator/BCLibNetherBiomeSource.java b/src/main/java/org/betterx/bclib/api/v2/generator/BCLibNetherBiomeSource.java index b4187221..823857e7 100644 --- a/src/main/java/org/betterx/bclib/api/v2/generator/BCLibNetherBiomeSource.java +++ b/src/main/java/org/betterx/bclib/api/v2/generator/BCLibNetherBiomeSource.java @@ -12,6 +12,7 @@ import org.betterx.bclib.config.Configs; import org.betterx.bclib.interfaces.BiomeMap; import org.betterx.worlds.together.biomesource.BiomeSourceWithConfig; import org.betterx.worlds.together.biomesource.ReloadableBiomeSource; +import org.betterx.worlds.together.world.event.WorldBootstrap; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -36,7 +37,8 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource implements BiomeSourc public static final Codec CODEC = RecordCodecBuilder .create(instance -> instance .group( - RegistryOps.retrieveElement(Registries.BIOME), + RegistryOps.retrieveGetter(Registries.BIOME), + RegistryOps.retrieveGetter(BCLBiomeRegistry.BCL_BIOMES_REGISTRY), Codec .LONG .fieldOf("seed") @@ -56,41 +58,42 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource implements BiomeSourc private BiomePicker biomePicker; private BCLNetherBiomeSourceConfig config; - - private BCLibNetherBiomeSource( - Holder.Reference> registryReference, - long seed, - BCLNetherBiomeSourceConfig bclNetherBiomeSourceConfig + public BCLibNetherBiomeSource( + HolderGetter biomeRegistry, + HolderGetter bclBiomeRegistry, + BCLNetherBiomeSourceConfig config ) { - this(registryReference.value().asLookup(), seed, bclNetherBiomeSourceConfig); - } - - - public BCLibNetherBiomeSource(HolderGetter biomeRegistry, BCLNetherBiomeSourceConfig config) { - this(biomeRegistry, 0, config, false); - } - - private BCLibNetherBiomeSource(HolderGetter biomeRegistry, long seed, BCLNetherBiomeSourceConfig config) { - this(biomeRegistry, seed, config, true); + this(biomeRegistry, bclBiomeRegistry, 0, config, false); } private BCLibNetherBiomeSource( HolderGetter biomeRegistry, + HolderGetter bclBiomeRegistry, + long seed, + BCLNetherBiomeSourceConfig config + ) { + this(biomeRegistry, bclBiomeRegistry, seed, config, true); + } + + private BCLibNetherBiomeSource( + HolderGetter biomeRegistry, + HolderGetter bclBiomeRegistry, long seed, BCLNetherBiomeSourceConfig config, boolean initMaps ) { - this(biomeRegistry, getBiomes(biomeRegistry), seed, config, initMaps); + this(biomeRegistry, bclBiomeRegistry, getBiomes(biomeRegistry, bclBiomeRegistry), seed, config, initMaps); } private BCLibNetherBiomeSource( HolderGetter biomeRegistry, + HolderGetter bclBiomeRegistry, List> list, long seed, BCLNetherBiomeSourceConfig config, boolean initMaps ) { - super(biomeRegistry, list, seed); + super(biomeRegistry, bclBiomeRegistry, list, seed); this.config = config; rebuildBiomePicker(); if (initMaps) { @@ -99,20 +102,27 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource implements BiomeSourc } private void rebuildBiomePicker() { - biomePicker = new BiomePicker(biomeRegistry); - + if (WorldBootstrap.getLastRegistryAccess() == null) { + biomePicker = new BiomePicker(null); + return; + } + biomePicker = new BiomePicker(WorldBootstrap.getLastRegistryAccess().lookupOrThrow(Registries.BIOME)); + Registry bclBiomeRegistry = WorldBootstrap.getLastRegistryAccess() + .registryOrThrow(BCLBiomeRegistry.BCL_BIOMES_REGISTRY); this.possibleBiomes().forEach(biome -> { ResourceLocation biomeID = biome.unwrapKey().orElseThrow().location(); if (!biome.isBound()) { BCLib.LOGGER.warning("Biome " + biomeID.toString() + " is requested but not yet bound."); return; } - if (!BiomeAPI.hasBiome(biomeID)) { + + + if (!bclBiomeRegistry.containsKey(biomeID)) { BCLBiome bclBiome = new BCLBiome(biomeID, BiomeAPI.BiomeType.NETHER); InternalBiomeAPI.registerBCLBiomeData(bclBiome); biomePicker.addBiome(bclBiome); } else { - BCLBiome bclBiome = BiomeAPI.getBiome(biomeID); + BCLBiome bclBiome = bclBiomeRegistry.get(biomeID); if (!BCLBiomeRegistry.isEmptyBiome(bclBiome)) { if (bclBiome.getParentBiome() == null) { @@ -126,7 +136,7 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource implements BiomeSourc } protected BCLBiomeSource cloneForDatapack(Set> datapackBiomes) { - datapackBiomes.addAll(getNonVanillaBiomes(this.biomeRegistry)); + datapackBiomes.addAll(getNonVanillaBiomes(this.biomeRegistry, this.bclBiomeRegistry)); datapackBiomes.addAll(possibleBiomes().stream() .filter(h -> !h.unwrapKey() .orElseThrow() @@ -136,6 +146,7 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource implements BiomeSourc .toList()); return new BCLibNetherBiomeSource( this.biomeRegistry, + this.bclBiomeRegistry, datapackBiomes.stream() .filter(b -> b.unwrapKey() .orElse(null) != BCLBiomeRegistry.EMPTY_BIOME.getBiomeKey()) @@ -146,19 +157,31 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource implements BiomeSourc ); } - private static List> getNonVanillaBiomes(HolderGetter biomeRegistry) { + private static List> getNonVanillaBiomes( + HolderGetter biomeRegistry, + HolderGetter bclBiomeRegistry + ) { List include = Configs.BIOMES_CONFIG.getIncludeMatching(BiomeAPI.BiomeType.NETHER); List exclude = Configs.BIOMES_CONFIG.getExcludeMatching(BiomeAPI.BiomeType.NETHER); - return getBiomes(biomeRegistry, exclude, include, BCLibNetherBiomeSource::isValidNonVanillaNetherBiome); + return getBiomes( + biomeRegistry, + bclBiomeRegistry, + exclude, + include, + BCLibNetherBiomeSource::isValidNonVanillaNetherBiome + ); } - private static List> getBiomes(HolderGetter biomeRegistry) { + private static List> getBiomes( + HolderGetter biomeRegistry, + HolderGetter bclBiomeRegistry + ) { List include = Configs.BIOMES_CONFIG.getIncludeMatching(BiomeAPI.BiomeType.NETHER); List exclude = Configs.BIOMES_CONFIG.getExcludeMatching(BiomeAPI.BiomeType.NETHER); - return getBiomes(biomeRegistry, exclude, include, BCLibNetherBiomeSource::isValidNetherBiome); + return getBiomes(biomeRegistry, bclBiomeRegistry, exclude, include, BCLibNetherBiomeSource::isValidNetherBiome); } diff --git a/src/main/java/org/betterx/bclib/api/v2/generator/BiomePicker.java b/src/main/java/org/betterx/bclib/api/v2/generator/BiomePicker.java index 6c65504c..b2b5a24f 100644 --- a/src/main/java/org/betterx/bclib/api/v2/generator/BiomePicker.java +++ b/src/main/java/org/betterx/bclib/api/v2/generator/BiomePicker.java @@ -110,7 +110,7 @@ public class BiomePicker { Registries.BIOME, bclBiome.getID() );//biomeRegistry.getResourceKey(biomeRegistry.get(bclBiome.getID())).orElse(null); - this.biome = key != null ? biomeRegistry.getOrThrow(key) : null; + this.biome = (key != null && biomeRegistry != null) ? biomeRegistry.getOrThrow(key) : null; this.isValid = key != null && biome != null && biome.isBound() && biomeRegistry.get(key).isPresent(); bclBiome.forEachSubBiome((b, w) -> { if (isAllowed(b)) diff --git a/src/main/java/org/betterx/bclib/api/v2/levelgen/LevelGenUtil.java b/src/main/java/org/betterx/bclib/api/v2/levelgen/LevelGenUtil.java index 8383664c..0780d1ae 100644 --- a/src/main/java/org/betterx/bclib/api/v2/levelgen/LevelGenUtil.java +++ b/src/main/java/org/betterx/bclib/api/v2/levelgen/LevelGenUtil.java @@ -37,7 +37,7 @@ public class LevelGenUtil { @NotNull public static LevelStem getBCLNetherLevelStem(WorldGenUtil.Context context, BCLNetherBiomeSourceConfig config) { - BCLibNetherBiomeSource netherSource = new BCLibNetherBiomeSource(context.biomes, config); + BCLibNetherBiomeSource netherSource = new BCLibNetherBiomeSource(context.biomes, context.bclBiomes, config); return new LevelStem( context.dimension, @@ -49,7 +49,7 @@ public class LevelGenUtil { } public static LevelStem getBCLEndLevelStem(WorldGenUtil.Context context, BCLEndBiomeSourceConfig config) { - BCLibEndBiomeSource endSource = new BCLibEndBiomeSource(context.biomes, config); + BCLibEndBiomeSource endSource = new BCLibEndBiomeSource(context.biomes, context.bclBiomes, config); return new LevelStem( context.dimension, new BCLChunkGenerator( diff --git a/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/BCLBiomeRegistry.java b/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/BCLBiomeRegistry.java index 2dcb01cc..f9c08667 100644 --- a/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/BCLBiomeRegistry.java +++ b/src/main/java/org/betterx/bclib/api/v2/levelgen/biomes/BCLBiomeRegistry.java @@ -5,7 +5,6 @@ import org.betterx.worlds.together.WorldsTogether; import org.betterx.worlds.together.world.event.WorldBootstrap; import com.mojang.serialization.Codec; -import com.mojang.serialization.Lifecycle; import net.minecraft.core.MappedRegistry; import net.minecraft.core.Registry; import net.minecraft.core.RegistryAccess; @@ -30,10 +29,7 @@ public class BCLBiomeRegistry { BCL_BIOME_CODEC_REGISTRY, BCLBiomeRegistry::bootstrapCodecs ); - public static MappedRegistry BUILTIN_BCL_BIOMES = new MappedRegistry<>( - BCL_BIOMES_REGISTRY, - Lifecycle.stable() - ); + public static MappedRegistry BUILTIN_BCL_BIOMES = null; /** * Empty biome used as default value if requested biome doesn't exist or linked. Shouldn't be registered anywhere to prevent bugs. @@ -76,6 +72,7 @@ public class BCLBiomeRegistry { */ @ApiStatus.Internal public static ResourceKey register(RegistryAccess access, BCLBiome biome) { + if (access != null && BUILTIN_BCL_BIOMES == null) return biome.getBCLBiomeKey(); Registry.register( access == null ? BUILTIN_BCL_BIOMES : access.registryOrThrow(BCL_BIOMES_REGISTRY), biome.getBCLBiomeKey(), @@ -134,7 +131,9 @@ public class BCLBiomeRegistry { } public static BCLBiome get(@Nullable RegistryAccess access, ResourceLocation loc) { - return getBclBiomesRegistry(access).get(loc); + var reg = getBclBiomesRegistry(access); + if (reg == null) return null; + return reg.get(loc); } public static BCLBiome getOrElseEmpty(ResourceLocation loc) { diff --git a/src/main/java/org/betterx/bclib/mixin/common/BuiltinRegistriesMixin.java b/src/main/java/org/betterx/bclib/mixin/common/BuiltinRegistriesMixin.java index 8090bec3..2f5ef25e 100644 --- a/src/main/java/org/betterx/bclib/mixin/common/BuiltinRegistriesMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/common/BuiltinRegistriesMixin.java @@ -1,5 +1,6 @@ package org.betterx.bclib.mixin.common; +import org.betterx.bclib.BCLib; import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeRegistry; import com.mojang.serialization.Lifecycle; @@ -29,11 +30,17 @@ public abstract class BuiltinRegistriesMixin { //this needs to be added BEFORE the WORLD_PRESET-Registry. Otherwise decoding will fail! @Inject(method = "", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/core/registries/BuiltInRegistries;registerSimple(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/registries/BuiltInRegistries$RegistryBootstrap;)Lnet/minecraft/core/Registry;")) private static void bcl_registerBuiltin(CallbackInfo ci) { - BCLBiomeRegistry.BUILTIN_BCL_BIOMES = internalRegister( - BCLBiomeRegistry.BCL_BIOMES_REGISTRY, - BCLBiomeRegistry.BUILTIN_BCL_BIOMES, - BCLBiomeRegistry::bootstrap, - Lifecycle.stable() - ); + BCLBiomeRegistry.ensureStaticallyLoaded(); + if (BCLib.isDatagen()) { +// BCLBiomeRegistry.BUILTIN_BCL_BIOMES = internalRegister( +// BCLBiomeRegistry.BCL_BIOMES_REGISTRY, +// new MappedRegistry<>( +// BCLBiomeRegistry.BCL_BIOMES_REGISTRY, +// Lifecycle.stable() +// ), +// BCLBiomeRegistry::bootstrap, +// Lifecycle.stable() +// ); + } } } diff --git a/src/main/java/org/betterx/bclib/registry/PresetsRegistry.java b/src/main/java/org/betterx/bclib/registry/PresetsRegistry.java index dfe78c55..c539401c 100644 --- a/src/main/java/org/betterx/bclib/registry/PresetsRegistry.java +++ b/src/main/java/org/betterx/bclib/registry/PresetsRegistry.java @@ -1,132 +1,22 @@ package org.betterx.bclib.registry; import org.betterx.bclib.BCLib; -import org.betterx.bclib.api.v2.generator.BCLChunkGenerator; -import org.betterx.bclib.api.v2.generator.config.BCLEndBiomeSourceConfig; -import org.betterx.bclib.api.v2.generator.config.BCLNetherBiomeSourceConfig; -import org.betterx.bclib.api.v2.levelgen.LevelGenUtil; import org.betterx.bclib.config.Configs; -import org.betterx.worlds.together.entrypoints.WorldPresetBootstrap; -import org.betterx.worlds.together.levelgen.WorldGenUtil; -import org.betterx.worlds.together.worldPreset.TogetherWorldPreset; import org.betterx.worlds.together.worldPreset.WorldPresets; -import net.minecraft.core.Holder; import net.minecraft.resources.ResourceKey; -import net.minecraft.world.level.dimension.LevelStem; -import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import net.minecraft.world.level.levelgen.presets.WorldPreset; -import java.util.Map; - -public class PresetsRegistry implements WorldPresetBootstrap { - +public class PresetsRegistry { public static ResourceKey BCL_WORLD = WorldPresets.createKey(BCLib.makeID("normal")); public static ResourceKey BCL_WORLD_LARGE = WorldPresets.createKey(BCLib.makeID("large")); public static ResourceKey BCL_WORLD_AMPLIFIED = WorldPresets.createKey(BCLib.makeID("amplified")); public static ResourceKey BCL_WORLD_17 = WorldPresets.createKey(BCLib.makeID("legacy_17")); - public void bootstrapWorldPresets() { - WorldPresets.register( - BCL_WORLD, - (overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> - buildPreset( - overworldStem, - netherContext, BCLNetherBiomeSourceConfig.DEFAULT, - endContext, BCLEndBiomeSourceConfig.DEFAULT - ), - true - ); - - WorldPresets.register( - BCL_WORLD_LARGE, - (overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> { - Holder largeBiomeGenerator = noiseSettings - .getOrThrow(NoiseGeneratorSettings.LARGE_BIOMES); - return buildPreset( - noiseBasedOverworld.make( - overworldStem.generator().getBiomeSource(), - largeBiomeGenerator - ), - netherContext, BCLNetherBiomeSourceConfig.MINECRAFT_18_LARGE, - endContext, BCLEndBiomeSourceConfig.MINECRAFT_18_LARGE - ); - }, - true - ); - - WorldPresets.register( - BCL_WORLD_AMPLIFIED, - (overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> { - Holder amplifiedBiomeGenerator = noiseSettings - .getOrThrow(NoiseGeneratorSettings.AMPLIFIED); - - WorldGenUtil.Context amplifiedNetherContext = new WorldGenUtil.Context( - netherContext.biomes, - netherContext.dimension, - netherContext.structureSets, - noiseSettings.getOrThrow(BCLChunkGenerator.AMPLIFIED_NETHER) - ); - - return buildPreset( - noiseBasedOverworld.make( - overworldStem.generator().getBiomeSource(), - amplifiedBiomeGenerator - ), - amplifiedNetherContext, BCLNetherBiomeSourceConfig.MINECRAFT_18_AMPLIFIED, - endContext, BCLEndBiomeSourceConfig.MINECRAFT_18_AMPLIFIED - ); - }, - true - ); - - WorldPresets.register( - BCL_WORLD_17, - (overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> - buildPreset( - overworldStem, - netherContext, - BCLNetherBiomeSourceConfig.MINECRAFT_17, endContext, - BCLEndBiomeSourceConfig.MINECRAFT_17 - ), - false - ); - + public static void register() { if (Configs.CLIENT_CONFIG.forceBetterXPreset()) WorldPresets.setDEFAULT(BCL_WORLD); else WorldPresets.setDEFAULT(net.minecraft.world.level.levelgen.presets.WorldPresets.NORMAL); } - - public static TogetherWorldPreset buildPreset( - LevelStem overworldStem, - WorldGenUtil.Context netherContext, - BCLNetherBiomeSourceConfig netherConfig, - WorldGenUtil.Context endContext, - BCLEndBiomeSourceConfig endConfig - ) { - return new TogetherWorldPreset(buildDimensionMap( - overworldStem, - netherContext, - netherConfig, endContext, - endConfig - ), 1000); - } - - public static Map, LevelStem> buildDimensionMap( - LevelStem overworldStem, - WorldGenUtil.Context netherContext, - BCLNetherBiomeSourceConfig netherConfig, - WorldGenUtil.Context endContext, - BCLEndBiomeSourceConfig endConfig - ) { - return Map.of( - LevelStem.OVERWORLD, - overworldStem, - LevelStem.NETHER, - LevelGenUtil.getBCLNetherLevelStem(netherContext, netherConfig), - LevelStem.END, - LevelGenUtil.getBCLEndLevelStem(endContext, endConfig) - ); - } } diff --git a/src/main/java/org/betterx/bclib/datagen/BCLibDatagen.java b/src/main/java/org/betterx/datagen/bclib/BCLibDatagen.java similarity index 53% rename from src/main/java/org/betterx/bclib/datagen/BCLibDatagen.java rename to src/main/java/org/betterx/datagen/bclib/BCLibDatagen.java index 5e877ca0..d6a2e92a 100644 --- a/src/main/java/org/betterx/bclib/datagen/BCLibDatagen.java +++ b/src/main/java/org/betterx/datagen/bclib/BCLibDatagen.java @@ -1,6 +1,14 @@ -package org.betterx.bclib.datagen; +package org.betterx.datagen.bclib; import org.betterx.bclib.BCLib; +import org.betterx.datagen.bclib.preset.WorldPresetDataProvider; +import org.betterx.datagen.bclib.tests.TestBiomes; +import org.betterx.datagen.bclib.tests.TestConfiguredFeatures; +import org.betterx.datagen.bclib.tests.TestPlacedFeatures; +import org.betterx.datagen.bclib.tests.TestWorldgenProvider; +import org.betterx.datagen.bclib.worldgen.BCLibRegistriesDataProvider; +import org.betterx.datagen.bclib.worldgen.NoiseTypesDataProvider; +import org.betterx.datagen.bclib.worldgen.WorldgenRegistriesDataProvider; import net.minecraft.core.RegistrySetBuilder; import net.minecraft.core.registries.Registries; @@ -9,7 +17,7 @@ import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint; import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator; public class BCLibDatagen implements DataGeneratorEntrypoint { - static boolean ADD_TESTS = true; + public static final boolean ADD_TESTS = true; @Override public void onInitializeDataGenerator(FabricDataGenerator dataGenerator) { @@ -19,10 +27,10 @@ public class BCLibDatagen implements DataGeneratorEntrypoint { if (ADD_TESTS) { pack.addProvider(TestWorldgenProvider::new); } - pack.addProvider(WorldgenProvider::new); - //pack.addProvider(BiomeProvider::new); - //pack.addProvider(new BiomeProvider()); - pack.addProvider(CustomRegistriesDataProvider::new); + + pack.addProvider(WorldgenRegistriesDataProvider::new); + pack.addProvider(WorldPresetDataProvider::new); + pack.addProvider(BCLibRegistriesDataProvider::new); } @Override @@ -33,6 +41,7 @@ public class BCLibDatagen implements DataGeneratorEntrypoint { registryBuilder.add(Registries.PLACED_FEATURE, TestPlacedFeatures::bootstrap); } registryBuilder.add(Registries.BIOME, TestBiomes::bootstrap); - registryBuilder.add(Registries.NOISE_SETTINGS, NoiseDatagen::bootstrap); + registryBuilder.add(Registries.NOISE_SETTINGS, NoiseTypesDataProvider::bootstrap); + registryBuilder.add(Registries.WORLD_PRESET, WorldPresetDataProvider::bootstrap); } } diff --git a/src/main/java/org/betterx/datagen/bclib/preset/WorldPresetDataProvider.java b/src/main/java/org/betterx/datagen/bclib/preset/WorldPresetDataProvider.java new file mode 100644 index 00000000..880f4a5e --- /dev/null +++ b/src/main/java/org/betterx/datagen/bclib/preset/WorldPresetDataProvider.java @@ -0,0 +1,143 @@ +package org.betterx.datagen.bclib.preset; + +import org.betterx.bclib.api.v2.generator.BCLChunkGenerator; +import org.betterx.bclib.api.v2.generator.config.BCLEndBiomeSourceConfig; +import org.betterx.bclib.api.v2.generator.config.BCLNetherBiomeSourceConfig; +import org.betterx.bclib.api.v2.levelgen.LevelGenUtil; +import org.betterx.bclib.registry.PresetsRegistry; +import org.betterx.worlds.together.levelgen.WorldGenUtil; +import org.betterx.worlds.together.worldPreset.TogetherWorldPreset; +import org.betterx.worlds.together.worldPreset.WorldPresets; + +import net.minecraft.core.Holder; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.WorldPresetTags; +import net.minecraft.world.level.dimension.LevelStem; +import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; +import net.minecraft.world.level.levelgen.presets.WorldPreset; + +import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider; + +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +public class WorldPresetDataProvider extends FabricTagProvider { + + + /** + * Constructs a new {@link FabricTagProvider} with the default computed path. + * + *

Common implementations of this class are provided. + * + * @param output the {@link FabricDataOutput} instance + * @param registriesFuture the backing registry for the tag type + */ + public WorldPresetDataProvider( + FabricDataOutput output, + CompletableFuture registriesFuture + ) { + super(output, Registries.WORLD_PRESET, registriesFuture); + } + + public static void bootstrap(BootstapContext bootstrapContext) { + final WorldPresets.BootstrapData ctx = new WorldPresets.BootstrapData(bootstrapContext); + + bootstrapContext.register(PresetsRegistry.BCL_WORLD, createNormal(ctx)); + bootstrapContext.register(PresetsRegistry.BCL_WORLD_LARGE, createLarge(ctx)); + bootstrapContext.register(PresetsRegistry.BCL_WORLD_AMPLIFIED, createAmplified(ctx)); + bootstrapContext.register(PresetsRegistry.BCL_WORLD_17, createLegacy(ctx)); + } + + private static WorldPreset createLegacy(WorldPresets.BootstrapData ctx) { + return buildPreset( + ctx.overworldStem, + ctx.netherContext, + BCLNetherBiomeSourceConfig.MINECRAFT_17, ctx.endContext, + BCLEndBiomeSourceConfig.MINECRAFT_17 + ); + } + + private static WorldPreset createAmplified(WorldPresets.BootstrapData ctx) { + Holder amplifiedBiomeGenerator = ctx.noiseSettings + .getOrThrow(NoiseGeneratorSettings.AMPLIFIED); + + WorldGenUtil.Context amplifiedNetherContext = new WorldGenUtil.Context( + ctx.netherContext.biomes, + ctx.netherContext.bclBiomes, + ctx.netherContext.dimension, + ctx.netherContext.structureSets, + ctx.noiseSettings.getOrThrow(BCLChunkGenerator.AMPLIFIED_NETHER) + ); + + return buildPreset( + ctx.makeNoiseBasedOverworld( + ctx.overworldStem.generator().getBiomeSource(), + amplifiedBiomeGenerator + ), + amplifiedNetherContext, BCLNetherBiomeSourceConfig.MINECRAFT_18_AMPLIFIED, + ctx.endContext, BCLEndBiomeSourceConfig.MINECRAFT_18_AMPLIFIED + ); + } + + private static WorldPreset createLarge(WorldPresets.BootstrapData ctx) { + Holder largeBiomeGenerator = ctx.noiseSettings + .getOrThrow(NoiseGeneratorSettings.LARGE_BIOMES); + return buildPreset( + ctx.makeNoiseBasedOverworld( + ctx.overworldStem.generator().getBiomeSource(), + largeBiomeGenerator + ), + ctx.netherContext, BCLNetherBiomeSourceConfig.MINECRAFT_18_LARGE, + ctx.endContext, BCLEndBiomeSourceConfig.MINECRAFT_18_LARGE + ); + } + + private static WorldPreset createNormal(WorldPresets.BootstrapData ctx) { + return buildPreset( + ctx.overworldStem, + ctx.netherContext, BCLNetherBiomeSourceConfig.DEFAULT, + ctx.endContext, BCLEndBiomeSourceConfig.DEFAULT + ); + } + + private static TogetherWorldPreset buildPreset( + LevelStem overworldStem, + WorldGenUtil.Context netherContext, + BCLNetherBiomeSourceConfig netherConfig, + WorldGenUtil.Context endContext, + BCLEndBiomeSourceConfig endConfig + ) { + return new TogetherWorldPreset(buildDimensionMap( + overworldStem, netherContext, netherConfig, endContext, endConfig + ), 1000); + } + + public static Map, LevelStem> buildDimensionMap( + LevelStem overworldStem, + WorldGenUtil.Context netherContext, + BCLNetherBiomeSourceConfig netherConfig, + WorldGenUtil.Context endContext, + BCLEndBiomeSourceConfig endConfig + ) { + return Map.of( + LevelStem.OVERWORLD, + overworldStem, + LevelStem.NETHER, + LevelGenUtil.getBCLNetherLevelStem(netherContext, netherConfig), + LevelStem.END, + LevelGenUtil.getBCLEndLevelStem(endContext, endConfig) + ); + } + + @Override + protected void addTags(HolderLookup.Provider arg) { + final FabricTagProvider.FabricTagBuilder builder = getOrCreateTagBuilder(WorldPresetTags.NORMAL); + builder.add(PresetsRegistry.BCL_WORLD); + builder.add(PresetsRegistry.BCL_WORLD_AMPLIFIED); + builder.add(PresetsRegistry.BCL_WORLD_LARGE); + } +} diff --git a/src/main/java/org/betterx/bclib/datagen/TestBiomes.java b/src/main/java/org/betterx/datagen/bclib/tests/TestBiomes.java similarity index 97% rename from src/main/java/org/betterx/bclib/datagen/TestBiomes.java rename to src/main/java/org/betterx/datagen/bclib/tests/TestBiomes.java index 6dd9baee..638ace2f 100644 --- a/src/main/java/org/betterx/bclib/datagen/TestBiomes.java +++ b/src/main/java/org/betterx/datagen/bclib/tests/TestBiomes.java @@ -1,9 +1,10 @@ -package org.betterx.bclib.datagen; +package org.betterx.datagen.bclib.tests; import org.betterx.bclib.BCLib; import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiome; import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeBuilder; import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeContainer; +import org.betterx.datagen.bclib.BCLibDatagen; import net.minecraft.data.worldgen.BootstapContext; import net.minecraft.world.level.biome.Biome; diff --git a/src/main/java/org/betterx/bclib/datagen/TestConfiguredFeatures.java b/src/main/java/org/betterx/datagen/bclib/tests/TestConfiguredFeatures.java similarity index 95% rename from src/main/java/org/betterx/bclib/datagen/TestConfiguredFeatures.java rename to src/main/java/org/betterx/datagen/bclib/tests/TestConfiguredFeatures.java index a0c612f5..e28dd5cd 100644 --- a/src/main/java/org/betterx/bclib/datagen/TestConfiguredFeatures.java +++ b/src/main/java/org/betterx/datagen/bclib/tests/TestConfiguredFeatures.java @@ -1,8 +1,9 @@ -package org.betterx.bclib.datagen; +package org.betterx.datagen.bclib.tests; import org.betterx.bclib.BCLib; import org.betterx.bclib.api.v3.levelgen.features.BCLConfigureFeature; import org.betterx.bclib.api.v3.levelgen.features.BCLFeatureBuilder; +import org.betterx.datagen.bclib.BCLibDatagen; import net.minecraft.core.Holder; import net.minecraft.core.registries.Registries; @@ -27,7 +28,7 @@ public class TestConfiguredFeatures { Registries.CONFIGURED_FEATURE, YELLOW_FEATURE.id )); - + BCLib.LOGGER.info("Bootstrap CONFIGUREDFeatures" + holder); if (BCLibDatagen.ADD_TESTS && BCLib.isDevEnvironment()) { //YELLOW_FEATURE = YELLOW_FEATURE.register(bootstrapContext); diff --git a/src/main/java/org/betterx/bclib/datagen/TestPlacedFeatures.java b/src/main/java/org/betterx/datagen/bclib/tests/TestPlacedFeatures.java similarity index 92% rename from src/main/java/org/betterx/bclib/datagen/TestPlacedFeatures.java rename to src/main/java/org/betterx/datagen/bclib/tests/TestPlacedFeatures.java index 3a2d99be..376f934b 100644 --- a/src/main/java/org/betterx/bclib/datagen/TestPlacedFeatures.java +++ b/src/main/java/org/betterx/datagen/bclib/tests/TestPlacedFeatures.java @@ -1,7 +1,8 @@ -package org.betterx.bclib.datagen; +package org.betterx.datagen.bclib.tests; import org.betterx.bclib.BCLib; import org.betterx.bclib.api.v3.levelgen.features.BCLFeature; +import org.betterx.datagen.bclib.BCLibDatagen; import net.minecraft.data.worldgen.BootstapContext; import net.minecraft.world.level.levelgen.GenerationStep; diff --git a/src/main/java/org/betterx/bclib/datagen/TestWorldgenProvider.java b/src/main/java/org/betterx/datagen/bclib/tests/TestWorldgenProvider.java similarity index 92% rename from src/main/java/org/betterx/bclib/datagen/TestWorldgenProvider.java rename to src/main/java/org/betterx/datagen/bclib/tests/TestWorldgenProvider.java index 88689e04..88e56237 100644 --- a/src/main/java/org/betterx/bclib/datagen/TestWorldgenProvider.java +++ b/src/main/java/org/betterx/datagen/bclib/tests/TestWorldgenProvider.java @@ -1,4 +1,6 @@ -package org.betterx.bclib.datagen; +package org.betterx.datagen.bclib.tests; + +import org.betterx.datagen.bclib.BCLibDatagen; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; diff --git a/src/main/java/org/betterx/bclib/datagen/CustomRegistriesDataProvider.java b/src/main/java/org/betterx/datagen/bclib/worldgen/BCLibRegistriesDataProvider.java similarity index 94% rename from src/main/java/org/betterx/bclib/datagen/CustomRegistriesDataProvider.java rename to src/main/java/org/betterx/datagen/bclib/worldgen/BCLibRegistriesDataProvider.java index de6c7fd0..8d45ee43 100644 --- a/src/main/java/org/betterx/bclib/datagen/CustomRegistriesDataProvider.java +++ b/src/main/java/org/betterx/datagen/bclib/worldgen/BCLibRegistriesDataProvider.java @@ -1,4 +1,4 @@ -package org.betterx.bclib.datagen; +package org.betterx.datagen.bclib.worldgen; import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeRegistry; import org.betterx.bclib.api.v2.levelgen.biomes.BiomeData; @@ -29,13 +29,14 @@ import java.util.List; import java.util.Optional; import java.util.concurrent.CompletableFuture; -public class CustomRegistriesDataProvider implements DataProvider { +public class BCLibRegistriesDataProvider implements DataProvider { public static final List> REGISTRIES = List.of( new RegistryDataLoader.RegistryData<>(BCLBiomeRegistry.BCL_BIOMES_REGISTRY, BiomeData.CODEC), new RegistryDataLoader.RegistryData<>( SurfaceRuleRegistry.SURFACE_RULES_REGISTRY, AssignedSurfaceRule.CODEC ) + //new RegistryDataLoader.RegistryData<>(Registries.WORLD_PRESET, WorldPreset.DIRECT_CODEC) // new RegistryDataLoader.RegistryData<>(Registries.BIOME, Biome.DIRECT_CODEC), // new RegistryDataLoader.RegistryData<>(Registries.CONFIGURED_FEATURE, ConfiguredFeature.DIRECT_CODEC), // new RegistryDataLoader.RegistryData<>(Registries.PLACED_FEATURE, PlacedFeature.DIRECT_CODEC), @@ -45,7 +46,7 @@ public class CustomRegistriesDataProvider implements DataProvider { private final PackOutput output; - public CustomRegistriesDataProvider(FabricDataOutput generator) { + public BCLibRegistriesDataProvider(FabricDataOutput generator) { this.output = generator; } diff --git a/src/main/java/org/betterx/bclib/datagen/NoiseDatagen.java b/src/main/java/org/betterx/datagen/bclib/worldgen/NoiseTypesDataProvider.java similarity index 84% rename from src/main/java/org/betterx/bclib/datagen/NoiseDatagen.java rename to src/main/java/org/betterx/datagen/bclib/worldgen/NoiseTypesDataProvider.java index b120933e..049dc206 100644 --- a/src/main/java/org/betterx/bclib/datagen/NoiseDatagen.java +++ b/src/main/java/org/betterx/datagen/bclib/worldgen/NoiseTypesDataProvider.java @@ -1,11 +1,11 @@ -package org.betterx.bclib.datagen; +package org.betterx.datagen.bclib.worldgen; import org.betterx.bclib.api.v2.generator.BCLChunkGenerator; import net.minecraft.data.worldgen.BootstapContext; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; -public class NoiseDatagen { +public class NoiseTypesDataProvider { public static void bootstrap(BootstapContext bootstrapContext) { bootstrapContext.register( BCLChunkGenerator.AMPLIFIED_NETHER, diff --git a/src/main/java/org/betterx/bclib/datagen/WorldgenProvider.java b/src/main/java/org/betterx/datagen/bclib/worldgen/WorldgenRegistriesDataProvider.java similarity index 86% rename from src/main/java/org/betterx/bclib/datagen/WorldgenProvider.java rename to src/main/java/org/betterx/datagen/bclib/worldgen/WorldgenRegistriesDataProvider.java index f5e84e4d..603407e4 100644 --- a/src/main/java/org/betterx/bclib/datagen/WorldgenProvider.java +++ b/src/main/java/org/betterx/datagen/bclib/worldgen/WorldgenRegistriesDataProvider.java @@ -1,4 +1,4 @@ -package org.betterx.bclib.datagen; +package org.betterx.datagen.bclib.worldgen; import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeRegistry; import org.betterx.worlds.together.surfaceRules.SurfaceRuleRegistry; @@ -11,8 +11,8 @@ import net.fabricmc.fabric.api.datagen.v1.provider.FabricDynamicRegistryProvider import java.util.concurrent.CompletableFuture; -public class WorldgenProvider extends FabricDynamicRegistryProvider { - public WorldgenProvider( +public class WorldgenRegistriesDataProvider extends FabricDynamicRegistryProvider { + public WorldgenRegistriesDataProvider( FabricDataOutput output, CompletableFuture registriesFuture ) { diff --git a/src/main/java/org/betterx/worlds/together/entrypoints/WorldPresetBootstrap.java b/src/main/java/org/betterx/worlds/together/entrypoints/WorldPresetBootstrap.java deleted file mode 100644 index 238fec8e..00000000 --- a/src/main/java/org/betterx/worlds/together/entrypoints/WorldPresetBootstrap.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.betterx.worlds.together.entrypoints; - -public interface WorldPresetBootstrap extends WorldsTogetherEntrypoint { - void bootstrapWorldPresets(); -} 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 61aac0d7..a59b80af 100644 --- a/src/main/java/org/betterx/worlds/together/levelgen/WorldGenUtil.java +++ b/src/main/java/org/betterx/worlds/together/levelgen/WorldGenUtil.java @@ -1,5 +1,6 @@ package org.betterx.worlds.together.levelgen; +import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiome; import org.betterx.worlds.together.WorldsTogether; import org.betterx.worlds.together.biomesource.BiomeSourceWithConfig; import org.betterx.worlds.together.biomesource.ReloadableBiomeSource; @@ -100,15 +101,18 @@ public class WorldGenUtil { public static class Context extends StemContext { public final HolderGetter biomes; + public final HolderGetter bclBiomes; public Context( HolderGetter biomes, + HolderGetter bclBiomes, Holder dimension, HolderGetter structureSets, Holder generatorSettings ) { super(dimension, structureSets, generatorSettings); this.biomes = biomes; + this.bclBiomes = bclBiomes; } } diff --git a/src/main/java/org/betterx/worlds/together/mixin/common/WorldPresetMixin.java b/src/main/java/org/betterx/worlds/together/mixin/common/WorldPresetMixin.java index e846a3a4..bbe125b4 100644 --- a/src/main/java/org/betterx/worlds/together/mixin/common/WorldPresetMixin.java +++ b/src/main/java/org/betterx/worlds/together/mixin/common/WorldPresetMixin.java @@ -20,8 +20,6 @@ import java.util.function.Function; @Mixin(WorldPreset.class) public class WorldPresetMixin { - - @ModifyArg(method = "", at = @At(value = "INVOKE", target = "Lcom/mojang/serialization/codecs/RecordCodecBuilder;create(Ljava/util/function/Function;)Lcom/mojang/serialization/Codec;")) private static Function, ? extends App, WorldPreset>> foo( Function, ? extends App, WorldPreset>> builder diff --git a/src/main/java/org/betterx/worlds/together/mixin/common/WorldPresetsBootstrapMixin.java b/src/main/java/org/betterx/worlds/together/mixin/common/WorldPresetsBootstrapMixin.java deleted file mode 100644 index 1782db34..00000000 --- a/src/main/java/org/betterx/worlds/together/mixin/common/WorldPresetsBootstrapMixin.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.betterx.worlds.together.mixin.common; - -import org.betterx.worlds.together.levelgen.WorldGenUtil; -import org.betterx.worlds.together.worldPreset.WorldPresets; - -import net.minecraft.core.Holder; -import net.minecraft.core.HolderGetter; -import net.minecraft.data.worldgen.BootstapContext; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSource; -import net.minecraft.world.level.dimension.LevelStem; -import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; -import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; -import net.minecraft.world.level.levelgen.placement.PlacedFeature; -import net.minecraft.world.level.levelgen.presets.WorldPreset; -import net.minecraft.world.level.levelgen.structure.StructureSet; - -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.ModifyArg; - -@Mixin(net.minecraft.world.level.levelgen.presets.WorldPresets.Bootstrap.class) -public abstract class WorldPresetsBootstrapMixin { - @Shadow - @Final - private HolderGetter biomes; - @Shadow - @Final - private HolderGetter structureSets; - - @Shadow - @Final - private BootstapContext context; - @Shadow - @Final - private HolderGetter placedFeatures; - @Shadow - @Final - private LevelStem netherStem; - @Shadow - @Final - private LevelStem endStem; - //see WorldPresets.register - - @Shadow - protected abstract LevelStem makeNoiseBasedOverworld( - BiomeSource biomeSource, - Holder holder - ); - - @Shadow - @Final - private HolderGetter noiseSettings; - - @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;)V")) - private LevelStem bcl_getOverworldStem(LevelStem overworldStem) { - Holder netherSettings, endSettings; - if (this.netherStem.generator() instanceof NoiseBasedChunkGenerator nether) { - netherSettings = nether.generatorSettings(); - } else { - netherSettings = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.NETHER); - } - - if (this.endStem.generator() instanceof NoiseBasedChunkGenerator nether) { - endSettings = nether.generatorSettings(); - } else { - endSettings = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.END); - } - - WorldGenUtil.Context netherContext = new WorldGenUtil.Context( - this.biomes, - this.netherStem.type(), - this.structureSets, - netherSettings - ); - WorldGenUtil.Context endContext = new WorldGenUtil.Context( - this.biomes, - this.endStem.type(), - this.structureSets, - endSettings - ); - - WorldPresets.bootstrapPresets( - context, - overworldStem, - netherContext, - endContext, - noiseSettings, - this::makeNoiseBasedOverworld - ); - - return overworldStem; - } - -} diff --git a/src/main/java/org/betterx/worlds/together/worldPreset/WorldPresets.java b/src/main/java/org/betterx/worlds/together/worldPreset/WorldPresets.java index e90c141e..fb418da6 100644 --- a/src/main/java/org/betterx/worlds/together/worldPreset/WorldPresets.java +++ b/src/main/java/org/betterx/worlds/together/worldPreset/WorldPresets.java @@ -1,12 +1,8 @@ package org.betterx.worlds.together.worldPreset; -import org.betterx.worlds.together.WorldsTogether; -import org.betterx.worlds.together.entrypoints.EntrypointUtil; -import org.betterx.worlds.together.entrypoints.WorldPresetBootstrap; +import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiome; +import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeRegistry; import org.betterx.worlds.together.levelgen.WorldGenUtil; -import org.betterx.worlds.together.tag.v3.TagManager; -import org.betterx.worlds.together.tag.v3.TagRegistry; -import org.betterx.worlds.together.worldPreset.client.WorldPresetsClient; import net.minecraft.core.Holder; import net.minecraft.core.HolderGetter; @@ -15,28 +11,23 @@ import net.minecraft.core.registries.Registries; import net.minecraft.data.worldgen.BootstapContext; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.WorldPresetTags; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.biome.MultiNoiseBiomeSource; +import net.minecraft.world.level.biome.TheEndBiomeSource; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.dimension.BuiltinDimensionTypes; +import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.LevelStem; +import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; import net.minecraft.world.level.levelgen.presets.WorldPreset; +import net.minecraft.world.level.levelgen.structure.StructureSet; -import com.google.common.collect.Maps; - -import java.util.Map; import org.jetbrains.annotations.ApiStatus; public class WorldPresets { - @FunctionalInterface - public interface OverworldBuilder { - LevelStem make(BiomeSource biomeSource, Holder noiseGeneratorSettings); - } - - private static Map, PresetBuilder> BUILDERS = Maps.newHashMap(); - - public static final TagRegistry.UnTyped WORLD_PRESETS = - TagManager.registerType(Registries.WORLD_PRESET, "tags/worldgen/world_preset"); - private static ResourceKey DEFAULT = net.minecraft.world.level.levelgen.presets.WorldPresets.NORMAL; public static Holder get(RegistryAccess access, ResourceKey key) { @@ -45,28 +36,6 @@ public class WorldPresets { .getHolderOrThrow(key); } - /** - * Registers a custom WorldPreset (with custom rules and behaviour) - *

- * See also {@link WorldPresetsClient} if you need to add a Customize Button/Screen - * for your preset - * - * @param loc The ID of your Preset - * @param visibleInUI if true, the preset will show up in the UI on world creataion - * @return The key you may use to reference your new Preset - */ - private static ResourceKey register(ResourceKey key, boolean visibleInUI) { - //ResourceKey key = ResourceKey.create(Registries.WORLD_PRESET, loc); - if (visibleInUI) { - if (!didExplicitlySetDefault && DEFAULT == net.minecraft.world.level.levelgen.presets.WorldPresets.NORMAL) { - DEFAULT = key; - } - WORLD_PRESETS.addUntyped(WorldPresetTags.NORMAL, key.location()); - } - - return key; - } - public static void ensureStaticallyLoaded() { } @@ -75,68 +44,99 @@ public class WorldPresets { return ResourceKey.create(Registries.WORLD_PRESET, loc); } - public static ResourceKey register( - ResourceKey loc, - PresetBuilder builder, - boolean visibleInUI - ) { - ResourceKey key = register(loc, visibleInUI); - - if (BUILDERS == null) { - WorldsTogether.LOGGER.error("Unable to register WorldPreset '" + loc + "'."); - - } else { - BUILDERS.put(key, builder); - } - return key; - } - - @ApiStatus.Internal - public static void bootstrapPresets( - BootstapContext bootstrapContext, - LevelStem overworldStem, - WorldGenUtil.Context netherContext, - WorldGenUtil.Context endContext, - HolderGetter noiseSettings, - OverworldBuilder noiseBasedOverworld - ) { - if (BUILDERS == null) - return; - EntrypointUtil.getCommon(WorldPresetBootstrap.class) - .forEach(e -> e.bootstrapWorldPresets()); - - for (Map.Entry, PresetBuilder> e : BUILDERS.entrySet()) { - TogetherWorldPreset preset = e.getValue() - .create( - overworldStem, netherContext, endContext, - noiseSettings, noiseBasedOverworld - ); - bootstrapContext.register(e.getKey(), preset); - } - BUILDERS = null; - } - public static ResourceKey getDEFAULT() { return DEFAULT; } - private static boolean didExplicitlySetDefault = false; @ApiStatus.Internal public static void setDEFAULT(ResourceKey DEFAULT) { - didExplicitlySetDefault = true; WorldPresets.DEFAULT = DEFAULT; } + public static class BootstrapData { + public final HolderGetter noiseSettings; + public final HolderGetter biomes; + public final HolderGetter placedFeatures; + public final HolderGetter structureSets; + public final LevelStem netherStem; + public final LevelStem endStem; + public final LevelStem overworldStem; + public final Holder netherDimensionType; + public final Holder endDimensionType; + public final Holder overworldDimensionType; - @FunctionalInterface - public interface PresetBuilder { - TogetherWorldPreset create( - LevelStem overworldStem, - WorldGenUtil.Context netherContext, - WorldGenUtil.Context endContext, - HolderGetter noiseSettings, - OverworldBuilder noiseBasedOverworld - ); + public final WorldGenUtil.Context netherContext; + public final WorldGenUtil.Context endContext; + + public BootstrapData(BootstapContext bootstapContext) { + final HolderGetter dimensionTypes = bootstapContext.lookup(Registries.DIMENSION_TYPE); + + this.noiseSettings = bootstapContext.lookup(Registries.NOISE_SETTINGS); + this.biomes = bootstapContext.lookup(Registries.BIOME); + this.placedFeatures = bootstapContext.lookup(Registries.PLACED_FEATURE); + this.structureSets = bootstapContext.lookup(Registries.STRUCTURE_SET); + + this.overworldDimensionType = dimensionTypes.getOrThrow(BuiltinDimensionTypes.OVERWORLD); + MultiNoiseBiomeSource overworldBiomeSource = MultiNoiseBiomeSource.Preset.OVERWORLD.biomeSource(this.biomes); + Holder defaultOverworldNoise = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.OVERWORLD); + this.overworldStem = makeNoiseBasedOverworld(overworldBiomeSource, defaultOverworldNoise); + + this.netherDimensionType = dimensionTypes.getOrThrow(BuiltinDimensionTypes.NETHER); + Holder defaultNetherNoise = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.NETHER); + this.netherStem = new LevelStem( + netherDimensionType, + new NoiseBasedChunkGenerator( + MultiNoiseBiomeSource.Preset.NETHER.biomeSource(this.biomes), + defaultNetherNoise + ) + ); + + this.endDimensionType = dimensionTypes.getOrThrow(BuiltinDimensionTypes.END); + Holder defaultEndNoise = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.END); + this.endStem = new LevelStem( + endDimensionType, + new NoiseBasedChunkGenerator(TheEndBiomeSource.create(this.biomes), defaultEndNoise) + ); + + + Holder netherSettings, endSettings; + if (this.netherStem.generator() instanceof NoiseBasedChunkGenerator nether) { + netherSettings = nether.generatorSettings(); + } else { + netherSettings = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.NETHER); + } + + if (this.endStem.generator() instanceof NoiseBasedChunkGenerator nether) { + endSettings = nether.generatorSettings(); + } else { + endSettings = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.END); + } + + HolderGetter bclBiomes = bootstapContext.lookup(BCLBiomeRegistry.BCL_BIOMES_REGISTRY); + this.netherContext = new WorldGenUtil.Context( + this.biomes, + bclBiomes, + this.netherStem.type(), + this.structureSets, + netherSettings + ); + + this.endContext = new WorldGenUtil.Context( + this.biomes, + bclBiomes, + this.endStem.type(), + this.structureSets, + endSettings + ); + } + + private LevelStem makeOverworld(ChunkGenerator chunkGenerator) { + return new LevelStem(this.overworldDimensionType, chunkGenerator); + } + + public LevelStem makeNoiseBasedOverworld(BiomeSource biomeSource, Holder holder) { + return this.makeOverworld(new NoiseBasedChunkGenerator(biomeSource, holder)); + } } } diff --git a/src/main/java/org/betterx/worlds/together/worldPreset/client/WorldPresetsClient.java b/src/main/java/org/betterx/worlds/together/worldPreset/client/WorldPresetsClient.java index 692ae3b2..e65a8803 100644 --- a/src/main/java/org/betterx/worlds/together/worldPreset/client/WorldPresetsClient.java +++ b/src/main/java/org/betterx/worlds/together/worldPreset/client/WorldPresetsClient.java @@ -13,7 +13,6 @@ import java.util.Optional; public class WorldPresetsClient { public static void registerCustomizeUI(ResourceKey key, PresetEditor setupScreen) { if (setupScreen != null) { - //TODO: 1.19.3 this is called out of order PresetEditor.EDITORS.put(Optional.of(key), setupScreen); } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 3ddd397f..50d9b895 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -30,14 +30,11 @@ "modmenu": [ "org.betterx.bclib.integration.modmenu.ModMenuEntryPoint" ], - "worlds_together": [ - "org.betterx.bclib.registry.PresetsRegistry" - ], "emi": [ "org.betterx.bclib.integration.emi.EMIPlugin" ], "fabric-datagen": [ - "org.betterx.bclib.datagen.BCLibDatagen" + "org.betterx.datagen.bclib.BCLibDatagen" ] }, "accessWidener": "bclib.accesswidener", diff --git a/src/main/resources/together.mixins.common.json b/src/main/resources/together.mixins.common.json index 06534d8c..809b8cd3 100644 --- a/src/main/resources/together.mixins.common.json +++ b/src/main/resources/together.mixins.common.json @@ -21,7 +21,6 @@ "WorldLoaderMixin", "WorldPresetAccessor", "WorldPresetMixin", - "WorldPresetsBootstrapMixin", "WorldStem_Mixin" ], "injectors": {