minecraft-src/net/minecraft/network/chat/LastSeenMessagesTracker.java
2025-07-04 03:45:38 +03:00

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) {
}
}