68 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.util.debugchart;
 | |
| 
 | |
| import com.google.common.collect.Maps;
 | |
| import java.util.LinkedList;
 | |
| import java.util.Map;
 | |
| import java.util.Queue;
 | |
| import net.minecraft.Util;
 | |
| import net.minecraft.network.protocol.game.ClientboundDebugSamplePacket;
 | |
| import net.minecraft.server.level.ServerPlayer;
 | |
| import net.minecraft.server.players.PlayerList;
 | |
| 
 | |
| public class DebugSampleSubscriptionTracker {
 | |
| 	public static final int STOP_SENDING_AFTER_TICKS = 200;
 | |
| 	public static final int STOP_SENDING_AFTER_MS = 10000;
 | |
| 	private final PlayerList playerList;
 | |
| 	private final Map<RemoteDebugSampleType, Map<ServerPlayer, DebugSampleSubscriptionTracker.SubscriptionStartedAt>> subscriptions;
 | |
| 	private final Queue<DebugSampleSubscriptionTracker.SubscriptionRequest> subscriptionRequestQueue = new LinkedList();
 | |
| 
 | |
| 	public DebugSampleSubscriptionTracker(PlayerList playerList) {
 | |
| 		this.playerList = playerList;
 | |
| 		this.subscriptions = Util.makeEnumMap(RemoteDebugSampleType.class, remoteDebugSampleType -> Maps.newHashMap());
 | |
| 	}
 | |
| 
 | |
| 	public boolean shouldLogSamples(RemoteDebugSampleType sampleType) {
 | |
| 		return !((Map)this.subscriptions.get(sampleType)).isEmpty();
 | |
| 	}
 | |
| 
 | |
| 	public void broadcast(ClientboundDebugSamplePacket packet) {
 | |
| 		for (ServerPlayer serverPlayer : ((Map)this.subscriptions.get(packet.debugSampleType())).keySet()) {
 | |
| 			serverPlayer.connection.send(packet);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public void subscribe(ServerPlayer player, RemoteDebugSampleType sampleType) {
 | |
| 		if (this.playerList.isOp(player.getGameProfile())) {
 | |
| 			this.subscriptionRequestQueue.add(new DebugSampleSubscriptionTracker.SubscriptionRequest(player, sampleType));
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public void tick(int tick) {
 | |
| 		long l = Util.getMillis();
 | |
| 		this.handleSubscriptions(l, tick);
 | |
| 		this.handleUnsubscriptions(l, tick);
 | |
| 	}
 | |
| 
 | |
| 	private void handleSubscriptions(long millis, int tick) {
 | |
| 		for (DebugSampleSubscriptionTracker.SubscriptionRequest subscriptionRequest : this.subscriptionRequestQueue) {
 | |
| 			((Map)this.subscriptions.get(subscriptionRequest.sampleType()))
 | |
| 				.put(subscriptionRequest.player(), new DebugSampleSubscriptionTracker.SubscriptionStartedAt(millis, tick));
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	private void handleUnsubscriptions(long millis, int tick) {
 | |
| 		for (Map<ServerPlayer, DebugSampleSubscriptionTracker.SubscriptionStartedAt> map : this.subscriptions.values()) {
 | |
| 			map.entrySet().removeIf(entry -> {
 | |
| 				boolean bl = !this.playerList.isOp(((ServerPlayer)entry.getKey()).getGameProfile());
 | |
| 				DebugSampleSubscriptionTracker.SubscriptionStartedAt subscriptionStartedAt = (DebugSampleSubscriptionTracker.SubscriptionStartedAt)entry.getValue();
 | |
| 				return bl || tick > subscriptionStartedAt.tick() + 200 && millis > subscriptionStartedAt.millis() + 10000L;
 | |
| 			});
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	record SubscriptionRequest(ServerPlayer player, RemoteDebugSampleType sampleType) {
 | |
| 	}
 | |
| 
 | |
| 	record SubscriptionStartedAt(long millis, int tick) {
 | |
| 	}
 | |
| }
 |