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 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; } } }