diff --git a/src/main/java/net/pixaurora/janerator/config/ConfigFileManager.java b/src/main/java/net/pixaurora/janerator/config/ConfigFileManager.java index a626e84..da08d70 100644 --- a/src/main/java/net/pixaurora/janerator/config/ConfigFileManager.java +++ b/src/main/java/net/pixaurora/janerator/config/ConfigFileManager.java @@ -22,7 +22,7 @@ import net.pixaurora.janerator.graphing.grapher.FunctionGrapher; import net.pixaurora.janerator.shade.JaneratorLayer; import net.pixaurora.janerator.shade.method.NormalShading; -import net.pixaurora.janerator.worldgen.FeatureFilter; +import net.pixaurora.janerator.worldgen.feature.FeatureFilter; import net.pixaurora.janerator.worldgen.generator.MultiGenOrganizer; public class ConfigFileManager { diff --git a/src/main/java/net/pixaurora/janerator/config/JaneratorConfig.java b/src/main/java/net/pixaurora/janerator/config/JaneratorConfig.java index 83a9548..53206d0 100644 --- a/src/main/java/net/pixaurora/janerator/config/JaneratorConfig.java +++ b/src/main/java/net/pixaurora/janerator/config/JaneratorConfig.java @@ -11,7 +11,7 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.Level; import net.minecraft.world.level.chunk.ChunkGenerator; -import net.pixaurora.janerator.worldgen.FeatureFilter; +import net.pixaurora.janerator.worldgen.feature.FeatureFilter; import net.pixaurora.janerator.worldgen.generator.MultiGenerator; public class JaneratorConfig { diff --git a/src/main/java/net/pixaurora/janerator/worldgen/FeatureFilter.java b/src/main/java/net/pixaurora/janerator/worldgen/FeatureFilter.java deleted file mode 100644 index 91f16ae..0000000 --- a/src/main/java/net/pixaurora/janerator/worldgen/FeatureFilter.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.pixaurora.janerator.worldgen; - -import java.util.List; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; - -import net.minecraft.core.Holder; -import net.minecraft.core.HolderSet; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; - -public record FeatureFilter(HolderSet> features) { - public static final Codec CODEC = RecordCodecBuilder.create( - instance -> instance.group( - ConfiguredFeature.LIST_CODEC.fieldOf("features").forGetter(FeatureFilter::features) - ).apply(instance, FeatureFilter::new) - ); - - public static FeatureFilter defaultInstance() { - return new FeatureFilter(HolderSet.direct(List.of())); - } - - public boolean filtersOut(Holder> feature) { - return this.features.contains(feature); - } -} diff --git a/src/main/java/net/pixaurora/janerator/worldgen/feature/FeatureFilter.java b/src/main/java/net/pixaurora/janerator/worldgen/feature/FeatureFilter.java new file mode 100644 index 0000000..95faf96 --- /dev/null +++ b/src/main/java/net/pixaurora/janerator/worldgen/feature/FeatureFilter.java @@ -0,0 +1,41 @@ +package net.pixaurora.janerator.worldgen.feature; + +import java.util.List; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import net.minecraft.core.Holder; +import net.minecraft.core.HolderSet; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; + +public class FeatureFilter { + public static final Codec CODEC = RecordCodecBuilder.create( + instance -> instance.group( + ConfiguredFeature.LIST_CODEC.fieldOf("features").forGetter(filter -> filter.individualFeatures), + HandpickedFeatureCategory.CODEC.listOf().fieldOf("preset_categories").forGetter(filter -> filter.presetCategories) + ).apply(instance, FeatureFilter::new) + ); + + private final HolderSet> individualFeatures; + private final List presetCategories; + + private final List>> categorizedKeys; + + public FeatureFilter(HolderSet> individualFeatures, List handpickedCategories) { + this.individualFeatures = individualFeatures; + this.presetCategories = handpickedCategories; + + this.categorizedKeys = handpickedCategories.stream().flatMap(features -> features.includedFeatures().stream()).toList(); + } + + public static FeatureFilter defaultInstance() { + return new FeatureFilter(HolderSet.direct(List.of()), List.of()); + } + + public boolean filtersOut(Holder> feature) { + return this.individualFeatures.contains(feature) + || feature.unwrapKey().map(featureKey -> this.categorizedKeys.contains(featureKey)).orElse(false); + } +} diff --git a/src/main/java/net/pixaurora/janerator/worldgen/feature/HandpickedFeatureCategory.java b/src/main/java/net/pixaurora/janerator/worldgen/feature/HandpickedFeatureCategory.java new file mode 100644 index 0000000..b81b6e8 --- /dev/null +++ b/src/main/java/net/pixaurora/janerator/worldgen/feature/HandpickedFeatureCategory.java @@ -0,0 +1,44 @@ +package net.pixaurora.janerator.worldgen.feature; + +import java.util.List; + +import com.mojang.serialization.Codec; + +import net.minecraft.data.worldgen.features.TreeFeatures; +import net.minecraft.data.worldgen.features.VegetationFeatures; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.pixaurora.janerator.config.EnumCodec; + +public enum HandpickedFeatureCategory { + ALL_TREES(List.of(TreeFeatures.ACACIA, TreeFeatures.AZALEA_TREE, TreeFeatures.BIRCH, TreeFeatures.BIRCH_BEES_0002, + TreeFeatures.BIRCH_BEES_002, TreeFeatures.BIRCH_BEES_005, TreeFeatures.CHERRY, TreeFeatures.CHERRY_BEES_005, + TreeFeatures.CRIMSON_FUNGUS, TreeFeatures.CRIMSON_FUNGUS_PLANTED, TreeFeatures.DARK_OAK, TreeFeatures.FANCY_OAK, + TreeFeatures.FANCY_OAK_BEES, TreeFeatures.FANCY_OAK_BEES_0002, TreeFeatures.FANCY_OAK_BEES_002, TreeFeatures.FANCY_OAK_BEES_005, + TreeFeatures.HUGE_BROWN_MUSHROOM, TreeFeatures.HUGE_RED_MUSHROOM, TreeFeatures.JUNGLE_BUSH, TreeFeatures.JUNGLE_TREE, + TreeFeatures.JUNGLE_TREE_NO_VINE, TreeFeatures.MANGROVE, TreeFeatures.MEGA_JUNGLE_TREE, TreeFeatures.MEGA_PINE, + TreeFeatures.MEGA_SPRUCE, TreeFeatures.OAK, TreeFeatures.OAK_BEES_0002, TreeFeatures.OAK_BEES_002, TreeFeatures.OAK_BEES_005, + TreeFeatures.PINE, TreeFeatures.SPRUCE, TreeFeatures.SUPER_BIRCH_BEES, TreeFeatures.SUPER_BIRCH_BEES_0002, TreeFeatures.SWAMP_OAK, + TreeFeatures.TALL_MANGROVE, TreeFeatures.WARPED_FUNGUS, TreeFeatures.WARPED_FUNGUS_PLANTED, VegetationFeatures.BAMBOO_NO_PODZOL, + VegetationFeatures.BAMBOO_SOME_PODZOL, VegetationFeatures.BAMBOO_VEGETATION, VegetationFeatures.BIRCH_TALL, + VegetationFeatures.DARK_FOREST_VEGETATION, VegetationFeatures.MANGROVE_VEGETATION, VegetationFeatures.MEADOW_TREES, + VegetationFeatures.MUSHROOM_ISLAND_VEGETATION, VegetationFeatures.TREES_BIRCH_AND_OAK, VegetationFeatures.TREES_GROVE, + VegetationFeatures.TREES_JUNGLE, VegetationFeatures.TREES_OLD_GROWTH_PINE_TAIGA, VegetationFeatures.TREES_OLD_GROWTH_SPRUCE_TAIGA, + VegetationFeatures.TREES_PLAINS, VegetationFeatures.TREES_SAVANNA, VegetationFeatures.TREES_SPARSE_JUNGLE, + VegetationFeatures.TREES_TAIGA, VegetationFeatures.TREES_WATER, VegetationFeatures.TREES_WINDSWEPT_HILLS)); + + public static final Codec CODEC = new EnumCodec( + "Hardcoded Feature Categories", + values() + ); + + private final List>> includedFeatures; + + HandpickedFeatureCategory(List>> includedFeatures) { + this.includedFeatures = includedFeatures; + } + + public List>> includedFeatures() { + return this.includedFeatures; + } +} diff --git a/src/main/java/net/pixaurora/janerator/worldgen/generator/MultiGenerator.java b/src/main/java/net/pixaurora/janerator/worldgen/generator/MultiGenerator.java index 233c193..3b37c43 100644 --- a/src/main/java/net/pixaurora/janerator/worldgen/generator/MultiGenerator.java +++ b/src/main/java/net/pixaurora/janerator/worldgen/generator/MultiGenerator.java @@ -25,10 +25,10 @@ import net.minecraft.world.level.levelgen.RandomState; import net.minecraft.world.level.levelgen.blending.Blender; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; -import net.pixaurora.janerator.worldgen.FeatureFilter; import net.pixaurora.janerator.worldgen.GeneratorLookup; import net.pixaurora.janerator.worldgen.PlacementSelection; import net.pixaurora.janerator.worldgen.WrappedBiomeResolver; +import net.pixaurora.janerator.worldgen.feature.FeatureFilter; public class MultiGenerator extends ChunkGenerator { private MultiGenOrganizer organizer;