LastSeenMessagesTracker.java

net.minecraft.network.chat.LastSeenMessagesTracker

信息

  • 全限定名:net.minecraft.network.chat.LastSeenMessagesTracker
  • 类型:public class
  • 包:net.minecraft.network.chat
  • 源码路径:src/main/java/net/minecraft/network/chat/LastSeenMessagesTracker.java
  • 起始行号:L9
  • 职责:

    TODO

字段/常量

  • trackedMessages

    • 类型: LastSeenTrackedEntry[]
    • 修饰符: private final
    • 源码定位: L10
    • 说明:

      TODO

  • tail

    • 类型: int
    • 修饰符: private
    • 源码定位: L11
    • 说明:

      TODO

  • offset

    • 类型: int
    • 修饰符: private
    • 源码定位: L12
    • 说明:

      TODO

  • lastTrackedMessage

    • 类型: MessageSignature
    • 修饰符: private
    • 源码定位: L13
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.network.chat.LastSeenMessagesTracker.Update
    • 类型: record
    • 修饰符: public
    • 源码定位: L76
    • 说明:

      TODO

构造器

public LastSeenMessagesTracker(int lastSeenCount) @ L15

  • 构造器名:LastSeenMessagesTracker
  • 源码定位:L15
  • 修饰符:public

参数:

  • lastSeenCount: int

说明:

TODO

方法

下面的方法块按源码顺序生成。

public boolean addPending(MessageSignature message, boolean wasShown) @ L19

  • 方法名:addPending
  • 源码定位:L19
  • 返回类型:boolean
  • 修饰符:public

参数:

  • message: MessageSignature
  • wasShown: boolean

说明:

TODO

private void addEntry(LastSeenTrackedEntry entry) @ L29

  • 方法名:addEntry
  • 源码定位:L29
  • 返回类型:void
  • 修饰符:private

参数:

  • entry: LastSeenTrackedEntry

说明:

TODO

public void ignorePending(MessageSignature pendingMessage) @ L36

  • 方法名:ignorePending
  • 源码定位:L36
  • 返回类型:void
  • 修饰符:public

参数:

  • pendingMessage: MessageSignature

说明:

TODO

public int getAndClearOffset() @ L46

  • 方法名:getAndClearOffset
  • 源码定位:L46
  • 返回类型:int
  • 修饰符:public

参数:

说明:

TODO

public LastSeenMessagesTracker.Update generateAndApplyUpdate() @ L52

  • 方法名:generateAndApplyUpdate
  • 源码定位:L52
  • 返回类型:LastSeenMessagesTracker.Update
  • 修饰符:public

参数:

说明:

TODO

public int offset() @ L72

  • 方法名:offset
  • 源码定位:L72
  • 返回类型:int
  • 修饰符:public

参数:

说明:

TODO

代码

public class LastSeenMessagesTracker {
    private final @Nullable LastSeenTrackedEntry[] trackedMessages;
    private int tail;
    private int offset;
    private @Nullable MessageSignature lastTrackedMessage;
 
    public LastSeenMessagesTracker(int lastSeenCount) {
        this.trackedMessages = new LastSeenTrackedEntry[lastSeenCount];
    }
 
    public boolean addPending(MessageSignature message, boolean wasShown) {
        if (Objects.equals(message, this.lastTrackedMessage)) {
            return false;
        } else {
            this.lastTrackedMessage = message;
            this.addEntry(wasShown ? new LastSeenTrackedEntry(message, true) : null);
            return true;
        }
    }
 
    private void addEntry(@Nullable LastSeenTrackedEntry entry) {
        int index = this.tail;
        this.tail = (index + 1) % this.trackedMessages.length;
        this.offset++;
        this.trackedMessages[index] = entry;
    }
 
    public void ignorePending(MessageSignature pendingMessage) {
        for (int i = 0; i < this.trackedMessages.length; i++) {
            LastSeenTrackedEntry entry = this.trackedMessages[i];
            if (entry != null && entry.pending() && pendingMessage.equals(entry.signature())) {
                this.trackedMessages[i] = null;
                break;
            }
        }
    }
 
    public int getAndClearOffset() {
        int originalOffset = this.offset;
        this.offset = 0;
        return originalOffset;
    }
 
    public LastSeenMessagesTracker.Update generateAndApplyUpdate() {
        int offset = this.getAndClearOffset();
        BitSet acknowledged = new BitSet(this.trackedMessages.length);
        ObjectList<MessageSignature> lastSeenEntries = new ObjectArrayList<>(this.trackedMessages.length);
 
        for (int i = 0; i < this.trackedMessages.length; i++) {
            int index = (this.tail + i) % this.trackedMessages.length;
            LastSeenTrackedEntry message = this.trackedMessages[index];
            if (message != null) {
                acknowledged.set(i, true);
                lastSeenEntries.add(message.signature());
                this.trackedMessages[index] = message.acknowledge();
            }
        }
 
        LastSeenMessages lastSeen = new LastSeenMessages(lastSeenEntries);
        LastSeenMessages.Update update = new LastSeenMessages.Update(offset, acknowledged, lastSeen.computeChecksum());
        return new LastSeenMessagesTracker.Update(lastSeen, update);
    }
 
    public int offset() {
        return this.offset;
    }
 
    public record Update(LastSeenMessages lastSeen, LastSeenMessages.Update update) {
    }
}

引用的其他类

  • LastSeenMessages

    • 引用位置: 方法调用/构造调用
    • 关联成员: LastSeenMessages(), LastSeenMessages.Update(), Update()
  • LastSeenTrackedEntry

    • 引用位置: 参数/字段/构造调用
    • 关联成员: LastSeenTrackedEntry()
  • MessageSignature

    • 引用位置: 参数/字段