minecraft-src/net/minecraft/realms/RepeatedNarrator.java
2025-07-04 01:41:11 +03:00

42 lines
1.3 KiB
Java

package net.minecraft.realms;
import com.google.common.util.concurrent.RateLimiter;
import java.time.Duration;
import java.util.concurrent.atomic.AtomicReference;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.GameNarrator;
import net.minecraft.network.chat.Component;
@Environment(EnvType.CLIENT)
public class RepeatedNarrator {
private final float permitsPerSecond;
private final AtomicReference<RepeatedNarrator.Params> params = new AtomicReference();
public RepeatedNarrator(Duration duration) {
this.permitsPerSecond = 1000.0F / (float)duration.toMillis();
}
public void narrate(GameNarrator narrator, Component narration) {
RepeatedNarrator.Params params = (RepeatedNarrator.Params)this.params
.updateAndGet(
paramsx -> paramsx != null && narration.equals(paramsx.narration)
? paramsx
: new RepeatedNarrator.Params(narration, RateLimiter.create(this.permitsPerSecond))
);
if (params.rateLimiter.tryAcquire(1)) {
narrator.sayNow(narration);
}
}
@Environment(EnvType.CLIENT)
static class Params {
final Component narration;
final RateLimiter rateLimiter;
Params(Component narration, RateLimiter rateLimiter) {
this.narration = narration;
this.rateLimiter = rateLimiter;
}
}
}