[Changes] Adapted BCLPlacedFeatureBuilder for DataGen pass

This commit is contained in:
Frank 2022-11-30 12:12:20 +01:00
parent 2e60364029
commit 271c974929
8 changed files with 93 additions and 69 deletions

View file

@ -55,12 +55,12 @@ public class BCLConfigureFeature<F extends Feature<FC>, FC extends FeatureConfig
} }
public BCLPlacedFeatureBuilder<F, FC> place(BCLPlacedFeatureBuilder.Context ctx) { public BCLPlacedFeatureBuilder<F, FC> place() {
return place(ctx, this.id); return place(this.id);
} }
public BCLPlacedFeatureBuilder<F, FC> place(BCLPlacedFeatureBuilder.Context ctx, ResourceLocation id) { public BCLPlacedFeatureBuilder<F, FC> place(ResourceLocation id) {
return BCLPlacedFeatureBuilder.place(ctx, id, this); return BCLPlacedFeatureBuilder.place(id, this);
} }
static <F extends Feature<FC>, FC extends FeatureConfiguration> BCLConfigureFeature<F, FC> create(Holder<ConfiguredFeature<FC, F>> registeredFeature) { static <F extends Feature<FC>, FC extends FeatureConfiguration> BCLConfigureFeature<F, FC> create(Holder<ConfiguredFeature<FC, F>> registeredFeature) {

View file

@ -7,6 +7,7 @@ import org.betterx.bclib.api.v3.levelgen.features.features.*;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.GenerationStep;
import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.Feature;
@ -17,6 +18,25 @@ import net.minecraft.world.level.levelgen.placement.PlacedFeature;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
public class BCLFeature<F extends Feature<FC>, FC extends FeatureConfiguration> { public class BCLFeature<F extends Feature<FC>, FC extends FeatureConfiguration> {
public static class Unregistered<F extends Feature<FC>, FC extends FeatureConfiguration> extends BCLFeature<F, FC> {
Unregistered(
BCLConfigureFeature<F, FC> configuredFeature,
Holder<PlacedFeature> placed,
GenerationStep.Decoration decoration
) {
super(configuredFeature, placed, decoration);
}
@Override
public BCLFeature<F, FC> register(BootstapContext<PlacedFeature> bootstrapContext) {
Holder<PlacedFeature> holder = BCLPlacedFeatureBuilder.register(
bootstrapContext,
getPlacedFeature()
);
return new BCLFeature<>(configuredFeature, holder, decoration);
}
}
public static final Feature<PlaceFacingBlockConfig> PLACE_BLOCK = register( public static final Feature<PlaceFacingBlockConfig> PLACE_BLOCK = register(
BCLib.makeID("place_block"), BCLib.makeID("place_block"),
new PlaceBlockFeature<>(PlaceFacingBlockConfig.CODEC) new PlaceBlockFeature<>(PlaceFacingBlockConfig.CODEC)
@ -102,4 +122,8 @@ public class BCLFeature<F extends Feature<FC>, FC extends FeatureConfiguration>
) { ) {
return Registry.register(BuiltInRegistries.FEATURE, location, feature); return Registry.register(BuiltInRegistries.FEATURE, location, feature);
} }
public BCLFeature<F, FC> register(BootstapContext<PlacedFeature> bootstrapContext) {
return this;
}
} }

View file

@ -59,6 +59,8 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
B create(ResourceLocation id, Holder<ConfiguredFeature<FC, F>> configuredFeature); B create(ResourceLocation id, Holder<ConfiguredFeature<FC, F>> configuredFeature);
} }
private static List<BCLConfigureFeature.Unregistered<?, ?>> ALL_UNREGISTERED = new LinkedList<>();
/** /**
* Starts a new {@link BCLFeature} builder. * Starts a new {@link BCLFeature} builder.
* *
@ -273,7 +275,7 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
} }
public BCLConfigureFeature.Unregistered<F, FC> build() { public BCLConfigureFeature.Unregistered<F, FC> build() {
return buildAndCreateHolder( final var res = buildAndCreateHolder(
(featureID, holder) -> new BCLConfigureFeature.Unregistered<>(featureID, holder), (featureID, holder) -> new BCLConfigureFeature.Unregistered<>(featureID, holder),
(featureID, cFeature) -> (FullReferenceHolder<ConfiguredFeature<FC, F>>) (Object) FullReferenceHolder.create( (featureID, cFeature) -> (FullReferenceHolder<ConfiguredFeature<FC, F>>) (Object) FullReferenceHolder.create(
Registries.CONFIGURED_FEATURE, Registries.CONFIGURED_FEATURE,
@ -281,6 +283,12 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
cFeature cFeature
) )
); );
ALL_UNREGISTERED.add(res);
return res;
}
public static void registerAll(BootstapContext<ConfiguredFeature<?, ?>> bootstapContext) {
ALL_UNREGISTERED.forEach(u -> u.register(bootstapContext));
} }
public BCLInlinePlacedBuilder<F, FC> inlinePlace() { public BCLInlinePlacedBuilder<F, FC> inlinePlace() {
@ -290,7 +298,7 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
public Holder<PlacedFeature> inlinePlace(BCLInlinePlacedBuilder<F, FC> placer) { public Holder<PlacedFeature> inlinePlace(BCLInlinePlacedBuilder<F, FC> placer) {
BCLConfigureFeature<F, FC> f = buildInline(); BCLConfigureFeature<F, FC> f = buildInline();
return placer.build(f); return placer.build(f).getPlacedFeature();
} }
public static class AsOre extends BCLFeatureBuilder<OreFeature, OreConfiguration> { public static class AsOre extends BCLFeatureBuilder<OreFeature, OreConfiguration> {
@ -914,7 +922,7 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
if (isEmpty) blockFeature.isEmpty(); if (isEmpty) blockFeature.isEmpty();
if (groundType != null) blockFeature.isOn(groundType); if (groundType != null) blockFeature.isOn(groundType);
return new RandomPatchConfiguration(tries, xzSpread, ySpread, blockFeature.build()); return new RandomPatchConfiguration(tries, xzSpread, ySpread, blockFeature.build().getPlacedFeature());
} }
} }

View file

@ -3,6 +3,7 @@ package org.betterx.bclib.api.v3.levelgen.features;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.data.worldgen.placement.PlacementUtils; import net.minecraft.data.worldgen.placement.PlacementUtils;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.levelgen.GenerationStep;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.Feature;
import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration;
@ -48,7 +49,7 @@ public class BCLInlinePlacedBuilder<F extends Feature<FC>, FC extends FeatureCon
* @return created {@link PlacedFeature} instance. * @return created {@link PlacedFeature} instance.
*/ */
@Override @Override
public Holder<PlacedFeature> build() { public BCLFeature.Unregistered<F, FC> build() {
return build(cFeature); return build(cFeature);
} }
@ -57,18 +58,13 @@ public class BCLInlinePlacedBuilder<F extends Feature<FC>, FC extends FeatureCon
* *
* @return created {@link PlacedFeature} instance. * @return created {@link PlacedFeature} instance.
*/ */
public Holder<PlacedFeature> build(BCLConfigureFeature feature) { public BCLFeature.Unregistered<F, FC> build(BCLConfigureFeature feature) {
return build(feature.configuredFeature);
}
/**
* Builds a new inline (not registered) {@link PlacedFeature}.
*
* @return created {@link PlacedFeature} instance.
*/
public Holder<PlacedFeature> build(Holder<ConfiguredFeature<FC, F>> feature) {
PlacementModifier[] modifiers = modifications.toArray(new PlacementModifier[modifications.size()]); PlacementModifier[] modifiers = modifications.toArray(new PlacementModifier[modifications.size()]);
return PlacementUtils.inlinePlaced((Holder<ConfiguredFeature<?, ?>>) (Object) feature, modifiers); Holder<PlacedFeature> holder = PlacementUtils.inlinePlaced(
feature.configuredFeature,
modifiers
);
return new BCLFeature.Unregistered<>(feature, holder, GenerationStep.Decoration.VEGETAL_DECORATION);
} }
/** /**
@ -83,7 +79,7 @@ public class BCLInlinePlacedBuilder<F extends Feature<FC>, FC extends FeatureCon
public BCLFeatureBuilder.RandomPatch inRandomPatch(ResourceLocation id) { public BCLFeatureBuilder.RandomPatch inRandomPatch(ResourceLocation id) {
return BCLFeatureBuilder.startRandomPatch(id, build()); return BCLFeatureBuilder.startRandomPatch(id, build().getPlacedFeature());
} }
public BCLFeatureBuilder.RandomPatch randomBonemealDistribution(ResourceLocation id) { public BCLFeatureBuilder.RandomPatch randomBonemealDistribution(ResourceLocation id) {

View file

@ -1,9 +1,10 @@
package org.betterx.bclib.api.v3.levelgen.features; package org.betterx.bclib.api.v3.levelgen.features;
import org.betterx.bclib.util.FullReferenceHolder;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BootstapContext; import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.data.worldgen.placement.PlacementUtils;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.GenerationStep;
@ -12,18 +13,17 @@ import net.minecraft.world.level.levelgen.feature.Feature;
import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration;
import net.minecraft.world.level.levelgen.placement.PlacedFeature; import net.minecraft.world.level.levelgen.placement.PlacedFeature;
import java.util.List;
public class BCLPlacedFeatureBuilder<F extends Feature<FC>, FC extends FeatureConfiguration> extends CommonPlacedFeatureBuilder<F, FC, BCLPlacedFeatureBuilder<F, FC>> { public class BCLPlacedFeatureBuilder<F extends Feature<FC>, FC extends FeatureConfiguration> extends CommonPlacedFeatureBuilder<F, FC, BCLPlacedFeatureBuilder<F, FC>> {
private final ResourceLocation featureID; private final ResourceLocation featureID;
private GenerationStep.Decoration decoration = GenerationStep.Decoration.VEGETAL_DECORATION; private GenerationStep.Decoration decoration = GenerationStep.Decoration.VEGETAL_DECORATION;
private final BCLConfigureFeature<F, FC> cFeature; private final BCLConfigureFeature<F, FC> cFeature;
protected final BCLPlacedFeatureBuilder.Context ctx;
private BCLPlacedFeatureBuilder( private BCLPlacedFeatureBuilder(
Context ctx,
ResourceLocation featureID, ResourceLocation featureID,
BCLConfigureFeature<F, FC> cFeature BCLConfigureFeature<F, FC> cFeature
) { ) {
this.ctx = ctx;
this.featureID = featureID; this.featureID = featureID;
this.cFeature = cFeature; this.cFeature = cFeature;
} }
@ -48,11 +48,10 @@ public class BCLPlacedFeatureBuilder<F extends Feature<FC>, FC extends FeatureCo
* @return {@link CommonPlacedFeatureBuilder} instance. * @return {@link CommonPlacedFeatureBuilder} instance.
*/ */
public static <F extends Feature<FC>, FC extends FeatureConfiguration> BCLPlacedFeatureBuilder<F, FC> place( public static <F extends Feature<FC>, FC extends FeatureConfiguration> BCLPlacedFeatureBuilder<F, FC> place(
Context ctx,
ResourceLocation featureID, ResourceLocation featureID,
Holder<ConfiguredFeature<FC, F>> holder Holder<ConfiguredFeature<FC, F>> holder
) { ) {
return place(ctx, featureID, BCLConfigureFeature.create(holder)); return place(featureID, BCLConfigureFeature.create(holder));
} }
@ -64,43 +63,36 @@ public class BCLPlacedFeatureBuilder<F extends Feature<FC>, FC extends FeatureCo
* @return {@link CommonPlacedFeatureBuilder} instance. * @return {@link CommonPlacedFeatureBuilder} instance.
*/ */
static <F extends Feature<FC>, FC extends FeatureConfiguration> BCLPlacedFeatureBuilder<F, FC> place( static <F extends Feature<FC>, FC extends FeatureConfiguration> BCLPlacedFeatureBuilder<F, FC> place(
Context ctx,
ResourceLocation featureID, ResourceLocation featureID,
BCLConfigureFeature<F, FC> cFeature BCLConfigureFeature<F, FC> cFeature
) { ) {
return new BCLPlacedFeatureBuilder(ctx, featureID, cFeature); return new BCLPlacedFeatureBuilder(featureID, cFeature);
} }
public static <F extends Feature<FC>, FC extends FeatureConfiguration> BCLPlacedFeatureBuilder<F, FC> place(
BCLPlacedFeatureBuilder.Context ctx,
ResourceLocation configuredFeature
) {
ResourceKey<ConfiguredFeature<?, ?>> key = ResourceKey.create(
Registries.CONFIGURED_FEATURE,
configuredFeature
);
Holder<ConfiguredFeature<FC, F>> holder = (Holder<ConfiguredFeature<FC, F>>) (Object) ctx.bootstrapContext
.lookup(Registries.CONFIGURED_FEATURE)
.get(key);
var cFeature = new BCLConfigureFeature<F, FC>(configuredFeature, holder, false);
return new BCLPlacedFeatureBuilder<F, FC>(ctx, configuredFeature, cFeature);
}
/** /**
* Builds a new {@link BCLFeature} instance. * Builds a new {@link BCLFeature} instance.
* *
* @return created {@link BCLFeature} instance. * @return created {@link BCLFeature} instance.
*/ */
public Holder<PlacedFeature> build() { public BCLFeature.Unregistered<F, FC> build() {
final ResourceKey<PlacedFeature> key = ResourceKey.create(Registries.PLACED_FEATURE, featureID); final ResourceKey<PlacedFeature> key = ResourceKey.create(Registries.PLACED_FEATURE, featureID);
PlacementUtils.register( PlacedFeature pFeature = new PlacedFeature(
ctx.bootstrapContext,
key,
(Holder<ConfiguredFeature<?, ?>>) (Object) cFeature.configuredFeature, (Holder<ConfiguredFeature<?, ?>>) (Object) cFeature.configuredFeature,
modifications List.copyOf(modifications)
); );
return ctx.bootstrapContext.lookup(Registries.PLACED_FEATURE).get(key).orElseThrow(); FullReferenceHolder<PlacedFeature> holder = FullReferenceHolder.create(
Registries.PLACED_FEATURE,
featureID,
pFeature
);
return new BCLFeature.Unregistered<>(cFeature, holder, decoration);
}
public static Holder<PlacedFeature> register(
BootstapContext<PlacedFeature> bootstrapContext,
Holder<PlacedFeature> holder
) {
return bootstrapContext.register(holder.unwrapKey().orElseThrow(), holder.value());
} }
@ -110,11 +102,7 @@ public class BCLPlacedFeatureBuilder<F extends Feature<FC>, FC extends FeatureCo
* *
* @return created {@link BCLFeature} instance. * @return created {@link BCLFeature} instance.
*/ */
public BCLFeature<F, FC> buildAndRegister() { public BCLFeature<F, FC> buildAndRegister(BootstapContext<PlacedFeature> bootstapContext) {
Holder<PlacedFeature> p = build(); return build().register(bootstapContext);
return new BCLFeature(cFeature, p, decoration);
}
public record Context(BootstapContext<PlacedFeature> bootstrapContext) {
} }
} }

View file

@ -6,7 +6,6 @@ import org.betterx.bclib.api.v3.levelgen.features.placement.*;
import org.betterx.worlds.together.tag.v3.CommonBlockTags; import org.betterx.worlds.together.tag.v3.CommonBlockTags;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.core.Holder;
import net.minecraft.core.Vec3i; import net.minecraft.core.Vec3i;
import net.minecraft.data.worldgen.placement.PlacementUtils; import net.minecraft.data.worldgen.placement.PlacementUtils;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
@ -424,5 +423,5 @@ abstract class CommonPlacedFeatureBuilder<F extends Feature<FC>, FC extends Feat
* *
* @return created {@link PlacedFeature} instance. * @return created {@link PlacedFeature} instance.
*/ */
abstract Holder<PlacedFeature> build(); abstract BCLFeature.Unregistered<F, FC> build();
} }

View file

@ -4,7 +4,10 @@ import org.betterx.bclib.BCLib;
import org.betterx.bclib.api.v3.levelgen.features.BCLConfigureFeature; import org.betterx.bclib.api.v3.levelgen.features.BCLConfigureFeature;
import org.betterx.bclib.api.v3.levelgen.features.BCLFeatureBuilder; import org.betterx.bclib.api.v3.levelgen.features.BCLFeatureBuilder;
import net.minecraft.core.Holder;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BootstapContext; import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import net.minecraft.world.level.levelgen.feature.RandomPatchFeature; import net.minecraft.world.level.levelgen.feature.RandomPatchFeature;
@ -19,9 +22,16 @@ public class TestConfiguredFeatures {
.build(); .build();
public static void bootstrap(BootstapContext<ConfiguredFeature<?, ?>> bootstrapContext) { public static void bootstrap(BootstapContext<ConfiguredFeature<?, ?>> bootstrapContext) {
BCLib.LOGGER.info("Bootstrap CONFIGUREDFeatures"); Holder<ConfiguredFeature<?, ?>> holder = bootstrapContext.lookup(Registries.CONFIGURED_FEATURE)
.getOrThrow(ResourceKey.create(
Registries.CONFIGURED_FEATURE,
YELLOW_FEATURE.id
));
BCLib.LOGGER.info("Bootstrap CONFIGUREDFeatures" + holder);
if (BCLibDatagen.ADD_TESTS && BCLib.isDevEnvironment()) { if (BCLibDatagen.ADD_TESTS && BCLib.isDevEnvironment()) {
YELLOW_FEATURE = YELLOW_FEATURE.register(bootstrapContext); //YELLOW_FEATURE = YELLOW_FEATURE.register(bootstrapContext);
BCLFeatureBuilder.registerAll(bootstrapContext);
} }
} }
} }

View file

@ -2,7 +2,6 @@ package org.betterx.bclib.datagen;
import org.betterx.bclib.BCLib; import org.betterx.bclib.BCLib;
import org.betterx.bclib.api.v3.levelgen.features.BCLFeature; import org.betterx.bclib.api.v3.levelgen.features.BCLFeature;
import org.betterx.bclib.api.v3.levelgen.features.BCLPlacedFeatureBuilder;
import net.minecraft.data.worldgen.BootstapContext; import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.GenerationStep;
@ -11,19 +10,19 @@ import net.minecraft.world.level.levelgen.feature.configurations.RandomPatchConf
import net.minecraft.world.level.levelgen.placement.PlacedFeature; import net.minecraft.world.level.levelgen.placement.PlacedFeature;
public class TestPlacedFeatures { public class TestPlacedFeatures {
static BCLFeature<RandomPatchFeature, RandomPatchConfiguration> YELLOW_PLACED; static BCLFeature<RandomPatchFeature, RandomPatchConfiguration> YELLOW_PLACED = TestConfiguredFeatures
.YELLOW_FEATURE
.place()
.decoration(GenerationStep.Decoration.VEGETAL_DECORATION)
.vanillaNetherGround(8)
.isEmptyAndOnNetherGround()
.build();
public static void bootstrap(BootstapContext<PlacedFeature> bootstrapContext) { public static void bootstrap(BootstapContext<PlacedFeature> bootstrapContext) {
BCLib.LOGGER.info("Bootstrap PLACEDFeatures"); BCLib.LOGGER.info("Bootstrap PLACEDFeatures");
if (BCLibDatagen.ADD_TESTS && BCLib.isDevEnvironment()) { if (BCLibDatagen.ADD_TESTS && BCLib.isDevEnvironment()) {
final BCLPlacedFeatureBuilder.Context buildContext = new BCLPlacedFeatureBuilder.Context(bootstrapContext); YELLOW_PLACED = YELLOW_PLACED.register(bootstrapContext);
YELLOW_PLACED = TestConfiguredFeatures.YELLOW_FEATURE
.place(buildContext)
.decoration(GenerationStep.Decoration.VEGETAL_DECORATION)
.vanillaNetherGround(8)
.isEmptyAndOnNetherGround()
.buildAndRegister();
} }
} }
} }