Feature Builder for Random Feature Select

This commit is contained in:
Frank 2022-06-27 01:04:57 +02:00
parent 717f220af1
commit c1d5ca7b9b
6 changed files with 176 additions and 27 deletions

View file

@ -17,7 +17,6 @@ import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.resources.RegistryOps; import net.minecraft.resources.RegistryOps;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.BiomeTags;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.biome.BiomeSource;
import net.minecraft.world.level.biome.Climate; import net.minecraft.world.level.biome.Climate;
@ -136,11 +135,12 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource implements BiomeSourc
private static boolean isValidNetherBiome(Holder<Biome> biome, ResourceLocation location) { private static boolean isValidNetherBiome(Holder<Biome> biome, ResourceLocation location) {
//return biome.unwrapKey().get().location().toString().contains("gravel_desert"); return biome.unwrapKey().get().location().toString().contains("mushroom_forest")
|| biome.unwrapKey().get().location().toString().contains("old_fungiwoods");
return NetherBiomes.canGenerateInNether(biome.unwrapKey().get()) || // return NetherBiomes.canGenerateInNether(biome.unwrapKey().get()) ||
biome.is(BiomeTags.IS_NETHER) || // biome.is(BiomeTags.IS_NETHER) ||
BiomeAPI.wasRegisteredAsNetherBiome(location); // BiomeAPI.wasRegisteredAsNetherBiome(location);
} }
private static boolean isValidNonVanillaNetherBiome(Holder<Biome> biome, ResourceLocation location) { private static boolean isValidNonVanillaNetherBiome(Holder<Biome> biome, ResourceLocation location) {

View file

@ -28,6 +28,12 @@ import net.minecraft.world.level.levelgen.placement.PlacementModifier;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Optional; import java.util.Optional;
/**
* @param <F>
* @param <FC>
* @deprecated Please use {@link org.betterx.bclib.api.v3.levelgen.features.BCLFeature} instead
*/
@Deprecated(forRemoval = true)
public class BCLFeature<F extends Feature<FC>, FC extends FeatureConfiguration> { public class BCLFeature<F extends Feature<FC>, FC extends FeatureConfiguration> {
public static final Feature<PlaceFacingBlockConfig> PLACE_BLOCK = register( public static final Feature<PlaceFacingBlockConfig> PLACE_BLOCK = register(
BCLib.makeID("place_block"), BCLib.makeID("place_block"),

View file

@ -25,6 +25,12 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
/**
* @param <FC>
* @param <F>
* @deprecated please use {@link org.betterx.bclib.api.v3.levelgen.features.BCLFeatureBuilder} instead
*/
@Deprecated(forRemoval = true)
public class BCLFeatureBuilder<FC extends FeatureConfiguration, F extends Feature<FC>> { public class BCLFeatureBuilder<FC extends FeatureConfiguration, F extends Feature<FC>> {
private final List<PlacementModifier> modifications = new ArrayList<>(5); private final List<PlacementModifier> modifications = new ArrayList<>(5);
private final ResourceLocation featureID; private final ResourceLocation featureID;

View file

@ -1,5 +1,6 @@
package org.betterx.bclib.api.v3.levelgen.features; package org.betterx.bclib.api.v3.levelgen.features;
import org.betterx.bclib.BCLib;
import org.betterx.bclib.api.v2.levelgen.features.BCLFeature; import org.betterx.bclib.api.v2.levelgen.features.BCLFeature;
import org.betterx.bclib.api.v2.levelgen.features.config.PillarFeatureConfig; import org.betterx.bclib.api.v2.levelgen.features.config.PillarFeatureConfig;
import org.betterx.bclib.api.v2.levelgen.features.config.PlaceFacingBlockConfig; import org.betterx.bclib.api.v2.levelgen.features.config.PlaceFacingBlockConfig;
@ -13,6 +14,7 @@ import org.betterx.bclib.api.v2.levelgen.structures.StructurePlacementType;
import org.betterx.bclib.api.v2.levelgen.structures.StructureWorldNBT; import org.betterx.bclib.api.v2.levelgen.structures.StructureWorldNBT;
import org.betterx.bclib.api.v2.poi.BCLPoiType; import org.betterx.bclib.api.v2.poi.BCLPoiType;
import org.betterx.bclib.blocks.BlockProperties; import org.betterx.bclib.blocks.BlockProperties;
import org.betterx.bclib.util.Triple;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
@ -109,6 +111,26 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
); );
} }
public static AsRandomSelect startRandomSelect(
ResourceLocation featureID
) {
return new AsRandomSelect(
featureID,
(RandomSelectorFeature) Feature.RANDOM_SELECTOR
);
}
public static AsMultiPlaceRandomSelect startRandomSelect(
ResourceLocation featureID,
BiFunction<BCLInlinePlacedBuilder<SimpleBlockFeature, SimpleBlockConfiguration>, Integer, Holder<PlacedFeature>> placementModFunction
) {
return new AsMultiPlaceRandomSelect(
featureID,
(RandomSelectorFeature) Feature.RANDOM_SELECTOR,
placementModFunction
);
}
public static NetherForrestVegetation startNetherVegetation( public static NetherForrestVegetation startNetherVegetation(
ResourceLocation featureID ResourceLocation featureID
) { ) {
@ -781,6 +803,142 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
return new SimpleBlockConfiguration(new WeightedStateProvider(stateBuilder.build())); return new SimpleBlockConfiguration(new WeightedStateProvider(stateBuilder.build()));
} }
} }
public static class AsRandomSelect extends BCLFeatureBuilder<RandomSelectorFeature, RandomFeatureConfiguration> {
private List<WeightedPlacedFeature> features = new LinkedList<>();
private Holder<PlacedFeature> defaultFeature;
private AsRandomSelect(ResourceLocation featureID, RandomSelectorFeature feature) {
super(featureID, feature);
}
public AsRandomSelect add(Holder<PlacedFeature> feature, float weight) {
features.add(new WeightedPlacedFeature(feature, weight));
return this;
}
public AsRandomSelect defaultFeature(Holder<PlacedFeature> feature) {
defaultFeature = feature;
return this;
}
@Override
public RandomFeatureConfiguration createConfiguration() {
return new RandomFeatureConfiguration(features, defaultFeature);
}
}
public static class AsMultiPlaceRandomSelect extends BCLFeatureBuilder<RandomSelectorFeature, RandomFeatureConfiguration> {
private List<Triple<BlockStateProvider, Float, Integer>> features = new LinkedList<>();
private final BiFunction<BCLInlinePlacedBuilder<SimpleBlockFeature, SimpleBlockConfiguration>, Integer, Holder<PlacedFeature>> modFunction;
private AsMultiPlaceRandomSelect(
ResourceLocation featureID,
RandomSelectorFeature feature,
BiFunction<BCLInlinePlacedBuilder<SimpleBlockFeature, SimpleBlockConfiguration>, Integer, Holder<PlacedFeature>> mod
) {
super(featureID, feature);
this.modFunction = mod;
}
private static int featureCounter = 0;
private static int lastID = 0;
public AsMultiPlaceRandomSelect addAllStates(Block block, int weight) {
return addAllStates(block, weight, lastID + 1);
}
public AsMultiPlaceRandomSelect addAll(int weight, Block... blocks) {
return addAll(weight, lastID + 1, blocks);
}
public AsMultiPlaceRandomSelect addAllStatesFor(IntegerProperty prop, Block block, int weight) {
return addAllStatesFor(prop, block, weight, lastID + 1);
}
public AsMultiPlaceRandomSelect add(Block block, float weight) {
return add(BlockStateProvider.simple(block), weight);
}
public AsMultiPlaceRandomSelect add(BlockState state, float weight) {
return add(BlockStateProvider.simple(state), weight);
}
public AsMultiPlaceRandomSelect add(BlockStateProvider provider, float weight) {
return add(provider, weight, lastID + 1);
}
public AsMultiPlaceRandomSelect addAllStates(Block block, int weight, int id) {
Set<BlockState> states = BCLPoiType.getBlockStates(block);
SimpleWeightedRandomList.Builder<BlockState> builder = SimpleWeightedRandomList.builder();
states.forEach(s -> builder.add(block.defaultBlockState(), 1));
this.add(new WeightedStateProvider(builder.build()), weight, id);
return this;
}
public AsMultiPlaceRandomSelect addAll(int weight, int id, Block... blocks) {
SimpleWeightedRandomList.Builder<BlockState> builder = SimpleWeightedRandomList.builder();
for (Block block : blocks) {
builder.add(block.defaultBlockState(), 1);
}
this.add(new WeightedStateProvider(builder.build()), weight, id);
return this;
}
public AsMultiPlaceRandomSelect addAllStatesFor(IntegerProperty prop, Block block, int weight, int id) {
Collection<Integer> values = prop.getPossibleValues();
SimpleWeightedRandomList.Builder<BlockState> builder = SimpleWeightedRandomList.builder();
values.forEach(s -> builder.add(block.defaultBlockState().setValue(prop, s), 1));
this.add(new WeightedStateProvider(builder.build()), weight, id);
return this;
}
public AsMultiPlaceRandomSelect add(Block block, float weight, int id) {
return add(BlockStateProvider.simple(block), weight, id);
}
public AsMultiPlaceRandomSelect add(BlockState state, float weight, int id) {
return add(BlockStateProvider.simple(state), weight, id);
}
public AsMultiPlaceRandomSelect add(BlockStateProvider provider, float weight, int id) {
features.add(new Triple<>(provider, weight, id));
lastID = Math.max(lastID, id);
return this;
}
private Holder<PlacedFeature> place(BlockStateProvider p, int id) {
var builder = BCLFeatureBuilder
.start(BCLib.makeID("temp_select_feature" + (featureCounter++)), p)
.inlinePlace();
return modFunction.apply(builder, id);
}
@Override
public RandomFeatureConfiguration createConfiguration() {
if (modFunction == null) {
throw new IllegalStateException("AsMultiPlaceRandomSelect needs a placement.modification Function");
}
float sum = this.features.stream().map(p -> p.second).reduce(0.0f, (p, v) -> p + v);
List<WeightedPlacedFeature> features = this.features.stream()
.map(p -> new WeightedPlacedFeature(
this.place(p.first, p.third),
p.second / sum
))
.toList();
return new RandomFeatureConfiguration(
features.subList(0, features.size() - 1),
features.get(features.size() - 1).feature
);
}
}
} }

