Code/net/minecraft/network/chat/LastSeenMessagesTracker.java

79 lines
2.9 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 javax.annotation.Nullable;
public class LastSeenMessagesTracker {
private final LastSeenTrackedEntry[] trackedMessages;
private int tail;
private int offset;
@Nullable
private MessageSignature lastTrackedMessage;
public LastSeenMessagesTracker(int p_242388_) {
this.trackedMessages = new LastSeenTrackedEntry[p_242388_];
}
public boolean addPending(MessageSignature p_248926_, boolean p_250312_) {
if (Objects.equals(p_248926_, this.lastTrackedMessage)) {
return false;
} else {
this.lastTrackedMessage = p_248926_;
this.addEntry(p_250312_ ? new LastSeenTrackedEntry(p_248926_, true) : null);
return true;
}
}
private void addEntry(@Nullable LastSeenTrackedEntry p_250255_) {
int i = this.tail;
this.tail = (i + 1) % this.trackedMessages.length;
this.offset++;
this.trackedMessages[i] = p_250255_;
}
public void ignorePending(MessageSignature p_251020_) {
for (int i = 0; i < this.trackedMessages.length; i++) {
LastSeenTrackedEntry lastseentrackedentry = this.trackedMessages[i];
if (lastseentrackedentry != null && lastseentrackedentry.pending() && p_251020_.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 lastseenmessages$update = new LastSeenMessages.Update(i, bitset, lastseenmessages.computeChecksum());
return new LastSeenMessagesTracker.Update(lastseenmessages, lastseenmessages$update);
}
public int offset() {
return this.offset;
}
public record Update(LastSeenMessages lastSeen, LastSeenMessages.Update update) {
}
}