LevelLoadTracker.java
net.minecraft.client.multiplayer.LevelLoadTracker
信息
- 全限定名:net.minecraft.client.multiplayer.LevelLoadTracker
- 类型:public class
- 包:net.minecraft.client.multiplayer
- 源码路径:src/main/java/net/minecraft/client/multiplayer/LevelLoadTracker.java
- 起始行号:L21
- 实现:LevelLoadListener
- 职责:
TODO
字段/常量
-
LOGGER- 类型:
Logger - 修饰符:
private static final - 源码定位:
L22 - 说明:
TODO
- 类型:
-
CLIENT_WAIT_TIMEOUT_MS- 类型:
long - 修饰符:
private static final - 源码定位:
L23 - 说明:
TODO
- 类型:
-
LEVEL_LOAD_CLOSE_DELAY_MS- 类型:
long - 修饰符:
public static final - 源码定位:
L24 - 说明:
TODO
- 类型:
-
serverProgressTracker- 类型:
LevelLoadProgressTracker - 修饰符:
private final - 源码定位:
L25 - 说明:
TODO
- 类型:
-
serverChunkStatusView- 类型:
ChunkLoadStatusView - 修饰符:
private - 源码定位:
L26 - 说明:
TODO
- 类型:
-
serverStage- 类型:
LevelLoadListener.Stage - 修饰符:
private volatile - 源码定位:
L27 - 说明:
TODO
- 类型:
-
clientState- 类型:
LevelLoadTracker.ClientState - 修饰符:
private - 源码定位:
L28 - 说明:
TODO
- 类型:
-
closeDelayMs- 类型:
long - 修饰符:
private final - 源码定位:
L29 - 说明:
TODO
- 类型:
内部类/嵌套类型
-
net.minecraft.client.multiplayer.LevelLoadTracker.ClientLevelReady- 类型:
record - 修饰符:
private - 源码定位:
L106 - 说明:
TODO
- 类型:
-
net.minecraft.client.multiplayer.LevelLoadTracker.ClientState- 类型:
interface - 修饰符:
private sealed - 源码定位:
L110 - 说明:
TODO
- 类型:
-
net.minecraft.client.multiplayer.LevelLoadTracker.WaitingForPlayerChunk- 类型:
record - 修饰符:
private - 源码定位:
L121 - 说明:
TODO
- 类型:
-
net.minecraft.client.multiplayer.LevelLoadTracker.WaitingForServer- 类型:
record - 修饰符:
private - 源码定位:
L142 - 说明:
TODO
- 类型:
构造器
public LevelLoadTracker() @ L31
- 构造器名:LevelLoadTracker
- 源码定位:L31
- 修饰符:public
参数:
- 无
说明:
TODO
public LevelLoadTracker(long closeDelayMs) @ L35
- 构造器名:LevelLoadTracker
- 源码定位:L35
- 修饰符:public
参数:
- closeDelayMs: long
说明:
TODO
方法
下面的方法块按源码顺序生成。
public void setServerChunkStatusView(ChunkLoadStatusView serverChunkStatusView) @ L39
- 方法名:setServerChunkStatusView
- 源码定位:L39
- 返回类型:void
- 修饰符:public
参数:
- serverChunkStatusView: ChunkLoadStatusView
说明:
TODO
public void startClientLoad(LocalPlayer player, ClientLevel level, LevelRenderer levelRenderer) @ L43
- 方法名:startClientLoad
- 源码定位:L43
- 返回类型:void
- 修饰符:public
参数:
- player: LocalPlayer
- level: ClientLevel
- levelRenderer: LevelRenderer
说明:
TODO
public void tickClientLoad() @ L47
- 方法名:tickClientLoad
- 源码定位:L47
- 返回类型:void
- 修饰符:public
参数:
- 无
说明:
TODO
public boolean isLevelReady() @ L53
- 方法名:isLevelReady
- 源码定位:L53
- 返回类型:boolean
- 修饰符:public
参数:
- 无
说明:
TODO
public void loadingPacketsReceived() @ L64
- 方法名:loadingPacketsReceived
- 源码定位:L64
- 返回类型:void
- 修饰符:public
参数:
- 无
说明:
TODO
public void start(LevelLoadListener.Stage stage, int totalChunks) @ L70
- 方法名:start
- 源码定位:L70
- 返回类型:void
- 修饰符:public
参数:
- stage: LevelLoadListener.Stage
- totalChunks: int
说明:
TODO
public void update(LevelLoadListener.Stage stage, int currentChunks, int totalChunks) @ L76
- 方法名:update
- 源码定位:L76
- 返回类型:void
- 修饰符:public
参数:
- stage: LevelLoadListener.Stage
- currentChunks: int
- totalChunks: int
说明:
TODO
public void finish(LevelLoadListener.Stage stage) @ L81
- 方法名:finish
- 源码定位:L81
- 返回类型:void
- 修饰符:public
参数:
- stage: LevelLoadListener.Stage
说明:
TODO
public void updateFocus(ResourceKey<Level> dimension, ChunkPos chunkPos) @ L86
- 方法名:updateFocus
- 源码定位:L86
- 返回类型:void
- 修饰符:public
参数:
- dimension: ResourceKey
- chunkPos: ChunkPos
说明:
TODO
public ChunkLoadStatusView statusView() @ L93
- 方法名:statusView
- 源码定位:L93
- 返回类型:ChunkLoadStatusView
- 修饰符:public
参数:
- 无
说明:
TODO
public float serverProgress() @ L97
- 方法名:serverProgress
- 源码定位:L97
- 返回类型:float
- 修饰符:public
参数:
- 无
说明:
TODO
public boolean hasProgress() @ L101
- 方法名:hasProgress
- 源码定位:L101
- 返回类型:boolean
- 修饰符:public
参数:
- 无
说明:
TODO
代码
@OnlyIn(Dist.CLIENT)
public class LevelLoadTracker implements LevelLoadListener {
private static final Logger LOGGER = LogUtils.getLogger();
private static final long CLIENT_WAIT_TIMEOUT_MS = TimeUnit.SECONDS.toMillis(30L);
public static final long LEVEL_LOAD_CLOSE_DELAY_MS = 500L;
private final LevelLoadProgressTracker serverProgressTracker = new LevelLoadProgressTracker(true);
private @Nullable ChunkLoadStatusView serverChunkStatusView;
private volatile LevelLoadListener.@Nullable Stage serverStage;
private LevelLoadTracker.@Nullable ClientState clientState;
private final long closeDelayMs;
public LevelLoadTracker() {
this(0L);
}
public LevelLoadTracker(long closeDelayMs) {
this.closeDelayMs = closeDelayMs;
}
public void setServerChunkStatusView(ChunkLoadStatusView serverChunkStatusView) {
this.serverChunkStatusView = serverChunkStatusView;
}
public void startClientLoad(LocalPlayer player, ClientLevel level, LevelRenderer levelRenderer) {
this.clientState = new LevelLoadTracker.WaitingForServer(player, level, levelRenderer, Util.getMillis() + CLIENT_WAIT_TIMEOUT_MS);
}
public void tickClientLoad() {
if (this.clientState != null) {
this.clientState = this.clientState.tick();
}
}
public boolean isLevelReady() {
if (this.clientState instanceof LevelLoadTracker.ClientLevelReady(long var10)) {
long var5 = var10;
if (true && Util.getMillis() >= var5 + this.closeDelayMs) {
return true;
}
}
return false;
}
public void loadingPacketsReceived() {
if (this.clientState != null) {
this.clientState = this.clientState.loadingPacketsReceived();
}
}
@Override
public void start(LevelLoadListener.Stage stage, int totalChunks) {
this.serverProgressTracker.start(stage, totalChunks);
this.serverStage = stage;
}
@Override
public void update(LevelLoadListener.Stage stage, int currentChunks, int totalChunks) {
this.serverProgressTracker.update(stage, currentChunks, totalChunks);
}
@Override
public void finish(LevelLoadListener.Stage stage) {
this.serverProgressTracker.finish(stage);
}
@Override
public void updateFocus(ResourceKey<Level> dimension, ChunkPos chunkPos) {
if (this.serverChunkStatusView != null) {
this.serverChunkStatusView.moveTo(dimension, chunkPos);
}
}
public @Nullable ChunkLoadStatusView statusView() {
return this.serverChunkStatusView;
}
public float serverProgress() {
return this.serverProgressTracker.get();
}
public boolean hasProgress() {
return this.serverStage != null;
}
@OnlyIn(Dist.CLIENT)
private record ClientLevelReady(long readyAt) implements LevelLoadTracker.ClientState {
}
@OnlyIn(Dist.CLIENT)
private sealed interface ClientState permits LevelLoadTracker.WaitingForServer, LevelLoadTracker.WaitingForPlayerChunk, LevelLoadTracker.ClientLevelReady {
default LevelLoadTracker.ClientState tick() {
return this;
}
default LevelLoadTracker.ClientState loadingPacketsReceived() {
return this;
}
}
@OnlyIn(Dist.CLIENT)
private record WaitingForPlayerChunk(LocalPlayer player, ClientLevel level, LevelRenderer levelRenderer, long timeoutAfter)
implements LevelLoadTracker.ClientState {
@Override
public LevelLoadTracker.ClientState tick() {
return (LevelLoadTracker.ClientState)(this.isReady() ? new LevelLoadTracker.ClientLevelReady(Util.getMillis()) : this);
}
private boolean isReady() {
if (Util.getMillis() > this.timeoutAfter) {
LevelLoadTracker.LOGGER.warn("Timed out while waiting for the client to load chunks, letting the player into the world anyway");
return true;
} else {
BlockPos playerPos = this.player.blockPosition();
return !this.level.isOutsideBuildHeight(playerPos.getY()) && !this.player.isSpectator() && this.player.isAlive()
? this.levelRenderer.isSectionCompiledAndVisible(playerPos)
: true;
}
}
}
@OnlyIn(Dist.CLIENT)
private record WaitingForServer(LocalPlayer player, ClientLevel level, LevelRenderer levelRenderer, long timeoutAfter)
implements LevelLoadTracker.ClientState {
@Override
public LevelLoadTracker.ClientState loadingPacketsReceived() {
return new LevelLoadTracker.WaitingForPlayerChunk(this.player, this.level, this.levelRenderer, this.timeoutAfter);
}
}
}引用的其他类
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数/字段/返回值
- 引用位置:
-
- 引用位置:
参数/字段/实现
- 引用位置:
-
- 引用位置:
字段/构造调用 - 关联成员:
LevelLoadProgressTracker()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Util.getMillis()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置: