package net.minecraft.client.sounds; import com.google.common.collect.Lists; import java.util.List; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.resources.sounds.Sound; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.RandomSource; import org.jetbrains.annotations.Nullable; /** * The WeighedSoundEvents class represents a collection of weighted sound events. * It implements the Weighted interface to provide weighted selection of sounds. */ @Environment(EnvType.CLIENT) public class WeighedSoundEvents implements Weighted { private final List> list = Lists.>newArrayList(); @Nullable private final Component subtitle; /** * @param location The resource location of the sound events * @param subtitleKey The key for the subtitle translation component, or null if no subtitle is provided */ public WeighedSoundEvents(ResourceLocation location, @Nullable String subtitleKey) { this.subtitle = subtitleKey == null ? null : Component.translatable(subtitleKey); } @Override public int getWeight() { int i = 0; for (Weighted weighted : this.list) { i += weighted.getWeight(); } return i; } /** * Retrieves a randomly selected sound from the sound events based on their weights. * The selection is performed using the provided random source. *

* @return A randomly selected sound from the sound events * The random source used for sound selection * * @param randomSource the random source used for sound selection */ public Sound getSound(RandomSource randomSource) { int i = this.getWeight(); if (!this.list.isEmpty() && i != 0) { int j = randomSource.nextInt(i); for (Weighted weighted : this.list) { j -= weighted.getWeight(); if (j < 0) { return weighted.getSound(randomSource); } } return SoundManager.EMPTY_SOUND; } else { return SoundManager.EMPTY_SOUND; } } /** * Adds a sound event to the collection. * * @param accessor The weighted accessor for the sound event to be added */ public void addSound(Weighted accessor) { this.list.add(accessor); } /** * {@return The subtitle component, or {@code null} if no subtitle is provided} */ @Nullable public Component getSubtitle() { return this.subtitle; } @Override public void preloadIfRequired(SoundEngine engine) { for (Weighted weighted : this.list) { weighted.preloadIfRequired(engine); } } }