ChatReportContextBuilder.java
net.minecraft.client.multiplayer.chat.report.ChatReportContextBuilder
信息
- 全限定名:net.minecraft.client.multiplayer.chat.report.ChatReportContextBuilder
- 类型:public class
- 包:net.minecraft.client.multiplayer.chat.report
- 源码路径:src/main/java/net/minecraft/client/multiplayer/chat/report/ChatReportContextBuilder.java
- 起始行号:L20
- 职责:
TODO
字段/常量
-
leadingCount- 类型:
int - 修饰符:
private final - 源码定位:
L21 - 说明:
TODO
- 类型:
-
activeCollectors- 类型:
List<ChatReportContextBuilder.Collector> - 修饰符:
private final - 源码定位:
L22 - 说明:
TODO
- 类型:
内部类/嵌套类型
-
net.minecraft.client.multiplayer.chat.report.ChatReportContextBuilder.Collector- 类型:
class - 修饰符:
private - 源码定位:
L70 - 说明:
TODO
- 类型:
-
net.minecraft.client.multiplayer.chat.report.ChatReportContextBuilder.Handler- 类型:
interface - 修饰符:
public - 源码定位:
L112 - 说明:
TODO
- 类型:
构造器
public ChatReportContextBuilder(int leadingCount) @ L24
- 构造器名:ChatReportContextBuilder
- 源码定位:L24
- 修饰符:public
参数:
- leadingCount: int
说明:
TODO
方法
下面的方法块按源码顺序生成。
public void collectAllContext(ChatLog chatLog, IntCollection roots, ChatReportContextBuilder.Handler handler) @ L28
- 方法名:collectAllContext
- 源码定位:L28
- 返回类型:void
- 修饰符:public
参数:
- chatLog: ChatLog
- roots: IntCollection
- handler: ChatReportContextBuilder.Handler
说明:
TODO
public void trackContext(PlayerChatMessage message) @ L44
- 方法名:trackContext
- 源码定位:L44
- 返回类型:void
- 修饰符:public
参数:
- message: PlayerChatMessage
说明:
TODO
public boolean acceptContext(PlayerChatMessage message) @ L48
- 方法名:acceptContext
- 源码定位:L48
- 返回类型:boolean
- 修饰符:public
参数:
- message: PlayerChatMessage
说明:
TODO
public boolean isActive() @ L65
- 方法名:isActive
- 源码定位:L65
- 返回类型:boolean
- 修饰符:public
参数:
- 无
说明:
TODO
代码
@OnlyIn(Dist.CLIENT)
public class ChatReportContextBuilder {
private final int leadingCount;
private final List<ChatReportContextBuilder.Collector> activeCollectors = new ArrayList<>();
public ChatReportContextBuilder(int leadingCount) {
this.leadingCount = leadingCount;
}
public void collectAllContext(ChatLog chatLog, IntCollection roots, ChatReportContextBuilder.Handler handler) {
IntSortedSet uncollectedRoots = new IntRBTreeSet(roots);
for (int id = uncollectedRoots.lastInt(); id >= chatLog.start() && (this.isActive() || !uncollectedRoots.isEmpty()); id--) {
if (chatLog.lookup(id) instanceof LoggedChatMessage.Player event) {
boolean context = this.acceptContext(event.message());
if (uncollectedRoots.remove(id)) {
this.trackContext(event.message());
handler.accept(id, event);
} else if (context) {
handler.accept(id, event);
}
}
}
}
public void trackContext(PlayerChatMessage message) {
this.activeCollectors.add(new ChatReportContextBuilder.Collector(message));
}
public boolean acceptContext(PlayerChatMessage message) {
boolean collected = false;
Iterator<ChatReportContextBuilder.Collector> iterator = this.activeCollectors.iterator();
while (iterator.hasNext()) {
ChatReportContextBuilder.Collector collector = iterator.next();
if (collector.accept(message)) {
collected = true;
if (collector.isComplete()) {
iterator.remove();
}
}
}
return collected;
}
public boolean isActive() {
return !this.activeCollectors.isEmpty();
}
@OnlyIn(Dist.CLIENT)
private class Collector {
private final Set<MessageSignature> lastSeenSignatures;
private PlayerChatMessage lastChainMessage;
private boolean collectingChain;
private int count;
private Collector(PlayerChatMessage fromMessage) {
Objects.requireNonNull(ChatReportContextBuilder.this);
super();
this.collectingChain = true;
this.lastSeenSignatures = new ObjectOpenHashSet<>(fromMessage.signedBody().lastSeen().entries());
this.lastChainMessage = fromMessage;
}
private boolean accept(PlayerChatMessage message) {
if (message.equals(this.lastChainMessage)) {
return false;
} else {
boolean selected = this.lastSeenSignatures.remove(message.signature());
if (this.collectingChain && this.lastChainMessage.sender().equals(message.sender())) {
if (this.lastChainMessage.link().isDescendantOf(message.link())) {
selected = true;
this.lastChainMessage = message;
} else {
this.collectingChain = false;
}
}
if (selected) {
this.count++;
}
return selected;
}
}
private boolean isComplete() {
return this.count >= ChatReportContextBuilder.this.leadingCount || !this.collectingChain && this.lastSeenSignatures.isEmpty();
}
}
@OnlyIn(Dist.CLIENT)
public interface Handler {
void accept(int id, LoggedChatMessage.Player event);
}
}引用的其他类
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置: