From 39fe678d39a252252749bb977db6bce316920b01 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 3 Dec 2021 13:44:58 +0300 Subject: [PATCH 1/4] Biome feature adding --- .../java/ru/bclib/api/biomes/BiomeAPI.java | 32 ++++++++++++++++--- .../BiomeGenerationSettingsAccessor.java | 25 +++++++++++++++ 2 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 src/main/java/ru/bclib/mixin/common/BiomeGenerationSettingsAccessor.java diff --git a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java index 934ced83..cad8cfb0 100644 --- a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java @@ -5,6 +5,7 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.biome.v1.BiomeModificationContext.GenerationSettingsContext; import net.fabricmc.fabric.api.biome.v1.BiomeModifications; import net.fabricmc.fabric.impl.biome.NetherBiomeData; import net.fabricmc.fabric.impl.biome.TheEndBiomeData; @@ -30,6 +31,7 @@ import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.placement.PlacedFeature; import org.jetbrains.annotations.Nullable; import ru.bclib.config.Configs; +import ru.bclib.mixin.common.BiomeGenerationSettingsAccessor; import ru.bclib.util.MHelper; import ru.bclib.world.biomes.BCLBiome; import ru.bclib.world.biomes.FabricBiomesData; @@ -37,12 +39,14 @@ import ru.bclib.world.features.BCLFeature; import ru.bclib.world.generator.BiomePicker; import ru.bclib.world.structures.BCLStructureFeature; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; import java.util.function.BiConsumer; +import java.util.function.Supplier; import java.util.stream.Collectors; public class BiomeAPI { @@ -401,7 +405,7 @@ public class BiomeAPI { Set biomes = source.possibleBiomes(); biomes.forEach(biome -> { - ResourceLocation biomeID = getBiomeID(biome); + ResourceLocation biomeID = getBiomeID(biome); boolean modify = isDatapackBiome(biomeID); if (biome != BuiltinRegistries.BIOME.get(biomeID)) { modify = true; @@ -445,7 +449,10 @@ public class BiomeAPI { * @param step a {@link Decoration} step for the feature. */ public static void addBiomeFeature(Biome biome, PlacedFeature feature, Decoration step) { - addBiomeFeature(getBiomeID(biome), feature, step); + BiomeGenerationSettingsAccessor accessor = (BiomeGenerationSettingsAccessor) biome.getGenerationSettings(); + List>> allFeatures = getMutable(accessor.bclib_getFeatures()); + List> features = getFeaturesList(allFeatures, step); + features.add(() -> feature); } /** @@ -455,9 +462,7 @@ public class BiomeAPI { * @param step a {@link Decoration} step for the feature. */ private static void addBiomeFeature(ResourceLocation biomeID, PlacedFeature feature, Decoration step) { - BuiltinRegistries.PLACED_FEATURE - .getResourceKey(feature) - .ifPresent(key -> BiomeModifications.addFeature(ctx -> ctx.getBiomeKey().location().equals(biomeID), step, key)); + addBiomeFeature(BuiltinRegistries.BIOME.get(biomeID), feature, step); } /** @@ -553,4 +558,21 @@ public class BiomeAPI { fog = Configs.BIOMES_CONFIG.getFloat(group, "fog_density", fog); biome.setGenChance(chance).setFogDensity(fog); } + + private static List getMutable(List list) { + if (list instanceof ArrayList) { + return list; + } + return new ArrayList<>(list); + } + + private static List> getFeaturesList(List>> features, Decoration step) { + int index = step.ordinal(); + while (features.size() <= index) { + features.add(Lists.newArrayList()); + } + List> mutable = getMutable(features.get(index)); + features.set(index, mutable); + return mutable; + } } diff --git a/src/main/java/ru/bclib/mixin/common/BiomeGenerationSettingsAccessor.java b/src/main/java/ru/bclib/mixin/common/BiomeGenerationSettingsAccessor.java new file mode 100644 index 00000000..ac100c07 --- /dev/null +++ b/src/main/java/ru/bclib/mixin/common/BiomeGenerationSettingsAccessor.java @@ -0,0 +1,25 @@ +package ru.bclib.mixin.common; + +import net.minecraft.world.level.biome.BiomeGenerationSettings; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; +import java.util.Set; +import java.util.function.Supplier; + +@Mixin(BiomeGenerationSettings.class) +public interface BiomeGenerationSettingsAccessor { + @Accessor("features") + List>> bclib_getFeatures(); + + @Accessor("features") + void bclib_setFeatures(List>> features); + + @Accessor("featureSet") + Set bclib_getFeatureSet(); + + @Accessor("featureSet") + void bclib_setFeatureSet(Set features); +} From eaba9bf698b35312fa32091529de2b65a8763794 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 3 Dec 2021 13:49:42 +0300 Subject: [PATCH 2/4] Collections util --- .../java/ru/bclib/util/CollectionsUtil.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/main/java/ru/bclib/util/CollectionsUtil.java diff --git a/src/main/java/ru/bclib/util/CollectionsUtil.java b/src/main/java/ru/bclib/util/CollectionsUtil.java new file mode 100644 index 00000000..609d392a --- /dev/null +++ b/src/main/java/ru/bclib/util/CollectionsUtil.java @@ -0,0 +1,46 @@ +package ru.bclib.util; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class CollectionsUtil { + /** + * Will return mutable copy of list. + * @param list {@link List} to make mutable. + * @return {@link ArrayList} or original {@link List} if it is mutable. + */ + public static List getMutable(List list) { + if (list instanceof ArrayList) { + return list; + } + return new ArrayList<>(list); + } + + /** + * Will return mutable copy of set. + * @param set {@link Set} to make mutable. + * @return {@link HashSet} or original {@link Set} if it is mutable. + */ + public static Set getMutable(Set set) { + if (set instanceof HashSet) { + return set; + } + return new HashSet<>(set); + } + + /** + * Will return mutable copy of map. + * @param map {@link Map} to make mutable. + * @return {@link HashMap} or original {@link Map} if it is mutable. + */ + public static Map getMutable(Map map) { + if (map instanceof HashMap) { + return map; + } + return new HashMap<>(map); + } +} From 8234a1c9dc5abc3eff543c5d2e75b8536eb9f69c Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 3 Dec 2021 13:51:36 +0300 Subject: [PATCH 3/4] Biome feature modification fixes --- src/main/java/ru/bclib/api/biomes/BiomeAPI.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java index cad8cfb0..ed557e64 100644 --- a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java @@ -32,6 +32,7 @@ import net.minecraft.world.level.levelgen.placement.PlacedFeature; import org.jetbrains.annotations.Nullable; import ru.bclib.config.Configs; import ru.bclib.mixin.common.BiomeGenerationSettingsAccessor; +import ru.bclib.util.CollectionsUtil; import ru.bclib.util.MHelper; import ru.bclib.world.biomes.BCLBiome; import ru.bclib.world.biomes.FabricBiomesData; @@ -450,9 +451,13 @@ public class BiomeAPI { */ public static void addBiomeFeature(Biome biome, PlacedFeature feature, Decoration step) { BiomeGenerationSettingsAccessor accessor = (BiomeGenerationSettingsAccessor) biome.getGenerationSettings(); - List>> allFeatures = getMutable(accessor.bclib_getFeatures()); + List>> allFeatures = CollectionsUtil.getMutable(accessor.bclib_getFeatures()); + Set set = CollectionsUtil.getMutable(accessor.bclib_getFeatureSet()); List> features = getFeaturesList(allFeatures, step); features.add(() -> feature); + set.add(feature); + accessor.bclib_setFeatures(allFeatures); + accessor.bclib_setFeatureSet(set); } /** @@ -559,19 +564,12 @@ public class BiomeAPI { biome.setGenChance(chance).setFogDensity(fog); } - private static List getMutable(List list) { - if (list instanceof ArrayList) { - return list; - } - return new ArrayList<>(list); - } - private static List> getFeaturesList(List>> features, Decoration step) { int index = step.ordinal(); while (features.size() <= index) { features.add(Lists.newArrayList()); } - List> mutable = getMutable(features.get(index)); + List> mutable = CollectionsUtil.getMutable(features.get(index)); features.set(index, mutable); return mutable; } From db07cd18878da17d78ddf4a8b67c44808f3dfba0 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 3 Dec 2021 13:54:07 +0300 Subject: [PATCH 4/4] BCL Biome feature adding optimisation --- src/main/java/ru/bclib/api/biomes/BiomeAPI.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java index ed557e64..50a30723 100644 --- a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java @@ -476,9 +476,16 @@ public class BiomeAPI { * @param features array of {@link BCLFeature} to add. */ public static void addBiomeFeatures(Biome biome, BCLFeature... features) { + BiomeGenerationSettingsAccessor accessor = (BiomeGenerationSettingsAccessor) biome.getGenerationSettings(); + List>> allFeatures = CollectionsUtil.getMutable(accessor.bclib_getFeatures()); + Set set = CollectionsUtil.getMutable(accessor.bclib_getFeatureSet()); for (BCLFeature feature: features) { - addBiomeFeature(biome, feature.getPlacedFeature(), feature.getDecoration()); + List> featureList = getFeaturesList(allFeatures, feature.getDecoration()); + featureList.add(() -> feature.getPlacedFeature()); + set.add(feature.getPlacedFeature()); } + accessor.bclib_setFeatures(allFeatures); + accessor.bclib_setFeatureSet(set); } /**