Fixed compiler errors

This commit is contained in:
Frank 2022-03-17 17:05:59 +01:00
parent 6c015a9a53
commit 824e78abf7
10 changed files with 165 additions and 112 deletions

View file

@ -1,16 +1,17 @@
package ru.bclib.api.biomes;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import net.fabricmc.fabric.api.biome.v1.BiomeModifications;
import net.minecraft.core.Holder;
import net.minecraft.core.HolderSet;
import net.minecraft.core.Registry;
import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.data.BuiltinRegistries;
import net.minecraft.data.worldgen.BiomeDefaultFeatures;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.Music;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.tags.TagKey;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.Mob;
@ -44,13 +45,9 @@ import ru.bclib.world.biomes.BCLBiomeSettings;
import ru.bclib.world.features.BCLFeature;
import ru.bclib.world.structures.BCLStructureFeature;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Supplier;
import java.util.stream.Collectors;
public class BCLBiomeBuilder {
@ -61,7 +58,7 @@ public class BCLBiomeBuilder {
private static final BCLBiomeBuilder INSTANCE = new BCLBiomeBuilder();
private static final SurfaceRules.ConditionSource SURFACE_NOISE = SurfaceRules.noiseCondition(Noises.SOUL_SAND_LAYER, -0.012);
private List<ConfiguredStructureFeature> structures = new ArrayList<>(16);
private List<TagKey<Biome>> structureTags = new ArrayList<>(8);
private BiomeGenerationSettings.Builder generationSettings;
private BiomeSpecialEffects.Builder effectsBuilder;
private MobSpawnSettings.Builder spawnSettings;
@ -91,7 +88,7 @@ public class BCLBiomeBuilder {
INSTANCE.generationSettings = null;
INSTANCE.effectsBuilder = null;
INSTANCE.spawnSettings = null;
INSTANCE.structures.clear();
INSTANCE.structureTags.clear();
INSTANCE.temperature = 1.0F;
INSTANCE.fogDensity = 1.0F;
INSTANCE.edgeSize = 0;
@ -546,11 +543,11 @@ public class BCLBiomeBuilder {
/**
* Adds new structure feature into the biome.
* @param structure {@link ConfiguredStructureFeature} to add.
* @param structureTag {@link TagKey} to add.
* @return same {@link BCLBiomeBuilder} instance.
*/
public BCLBiomeBuilder structure(Holder<ConfiguredStructureFeature<?, ?>> structure) {
structures.add(structure.value());
public BCLBiomeBuilder structure(TagKey<Biome> structureTag) {
structureTags.add(structureTag);
return this;
}
@ -561,7 +558,7 @@ public class BCLBiomeBuilder {
*/
public BCLBiomeBuilder structure(BCLStructureFeature structure) {
structure.addInternalBiome(biomeID);
return structure(structure.getFeatureConfigured());
return structure(structure.biomeTag);
}
/**
@ -659,7 +656,7 @@ public class BCLBiomeBuilder {
public <T extends BCLBiome> T build(BiFunction<ResourceLocation, Biome, T> biomeConstructor) {
return build((id, biome, settings)->biomeConstructor.apply(id, biome));
}
/**
* Finalize biome creation.
* @param biomeConstructor {@link BiomeSupplier} biome constructor.
@ -674,24 +671,23 @@ public class BCLBiomeBuilder {
builder.mobSpawnSettings(getSpawns().build());
builder.specialEffects(getEffects().build());
Map<Decoration, HolderSet<PlacedFeature>> defferedFeatures = new HashMap<>();
Map<Decoration, List<Holder<PlacedFeature>>> defferedFeatures = Maps.newHashMap();
BiomeGenerationSettingsAccessor acc = BiomeGenerationSettingsAccessor.class.cast(getGeneration().build());
if (acc != null) {
builder.generationSettings(new BiomeGenerationSettings.Builder().build());
var decorations = acc.bclib_getFeatures();
List<HolderSet<PlacedFeature>> decorations = acc.bclib_getFeatures();
for (Decoration d : Decoration.values()) {
int i = d.ordinal();
if (i >= 0 && i < decorations.size()) {
var features = decorations.get(i);
if (i>=0 && i<decorations.size()) {
HolderSet<PlacedFeature> features = decorations.get(i);
defferedFeatures.put(d, features.stream().collect(Collectors.toList()));
} else {
defferedFeatures.put(d, Lists.newArrayList());
}
else {
defferedFeatures.put(d, new ArrayList<>(0));
}
}
}
else {
} else {
builder.generationSettings(getGeneration().build());
}
@ -706,7 +702,7 @@ public class BCLBiomeBuilder {
final Biome biome = builder.build();
final T res = biomeConstructor.apply(biomeID, biome, settings);
res.attachStructures(structures);
res.attachStructures(structureTags);
res.setSurface(surfaceRule);
res.setFeatures(defferedFeatures);
return res;

View file

@ -1,5 +1,7 @@
package ru.bclib.api.biomes;
import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
@ -39,6 +41,7 @@ import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource;
import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature;
import net.minecraft.world.level.levelgen.feature.Feature;
import net.minecraft.world.level.levelgen.placement.PlacedFeature;
import net.minecraft.world.level.levelgen.structure.StructureSet;
import org.apache.commons.lang3.mutable.MutableInt;
@ -77,7 +80,7 @@ public class BiomeAPI {
private static final Map<Biome, BCLBiome> CLIENT = Maps.newHashMap();
private static Registry<Biome> biomeRegistry;
private static final Map<PlacedFeature, Integer> FEATURE_ORDER = Maps.newHashMap();
private static final Map<Holder<PlacedFeature>, Integer> FEATURE_ORDER = Maps.newHashMap();
private static final MutableInt FEATURE_ORDER_ID = new MutableInt(0);
private static final Map<ResourceKey, List<BiConsumer<ResourceLocation, Holder<Biome>>>> MODIFICATIONS = Maps.newHashMap();
@ -113,8 +116,7 @@ public class BiomeAPI {
.map(Entry::getValue)
.map(biome -> (BiomeGenerationSettingsAccessor) biome.getGenerationSettings())
.map(BiomeGenerationSettingsAccessor::bclib_getFeatures)
.forEach(stepFeatureSuppliers -> stepFeatureSuppliers.forEach(step -> step.forEach(featureSupplier -> {
PlacedFeature feature = featureSupplier.value();
.forEach(stepFeatureSuppliers -> stepFeatureSuppliers.forEach(step -> step.forEach(feature -> {
FEATURE_ORDER.computeIfAbsent(feature, f -> FEATURE_ORDER_ID.getAndIncrement());
})));
}
@ -427,7 +429,7 @@ public class BiomeAPI {
FabricBiomesData.END_VOID_BIOMES.forEach((key, weight) -> {
if (!hasBiome(key.location())) {
registerEndVoidBiome(BuiltinRegistries.BIOME.get(key), weight);
registerEndVoidBiome(BuiltinRegistries.BIOME.getOrCreateHolder(key), weight);
}
});
}
@ -581,12 +583,12 @@ public class BiomeAPI {
public static void sortBiomeFeatures(Holder<Biome> biome) {
BiomeGenerationSettings settings = biome.value().getGenerationSettings();
BiomeGenerationSettingsAccessor accessor = (BiomeGenerationSettingsAccessor) settings;
List<List<Supplier<PlacedFeature>>> featureList = CollectionsUtil.getMutable(accessor.bclib_getFeatures());
List<HolderSet<PlacedFeature>> featureList = CollectionsUtil.getMutable(accessor.bclib_getFeatures());
final int size = featureList.size();
for (int i = 0; i < size; i++) {
List<Supplier<PlacedFeature>> features = CollectionsUtil.getMutable(featureList.get(i));
List<Holder<PlacedFeature>> features = getFeaturesListCopy(featureList, i);
sortFeatures(features);
featureList.set(i, features);
featureList.set(i, HolderSet.direct(features));
}
accessor.bclib_setFeatures(featureList);
}
@ -652,20 +654,24 @@ public class BiomeAPI {
* Adds new features to existing biome.
* @param biome {@link Biome} to add features in.
* @param step a {@link Decoration} step for the feature.
* @param featureList List of {@link ConfiguredFeature} to add.
* @param additionalFeatures List of {@link ConfiguredFeature} to add.
*/
private static void addBiomeFeature(Holder<Biome> biome, Decoration step, List<Holder<PlacedFeature>> featureList) {
private static void addBiomeFeature(Holder<Biome> biome, Decoration step, List<Holder<PlacedFeature>> additionalFeatures) {
BiomeGenerationSettingsAccessor accessor = (BiomeGenerationSettingsAccessor) biome.value().getGenerationSettings();
List<HolderSet<PlacedFeature>> allFeatures = CollectionsUtil.getMutable(accessor.bclib_getFeatures());
Set<PlacedFeature> set = CollectionsUtil.getMutable(accessor.bclib_getFeatureSet().get());
HolderSet<PlacedFeature> features = getFeaturesList(allFeatures, step);
for (var feature : featureList) {
features.
features.add(() -> feature);
set.add(feature);
List<Holder<PlacedFeature>> features = getFeaturesListCopy(allFeatures, step);
for (var feature : additionalFeatures) {
if (!features.contains(feature))
features.add(feature);
}
allFeatures.set(step.ordinal(), HolderSet.direct(features));
final Supplier<List<ConfiguredFeature<?, ?>>> flowerFeatures = Suppliers.memoize(() -> allFeatures.stream().flatMap(HolderSet::stream).map(Holder::value).flatMap(PlacedFeature::getFeatures).filter(configuredFeature -> configuredFeature.feature() == Feature.FLOWER).collect(ImmutableList.toImmutableList()));
final Supplier<Set<PlacedFeature>> featureSet = Suppliers.memoize(() -> allFeatures.stream().flatMap(HolderSet::stream).map(Holder::value).collect(Collectors.toSet()));
accessor.bclib_setFeatures(allFeatures);
accessor.bclib_setFeatureSet(()-> set);
accessor.bclib_setFeatureSet(featureSet);
}
/**
@ -676,22 +682,10 @@ public class BiomeAPI {
* @param biome {@link Biome} to add features in.
* @param featureMap Map of {@link ConfiguredFeature} to add.
*/
private static void addStepFeaturesToBiome(Holder<Biome> biome, Map<Decoration, List<Supplier<PlacedFeature>>> featureMap) {
BiomeGenerationSettingsAccessor accessor = (BiomeGenerationSettingsAccessor) biome.value().getGenerationSettings();
List<List<Supplier<PlacedFeature>>> allFeatures = CollectionsUtil.getMutable(accessor.bclib_getFeatures());
Set<PlacedFeature> set = CollectionsUtil.getMutable(accessor.bclib_getFeatureSet().get());
private static void addStepFeaturesToBiome(Holder<Biome> biome, Map<Decoration, List<Holder<PlacedFeature>>> featureMap) {
for (Decoration step: featureMap.keySet()) {
List<Supplier<PlacedFeature>> features = getFeaturesList(allFeatures, step);
List<Supplier<PlacedFeature>> featureList = featureMap.get(step);
for (Supplier<PlacedFeature> feature : featureList) {
features.add(feature);
set.add(feature.get());
}
addBiomeFeature(biome, step, featureMap.get(step));
}
accessor.bclib_setFeatures(allFeatures);
accessor.bclib_setFeatureSet(() -> set);
}
/**
@ -700,13 +694,20 @@ public class BiomeAPI {
* @param carver {@link ConfiguredWorldCarver} to add.
* @param stage {@link Carving} stage.
*/
public static void addBiomeCarver(Biome biome, ConfiguredWorldCarver carver, Carving stage) {
public static void addBiomeCarver(Biome biome, Holder<ConfiguredWorldCarver<?>> carver, Carving stage) {
BiomeGenerationSettingsAccessor accessor = (BiomeGenerationSettingsAccessor) biome.getGenerationSettings();
Map<Carving, HolderSet<ConfiguredWorldCarver<?>>> carvers = CollectionsUtil.getMutable(accessor.bclib_getCarvers());
HolderSet<ConfiguredWorldCarver<?>> carverList = CollectionsUtil.getMutable(carvers.getOrDefault(stage, new ArrayList<>()));
carvers.put(stage, carverList);
carverList.add(() -> carver);
accessor.bclib_setCarvers(carvers);
Map<Carving, HolderSet<ConfiguredWorldCarver<?>>> carverMap = CollectionsUtil.getMutable(accessor.bclib_getCarvers());
HolderSet<ConfiguredWorldCarver<?>> carvers = carverMap.get(stage);
List<Holder<ConfiguredWorldCarver<?>>> carverList;
if (carvers==null) {
carverList = Lists.newArrayList();
} else {
carverList = carvers.stream().toList();
}
carverList.add(carver);
carverMap.put(stage, HolderSet.direct(carverList));
accessor.bclib_setCarvers(carverMap);
}
/**
@ -866,25 +867,24 @@ public class BiomeAPI {
}
}
private static void sortFeatures(List<Supplier<PlacedFeature>> features) {
private static void sortFeatures(List<Holder<PlacedFeature>> features) {
initFeatureOrder();
Set<PlacedFeature> featuresWithoutDuplicates = Sets.newHashSet();
features.forEach(provider -> featuresWithoutDuplicates.add(provider.get()));
Set<Holder<PlacedFeature>> featuresWithoutDuplicates = Sets.newHashSet();
features.forEach(holder -> featuresWithoutDuplicates.add(holder));
if (featuresWithoutDuplicates.size() != features.size()) {
features.clear();
featuresWithoutDuplicates.forEach(feature -> features.add(() -> feature));
featuresWithoutDuplicates.forEach(feature -> features.add(feature));
}
features.forEach(provider -> {
PlacedFeature feature = provider.get();
features.forEach(feature -> {
FEATURE_ORDER.computeIfAbsent(feature, f -> FEATURE_ORDER_ID.getAndIncrement());
});
features.sort((f1, f2) -> {
int v1 = FEATURE_ORDER.getOrDefault(f1.get(), 70000);
int v2 = FEATURE_ORDER.getOrDefault(f2.get(), 70000);
int v1 = FEATURE_ORDER.getOrDefault(f1, 70000);
int v2 = FEATURE_ORDER.getOrDefault(f2, 70000);
return Integer.compare(v1, v2);
});
}
@ -906,14 +906,15 @@ public class BiomeAPI {
lists.set(index, list);
return list;
}
private static List<Holder<PlacedFeature>> getFeaturesListCopy(List<HolderSet<PlacedFeature>> features, Decoration step) {
return getFeaturesListCopy(features, step.ordinal());
}
private static HolderSet<PlacedFeature> getFeaturesList(List<HolderSet<PlacedFeature>> features, Decoration step) {
int index = step.ordinal();
private static List<Holder<PlacedFeature>> getFeaturesListCopy(List<HolderSet<PlacedFeature>> features, int index) {
while (features.size() <= index) {
features.add(HolderSet.direct(Lists.newArrayList()));
}
HolderSet<PlacedFeature> mutable = features.get(index);
features.set(index, mutable);
return mutable;
return features.get(index).stream().collect(Collectors.toList());
}
}

View file

@ -4,6 +4,7 @@ import net.minecraft.data.worldgen.placement.PlacementUtils;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.valueproviders.UniformInt;
import net.minecraft.world.level.levelgen.GenerationStep.Decoration;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import net.minecraft.world.level.levelgen.feature.Feature;
import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration;
import net.minecraft.world.level.levelgen.placement.BiomeFilter;
@ -18,12 +19,12 @@ import ru.bclib.world.features.BCLFeature;
import java.util.ArrayList;
import java.util.List;
public class BCLFeatureBuilder {
public class BCLFeatureBuilder <FC extends FeatureConfiguration, F extends Feature<FC>>{
private static final BCLFeatureBuilder INSTANCE = new BCLFeatureBuilder();
private List<PlacementModifier> modifications = new ArrayList<>(16);
private ResourceLocation featureID;
private Decoration decoration;
private Feature<?> feature;
private F feature;
private BCLFeatureBuilder() {}
@ -134,10 +135,9 @@ public class BCLFeatureBuilder {
* @param configuration any {@link FeatureConfiguration} for provided {@link Feature}.
* @return created {@link BCLFeature} instance.
*/
public <FC extends FeatureConfiguration> BCLFeature build(FC configuration) {
public BCLFeature build(FC configuration) {
PlacementModifier [] modifiers = modifications.toArray(new PlacementModifier [modifications.size()]);
PlacedFeature configured = ((Feature<FC>) feature).configured(configuration).placed(modifiers);
return new BCLFeature(featureID, feature, decoration, configured);
return new BCLFeature(featureID, feature, decoration, configuration, modifiers);
}
/**
@ -146,6 +146,6 @@ public class BCLFeatureBuilder {
* @return created {@link BCLFeature} instance.
*/
public BCLFeature build() {
return build(FeatureConfiguration.NONE);
return build((FC)FeatureConfiguration.NONE);
}
}

View file

@ -62,6 +62,16 @@ public class TagAPI {
public static TagKey<Block> makeBlockTag(String modID, String name) {
return makeTag(Registry.BLOCK, new TagLocation<>(modID, name));
}
/**
* Get or create {@link Block} {@link TagKey} with mod namespace.
*
* @param id - {@link String} id for the tag;
* @return {@link Block} {@link TagKey}.
*/
public static TagKey<Block> makeBlockTag(ResourceLocation id) {
return makeTag(Registry.BLOCK, new TagLocation<>(id));
}
/**
* Get or create {@link Item} {@link TagKey} with mod namespace.
@ -73,6 +83,16 @@ public class TagAPI {
public static TagKey<Item> makeItemTag(String modID, String name) {
return makeTag(Registry.ITEM, new TagLocation<>(modID, name));
}
/**
* Get or create {@link Item} {@link TagKey} with mod namespace.
*
* @param id - {@link String} id for the tag;
* @return {@link Item} {@link TagKey}.
*/
public static TagKey<Item> makeItemTag(ResourceLocation id) {
return makeTag(Registry.ITEM, new TagLocation<>(id));
}
/**
* Get or create {@link Block} {@link TagKey}.
@ -208,6 +228,7 @@ public class TagAPI {
* @return The {@code tagsMap} Parameter.
*/
public static <T> Map<ResourceLocation, Tag.Builder> apply(String directory, Map<ResourceLocation, Tag.Builder> tagsMap) {
System.out.println("TAG DIRECTORY: " + directory);
final BiConsumer<ResourceLocation, Set<ResourceLocation>> consumer;
consumer = (id, ids) -> apply(tagsMap.computeIfAbsent(id, key -> Tag.Builder.tag()), ids);
if ("tags/blocks".equals(directory)) {