minecraft-src/net/minecraft/world/level/biome/BiomeSpecialEffects.java
2025-07-04 03:45:38 +03:00

282 lines
11 KiB
Java

package net.minecraft.world.level.biome;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import java.util.Optional;
import java.util.OptionalInt;
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;
import org.jetbrains.annotations.Nullable;
public class BiomeSpecialEffects {
public static final Codec<BiomeSpecialEffects> CODEC = RecordCodecBuilder.create(
instance -> instance.group(
Codec.INT.fieldOf("fog_color").forGetter(biomeSpecialEffects -> biomeSpecialEffects.fogColor),
Codec.INT.fieldOf("water_color").forGetter(biomeSpecialEffects -> biomeSpecialEffects.waterColor),
Codec.INT.fieldOf("water_fog_color").forGetter(biomeSpecialEffects -> biomeSpecialEffects.waterFogColor),
Codec.INT.fieldOf("sky_color").forGetter(biomeSpecialEffects -> biomeSpecialEffects.skyColor),
Codec.INT.optionalFieldOf("foliage_color").forGetter(biomeSpecialEffects -> biomeSpecialEffects.foliageColorOverride),
Codec.INT.optionalFieldOf("dry_foliage_color").forGetter(biomeSpecialEffects -> biomeSpecialEffects.dryFoliageColorOverride),
Codec.INT.optionalFieldOf("grass_color").forGetter(biomeSpecialEffects -> biomeSpecialEffects.grassColorOverride),
BiomeSpecialEffects.GrassColorModifier.CODEC
.optionalFieldOf("grass_color_modifier", BiomeSpecialEffects.GrassColorModifier.NONE)
.forGetter(biomeSpecialEffects -> biomeSpecialEffects.grassColorModifier),
AmbientParticleSettings.CODEC.optionalFieldOf("particle").forGetter(biomeSpecialEffects -> biomeSpecialEffects.ambientParticleSettings),
SoundEvent.CODEC.optionalFieldOf("ambient_sound").forGetter(biomeSpecialEffects -> biomeSpecialEffects.ambientLoopSoundEvent),
AmbientMoodSettings.CODEC.optionalFieldOf("mood_sound").forGetter(biomeSpecialEffects -> biomeSpecialEffects.ambientMoodSettings),
AmbientAdditionsSettings.CODEC.optionalFieldOf("additions_sound").forGetter(biomeSpecialEffects -> biomeSpecialEffects.ambientAdditionsSettings),
WeightedList.codec(Music.CODEC).optionalFieldOf("music").forGetter(biomeSpecialEffects -> biomeSpecialEffects.backgroundMusic),
Codec.FLOAT.fieldOf("music_volume").orElse(1.0F).forGetter(biomeSpecialEffects -> biomeSpecialEffects.backgroundMusicVolume)
)
.apply(instance, BiomeSpecialEffects::new)
);
private final int fogColor;
private final int waterColor;
private final int waterFogColor;
private final int skyColor;
private final Optional<Integer> foliageColorOverride;
private final Optional<Integer> dryFoliageColorOverride;
private final Optional<Integer> grassColorOverride;
private final BiomeSpecialEffects.GrassColorModifier grassColorModifier;
private final Optional<AmbientParticleSettings> ambientParticleSettings;
private final Optional<Holder<SoundEvent>> ambientLoopSoundEvent;
private final Optional<AmbientMoodSettings> ambientMoodSettings;
private final Optional<AmbientAdditionsSettings> ambientAdditionsSettings;
private final Optional<WeightedList<Music>> backgroundMusic;
private final float backgroundMusicVolume;
BiomeSpecialEffects(
int fogColor,
int waterColor,
int waterFogColor,
int skyColor,
Optional<Integer> foliageColorOverride,
Optional<Integer> dryFoliageColorOverride,
Optional<Integer> grassColorOverride,
BiomeSpecialEffects.GrassColorModifier grassColorModifier,
Optional<AmbientParticleSettings> ambientParticleSettings,
Optional<Holder<SoundEvent>> ambientLoopSoundEvent,
Optional<AmbientMoodSettings> ambientMoodSettings,
Optional<AmbientAdditionsSettings> ambientAdditionsSettings,
Optional<WeightedList<Music>> backgroundMusic,
float backgroundMusicVolume
) {
this.fogColor = fogColor;
this.waterColor = waterColor;
this.waterFogColor = waterFogColor;
this.skyColor = skyColor;
this.foliageColorOverride = foliageColorOverride;
this.dryFoliageColorOverride = dryFoliageColorOverride;
this.grassColorOverride = grassColorOverride;
this.grassColorModifier = grassColorModifier;
this.ambientParticleSettings = ambientParticleSettings;
this.ambientLoopSoundEvent = ambientLoopSoundEvent;
this.ambientMoodSettings = ambientMoodSettings;
this.ambientAdditionsSettings = ambientAdditionsSettings;
this.backgroundMusic = backgroundMusic;
this.backgroundMusicVolume = backgroundMusicVolume;
}
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<Integer> getFoliageColorOverride() {
return this.foliageColorOverride;
}
public Optional<Integer> getDryFoliageColorOverride() {
return this.dryFoliageColorOverride;
}
public Optional<Integer> getGrassColorOverride() {
return this.grassColorOverride;
}
public BiomeSpecialEffects.GrassColorModifier getGrassColorModifier() {
return this.grassColorModifier;
}
public Optional<AmbientParticleSettings> getAmbientParticleSettings() {
return this.ambientParticleSettings;
}
public Optional<Holder<SoundEvent>> getAmbientLoopSoundEvent() {
return this.ambientLoopSoundEvent;
}
public Optional<AmbientMoodSettings> getAmbientMoodSettings() {
return this.ambientMoodSettings;
}
public Optional<AmbientAdditionsSettings> getAmbientAdditionsSettings() {
return this.ambientAdditionsSettings;
}
public Optional<WeightedList<Music>> 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<Integer> foliageColorOverride = Optional.empty();
private Optional<Integer> dryFoliageColorOverride = Optional.empty();
private Optional<Integer> grassColorOverride = Optional.empty();
private BiomeSpecialEffects.GrassColorModifier grassColorModifier = BiomeSpecialEffects.GrassColorModifier.NONE;
private Optional<AmbientParticleSettings> ambientParticle = Optional.empty();
private Optional<Holder<SoundEvent>> ambientLoopSoundEvent = Optional.empty();
private Optional<AmbientMoodSettings> ambientMoodSettings = Optional.empty();
private Optional<AmbientAdditionsSettings> ambientAdditionsSettings = Optional.empty();
private Optional<WeightedList<Music>> backgroundMusic = Optional.empty();
private float backgroundMusicVolume = 1.0F;
public BiomeSpecialEffects.Builder fogColor(int fogColor) {
this.fogColor = OptionalInt.of(fogColor);
return this;
}
public BiomeSpecialEffects.Builder waterColor(int waterColor) {
this.waterColor = OptionalInt.of(waterColor);
return this;
}
public BiomeSpecialEffects.Builder waterFogColor(int waterFogColor) {
this.waterFogColor = OptionalInt.of(waterFogColor);
return this;
}
public BiomeSpecialEffects.Builder skyColor(int skyColor) {
this.skyColor = OptionalInt.of(skyColor);
return this;
}
public BiomeSpecialEffects.Builder foliageColorOverride(int foliageColorOverride) {
this.foliageColorOverride = Optional.of(foliageColorOverride);
return this;
}
public BiomeSpecialEffects.Builder dryFoliageColorOverride(int dryFoliageColorOverride) {
this.dryFoliageColorOverride = Optional.of(dryFoliageColorOverride);
return this;
}
public BiomeSpecialEffects.Builder grassColorOverride(int grassColorOverride) {
this.grassColorOverride = Optional.of(grassColorOverride);
return this;
}
public BiomeSpecialEffects.Builder grassColorModifier(BiomeSpecialEffects.GrassColorModifier grassColorModifier) {
this.grassColorModifier = grassColorModifier;
return this;
}
public BiomeSpecialEffects.Builder ambientParticle(AmbientParticleSettings ambientParticle) {
this.ambientParticle = Optional.of(ambientParticle);
return this;
}
public BiomeSpecialEffects.Builder ambientLoopSound(Holder<SoundEvent> ambientLoopSoundEvent) {
this.ambientLoopSoundEvent = Optional.of(ambientLoopSoundEvent);
return this;
}
public BiomeSpecialEffects.Builder ambientMoodSound(AmbientMoodSettings ambientMoodSettings) {
this.ambientMoodSettings = Optional.of(ambientMoodSettings);
return this;
}
public BiomeSpecialEffects.Builder ambientAdditionsSound(AmbientAdditionsSettings ambientAdditionsSettings) {
this.ambientAdditionsSettings = Optional.of(ambientAdditionsSettings);
return this;
}
public BiomeSpecialEffects.Builder backgroundMusic(@Nullable Music backgroundMusic) {
if (backgroundMusic == null) {
this.backgroundMusic = Optional.empty();
return this;
} else {
this.backgroundMusic = Optional.of(WeightedList.of(backgroundMusic));
return this;
}
}
public BiomeSpecialEffects.Builder silenceAllBackgroundMusic() {
return this.backgroundMusic(WeightedList.of()).backgroundMusicVolume(0.0F);
}
public BiomeSpecialEffects.Builder backgroundMusic(WeightedList<Music> backgroundMusic) {
this.backgroundMusic = Optional.of(backgroundMusic);
return this;
}
public BiomeSpecialEffects.Builder backgroundMusicVolume(float backgroundMusicVolume) {
this.backgroundMusicVolume = backgroundMusicVolume;
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", 0, "none"),
DARK_FOREST("DARK_FOREST", 1, "dark_forest"),
SWAMP("SWAMP", 2, "swamp");
private final String name;
public static final Codec<BiomeSpecialEffects.GrassColorModifier> CODEC = StringRepresentable.fromEnum(BiomeSpecialEffects.GrassColorModifier::values);
public abstract int modifyColor(double x, double z, int grassColor);
GrassColorModifier(final String name) {
this.name = name;
}
public String getName() {
return this.name;
}
@Override
public String getSerializedName() {
return this.name;
}
}
}