42 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			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.saySystemNow(narration);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	@Environment(EnvType.CLIENT)
 | |
| 	static class Params {
 | |
| 		final Component narration;
 | |
| 		final RateLimiter rateLimiter;
 | |
| 
 | |
| 		Params(Component narration, RateLimiter rateLimiter) {
 | |
| 			this.narration = narration;
 | |
| 			this.rateLimiter = rateLimiter;
 | |
| 		}
 | |
| 	}
 | |
| }
 |