diff --git a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationContextImpl.java b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationContextImpl.java index f7a34ecf4..6ea545040 100644 --- a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationContextImpl.java +++ b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationContextImpl.java @@ -103,6 +103,10 @@ public class BiomeModificationContextImpl implements BiomeModificationContext { spawnSettings.freeze(); } + boolean shouldRebuildFeatures() { + return generationSettings.rebuildFeatures; + } + private class WeatherContextImpl implements WeatherContext { @Override public void setPrecipitation(boolean hasPrecipitation) { @@ -194,7 +198,7 @@ public class BiomeModificationContextImpl implements BiomeModificationContext { private final Registry<PlacedFeature> features = registries.get(RegistryKeys.PLACED_FEATURE); private final GenerationSettings generationSettings = biome.getGenerationSettings(); - private boolean rebuildFlowerFeatures; + boolean rebuildFeatures; /** * Unfreeze the immutable lists found in the generation settings, and make sure they're filled up to every @@ -204,7 +208,7 @@ public class BiomeModificationContextImpl implements BiomeModificationContext { unfreezeCarvers(); unfreezeFeatures(); - rebuildFlowerFeatures = false; + rebuildFeatures = false; } private void unfreezeCarvers() { @@ -225,7 +229,7 @@ public class BiomeModificationContextImpl implements BiomeModificationContext { freezeCarvers(); freezeFeatures(); - if (rebuildFlowerFeatures) { + if (rebuildFeatures) { rebuildFlowerFeatures(); } } @@ -267,7 +271,7 @@ public class BiomeModificationContextImpl implements BiomeModificationContext { if (features.removeIf(feature -> feature.value() == placedFeature)) { featureSteps.set(stepIndex, RegistryEntryList.of(features)); - rebuildFlowerFeatures = true; + rebuildFeatures = true; return true; } @@ -288,7 +292,7 @@ public class BiomeModificationContextImpl implements BiomeModificationContext { featureSteps.set(index, plus(featureSteps.get(index), getEntry(features, entry))); // Ensure the list of flower features is up-to-date - rebuildFlowerFeatures = true; + rebuildFeatures = true; } @Override diff --git a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationImpl.java b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationImpl.java index 6e8735aef..8afc5c889 100644 --- a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationImpl.java +++ b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationImpl.java @@ -26,6 +26,7 @@ import java.util.function.Consumer; import java.util.function.Predicate; import com.google.common.base.Stopwatch; +import com.google.common.base.Suppliers; import org.jetbrains.annotations.TestOnly; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,6 +37,7 @@ import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.util.Identifier; import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.feature.util.PlacedFeatureIndexer; import net.fabricmc.fabric.api.biome.v1.BiomeModificationContext; import net.fabricmc.fabric.api.biome.v1.BiomeSelectionContext; @@ -152,6 +154,18 @@ public class BiomeModificationImpl { // Re-freeze and apply certain cleanup actions if (modificationContext != null) { modificationContext.freeze(); + + if (modificationContext.shouldRebuildFeatures()) { + impl.get(RegistryKeys.DIMENSION).stream().forEach(dimensionOptions -> { + dimensionOptions.chunkGenerator().indexedFeaturesListSupplier = Suppliers.memoize( + () -> PlacedFeatureIndexer.collectIndexedFeatures( + List.copyOf(dimensionOptions.chunkGenerator().getBiomeSource().getBiomes()), + (biomeEntry) -> (biomeEntry.value().generationSettings).getFeatures(), + true + ) + ); + }); + } } } diff --git a/fabric-biome-api-v1/src/main/resources/fabric-biome-api-v1.accesswidener b/fabric-biome-api-v1/src/main/resources/fabric-biome-api-v1.accesswidener index 6009599f0..84dfaba87 100644 --- a/fabric-biome-api-v1/src/main/resources/fabric-biome-api-v1.accesswidener +++ b/fabric-biome-api-v1/src/main/resources/fabric-biome-api-v1.accesswidener @@ -55,3 +55,7 @@ accessible field net/minecraft/world/biome/GenerationSettings flowerFeatures Lja mutable field net/minecraft/world/biome/GenerationSettings flowerFeatures Ljava/util/function/Supplier; accessible field net/minecraft/world/biome/GenerationSettings allowedFeatures Ljava/util/function/Supplier; mutable field net/minecraft/world/biome/GenerationSettings allowedFeatures Ljava/util/function/Supplier; + +# ChunkGenerator +accessible field net/minecraft/world/gen/chunk/ChunkGenerator indexedFeaturesListSupplier Ljava/util/function/Supplier; +mutable field net/minecraft/world/gen/chunk/ChunkGenerator indexedFeaturesListSupplier Ljava/util/function/Supplier;