mirror of
https://github.com/architectury/architectury-api.git
synced 2026-03-30 05:05:19 -05:00
Merge pull request #104 from architectury/feature/biome-modifications-phases
Implement phases for BiomeModifications on Forge
This commit is contained in:
@@ -390,6 +390,11 @@ public final class BiomeHooks {
|
||||
return settings.getCarvers(carving);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Supplier<ConfiguredFeature<?, ?>>> getFeatures(GenerationStep.Decoration decoration) {
|
||||
return settings.features().get(decoration.ordinal());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<List<Supplier<ConfiguredFeature<?, ?>>>> getFeatures() {
|
||||
return settings.features();
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
package me.shedaniel.architectury.hooks.biome;
|
||||
|
||||
import net.minecraft.world.entity.animal.Panda;
|
||||
import net.minecraft.world.level.levelgen.GenerationStep;
|
||||
import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver;
|
||||
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
|
||||
@@ -34,6 +35,8 @@ public interface GenerationProperties {
|
||||
|
||||
List<Supplier<ConfiguredWorldCarver<?>>> getCarvers(GenerationStep.Carving carving);
|
||||
|
||||
List<Supplier<ConfiguredFeature<?, ?>>> getFeatures(GenerationStep.Decoration decoration);
|
||||
|
||||
List<List<Supplier<ConfiguredFeature<?, ?>>>> getFeatures();
|
||||
|
||||
List<Supplier<ConfiguredStructureFeature<?, ?>>> getStructureStarts();
|
||||
|
||||
@@ -27,6 +27,27 @@ import net.minecraft.resources.ResourceLocation;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
/**
|
||||
* This class provides a cross-platform API to modify Biome features and properties.
|
||||
*
|
||||
* <p> Changes to the biomes are hereby done in four distinct "phases", akin to Fabric API's
|
||||
* {@link net.fabricmc.fabric.api.biome.v1.ModificationPhase} enum.
|
||||
*
|
||||
* <p> The order in which these phases get processed is as follows,
|
||||
* with the corresponding Forge EventPriority shown in brackets:
|
||||
*
|
||||
* <ol>
|
||||
* <li>{@linkplain #addProperties(Predicate, BiConsumer) Adding} new features to biomes. [HIGH]</li>
|
||||
* <li>{@linkplain #removeProperties(Predicate, BiConsumer) Removing} existing features from biomes. [NORMAL]</li>
|
||||
* <li>{@linkplain #replaceProperties(Predicate, BiConsumer) Replacing} existing features with new ones. [LOW]</li>
|
||||
* <li>Generic {@linkplain #postProcessProperties(Predicate, BiConsumer) Post-Processing} of already modified biome features. [LOWEST]</li>
|
||||
* </ol>
|
||||
*
|
||||
* Keep in mind that it isn't strictly <b>required</b> that you use these phases accordingly
|
||||
* (i.e., you may also add features during Post-Processing, for example); they mostly serve to
|
||||
* add a predictable order to biome modifications.
|
||||
*/
|
||||
@SuppressWarnings("JavadocReference")
|
||||
public final class BiomeModifications {
|
||||
public static void addProperties(BiConsumer<BiomeContext, BiomeProperties.Mutable> modifier) {
|
||||
BiomeModifications.addProperties(Predicates.alwaysTrue(), modifier);
|
||||
|
||||
@@ -38,6 +38,7 @@ import net.minecraft.world.level.levelgen.surfacebuilders.ConfiguredSurfaceBuild
|
||||
import net.minecraftforge.common.world.BiomeGenerationSettingsBuilder;
|
||||
import net.minecraftforge.common.world.MobSpawnInfoBuilder;
|
||||
import net.minecraftforge.event.world.BiomeLoadingEvent;
|
||||
import net.minecraftforge.eventbus.api.EventPriority;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
@@ -53,22 +54,25 @@ import java.util.function.Supplier;
|
||||
|
||||
@Mod.EventBusSubscriber(modid = ArchitecturyForge.MOD_ID)
|
||||
public class BiomeModificationsImpl {
|
||||
private static final List<Pair<Predicate<BiomeContext>, BiConsumer<BiomeContext, BiomeProperties.Mutable>>> MODIFICATIONS = Lists.newArrayList();
|
||||
private static final List<Pair<Predicate<BiomeContext>, BiConsumer<BiomeContext, BiomeProperties.Mutable>>> ADDITIONS = Lists.newArrayList();
|
||||
private static final List<Pair<Predicate<BiomeContext>, BiConsumer<BiomeContext, BiomeProperties.Mutable>>> POST_PROCESSING = Lists.newArrayList();
|
||||
private static final List<Pair<Predicate<BiomeContext>, BiConsumer<BiomeContext, BiomeProperties.Mutable>>> REMOVALS = Lists.newArrayList();
|
||||
private static final List<Pair<Predicate<BiomeContext>, BiConsumer<BiomeContext, BiomeProperties.Mutable>>> REPLACEMENTS = Lists.newArrayList();
|
||||
|
||||
public static void addProperties(Predicate<BiomeContext> predicate, BiConsumer<BiomeContext, BiomeProperties.Mutable> modifier) {
|
||||
MODIFICATIONS.add(Pair.of(predicate, modifier));
|
||||
ADDITIONS.add(Pair.of(predicate, modifier));
|
||||
}
|
||||
|
||||
public static void postProcessProperties(Predicate<BiomeContext> predicate, BiConsumer<BiomeContext, BiomeProperties.Mutable> modifier) {
|
||||
MODIFICATIONS.add(Pair.of(predicate, modifier));
|
||||
POST_PROCESSING.add(Pair.of(predicate, modifier));
|
||||
}
|
||||
|
||||
public static void removeProperties(Predicate<BiomeContext> predicate, BiConsumer<BiomeContext, BiomeProperties.Mutable> modifier) {
|
||||
MODIFICATIONS.add(Pair.of(predicate, modifier));
|
||||
REMOVALS.add(Pair.of(predicate, modifier));
|
||||
}
|
||||
|
||||
public static void replaceProperties(Predicate<BiomeContext> predicate, BiConsumer<BiomeContext, BiomeProperties.Mutable> modifier) {
|
||||
MODIFICATIONS.add(Pair.of(predicate, modifier));
|
||||
REPLACEMENTS.add(Pair.of(predicate, modifier));
|
||||
}
|
||||
|
||||
private static BiomeContext wrapSelectionContext(BiomeLoadingEvent event) {
|
||||
@@ -170,7 +174,12 @@ public class BiomeModificationsImpl {
|
||||
public @NotNull List<Supplier<ConfiguredWorldCarver<?>>> getCarvers(GenerationStep.Carving carving) {
|
||||
return generation.getCarvers(carving);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<Supplier<ConfiguredFeature<?, ?>>> getFeatures(GenerationStep.Decoration decoration) {
|
||||
return generation.getFeatures(decoration);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull List<List<Supplier<ConfiguredFeature<?, ?>>>> getFeatures() {
|
||||
return ((BiomeGenerationSettingsBuilderAccessor) generation).getFeatures();
|
||||
@@ -435,11 +444,30 @@ public class BiomeModificationsImpl {
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onBiomeLoading(BiomeLoadingEvent event) {
|
||||
@SubscribeEvent(priority = EventPriority.HIGH)
|
||||
public static void processAdditions(BiomeLoadingEvent event) {
|
||||
modifyBiome(event, ADDITIONS);
|
||||
}
|
||||
|
||||
@SubscribeEvent(priority = EventPriority.NORMAL)
|
||||
public static void processRemovals(BiomeLoadingEvent event) {
|
||||
modifyBiome(event, REMOVALS);
|
||||
}
|
||||
|
||||
@SubscribeEvent(priority = EventPriority.LOW)
|
||||
public static void processReplacements(BiomeLoadingEvent event) {
|
||||
modifyBiome(event, REPLACEMENTS);
|
||||
}
|
||||
|
||||
@SubscribeEvent(priority = EventPriority.LOWEST)
|
||||
public static void postProcessBiomes(BiomeLoadingEvent event) {
|
||||
modifyBiome(event, POST_PROCESSING);
|
||||
}
|
||||
|
||||
private static void modifyBiome(BiomeLoadingEvent event, List<Pair<Predicate<BiomeContext>, BiConsumer<BiomeContext, BiomeProperties.Mutable>>> list) {
|
||||
BiomeContext biomeContext = wrapSelectionContext(event);
|
||||
BiomeProperties.Mutable mutableBiome = new MutableBiomeWrapped(event);
|
||||
for (Pair<Predicate<BiomeContext>, BiConsumer<BiomeContext, BiomeProperties.Mutable>> pair : MODIFICATIONS) {
|
||||
for (Pair<Predicate<BiomeContext>, BiConsumer<BiomeContext, BiomeProperties.Mutable>> pair : list) {
|
||||
if (pair.getLeft().test(biomeContext)) {
|
||||
pair.getRight().accept(biomeContext, mutableBiome);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user