diff --git a/src/main/java/ru/bclib/api/features/BCLFeatureBuilder.java b/src/main/java/ru/bclib/api/features/BCLFeatureBuilder.java new file mode 100644 index 00000000..9a7c16d1 --- /dev/null +++ b/src/main/java/ru/bclib/api/features/BCLFeatureBuilder.java @@ -0,0 +1,76 @@ +package ru.bclib.api.features; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.levelgen.GenerationStep.Decoration; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import net.minecraft.world.level.levelgen.placement.PlacementModifier; +import ru.bclib.world.features.BCLFeature; + +import java.util.ArrayList; +import java.util.List; + +public class BCLFeatureBuilder { + private static final BCLFeatureBuilder INSTANCE = new BCLFeatureBuilder(); + private List modifications = new ArrayList<>(16); + private ResourceLocation featureID; + private Decoration decoration; + private Feature feature; + + private BCLFeatureBuilder() {} + + /** + * Starts a new {@link BCLFeature} builder. + * @param featureID {@link ResourceLocation} feature identifier. + * @param feature {@link Feature} to construct. + * @return {@link BCLFeatureBuilder} instance. + */ + public static BCLFeatureBuilder start(ResourceLocation featureID, Feature feature) { + INSTANCE.decoration = Decoration.VEGETAL_DECORATION; + INSTANCE.modifications.clear(); + INSTANCE.featureID = featureID; + INSTANCE.feature = feature; + return INSTANCE; + } + + /** + * Set generation step for the feature. Default is {@code VEGETAL_DECORATION}. + * @param decoration {@link Decoration} step. + * @return same {@link BCLFeatureBuilder} instance. + */ + public BCLFeatureBuilder decoration(Decoration decoration) { + this.decoration = decoration; + return this; + } + + /** + * Add feature placement modifier. Used as a condition for feature how to generate. + * @param modifier {@link PlacementModifier}. + * @return same {@link BCLFeatureBuilder} instance. + */ + public BCLFeatureBuilder modifier(PlacementModifier modifier) { + modifications.add(modifier); + return this; + } + + /** + * Builds a new {@link BCLFeature} instance. Features will be registered during this process. + * @param configuration any {@link FeatureConfiguration} for provided {@link Feature}. + * @return created {@link BCLFeature} instance. + */ + public BCLFeature build(FC configuration) { + PlacementModifier [] modifiers = modifications.toArray(new PlacementModifier [modifications.size()]); + PlacedFeature configured = ((Feature) feature).configured(configuration).placed(modifiers); + return new BCLFeature(featureID, feature, decoration, configured); + } + + /** + * Builds a new {@link BCLFeature} instance with {@code NONE} {@link FeatureConfiguration}. + * Features will be registered during this process. + * @return created {@link BCLFeature} instance. + */ + public BCLFeature build() { + return build(FeatureConfiguration.NONE); + } +} diff --git a/src/main/java/ru/bclib/world/features/BCLFeature.java b/src/main/java/ru/bclib/world/features/BCLFeature.java index ff5d09b9..aaf236bd 100644 --- a/src/main/java/ru/bclib/world/features/BCLFeature.java +++ b/src/main/java/ru/bclib/world/features/BCLFeature.java @@ -33,7 +33,7 @@ public class BCLFeature { this.feature = feature; } - public BCLFeature(ResourceLocation id, Feature feature, Decoration featureStep, PlacedFeature placedFeature) { + public BCLFeature(ResourceLocation id, Feature feature, Decoration featureStep, PlacedFeature placedFeature) { this.placedFeature = Registry.register(BuiltinRegistries.PLACED_FEATURE, id, placedFeature); this.feature = Registry.register(Registry.FEATURE, id, feature); this.featureStep = featureStep;