92 lines
2.5 KiB
Java
92 lines
2.5 KiB
Java
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<Sound> {
|
|
private final List<Weighted<Sound>> list = Lists.<Weighted<Sound>>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<Sound> 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.
|
|
* <p>
|
|
* @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<Sound> 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<Sound> 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<Sound> weighted : this.list) {
|
|
weighted.preloadIfRequired(engine);
|
|
}
|
|
}
|
|
}
|