79 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.network.chat;
 | |
| 
 | |
| import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 | |
| import it.unimi.dsi.fastutil.objects.ObjectList;
 | |
| import java.util.BitSet;
 | |
| import java.util.Objects;
 | |
| import org.jetbrains.annotations.Nullable;
 | |
| 
 | |
| public class LastSeenMessagesTracker {
 | |
| 	private final LastSeenTrackedEntry[] trackedMessages;
 | |
| 	private int tail;
 | |
| 	private int offset;
 | |
| 	@Nullable
 | |
| 	private MessageSignature lastTrackedMessage;
 | |
| 
 | |
| 	public LastSeenMessagesTracker(int size) {
 | |
| 		this.trackedMessages = new LastSeenTrackedEntry[size];
 | |
| 	}
 | |
| 
 | |
| 	public boolean addPending(MessageSignature signature, boolean acknowledged) {
 | |
| 		if (Objects.equals(signature, this.lastTrackedMessage)) {
 | |
| 			return false;
 | |
| 		} else {
 | |
| 			this.lastTrackedMessage = signature;
 | |
| 			this.addEntry(acknowledged ? new LastSeenTrackedEntry(signature, true) : null);
 | |
| 			return true;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	private void addEntry(@Nullable LastSeenTrackedEntry entry) {
 | |
| 		int i = this.tail;
 | |
| 		this.tail = (i + 1) % this.trackedMessages.length;
 | |
| 		this.offset++;
 | |
| 		this.trackedMessages[i] = entry;
 | |
| 	}
 | |
| 
 | |
| 	public void ignorePending(MessageSignature signature) {
 | |
| 		for (int i = 0; i < this.trackedMessages.length; i++) {
 | |
| 			LastSeenTrackedEntry lastSeenTrackedEntry = this.trackedMessages[i];
 | |
| 			if (lastSeenTrackedEntry != null && lastSeenTrackedEntry.pending() && signature.equals(lastSeenTrackedEntry.signature())) {
 | |
| 				this.trackedMessages[i] = null;
 | |
| 				break;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public int getAndClearOffset() {
 | |
| 		int i = this.offset;
 | |
| 		this.offset = 0;
 | |
| 		return i;
 | |
| 	}
 | |
| 
 | |
| 	public LastSeenMessagesTracker.Update generateAndApplyUpdate() {
 | |
| 		int i = this.getAndClearOffset();
 | |
| 		BitSet bitSet = new BitSet(this.trackedMessages.length);
 | |
| 		ObjectList<MessageSignature> objectList = new ObjectArrayList<>(this.trackedMessages.length);
 | |
| 
 | |
| 		for (int j = 0; j < this.trackedMessages.length; j++) {
 | |
| 			int k = (this.tail + j) % this.trackedMessages.length;
 | |
| 			LastSeenTrackedEntry lastSeenTrackedEntry = this.trackedMessages[k];
 | |
| 			if (lastSeenTrackedEntry != null) {
 | |
| 				bitSet.set(j, true);
 | |
| 				objectList.add(lastSeenTrackedEntry.signature());
 | |
| 				this.trackedMessages[k] = lastSeenTrackedEntry.acknowledge();
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		LastSeenMessages lastSeenMessages = new LastSeenMessages(objectList);
 | |
| 		LastSeenMessages.Update update = new LastSeenMessages.Update(i, bitSet, lastSeenMessages.computeChecksum());
 | |
| 		return new LastSeenMessagesTracker.Update(lastSeenMessages, update);
 | |
| 	}
 | |
| 
 | |
| 	public int offset() {
 | |
| 		return this.offset;
 | |
| 	}
 | |
| 
 | |
| 	public record Update(LastSeenMessages lastSeen, LastSeenMessages.Update update) {
 | |
| 	}
 | |
| }
 |