View file

@ -47,6 +47,7 @@ public class BCLInlinePlacedBuilder<F extends Feature<FC>, FC extends FeatureCon
* *
* @return created {@link PlacedFeature} instance. * @return created {@link PlacedFeature} instance.
*/ */
@Override
public Holder<PlacedFeature> build() { public Holder<PlacedFeature> build() {
return build(cFeature); return build(cFeature);
} }

View file

@ -11,12 +11,9 @@ import net.minecraft.data.worldgen.placement.PlacementUtils;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.valueproviders.IntProvider; import net.minecraft.util.valueproviders.IntProvider;
import net.minecraft.util.valueproviders.UniformInt; import net.minecraft.util.valueproviders.UniformInt;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.blockpredicates.BlockPredicate; import net.minecraft.world.level.levelgen.blockpredicates.BlockPredicate;
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;
import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider;
import net.minecraft.world.level.levelgen.placement.*; import net.minecraft.world.level.levelgen.placement.*;
import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.Material;
@ -443,23 +440,4 @@ abstract class CommonPlacedFeatureBuilder<F extends Feature<FC>, FC extends Feat
public BCLFeatureBuilder.RandomPatch inRandomPatch(ResourceLocation id) { public BCLFeatureBuilder.RandomPatch inRandomPatch(ResourceLocation id) {
return BCLFeatureBuilder.startRandomPatch(id, build()); return BCLFeatureBuilder.startRandomPatch(id, build());
} }
public BCLFeatureBuilder.AsSequence then(ResourceLocation id) {
return BCLFeatureBuilder.startSequence(id).add(build());
}
public BCLFeatureBuilder.ForSimpleBlock putBlock(ResourceLocation id, Block block) {
return BCLFeatureBuilder.start(id, block);
}
public BCLFeatureBuilder.ForSimpleBlock putBlock(ResourceLocation id, BlockState state) {
return BCLFeatureBuilder.start(id, state);
}
public BCLFeatureBuilder.ForSimpleBlock putBlock(
ResourceLocation id,
BlockStateProvider provider
) {
return BCLFeatureBuilder.start(id, provider);
}
} }