From db681959b65c9a7496fd0a2e56168954287a66a3 Mon Sep 17 00:00:00 2001 From: PepperCode1 <44146161+PepperCode1@users.noreply.github.com> Date: Wed, 1 Feb 2023 00:12:28 -0800 Subject: [PATCH] World Generation^2 - Datagen all worldgen data - Remove all individual config values for configured and placed features --- src/main/java/com/simibubi/create/Create.java | 7 +- .../create/foundation/config/CWorldGen.java | 20 +- .../foundation/data/DynamicDataProvider.java | 87 -------- .../worldgen/AllBiomeModifiers.java | 47 ++++ .../worldgen/AllConfiguredFeatures.java | 62 ++++++ .../foundation/worldgen/AllFeatures.java | 1 - .../worldgen/AllOreFeatureConfigEntries.java | 123 ----------- .../worldgen/AllPlacedFeatures.java | 52 +++++ .../worldgen/AllPlacementModifiers.java | 2 +- .../worldgen/BaseConfigDrivenOreFeature.java | 32 --- ...seConfigDrivenOreFeatureConfiguration.java | 25 --- .../worldgen/BuiltinRegistration.java | 42 ---- ...gDrivenLayeredOreFeatureConfiguration.java | 33 --- .../ConfigDrivenOreFeatureConfiguration.java | 35 --- .../worldgen/ConfigDrivenPlacement.java | 79 ------- .../worldgen/ConfigPlacementFilter.java | 25 +++ .../foundation/worldgen/LayerPattern.java | 14 +- .../worldgen/LayeredOreConfiguration.java | 34 +++ .../worldgen/LayeredOreFeature.java | 31 ++- .../worldgen/OreFeatureConfigEntry.java | 209 ------------------ .../worldgen/StandardOreFeature.java | 168 -------------- .../worldgen/WorldgenDataProvider.java | 36 +++ 22 files changed, 294 insertions(+), 870 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/data/DynamicDataProvider.java create mode 100644 src/main/java/com/simibubi/create/foundation/worldgen/AllBiomeModifiers.java create mode 100644 src/main/java/com/simibubi/create/foundation/worldgen/AllConfiguredFeatures.java delete mode 100644 src/main/java/com/simibubi/create/foundation/worldgen/AllOreFeatureConfigEntries.java create mode 100644 src/main/java/com/simibubi/create/foundation/worldgen/AllPlacedFeatures.java delete mode 100644 src/main/java/com/simibubi/create/foundation/worldgen/BaseConfigDrivenOreFeature.java delete mode 100644 src/main/java/com/simibubi/create/foundation/worldgen/BaseConfigDrivenOreFeatureConfiguration.java delete mode 100644 src/main/java/com/simibubi/create/foundation/worldgen/BuiltinRegistration.java delete mode 100644 src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenLayeredOreFeatureConfiguration.java delete mode 100644 src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenOreFeatureConfiguration.java delete mode 100644 src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenPlacement.java create mode 100644 src/main/java/com/simibubi/create/foundation/worldgen/ConfigPlacementFilter.java create mode 100644 src/main/java/com/simibubi/create/foundation/worldgen/LayeredOreConfiguration.java delete mode 100644 src/main/java/com/simibubi/create/foundation/worldgen/OreFeatureConfigEntry.java delete mode 100644 src/main/java/com/simibubi/create/foundation/worldgen/StandardOreFeature.java create mode 100644 src/main/java/com/simibubi/create/foundation/worldgen/WorldgenDataProvider.java diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 5cfc75a42..f4556c08a 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -39,9 +39,8 @@ import com.simibubi.create.foundation.data.recipe.StandardRecipeGen; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.CreateRegistry; import com.simibubi.create.foundation.worldgen.AllFeatures; -import com.simibubi.create.foundation.worldgen.AllOreFeatureConfigEntries; import com.simibubi.create.foundation.worldgen.AllPlacementModifiers; -import com.simibubi.create.foundation.worldgen.BuiltinRegistration; +import com.simibubi.create.foundation.worldgen.WorldgenDataProvider; import net.minecraft.data.DataGenerator; import net.minecraft.resources.ResourceLocation; @@ -115,10 +114,8 @@ public class Create { AllParticleTypes.register(modEventBus); AllStructureProcessorTypes.register(modEventBus); AllEntityDataSerializers.register(modEventBus); - AllOreFeatureConfigEntries.init(); AllFeatures.register(modEventBus); AllPlacementModifiers.register(modEventBus); - BuiltinRegistration.register(modEventBus); AllConfigs.register(modLoadingContext); @@ -168,7 +165,7 @@ public class Create { gen.addProvider(true, new MechanicalCraftingRecipeGen(gen)); gen.addProvider(true, new SequencedAssemblyRecipeGen(gen)); ProcessingRecipeGen.registerAll(gen); -// AllOreFeatureConfigEntries.gatherData(event); + gen.addProvider(true, WorldgenDataProvider.makeFactory(event.getLookupProvider())); } } diff --git a/src/main/java/com/simibubi/create/foundation/config/CWorldGen.java b/src/main/java/com/simibubi/create/foundation/config/CWorldGen.java index 6f03e44c5..3b8a19a2f 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CWorldGen.java +++ b/src/main/java/com/simibubi/create/foundation/config/CWorldGen.java @@ -1,30 +1,12 @@ package com.simibubi.create.foundation.config; -import com.simibubi.create.Create; -import com.simibubi.create.foundation.worldgen.AllOreFeatureConfigEntries; - -import net.minecraftforge.common.ForgeConfigSpec.Builder; - public class CWorldGen extends ConfigBase { - /** - * Increment this number if all worldgen config entries should be overwritten - * in this update. Worlds from the previous version will overwrite potentially - * changed values with the new defaults. - */ - public static final int FORCED_UPDATE_VERSION = 2; - public final ConfigBool disable = b(false, "disableWorldGen", Comments.disable); - @Override - protected void registerAll(Builder builder) { - super.registerAll(builder); - AllOreFeatureConfigEntries.fillConfig(builder, Create.ID); - } - @Override public String getName() { - return "worldgen.v" + FORCED_UPDATE_VERSION; + return "worldgen"; } private static class Comments { diff --git a/src/main/java/com/simibubi/create/foundation/data/DynamicDataProvider.java b/src/main/java/com/simibubi/create/foundation/data/DynamicDataProvider.java deleted file mode 100644 index 6526a8b05..000000000 --- a/src/main/java/com/simibubi/create/foundation/data/DynamicDataProvider.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.simibubi.create.foundation.data; - -import java.io.IOException; -import java.nio.file.Path; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Optional; - -import org.jetbrains.annotations.Nullable; - -import com.google.gson.JsonElement; -import com.mojang.serialization.DynamicOps; -import com.mojang.serialization.Encoder; -import com.mojang.serialization.JsonOps; -import com.simibubi.create.Create; - -import net.minecraft.core.Registry; -import net.minecraft.core.RegistryAccess; -import net.minecraft.core.RegistryAccess.RegistryData; -import net.minecraft.data.CachedOutput; -import net.minecraft.data.DataGenerator; -import net.minecraft.data.DataProvider; -import net.minecraft.resources.RegistryOps; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.common.ForgeHooks; - -public class DynamicDataProvider implements DataProvider { - private final DataGenerator generator; - private final String name; - private final RegistryAccess registryAccess; - private final RegistryAccess.RegistryData registryData; - private final Map values; - - public DynamicDataProvider(DataGenerator generator, String name, RegistryAccess registryAccess, RegistryAccess.RegistryData registryData, Map values) { - this.generator = generator; - this.name = name; - this.registryAccess = registryAccess; - this.registryData = registryData; - this.values = values; - } - - @Nullable - public static DynamicDataProvider create(DataGenerator generator, String name, RegistryAccess registryAccess, ResourceKey> registryKey, Map values) { - @SuppressWarnings("unchecked") - RegistryAccess.RegistryData registryData = (RegistryData) RegistryAccess.REGISTRIES.get(registryKey); - if (registryData == null) { - return null; - } - return new DynamicDataProvider<>(generator, name, registryAccess, registryData, values); - } - - @Override - public void run(CachedOutput cache) throws IOException { - Path path = generator.getOutputFolder(); - DynamicOps ops = RegistryOps.create(JsonOps.INSTANCE, registryAccess); - - dumpValues(path, cache, ops, registryData.key(), values, registryData.codec()); - } - - private void dumpValues(Path rootPath, CachedOutput cache, DynamicOps ops, ResourceKey> registryKey, Map values, Encoder encoder) { - DataGenerator.PathProvider pathProvider = generator.createPathProvider(DataGenerator.Target.DATA_PACK, ForgeHooks.prefixNamespace(registryKey.location())); - - for (Entry entry : values.entrySet()) { - dumpValue(pathProvider.json(entry.getKey()), cache, ops, encoder, entry.getValue()); - } - } - - // From WorldgenRegistryDumpReport - private void dumpValue(Path path, CachedOutput cache, DynamicOps ops, Encoder encoder, T value) { - try { - Optional optional = encoder.encodeStart(ops, value).resultOrPartial((message) -> { - Create.LOGGER.error("Couldn't serialize element {}: {}", path, message); - }); - if (optional.isPresent()) { - DataProvider.saveStable(cache, optional.get(), path); - } - } catch (IOException e) { - Create.LOGGER.error("Couldn't save element {}", path, e); - } - } - - @Override - public String getName() { - return name; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/AllBiomeModifiers.java b/src/main/java/com/simibubi/create/foundation/worldgen/AllBiomeModifiers.java new file mode 100644 index 000000000..51afa475b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/worldgen/AllBiomeModifiers.java @@ -0,0 +1,47 @@ +package com.simibubi.create.foundation.worldgen; + +import com.simibubi.create.Create; + +import net.minecraft.core.Holder; +import net.minecraft.core.HolderGetter; +import net.minecraft.core.HolderSet; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.BiomeTags; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.GenerationStep.Decoration; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import net.minecraftforge.common.world.BiomeModifier; +import net.minecraftforge.common.world.ForgeBiomeModifiers.AddFeaturesBiomeModifier; +import net.minecraftforge.registries.ForgeRegistries; + +public class AllBiomeModifiers { + public static final ResourceKey + ZINC_ORE = key("zinc_ore"), + STRIATED_ORES_OVERWORLD = key("striated_ores_overworld"), + STRIATED_ORES_NETHER = key("striated_ores_nether"); + + private static ResourceKey key(String name) { + return ResourceKey.create(ForgeRegistries.Keys.BIOME_MODIFIERS, Create.asResource(name)); + } + + public static void bootstrap(BootstapContext ctx) { + HolderGetter biomeLookup = ctx.lookup(Registries.BIOME); + HolderSet isOverworld = biomeLookup.getOrThrow(BiomeTags.IS_OVERWORLD); + HolderSet isNether = biomeLookup.getOrThrow(BiomeTags.IS_NETHER); + + HolderGetter featureLookup = ctx.lookup(Registries.PLACED_FEATURE); + Holder zincOre = featureLookup.getOrThrow(AllPlacedFeatures.ZINC_ORE); + Holder striatedOresOverworld = featureLookup.getOrThrow(AllPlacedFeatures.STRIATED_ORES_OVERWORLD); + Holder striatedOresNether = featureLookup.getOrThrow(AllPlacedFeatures.STRIATED_ORES_NETHER); + + ctx.register(ZINC_ORE, addOre(isOverworld, zincOre)); + ctx.register(STRIATED_ORES_OVERWORLD, addOre(isOverworld, striatedOresOverworld)); + ctx.register(STRIATED_ORES_NETHER, addOre(isNether, striatedOresNether)); + } + + private static AddFeaturesBiomeModifier addOre(HolderSet biomes, Holder feature) { + return new AddFeaturesBiomeModifier(biomes, HolderSet.direct(feature), Decoration.UNDERGROUND_ORES); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/AllConfiguredFeatures.java b/src/main/java/com/simibubi/create/foundation/worldgen/AllConfiguredFeatures.java new file mode 100644 index 000000000..7593597b8 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/worldgen/AllConfiguredFeatures.java @@ -0,0 +1,62 @@ +package com.simibubi.create.foundation.worldgen; + +import static net.minecraft.data.worldgen.features.FeatureUtils.register; + +import java.util.List; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.Create; + +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration; +import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration.TargetBlockState; +import net.minecraft.world.level.levelgen.structure.templatesystem.RuleTest; +import net.minecraft.world.level.levelgen.structure.templatesystem.TagMatchTest; + +public class AllConfiguredFeatures { + public static final ResourceKey> + ZINC_ORE = key("zinc_ore"), + STRIATED_ORES_OVERWORLD = key("striated_ores_overworld"), + STRIATED_ORES_NETHER = key("striated_ores_nether"); + + private static ResourceKey> key(String name) { + return ResourceKey.create(Registries.CONFIGURED_FEATURE, Create.asResource(name)); + } + + public static void bootstrap(BootstapContext> ctx) { + RuleTest stoneOreReplaceables = new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES); + RuleTest deepslateOreReplaceables = new TagMatchTest(BlockTags.DEEPSLATE_ORE_REPLACEABLES); + + List zincTargetStates = List.of( + OreConfiguration.target(stoneOreReplaceables, AllBlocks.ZINC_ORE.get() + .defaultBlockState()), + OreConfiguration.target(deepslateOreReplaceables, AllBlocks.DEEPSLATE_ZINC_ORE.get() + .defaultBlockState()) + ); + + register(ctx, ZINC_ORE, Feature.ORE, new OreConfiguration(zincTargetStates, 12)); + + List overworldLayerPatterns = List.of( + AllLayerPatterns.SCORIA.get(), + AllLayerPatterns.CINNABAR.get(), + AllLayerPatterns.MAGNETITE.get(), + AllLayerPatterns.MALACHITE.get(), + AllLayerPatterns.LIMESTONE.get(), + AllLayerPatterns.OCHRESTONE.get() + ); + + register(ctx, STRIATED_ORES_OVERWORLD, AllFeatures.LAYERED_ORE.get(), new LayeredOreConfiguration(overworldLayerPatterns, 32, 0)); + + List netherLayerPatterns = List.of( + AllLayerPatterns.SCORIA_NETHER.get(), + AllLayerPatterns.SCORCHIA_NETHER.get() + ); + + register(ctx, STRIATED_ORES_NETHER, AllFeatures.LAYERED_ORE.get(), new LayeredOreConfiguration(netherLayerPatterns, 32, 0)); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/AllFeatures.java b/src/main/java/com/simibubi/create/foundation/worldgen/AllFeatures.java index 5fa2a98c2..ec0fd6568 100644 --- a/src/main/java/com/simibubi/create/foundation/worldgen/AllFeatures.java +++ b/src/main/java/com/simibubi/create/foundation/worldgen/AllFeatures.java @@ -11,7 +11,6 @@ import net.minecraftforge.registries.RegistryObject; public class AllFeatures { private static final DeferredRegister> REGISTER = DeferredRegister.create(ForgeRegistries.FEATURES, Create.ID); - public static final RegistryObject STANDARD_ORE = REGISTER.register("standard_ore", () -> new StandardOreFeature()); public static final RegistryObject LAYERED_ORE = REGISTER.register("layered_ore", () -> new LayeredOreFeature()); public static void register(IEventBus modEventBus) { diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/AllOreFeatureConfigEntries.java b/src/main/java/com/simibubi/create/foundation/worldgen/AllOreFeatureConfigEntries.java deleted file mode 100644 index 406061081..000000000 --- a/src/main/java/com/simibubi/create/foundation/worldgen/AllOreFeatureConfigEntries.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.simibubi.create.foundation.worldgen; - -import java.util.HashMap; -import java.util.Map; - -import com.simibubi.create.AllBlocks; -import com.simibubi.create.Create; -import com.simibubi.create.foundation.data.DynamicDataProvider; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.worldgen.OreFeatureConfigEntry.DatagenExtension; - -import net.minecraft.core.RegistryAccess; -import net.minecraft.core.registries.Registries; -import net.minecraft.data.DataGenerator; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.BiomeTags; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import net.minecraft.world.level.levelgen.placement.PlacedFeature; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.common.world.BiomeModifier; -import net.minecraftforge.data.event.GatherDataEvent; -import net.minecraftforge.registries.ForgeRegistries; - -public class AllOreFeatureConfigEntries { - public static final OreFeatureConfigEntry ZINC_ORE = - create("zinc_ore", 12, 8, -63, 70) - .standardDatagenExt() - .withBlocks(Couple.create(AllBlocks.ZINC_ORE, AllBlocks.DEEPSLATE_ZINC_ORE)) - .biomeTag(BiomeTags.IS_OVERWORLD) - .parent(); - - public static final OreFeatureConfigEntry STRIATED_ORES_OVERWORLD = - create("striated_ores_overworld", 32, 1 / 12f, -30, 70) - .layeredDatagenExt() - .withLayerPattern(AllLayerPatterns.SCORIA) - .withLayerPattern(AllLayerPatterns.CINNABAR) - .withLayerPattern(AllLayerPatterns.MAGNETITE) - .withLayerPattern(AllLayerPatterns.MALACHITE) - .withLayerPattern(AllLayerPatterns.LIMESTONE) - .withLayerPattern(AllLayerPatterns.OCHRESTONE) - .biomeTag(BiomeTags.IS_OVERWORLD) - .parent(); - - public static final OreFeatureConfigEntry STRIATED_ORES_NETHER = - create("striated_ores_nether", 32, 1 / 12f, 40, 90) - .layeredDatagenExt() - .withLayerPattern(AllLayerPatterns.SCORIA_NETHER) - .withLayerPattern(AllLayerPatterns.SCORCHIA_NETHER) - .biomeTag(BiomeTags.IS_NETHER) - .parent(); - - // - - private static OreFeatureConfigEntry create(String name, int clusterSize, float frequency, - int minHeight, int maxHeight) { - ResourceLocation id = Create.asResource(name); - OreFeatureConfigEntry configDrivenFeatureEntry = new OreFeatureConfigEntry(id, clusterSize, frequency, minHeight, maxHeight); - return configDrivenFeatureEntry; - } - - public static void fillConfig(ForgeConfigSpec.Builder builder, String namespace) { - OreFeatureConfigEntry.ALL - .forEach((id, entry) -> { - if (id.getNamespace().equals(namespace)) { - builder.push(entry.getName()); - entry.addToConfig(builder); - builder.pop(); - } - }); - } - - public static void init() {} - - public static void gatherData(GatherDataEvent event) { - DataGenerator generator = event.getGenerator(); - RegistryAccess registryAccess = RegistryAccess.BUILTIN.get(); - - // - - Map> configuredFeatures = new HashMap<>(); - for (Map.Entry entry : OreFeatureConfigEntry.ALL.entrySet()) { - DatagenExtension datagenExt = entry.getValue().datagenExt(); - if (datagenExt != null) { - configuredFeatures.put(entry.getKey(), datagenExt.createConfiguredFeature(registryAccess)); - } - } - - DynamicDataProvider> configuredFeatureProvider = DynamicDataProvider.create(generator, "Create's Configured Features", registryAccess, Registries.CONFIGURED_FEATURE, configuredFeatures); - if (configuredFeatureProvider != null) { - generator.addProvider(true, configuredFeatureProvider); - } - - // - - Map placedFeatures = new HashMap<>(); - for (Map.Entry entry : OreFeatureConfigEntry.ALL.entrySet()) { - DatagenExtension datagenExt = entry.getValue().datagenExt(); - if (datagenExt != null) { - placedFeatures.put(entry.getKey(), datagenExt.createPlacedFeature(registryAccess)); - } - } - - DynamicDataProvider placedFeatureProvider = DynamicDataProvider.create(generator, "Create's Placed Features", registryAccess, Registries.PLACED_FEATURE, placedFeatures); - if (placedFeatureProvider != null) { - generator.addProvider(true, placedFeatureProvider); - } - - // - - Map biomeModifiers = new HashMap<>(); - for (Map.Entry entry : OreFeatureConfigEntry.ALL.entrySet()) { - DatagenExtension datagenExt = entry.getValue().datagenExt(); - if (datagenExt != null) { - biomeModifiers.put(entry.getKey(), datagenExt.createBiomeModifier(registryAccess)); - } - } - - DynamicDataProvider biomeModifierProvider = DynamicDataProvider.create(generator, "Create's Biome Modifiers", registryAccess, ForgeRegistries.Keys.BIOME_MODIFIERS, biomeModifiers); - if (biomeModifierProvider != null) { - generator.addProvider(true, biomeModifierProvider); - } - } -} diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/AllPlacedFeatures.java b/src/main/java/com/simibubi/create/foundation/worldgen/AllPlacedFeatures.java new file mode 100644 index 000000000..dd702aa28 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/worldgen/AllPlacedFeatures.java @@ -0,0 +1,52 @@ +package com.simibubi.create.foundation.worldgen; + +import static net.minecraft.data.worldgen.placement.PlacementUtils.register; + +import java.util.List; + +import com.simibubi.create.Create; + +import net.minecraft.core.Holder; +import net.minecraft.core.HolderGetter; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.levelgen.VerticalAnchor; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.placement.CountPlacement; +import net.minecraft.world.level.levelgen.placement.HeightRangePlacement; +import net.minecraft.world.level.levelgen.placement.InSquarePlacement; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import net.minecraft.world.level.levelgen.placement.PlacementModifier; +import net.minecraft.world.level.levelgen.placement.RarityFilter; + +public class AllPlacedFeatures { + public static final ResourceKey + ZINC_ORE = key("zinc_ore"), + STRIATED_ORES_OVERWORLD = key("striated_ores_overworld"), + STRIATED_ORES_NETHER = key("striated_ores_nether"); + + private static ResourceKey key(String name) { + return ResourceKey.create(Registries.PLACED_FEATURE, Create.asResource(name)); + } + + public static void bootstrap(BootstapContext ctx) { + HolderGetter> featureLookup = ctx.lookup(Registries.CONFIGURED_FEATURE); + Holder> zincOre = featureLookup.getOrThrow(AllConfiguredFeatures.ZINC_ORE); + Holder> striatedOresOverworld = featureLookup.getOrThrow(AllConfiguredFeatures.STRIATED_ORES_OVERWORLD); + Holder> striatedOresNether = featureLookup.getOrThrow(AllConfiguredFeatures.STRIATED_ORES_NETHER); + + register(ctx, ZINC_ORE, zincOre, placement(CountPlacement.of(8), -63, 70)); + register(ctx, STRIATED_ORES_OVERWORLD, striatedOresOverworld, placement(RarityFilter.onAverageOnceEvery(12), -30, 70)); + register(ctx, STRIATED_ORES_NETHER, striatedOresNether, placement(RarityFilter.onAverageOnceEvery(12), 40, 90)); + } + + private static List placement(PlacementModifier frequency, int minHeight, int maxHeight) { + return List.of( + frequency, + InSquarePlacement.spread(), + HeightRangePlacement.uniform(VerticalAnchor.absolute(minHeight), VerticalAnchor.absolute(maxHeight)), + ConfigPlacementFilter.INSTANCE + ); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/AllPlacementModifiers.java b/src/main/java/com/simibubi/create/foundation/worldgen/AllPlacementModifiers.java index 0a22e630d..a05768395 100644 --- a/src/main/java/com/simibubi/create/foundation/worldgen/AllPlacementModifiers.java +++ b/src/main/java/com/simibubi/create/foundation/worldgen/AllPlacementModifiers.java @@ -11,7 +11,7 @@ import net.minecraftforge.registries.RegistryObject; public class AllPlacementModifiers { private static final DeferredRegister> REGISTER = DeferredRegister.create(Registries.PLACEMENT_MODIFIER_TYPE, Create.ID); - public static final RegistryObject> CONFIG_DRIVEN = REGISTER.register("config_driven", () -> () -> ConfigDrivenPlacement.CODEC); + public static final RegistryObject> CONFIG_FILTER = REGISTER.register("config_filter", () -> () -> ConfigPlacementFilter.CODEC); public static void register(IEventBus modEventBus) { REGISTER.register(modEventBus); diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/BaseConfigDrivenOreFeature.java b/src/main/java/com/simibubi/create/foundation/worldgen/BaseConfigDrivenOreFeature.java deleted file mode 100644 index a2299fb3e..000000000 --- a/src/main/java/com/simibubi/create/foundation/worldgen/BaseConfigDrivenOreFeature.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.simibubi.create.foundation.worldgen; - -import java.util.function.Function; - -import com.mojang.serialization.Codec; - -import net.minecraft.core.BlockPos; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.feature.Feature; -import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration; - -public abstract class BaseConfigDrivenOreFeature extends Feature { - public BaseConfigDrivenOreFeature(Codec configCodec) { - super(configCodec); - } - - public boolean canPlaceOre(BlockState pState, Function pAdjacentStateAccessor, - RandomSource pRandom, BaseConfigDrivenOreFeatureConfiguration pConfig, OreConfiguration.TargetBlockState pTargetState, - BlockPos.MutableBlockPos pMatablePos) { - if (!pTargetState.target.test(pState, pRandom)) - return false; - if (shouldSkipAirCheck(pRandom, pConfig.getDiscardChanceOnAirExposure())) - return true; - - return !isAdjacentToAir(pAdjacentStateAccessor, pMatablePos); - } - - protected boolean shouldSkipAirCheck(RandomSource pRandom, float pChance) { - return pChance <= 0 ? true : pChance >= 1 ? false : pRandom.nextFloat() >= pChance; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/BaseConfigDrivenOreFeatureConfiguration.java b/src/main/java/com/simibubi/create/foundation/worldgen/BaseConfigDrivenOreFeatureConfiguration.java deleted file mode 100644 index 1c741236f..000000000 --- a/src/main/java/com/simibubi/create/foundation/worldgen/BaseConfigDrivenOreFeatureConfiguration.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.simibubi.create.foundation.worldgen; - -import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; - -public class BaseConfigDrivenOreFeatureConfiguration implements FeatureConfiguration { - protected final OreFeatureConfigEntry entry; - protected final float discardChanceOnAirExposure; - - public BaseConfigDrivenOreFeatureConfiguration(OreFeatureConfigEntry entry, float discardChance) { - this.entry = entry; - this.discardChanceOnAirExposure = discardChance; - } - - public OreFeatureConfigEntry getEntry() { - return entry; - } - - public int getClusterSize() { - return entry.clusterSize.get(); - } - - public float getDiscardChanceOnAirExposure() { - return discardChanceOnAirExposure; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/BuiltinRegistration.java b/src/main/java/com/simibubi/create/foundation/worldgen/BuiltinRegistration.java deleted file mode 100644 index fe7234a84..000000000 --- a/src/main/java/com/simibubi/create/foundation/worldgen/BuiltinRegistration.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.simibubi.create.foundation.worldgen; - -import java.util.Map; - -import com.simibubi.create.Create; -import com.simibubi.create.foundation.worldgen.OreFeatureConfigEntry.DatagenExtension; - -import net.minecraft.core.registries.Registries; -import net.minecraft.data.BuiltinRegistries; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import net.minecraft.world.level.levelgen.placement.PlacedFeature; -import net.minecraftforge.common.world.BiomeModifier; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; - -public class BuiltinRegistration { - private static final DeferredRegister> CONFIGURED_FEATURE_REGISTER = DeferredRegister.create(Registries.CONFIGURED_FEATURE, Create.ID); - private static final DeferredRegister PLACED_FEATURE_REGISTER = DeferredRegister.create(Registries.PLACED_FEATURE, Create.ID); - private static final DeferredRegister BIOME_MODIFIER_REGISTER = DeferredRegister.create(ForgeRegistries.Keys.BIOME_MODIFIERS, Create.ID); - - static { - for (Map.Entry entry : OreFeatureConfigEntry.ALL.entrySet()) { - ResourceLocation id = entry.getKey(); - if (id.getNamespace().equals(Create.ID)) { - DatagenExtension datagenExt = entry.getValue().datagenExt(); - if (datagenExt != null) { - CONFIGURED_FEATURE_REGISTER.register(id.getPath(), () -> datagenExt.createConfiguredFeature(BuiltinRegistries.ACCESS)); - PLACED_FEATURE_REGISTER.register(id.getPath(), () -> datagenExt.createPlacedFeature(BuiltinRegistries.ACCESS)); - BIOME_MODIFIER_REGISTER.register(id.getPath(), () -> datagenExt.createBiomeModifier(BuiltinRegistries.ACCESS)); - } - } - } - } - - public static void register(IEventBus modEventBus) { - CONFIGURED_FEATURE_REGISTER.register(modEventBus); - PLACED_FEATURE_REGISTER.register(modEventBus); - BIOME_MODIFIER_REGISTER.register(modEventBus); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenLayeredOreFeatureConfiguration.java b/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenLayeredOreFeatureConfiguration.java deleted file mode 100644 index 4066b20b3..000000000 --- a/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenLayeredOreFeatureConfiguration.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.simibubi.create.foundation.worldgen; - -import java.util.List; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; - -public class ConfigDrivenLayeredOreFeatureConfiguration extends BaseConfigDrivenOreFeatureConfiguration { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> { - return instance.group( - OreFeatureConfigEntry.CODEC - .fieldOf("entry") - .forGetter(config -> config.entry), - Codec.floatRange(0.0F, 1.0F) - .fieldOf("discard_chance_on_air_exposure") - .forGetter(config -> config.discardChanceOnAirExposure), - Codec.list(LayerPattern.CODEC) - .fieldOf("layer_patterns") - .forGetter(config -> config.layerPatterns) - ).apply(instance, ConfigDrivenLayeredOreFeatureConfiguration::new); - }); - - private final List layerPatterns; - - public ConfigDrivenLayeredOreFeatureConfiguration(OreFeatureConfigEntry entry, float discardChance, List layerPatterns) { - super(entry, discardChance); - this.layerPatterns = layerPatterns; - } - - public List getLayerPatterns() { - return layerPatterns; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenOreFeatureConfiguration.java b/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenOreFeatureConfiguration.java deleted file mode 100644 index d554cc139..000000000 --- a/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenOreFeatureConfiguration.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.simibubi.create.foundation.worldgen; - -import java.util.List; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; - -import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration.TargetBlockState; - -public class ConfigDrivenOreFeatureConfiguration extends BaseConfigDrivenOreFeatureConfiguration { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> { - return instance.group( - OreFeatureConfigEntry.CODEC - .fieldOf("entry") - .forGetter(config -> config.entry), - Codec.floatRange(0.0F, 1.0F) - .fieldOf("discard_chance_on_air_exposure") - .forGetter(config -> config.discardChanceOnAirExposure), - Codec.list(TargetBlockState.CODEC) - .fieldOf("targets") - .forGetter(config -> config.targetStates) - ).apply(instance, ConfigDrivenOreFeatureConfiguration::new); - }); - - private final List targetStates; - - public ConfigDrivenOreFeatureConfiguration(OreFeatureConfigEntry entry, float discardChance, List targetStates) { - super(entry, discardChance); - this.targetStates = targetStates; - } - - public List getTargetStates() { - return targetStates; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenPlacement.java b/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenPlacement.java deleted file mode 100644 index 11d9651a5..000000000 --- a/src/main/java/com/simibubi/create/foundation/worldgen/ConfigDrivenPlacement.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.simibubi.create.foundation.worldgen; - -import java.util.stream.IntStream; -import java.util.stream.Stream; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import com.simibubi.create.foundation.config.AllConfigs; - -import net.minecraft.core.BlockPos; -import net.minecraft.util.Mth; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.levelgen.placement.PlacementContext; -import net.minecraft.world.level.levelgen.placement.PlacementModifier; -import net.minecraft.world.level.levelgen.placement.PlacementModifierType; - -public class ConfigDrivenPlacement extends PlacementModifier { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> { - return instance.group( - OreFeatureConfigEntry.CODEC - .fieldOf("entry") - .forGetter(ConfigDrivenPlacement::getEntry) - ).apply(instance, ConfigDrivenPlacement::new); - }); - - private final OreFeatureConfigEntry entry; - - public ConfigDrivenPlacement(OreFeatureConfigEntry entry) { - this.entry = entry; - } - - @Override - public Stream getPositions(PlacementContext context, RandomSource random, BlockPos pos) { - int count = getCount(getFrequency(), random); - if (count == 0) { - return Stream.empty(); - } - - int minY = getMinY(); - int maxY = getMaxY(); - - return IntStream.range(0, count) - .mapToObj(i -> pos) - .map(p -> { - int x = random.nextInt(16) + p.getX(); - int z = random.nextInt(16) + p.getZ(); - int y = Mth.randomBetweenInclusive(random, minY, maxY); - return new BlockPos(x, y, z); - }); - } - - public int getCount(float frequency, RandomSource random) { - int floored = Mth.floor(frequency); - return floored + (random.nextFloat() < (frequency - floored) ? 1 : 0); - } - - @Override - public PlacementModifierType type() { - return AllPlacementModifiers.CONFIG_DRIVEN.get(); - } - - public OreFeatureConfigEntry getEntry() { - return entry; - } - - public float getFrequency() { - if (AllConfigs.COMMON.worldGen.disable.get()) - return 0; - return entry.frequency.getF(); - } - - public int getMinY() { - return entry.minHeight.get(); - } - - public int getMaxY() { - return entry.maxHeight.get(); - } -} diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/ConfigPlacementFilter.java b/src/main/java/com/simibubi/create/foundation/worldgen/ConfigPlacementFilter.java new file mode 100644 index 000000000..1d62e91ed --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/worldgen/ConfigPlacementFilter.java @@ -0,0 +1,25 @@ +package com.simibubi.create.foundation.worldgen; + +import com.mojang.serialization.Codec; +import com.simibubi.create.foundation.config.AllConfigs; + +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.levelgen.placement.PlacementContext; +import net.minecraft.world.level.levelgen.placement.PlacementFilter; +import net.minecraft.world.level.levelgen.placement.PlacementModifierType; + +public class ConfigPlacementFilter extends PlacementFilter { + public static final ConfigPlacementFilter INSTANCE = new ConfigPlacementFilter(); + public static final Codec CODEC = Codec.unit(() -> INSTANCE); + + @Override + protected boolean shouldPlace(PlacementContext context, RandomSource random, BlockPos pos) { + return !AllConfigs.COMMON.worldGen.disable.get(); + } + + @Override + public PlacementModifierType type() { + return AllPlacementModifiers.CONFIG_FILTER.get(); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/LayerPattern.java b/src/main/java/com/simibubi/create/foundation/worldgen/LayerPattern.java index a346ee5cd..625bd5006 100644 --- a/src/main/java/com/simibubi/create/foundation/worldgen/LayerPattern.java +++ b/src/main/java/com/simibubi/create/foundation/worldgen/LayerPattern.java @@ -11,13 +11,15 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import com.simibubi.create.foundation.utility.Couple; import com.tterrag.registrate.util.nullness.NonNullSupplier; -import net.minecraft.data.worldgen.features.OreFeatures; +import net.minecraft.tags.BlockTags; import net.minecraft.util.RandomSource; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration.TargetBlockState; +import net.minecraft.world.level.levelgen.structure.templatesystem.RuleTest; +import net.minecraft.world.level.levelgen.structure.templatesystem.TagMatchTest; import net.minecraftforge.common.util.NonNullConsumer; public class LayerPattern { @@ -110,6 +112,10 @@ public class LayerPattern { } public static class Builder { + private static final RuleTest STONE_ORE_REPLACEABLES = new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES); + private static final RuleTest DEEPSLATE_ORE_REPLACEABLES = new TagMatchTest(BlockTags.DEEPSLATE_ORE_REPLACEABLES); + private static final RuleTest NETHER_ORE_REPLACEABLES = new TagMatchTest(BlockTags.BASE_STONE_NETHER); + private final List> targets = new ArrayList<>(); private int minSize = 1; private int maxSize = 1; @@ -127,7 +133,7 @@ public class LayerPattern { public Builder block(Block block) { if (netherMode) { this.targets.add(ImmutableList.of(OreConfiguration - .target(OreFeatures.NETHER_ORE_REPLACEABLES, block.defaultBlockState()))); + .target(NETHER_ORE_REPLACEABLES, block.defaultBlockState()))); return this; } return blocks(block.defaultBlockState(), block.defaultBlockState()); @@ -148,8 +154,8 @@ public class LayerPattern { private Builder blocks(BlockState stone, BlockState deepslate) { this.targets.add( - ImmutableList.of(OreConfiguration.target(OreFeatures.STONE_ORE_REPLACEABLES, stone), - OreConfiguration.target(OreFeatures.DEEPSLATE_ORE_REPLACEABLES, deepslate))); + ImmutableList.of(OreConfiguration.target(STONE_ORE_REPLACEABLES, stone), + OreConfiguration.target(DEEPSLATE_ORE_REPLACEABLES, deepslate))); return this; } diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/LayeredOreConfiguration.java b/src/main/java/com/simibubi/create/foundation/worldgen/LayeredOreConfiguration.java new file mode 100644 index 000000000..a60b14998 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/worldgen/LayeredOreConfiguration.java @@ -0,0 +1,34 @@ +package com.simibubi.create.foundation.worldgen; + +import java.util.List; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; + +public class LayeredOreConfiguration implements FeatureConfiguration { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> { + return instance.group( + Codec.list(LayerPattern.CODEC) + .fieldOf("layer_patterns") + .forGetter(config -> config.layerPatterns), + Codec.intRange(0, 64) + .fieldOf("size") + .forGetter(config -> config.size), + Codec.floatRange(0.0F, 1.0F) + .fieldOf("discard_chance_on_air_exposure") + .forGetter(config -> config.discardChanceOnAirExposure) + ).apply(instance, LayeredOreConfiguration::new); + }); + + public final List layerPatterns; + public final int size; + public final float discardChanceOnAirExposure; + + public LayeredOreConfiguration(List layerPatterns, int size, float discardChanceOnAirExposure) { + this.layerPatterns = layerPatterns; + this.size = size; + this.discardChanceOnAirExposure = discardChanceOnAirExposure; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/LayeredOreFeature.java b/src/main/java/com/simibubi/create/foundation/worldgen/LayeredOreFeature.java index 19e3f7545..5b44d4f90 100644 --- a/src/main/java/com/simibubi/create/foundation/worldgen/LayeredOreFeature.java +++ b/src/main/java/com/simibubi/create/foundation/worldgen/LayeredOreFeature.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.worldgen; import java.util.ArrayList; import java.util.List; +import java.util.function.Function; import com.simibubi.create.foundation.worldgen.LayerPattern.Layer; @@ -15,22 +16,23 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.BulkSectionAccess; import net.minecraft.world.level.chunk.LevelChunkSection; import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration.TargetBlockState; -public class LayeredOreFeature extends BaseConfigDrivenOreFeature { +public class LayeredOreFeature extends Feature { public LayeredOreFeature() { - super(ConfigDrivenLayeredOreFeatureConfiguration.CODEC); + super(LayeredOreConfiguration.CODEC); } @Override - public boolean place(FeaturePlaceContext pContext) { + public boolean place(FeaturePlaceContext pContext) { RandomSource random = pContext.random(); BlockPos blockpos = pContext.origin(); WorldGenLevel worldgenlevel = pContext.level(); - ConfigDrivenLayeredOreFeatureConfiguration config = pContext.config(); - List patternPool = config.getLayerPatterns(); + LayeredOreConfiguration config = pContext.config(); + List patternPool = config.layerPatterns; if (patternPool.isEmpty()) return false; @@ -38,8 +40,8 @@ public class LayeredOreFeature extends BaseConfigDrivenOreFeature 0; } + + public boolean canPlaceOre(BlockState pState, Function pAdjacentStateAccessor, + RandomSource pRandom, LayeredOreConfiguration pConfig, OreConfiguration.TargetBlockState pTargetState, + BlockPos.MutableBlockPos pMatablePos) { + if (!pTargetState.target.test(pState, pRandom)) + return false; + if (shouldSkipAirCheck(pRandom, pConfig.discardChanceOnAirExposure)) + return true; + + return !isAdjacentToAir(pAdjacentStateAccessor, pMatablePos); + } + + protected boolean shouldSkipAirCheck(RandomSource pRandom, float pChance) { + return pChance <= 0 ? true : pChance >= 1 ? false : pRandom.nextFloat() >= pChance; + } } diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/OreFeatureConfigEntry.java b/src/main/java/com/simibubi/create/foundation/worldgen/OreFeatureConfigEntry.java deleted file mode 100644 index 0676e4c2e..000000000 --- a/src/main/java/com/simibubi/create/foundation/worldgen/OreFeatureConfigEntry.java +++ /dev/null @@ -1,209 +0,0 @@ -package com.simibubi.create.foundation.worldgen; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.jetbrains.annotations.Nullable; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.DataResult; -import com.simibubi.create.foundation.config.ConfigBase; -import com.simibubi.create.foundation.utility.Couple; -import com.tterrag.registrate.util.nullness.NonNullSupplier; - -import net.minecraft.core.Holder; -import net.minecraft.core.HolderSet; -import net.minecraft.core.Registry; -import net.minecraft.core.RegistryAccess; -import net.minecraft.core.registries.Registries; -import net.minecraft.data.worldgen.features.OreFeatures; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.TagKey; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.levelgen.GenerationStep.Decoration; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration; -import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration.TargetBlockState; -import net.minecraft.world.level.levelgen.placement.PlacedFeature; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.common.world.BiomeModifier; -import net.minecraftforge.common.world.ForgeBiomeModifiers.AddFeaturesBiomeModifier; - -public class OreFeatureConfigEntry extends ConfigBase { - public static final Map ALL = new HashMap<>(); - - public static final Codec CODEC = ResourceLocation.CODEC - .comapFlatMap(OreFeatureConfigEntry::read, entry -> entry.id); - - public final ResourceLocation id; - public final ConfigInt clusterSize; - public final ConfigFloat frequency; - public final ConfigInt minHeight; - public final ConfigInt maxHeight; - - private DatagenExtension datagenExt; - - public OreFeatureConfigEntry(ResourceLocation id, int clusterSize, float frequency, int minHeight, int maxHeight) { - this.id = id; - - this.clusterSize = i(clusterSize, 0, "clusterSize"); - this.frequency = f(frequency, 0, 512, "frequency", "Amount of clusters generated per Chunk.", - " >1 to spawn multiple.", " <1 to make it a chance.", " 0 to disable."); - this.minHeight = i(minHeight, "minHeight"); - this.maxHeight = i(maxHeight, "maxHeight"); - - ALL.put(id, this); - } - - @Nullable - public StandardDatagenExtension standardDatagenExt() { - if (datagenExt == null) { - datagenExt = new StandardDatagenExtension(); - } - if (datagenExt instanceof StandardDatagenExtension standard) { - return standard; - } - return null; - } - - @Nullable - public LayeredDatagenExtension layeredDatagenExt() { - if (datagenExt == null) { - datagenExt = new LayeredDatagenExtension(); - } - if (datagenExt instanceof LayeredDatagenExtension layered) { - return layered; - } - return null; - } - - @Nullable - public DatagenExtension datagenExt() { - if (datagenExt != null) { - return datagenExt; - } - return null; - } - - public void addToConfig(ForgeConfigSpec.Builder builder) { - registerAll(builder); - } - - @Override - public String getName() { - return id.getPath(); - } - - public static DataResult read(ResourceLocation id) { - OreFeatureConfigEntry entry = ALL.get(id); - if (entry != null) { - return DataResult.success(entry); - } else { - return DataResult.error("Not a valid OreFeatureConfigEntry: " + id); - } - } - - public abstract class DatagenExtension { - public TagKey biomeTag; - - public DatagenExtension biomeTag(TagKey biomes) { - this.biomeTag = biomes; - return this; - } - - public abstract ConfiguredFeature createConfiguredFeature(RegistryAccess registryAccess); - - public PlacedFeature createPlacedFeature(RegistryAccess registryAccess) { - Registry> featureRegistry = registryAccess.registryOrThrow(Registries.CONFIGURED_FEATURE); - Holder> featureHolder = featureRegistry.getHolderOrThrow(ResourceKey.create(Registries.CONFIGURED_FEATURE, id)); - return new PlacedFeature(featureHolder, List.of(new ConfigDrivenPlacement(OreFeatureConfigEntry.this))); - } - - public BiomeModifier createBiomeModifier(RegistryAccess registryAccess) { - Registry biomeRegistry = registryAccess.registryOrThrow(Registries.BIOME); - Registry featureRegistry = registryAccess.registryOrThrow(Registries.PLACED_FEATURE); - HolderSet biomes = biomeRegistry.getOrCreateTag(biomeTag); - Holder featureHolder = featureRegistry.getHolderOrThrow(ResourceKey.create(Registries.PLACED_FEATURE, id)); - return new AddFeaturesBiomeModifier(biomes, HolderSet.direct(featureHolder), Decoration.UNDERGROUND_ORES); - } - - public OreFeatureConfigEntry parent() { - return OreFeatureConfigEntry.this; - } - } - - public class StandardDatagenExtension extends DatagenExtension { - public NonNullSupplier block; - public NonNullSupplier deepBlock; - public NonNullSupplier netherBlock; - - public StandardDatagenExtension withBlock(NonNullSupplier block) { - this.block = block; - this.deepBlock = block; - return this; - } - - public StandardDatagenExtension withBlocks(Couple> blocks) { - this.block = blocks.getFirst(); - this.deepBlock = blocks.getSecond(); - return this; - } - - public StandardDatagenExtension withNetherBlock(NonNullSupplier block) { - this.netherBlock = block; - return this; - } - - @Override - public StandardDatagenExtension biomeTag(TagKey biomes) { - super.biomeTag(biomes); - return this; - } - - @Override - public ConfiguredFeature createConfiguredFeature(RegistryAccess registryAccess) { - List targetStates = new ArrayList<>(); - if (block != null) - targetStates.add(OreConfiguration.target(OreFeatures.STONE_ORE_REPLACEABLES, block.get() - .defaultBlockState())); - if (deepBlock != null) - targetStates.add(OreConfiguration.target(OreFeatures.DEEPSLATE_ORE_REPLACEABLES, deepBlock.get() - .defaultBlockState())); - if (netherBlock != null) - targetStates.add(OreConfiguration.target(OreFeatures.NETHER_ORE_REPLACEABLES, netherBlock.get() - .defaultBlockState())); - - ConfigDrivenOreFeatureConfiguration config = new ConfigDrivenOreFeatureConfiguration(OreFeatureConfigEntry.this, 0, targetStates); - return new ConfiguredFeature<>(AllFeatures.STANDARD_ORE.get(), config); - } - } - - public class LayeredDatagenExtension extends DatagenExtension { - public final List> layerPatterns = new ArrayList<>(); - - public LayeredDatagenExtension withLayerPattern(NonNullSupplier pattern) { - this.layerPatterns.add(pattern); - return this; - } - - @Override - public LayeredDatagenExtension biomeTag(TagKey biomes) { - super.biomeTag(biomes); - return this; - } - - @Override - public ConfiguredFeature createConfiguredFeature(RegistryAccess registryAccess) { - List layerPatterns = this.layerPatterns.stream() - .map(NonNullSupplier::get) - .toList(); - - ConfigDrivenLayeredOreFeatureConfiguration config = new ConfigDrivenLayeredOreFeatureConfiguration(OreFeatureConfigEntry.this, 0, layerPatterns); - return new ConfiguredFeature<>(AllFeatures.LAYERED_ORE.get(), config); - } - } -} diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/StandardOreFeature.java b/src/main/java/com/simibubi/create/foundation/worldgen/StandardOreFeature.java deleted file mode 100644 index ea27c6b91..000000000 --- a/src/main/java/com/simibubi/create/foundation/worldgen/StandardOreFeature.java +++ /dev/null @@ -1,168 +0,0 @@ -package com.simibubi.create.foundation.worldgen; - -import java.util.BitSet; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.SectionPos; -import net.minecraft.util.Mth; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.BulkSectionAccess; -import net.minecraft.world.level.chunk.LevelChunkSection; -import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; -import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration; - -public class StandardOreFeature extends BaseConfigDrivenOreFeature { - - public StandardOreFeature() { - super(ConfigDrivenOreFeatureConfiguration.CODEC); - } - - // From OreFeature, slight adjustments - - @Override - public boolean place(FeaturePlaceContext pContext) { - RandomSource random = pContext.random(); - BlockPos blockpos = pContext.origin(); - WorldGenLevel worldgenlevel = pContext.level(); - ConfigDrivenOreFeatureConfiguration oreconfiguration = pContext.config(); - float f = random.nextFloat() * (float)Math.PI; - float f1 = (float)oreconfiguration.getClusterSize() / 8.0F; - int i = Mth.ceil(((float)oreconfiguration.getClusterSize() / 16.0F * 2.0F + 1.0F) / 2.0F); - double d0 = (double)blockpos.getX() + Math.sin((double)f) * (double)f1; - double d1 = (double)blockpos.getX() - Math.sin((double)f) * (double)f1; - double d2 = (double)blockpos.getZ() + Math.cos((double)f) * (double)f1; - double d3 = (double)blockpos.getZ() - Math.cos((double)f) * (double)f1; - double d4 = (double)(blockpos.getY() + random.nextInt(3) - 2); - double d5 = (double)(blockpos.getY() + random.nextInt(3) - 2); - int k = blockpos.getX() - Mth.ceil(f1) - i; - int l = blockpos.getY() - 2 - i; - int i1 = blockpos.getZ() - Mth.ceil(f1) - i; - int j1 = 2 * (Mth.ceil(f1) + i); - int k1 = 2 * (2 + i); - - for(int l1 = k; l1 <= k + j1; ++l1) { - for(int i2 = i1; i2 <= i1 + j1; ++i2) { - if (l <= worldgenlevel.getHeight(Heightmap.Types.OCEAN_FLOOR_WG, l1, i2)) { - return this.doPlace(worldgenlevel, random, oreconfiguration, d0, d1, d2, d3, d4, d5, k, l, i1, j1, k1); - } - } - } - - return false; - } - - protected boolean doPlace(WorldGenLevel pLevel, RandomSource pRandom, ConfigDrivenOreFeatureConfiguration pConfig, double pMinX, - double pMaxX, double pMinZ, double pMaxZ, double pMinY, double pMaxY, int pX, int pY, int pZ, int pWidth, - int pHeight) { - int i = 0; - BitSet bitset = new BitSet(pWidth * pHeight * pWidth); - BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(); - int j = pConfig.getClusterSize(); - double[] adouble = new double[j * 4]; - - for(int k = 0; k < j; ++k) { - float f = (float)k / (float)j; - double d0 = Mth.lerp((double)f, pMinX, pMaxX); - double d1 = Mth.lerp((double)f, pMinY, pMaxY); - double d2 = Mth.lerp((double)f, pMinZ, pMaxZ); - double d3 = pRandom.nextDouble() * (double)j / 16.0D; - double d4 = ((double)(Mth.sin((float)Math.PI * f) + 1.0F) * d3 + 1.0D) / 2.0D; - adouble[k * 4 + 0] = d0; - adouble[k * 4 + 1] = d1; - adouble[k * 4 + 2] = d2; - adouble[k * 4 + 3] = d4; - } - - for(int l3 = 0; l3 < j - 1; ++l3) { - if (!(adouble[l3 * 4 + 3] <= 0.0D)) { - for(int i4 = l3 + 1; i4 < j; ++i4) { - if (!(adouble[i4 * 4 + 3] <= 0.0D)) { - double d8 = adouble[l3 * 4 + 0] - adouble[i4 * 4 + 0]; - double d10 = adouble[l3 * 4 + 1] - adouble[i4 * 4 + 1]; - double d12 = adouble[l3 * 4 + 2] - adouble[i4 * 4 + 2]; - double d14 = adouble[l3 * 4 + 3] - adouble[i4 * 4 + 3]; - if (d14 * d14 > d8 * d8 + d10 * d10 + d12 * d12) { - if (d14 > 0.0D) { - adouble[i4 * 4 + 3] = -1.0D; - } else { - adouble[l3 * 4 + 3] = -1.0D; - } - } - } - } - } - } - - BulkSectionAccess bulksectionaccess = new BulkSectionAccess(pLevel); - - try { - for(int j4 = 0; j4 < j; ++j4) { - double d9 = adouble[j4 * 4 + 3]; - if (!(d9 < 0.0D)) { - double d11 = adouble[j4 * 4 + 0]; - double d13 = adouble[j4 * 4 + 1]; - double d15 = adouble[j4 * 4 + 2]; - int k4 = Math.max(Mth.floor(d11 - d9), pX); - int l = Math.max(Mth.floor(d13 - d9), pY); - int i1 = Math.max(Mth.floor(d15 - d9), pZ); - int j1 = Math.max(Mth.floor(d11 + d9), k4); - int k1 = Math.max(Mth.floor(d13 + d9), l); - int l1 = Math.max(Mth.floor(d15 + d9), i1); - - for(int i2 = k4; i2 <= j1; ++i2) { - double d5 = ((double)i2 + 0.5D - d11) / d9; - if (d5 * d5 < 1.0D) { - for(int j2 = l; j2 <= k1; ++j2) { - double d6 = ((double)j2 + 0.5D - d13) / d9; - if (d5 * d5 + d6 * d6 < 1.0D) { - for(int k2 = i1; k2 <= l1; ++k2) { - double d7 = ((double)k2 + 0.5D - d15) / d9; - if (d5 * d5 + d6 * d6 + d7 * d7 < 1.0D && !pLevel.isOutsideBuildHeight(j2)) { - int l2 = i2 - pX + (j2 - pY) * pWidth + (k2 - pZ) * pWidth * pHeight; - if (!bitset.get(l2)) { - bitset.set(l2); - blockpos$mutableblockpos.set(i2, j2, k2); - if (pLevel.ensureCanWrite(blockpos$mutableblockpos)) { - LevelChunkSection levelchunksection = bulksectionaccess.getSection(blockpos$mutableblockpos); - if (levelchunksection != null) { - int i3 = SectionPos.sectionRelative(i2); - int j3 = SectionPos.sectionRelative(j2); - int k3 = SectionPos.sectionRelative(k2); - BlockState blockstate = levelchunksection.getBlockState(i3, j3, k3); - - for(OreConfiguration.TargetBlockState oreconfiguration$targetblockstate : pConfig.getTargetStates()) { - if (canPlaceOre(blockstate, bulksectionaccess::getBlockState, pRandom, pConfig, oreconfiguration$targetblockstate, blockpos$mutableblockpos)) { - levelchunksection.setBlockState(i3, j3, k3, oreconfiguration$targetblockstate.state, false); - ++i; - break; - } - } - } - } - } - } - } - } - } - } - } - } - } - } catch (Throwable throwable1) { - try { - bulksectionaccess.close(); - } catch (Throwable throwable) { - throwable1.addSuppressed(throwable); - } - - throw throwable1; - } - - bulksectionaccess.close(); - return i > 0; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/worldgen/WorldgenDataProvider.java b/src/main/java/com/simibubi/create/foundation/worldgen/WorldgenDataProvider.java new file mode 100644 index 000000000..8ae2ddb7f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/worldgen/WorldgenDataProvider.java @@ -0,0 +1,36 @@ +package com.simibubi.create.foundation.worldgen; + +import java.util.Set; +import java.util.concurrent.CompletableFuture; + +import com.simibubi.create.Create; + +import net.minecraft.core.HolderLookup; +import net.minecraft.core.RegistrySetBuilder; +import net.minecraft.core.RegistrySetBuilder.RegistryBootstrap; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.DataProvider; +import net.minecraft.data.PackOutput; +import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider; +import net.minecraftforge.registries.ForgeRegistries; + +public class WorldgenDataProvider extends DatapackBuiltinEntriesProvider { + @SuppressWarnings({ "rawtypes", "unchecked" }) + private static final RegistrySetBuilder BUILDER = new RegistrySetBuilder() + .add(Registries.CONFIGURED_FEATURE, (RegistryBootstrap) AllConfiguredFeatures::bootstrap) + .add(Registries.PLACED_FEATURE, AllPlacedFeatures::bootstrap) + .add(ForgeRegistries.Keys.BIOME_MODIFIERS, AllBiomeModifiers::bootstrap); + + public WorldgenDataProvider(PackOutput output, CompletableFuture registries) { + super(output, registries, BUILDER, Set.of(Create.ID)); + } + + public static DataProvider.Factory makeFactory(CompletableFuture registries) { + return output -> new WorldgenDataProvider(output, registries); + } + + @Override + public String getName() { + return "Create's Worldgen Data"; + } +}