LastSeenMessagesValidator.java

net.minecraft.network.chat.LastSeenMessagesValidator

信息

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

    TODO

字段/常量

  • lastSeenCount

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

      TODO

  • trackedMessages

    • 类型: ObjectList<LastSeenTrackedEntry>
    • 修饰符: private final
    • 源码定位: L9
    • 说明:

      TODO

  • lastPendingMessage

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

      TODO

内部类/嵌套类型

  • net.minecraft.network.chat.LastSeenMessagesValidator.ValidationException
    • 类型: class
    • 修饰符: public static
    • 源码定位: L80
    • 说明:

      TODO

构造器

public LastSeenMessagesValidator(int lastSeenCount) @ L12

  • 构造器名:LastSeenMessagesValidator
  • 源码定位:L12
  • 修饰符:public

参数:

  • lastSeenCount: int

说明:

TODO

方法

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

public void addPending(MessageSignature message) @ L20

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

参数:

  • message: MessageSignature

说明:

TODO

public int trackedMessagesCount() @ L27

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

参数:

说明:

TODO

public void applyOffset(int offset) @ L31

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

参数:

  • offset: int

说明:

TODO

public LastSeenMessages applyUpdate(LastSeenMessages.Update update) @ L40

  • 方法名:applyUpdate
  • 源码定位:L40
  • 返回类型:LastSeenMessages
  • 修饰符:public

参数:

  • update: LastSeenMessages.Update

说明:

TODO

代码

public class LastSeenMessagesValidator {
    private final int lastSeenCount;
    private final ObjectList<LastSeenTrackedEntry> trackedMessages = new ObjectArrayList<>();
    private @Nullable MessageSignature lastPendingMessage;
 
    public LastSeenMessagesValidator(int lastSeenCount) {
        this.lastSeenCount = lastSeenCount;
 
        for (int i = 0; i < lastSeenCount; i++) {
            this.trackedMessages.add(null);
        }
    }
 
    public void addPending(MessageSignature message) {
        if (!message.equals(this.lastPendingMessage)) {
            this.trackedMessages.add(new LastSeenTrackedEntry(message, true));
            this.lastPendingMessage = message;
        }
    }
 
    public int trackedMessagesCount() {
        return this.trackedMessages.size();
    }
 
    public void applyOffset(int offset) throws LastSeenMessagesValidator.ValidationException {
        int maxOffset = this.trackedMessages.size() - this.lastSeenCount;
        if (offset >= 0 && offset <= maxOffset) {
            this.trackedMessages.removeElements(0, offset);
        } else {
            throw new LastSeenMessagesValidator.ValidationException("Advanced last seen window by " + offset + " messages, but expected at most " + maxOffset);
        }
    }
 
    public LastSeenMessages applyUpdate(LastSeenMessages.Update update) throws LastSeenMessagesValidator.ValidationException {
        this.applyOffset(update.offset());
        ObjectList<MessageSignature> lastSeenEntries = new ObjectArrayList<>(update.acknowledged().cardinality());
        if (update.acknowledged().length() > this.lastSeenCount) {
            throw new LastSeenMessagesValidator.ValidationException(
                "Last seen update contained " + update.acknowledged().length() + " messages, but maximum window size is " + this.lastSeenCount
            );
        } else {
            for (int i = 0; i < this.lastSeenCount; i++) {
                boolean acknowledged = update.acknowledged().get(i);
                LastSeenTrackedEntry message = this.trackedMessages.get(i);
                if (acknowledged) {
                    if (message == null) {
                        throw new LastSeenMessagesValidator.ValidationException(
                            "Last seen update acknowledged unknown or previously ignored message at index " + i
                        );
                    }
 
                    this.trackedMessages.set(i, message.acknowledge());
                    lastSeenEntries.add(message.signature());
                } else {
                    if (message != null && !message.pending()) {
                        throw new LastSeenMessagesValidator.ValidationException(
                            "Last seen update ignored previously acknowledged message at index " + i + " and signature " + message.signature()
                        );
                    }
 
                    this.trackedMessages.set(i, null);
                }
            }
 
            LastSeenMessages lastSeen = new LastSeenMessages(lastSeenEntries);
            if (!update.verifyChecksum(lastSeen)) {
                throw new LastSeenMessagesValidator.ValidationException("Checksum mismatch on last seen update: the client and server must have desynced");
            } else {
                return lastSeen;
            }
        }
    }
 
    public static class ValidationException extends Exception {
        public ValidationException(String message) {
            super(message);
        }
    }
}

引用的其他类