Path: blob/1.21.x/src/main/java/net/minecraftforge/common/world/ModifiableBiomeInfo.java
6513 views
/*1* Copyright (c) Forge Development LLC and contributors2* SPDX-License-Identifier: LGPL-2.1-only3*/45package net.minecraftforge.common.world;67import java.util.List;8import java.util.Locale;910import org.jetbrains.annotations.ApiStatus;11import org.jetbrains.annotations.NotNull;12import org.jetbrains.annotations.Nullable;1314import net.minecraft.core.Holder;15import net.minecraft.world.level.biome.Biome;16import net.minecraft.world.level.biome.Biome.ClimateSettings;17import net.minecraft.world.level.biome.BiomeGenerationSettings;18import net.minecraft.world.level.biome.BiomeSpecialEffects;19import net.minecraft.world.level.biome.MobSpawnSettings;2021/**22* Holds lazy-evaluable modified biome info.23* Memoizers are not used because it's important to return null24* without evaluating the biome info if it's accessed outside of a server context.25*/26public class ModifiableBiomeInfo {27@NotNull28private final BiomeInfo originalBiomeInfo;29@Nullable30private BiomeInfo modifiedBiomeInfo = null;3132/**33* @param originalBiomeInfo BiomeInfo representing the original state of a biome when the biome was constructed.34*/35public ModifiableBiomeInfo(@NotNull final BiomeInfo originalBiomeInfo) {36this.originalBiomeInfo = originalBiomeInfo;37}3839/**40* {@return The modified biome info if modified biome info has been generated, otherwise gets original biome info}41*/42@NotNull43public BiomeInfo get() {44return this.modifiedBiomeInfo == null45? originalBiomeInfo46: modifiedBiomeInfo;47}4849/**50* {@return The original biome info that the associated biome was created with}51*/52@NotNull53public BiomeInfo getOriginalBiomeInfo() {54return this.originalBiomeInfo;55}5657/**58* {@return Modified biome info; null if it hasn't been set yet}59*/60@Nullable61public BiomeInfo getModifiedBiomeInfo() {62return this.modifiedBiomeInfo;63}6465/**66* Internal forge method; the game will crash if mods invoke this.67* Creates and caches the modified biome info.68* @param biome named biome with original data.69* @param biomeModifiers biome modifiers to apply.70*71* @throws IllegalStateException if invoked more than once.72*/73@ApiStatus.Internal74public void applyBiomeModifiers(final Holder<Biome> biome, final List<BiomeModifier> biomeModifiers) {75if (this.modifiedBiomeInfo != null)76throw new IllegalStateException(String.format(Locale.ENGLISH, "Biome %s already modified", biome));7778var original = this.getOriginalBiomeInfo();79var builder = BiomeInfo.Builder.copyOf(original);80for (var phase : BiomeModifier.Phase.values()) {81for (var modifier : biomeModifiers)82modifier.modify(biome, phase, builder);83}84this.modifiedBiomeInfo = builder.build();85}8687/**88* Record containing raw biome data.89* @param climateSettings Weather and temperature settings.90* @param effects Client-relevant effects for rendering and sound.91* @param generationSettings Worldgen features and carvers.92* @param mobSpawnSettings Mob spawn settings.93*/94public record BiomeInfo(ClimateSettings climateSettings, BiomeSpecialEffects effects, BiomeGenerationSettings generationSettings, MobSpawnSettings mobSpawnSettings) {95public static class Builder {96private ClimateSettingsBuilder climateSettings;97private BiomeSpecialEffectsBuilder effects;98private BiomeGenerationSettings.PlainBuilder generationSettings;99private MobSpawnSettingsBuilder mobSpawnSettings;100101/**102* @param original the biome to copy103* @return A ModifiedBiomeInfo.Builder with a copy of the biome's data104*/105public static Builder copyOf(final BiomeInfo original) {106final ClimateSettingsBuilder climateBuilder = ClimateSettingsBuilder.copyOf(original.climateSettings());107final BiomeSpecialEffectsBuilder effectsBuilder = BiomeSpecialEffectsBuilder.copyOf(original.effects());108final var generationBuilder = new BiomeGenerationSettings.PlainBuilder();109generationBuilder.addFrom(original.generationSettings());110final MobSpawnSettingsBuilder mobSpawnBuilder = new MobSpawnSettingsBuilder(original.mobSpawnSettings());111112return new Builder(113climateBuilder,114effectsBuilder,115generationBuilder,116mobSpawnBuilder117);118}119120private Builder(final ClimateSettingsBuilder climateSettings, final BiomeSpecialEffectsBuilder effects, final BiomeGenerationSettings.PlainBuilder generationSettings, final MobSpawnSettingsBuilder mobSpawnSettings) {121this.climateSettings = climateSettings;122this.effects = effects;123this.generationSettings = generationSettings;124this.mobSpawnSettings = mobSpawnSettings;125}126127public BiomeInfo build() {128return new BiomeInfo(this.climateSettings.build(), this.effects.build(), this.generationSettings.build(), this.mobSpawnSettings.build());129}130131public ClimateSettingsBuilder getClimateSettings() {132return climateSettings;133}134135public BiomeSpecialEffectsBuilder getSpecialEffects() {136return effects;137}138139public BiomeGenerationSettings.PlainBuilder getGenerationSettings() {140return generationSettings;141}142143public MobSpawnSettingsBuilder getMobSpawnSettings() {144return mobSpawnSettings;145}146}147}148}149150151