package net.minecraft.world.level.biome; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder.Instance; import java.util.Optional; import java.util.OptionalInt; import javax.annotation.Nullable; import net.minecraft.core.Holder; import net.minecraft.sounds.Music; import net.minecraft.sounds.SoundEvent; import net.minecraft.util.StringRepresentable; import net.minecraft.util.random.WeightedList; public class BiomeSpecialEffects { public static final Codec CODEC = RecordCodecBuilder.create( p_390888_ -> p_390888_.group( Codec.INT.fieldOf("fog_color").forGetter(p_151782_ -> p_151782_.fogColor), Codec.INT.fieldOf("water_color").forGetter(p_151780_ -> p_151780_.waterColor), Codec.INT.fieldOf("water_fog_color").forGetter(p_151778_ -> p_151778_.waterFogColor), Codec.INT.fieldOf("sky_color").forGetter(p_151776_ -> p_151776_.skyColor), Codec.INT.optionalFieldOf("foliage_color").forGetter(p_151774_ -> p_151774_.foliageColorOverride), Codec.INT.optionalFieldOf("dry_foliage_color").forGetter(p_390889_ -> p_390889_.dryFoliageColorOverride), Codec.INT.optionalFieldOf("grass_color").forGetter(p_151772_ -> p_151772_.grassColorOverride), BiomeSpecialEffects.GrassColorModifier.CODEC .optionalFieldOf("grass_color_modifier", BiomeSpecialEffects.GrassColorModifier.NONE) .forGetter(p_151770_ -> p_151770_.grassColorModifier), AmbientParticleSettings.CODEC.optionalFieldOf("particle").forGetter(p_151768_ -> p_151768_.ambientParticleSettings), SoundEvent.CODEC.optionalFieldOf("ambient_sound").forGetter(p_151766_ -> p_151766_.ambientLoopSoundEvent), AmbientMoodSettings.CODEC.optionalFieldOf("mood_sound").forGetter(p_151764_ -> p_151764_.ambientMoodSettings), AmbientAdditionsSettings.CODEC.optionalFieldOf("additions_sound").forGetter(p_151762_ -> p_151762_.ambientAdditionsSettings), WeightedList.codec(Music.CODEC).optionalFieldOf("music").forGetter(p_151760_ -> p_151760_.backgroundMusic), Codec.FLOAT.fieldOf("music_volume").orElse(1.0F).forGetter(p_375319_ -> p_375319_.backgroundMusicVolume) ) .apply(p_390888_, BiomeSpecialEffects::new) ); private final int fogColor; private final int waterColor; private final int waterFogColor; private final int skyColor; private final Optional foliageColorOverride; private final Optional dryFoliageColorOverride; private final Optional grassColorOverride; private final BiomeSpecialEffects.GrassColorModifier grassColorModifier; private final Optional ambientParticleSettings; private final Optional> ambientLoopSoundEvent; private final Optional ambientMoodSettings; private final Optional ambientAdditionsSettings; private final Optional> backgroundMusic; private final float backgroundMusicVolume; BiomeSpecialEffects( int p_47941_, int p_47942_, int p_47943_, int p_47944_, Optional p_47945_, Optional p_47946_, Optional p_47948_, BiomeSpecialEffects.GrassColorModifier p_47947_, Optional p_47949_, Optional> p_47950_, Optional p_47951_, Optional p_47952_, Optional> p_391194_, float p_376511_ ) { this.fogColor = p_47941_; this.waterColor = p_47942_; this.waterFogColor = p_47943_; this.skyColor = p_47944_; this.foliageColorOverride = p_47945_; this.dryFoliageColorOverride = p_47946_; this.grassColorOverride = p_47948_; this.grassColorModifier = p_47947_; this.ambientParticleSettings = p_47949_; this.ambientLoopSoundEvent = p_47950_; this.ambientMoodSettings = p_47951_; this.ambientAdditionsSettings = p_47952_; this.backgroundMusic = p_391194_; this.backgroundMusicVolume = p_376511_; } public int getFogColor() { return this.fogColor; } public int getWaterColor() { return this.waterColor; } public int getWaterFogColor() { return this.waterFogColor; } public int getSkyColor() { return this.skyColor; } public Optional getFoliageColorOverride() { return this.foliageColorOverride; } public Optional getDryFoliageColorOverride() { return this.dryFoliageColorOverride; } public Optional getGrassColorOverride() { return this.grassColorOverride; } public BiomeSpecialEffects.GrassColorModifier getGrassColorModifier() { return this.grassColorModifier; } public Optional getAmbientParticleSettings() { return this.ambientParticleSettings; } public Optional> getAmbientLoopSoundEvent() { return this.ambientLoopSoundEvent; } public Optional getAmbientMoodSettings() { return this.ambientMoodSettings; } public Optional getAmbientAdditionsSettings() { return this.ambientAdditionsSettings; } public Optional> getBackgroundMusic() { return this.backgroundMusic; } public float getBackgroundMusicVolume() { return this.backgroundMusicVolume; } public static class Builder { private OptionalInt fogColor = OptionalInt.empty(); private OptionalInt waterColor = OptionalInt.empty(); private OptionalInt waterFogColor = OptionalInt.empty(); private OptionalInt skyColor = OptionalInt.empty(); private Optional foliageColorOverride = Optional.empty(); private Optional dryFoliageColorOverride = Optional.empty(); private Optional grassColorOverride = Optional.empty(); private BiomeSpecialEffects.GrassColorModifier grassColorModifier = BiomeSpecialEffects.GrassColorModifier.NONE; private Optional ambientParticle = Optional.empty(); private Optional> ambientLoopSoundEvent = Optional.empty(); private Optional ambientMoodSettings = Optional.empty(); private Optional ambientAdditionsSettings = Optional.empty(); private Optional> backgroundMusic = Optional.empty(); private float backgroundMusicVolume = 1.0F; public BiomeSpecialEffects.Builder fogColor(int p_48020_) { this.fogColor = OptionalInt.of(p_48020_); return this; } public BiomeSpecialEffects.Builder waterColor(int p_48035_) { this.waterColor = OptionalInt.of(p_48035_); return this; } public BiomeSpecialEffects.Builder waterFogColor(int p_48038_) { this.waterFogColor = OptionalInt.of(p_48038_); return this; } public BiomeSpecialEffects.Builder skyColor(int p_48041_) { this.skyColor = OptionalInt.of(p_48041_); return this; } public BiomeSpecialEffects.Builder foliageColorOverride(int p_48044_) { this.foliageColorOverride = Optional.of(p_48044_); return this; } public BiomeSpecialEffects.Builder dryFoliageColorOverride(int p_394617_) { this.dryFoliageColorOverride = Optional.of(p_394617_); return this; } public BiomeSpecialEffects.Builder grassColorOverride(int p_48046_) { this.grassColorOverride = Optional.of(p_48046_); return this; } public BiomeSpecialEffects.Builder grassColorModifier(BiomeSpecialEffects.GrassColorModifier p_48032_) { this.grassColorModifier = p_48032_; return this; } public BiomeSpecialEffects.Builder ambientParticle(AmbientParticleSettings p_48030_) { this.ambientParticle = Optional.of(p_48030_); return this; } public BiomeSpecialEffects.Builder ambientLoopSound(Holder p_263327_) { this.ambientLoopSoundEvent = Optional.of(p_263327_); return this; } public BiomeSpecialEffects.Builder ambientMoodSound(AmbientMoodSettings p_48028_) { this.ambientMoodSettings = Optional.of(p_48028_); return this; } public BiomeSpecialEffects.Builder ambientAdditionsSound(AmbientAdditionsSettings p_48026_) { this.ambientAdditionsSettings = Optional.of(p_48026_); return this; } public BiomeSpecialEffects.Builder backgroundMusic(@Nullable Music p_48022_) { if (p_48022_ == null) { this.backgroundMusic = Optional.empty(); return this; } else { this.backgroundMusic = Optional.of(WeightedList.of(p_48022_)); return this; } } public BiomeSpecialEffects.Builder silenceAllBackgroundMusic() { return this.backgroundMusic(WeightedList.of()).backgroundMusicVolume(0.0F); } public BiomeSpecialEffects.Builder backgroundMusic(WeightedList p_393009_) { this.backgroundMusic = Optional.of(p_393009_); return this; } public BiomeSpecialEffects.Builder backgroundMusicVolume(float p_375968_) { this.backgroundMusicVolume = p_375968_; return this; } public BiomeSpecialEffects build() { return new BiomeSpecialEffects( this.fogColor.orElseThrow(() -> new IllegalStateException("Missing 'fog' color.")), this.waterColor.orElseThrow(() -> new IllegalStateException("Missing 'water' color.")), this.waterFogColor.orElseThrow(() -> new IllegalStateException("Missing 'water fog' color.")), this.skyColor.orElseThrow(() -> new IllegalStateException("Missing 'sky' color.")), this.foliageColorOverride, this.dryFoliageColorOverride, this.grassColorOverride, this.grassColorModifier, this.ambientParticle, this.ambientLoopSoundEvent, this.ambientMoodSettings, this.ambientAdditionsSettings, this.backgroundMusic, this.backgroundMusicVolume ); } } public static enum GrassColorModifier implements StringRepresentable { NONE("none") { @Override public int modifyColor(double p_48081_, double p_48082_, int p_48083_) { return p_48083_; } }, DARK_FOREST("dark_forest") { @Override public int modifyColor(double p_48089_, double p_48090_, int p_48091_) { return (p_48091_ & 16711422) + 2634762 >> 1; } }, SWAMP("swamp") { @Override public int modifyColor(double p_48097_, double p_48098_, int p_48099_) { double d0 = Biome.BIOME_INFO_NOISE.getValue(p_48097_ * 0.0225, p_48098_ * 0.0225, false); return d0 < -0.1 ? 5011004 : 6975545; } }; private final String name; public static final Codec CODEC = StringRepresentable.fromEnum( BiomeSpecialEffects.GrassColorModifier::values ); public abstract int modifyColor(double p_48065_, double p_48066_, int p_48067_); GrassColorModifier(final String p_48058_) { this.name = p_48058_; } public String getName() { return this.name; } @Override public String getSerializedName() { return this.name; } } }