FabricMC 1.19.2如何获取服务器延迟?开发Ping悬浮窗模组遇空指针异常
FabricMC 1.19.2 Ping悬浮窗模组空指针问题解决
问题根源
你碰到的this.client is null空指针异常,核心原因是调用MinecraftClient.getInstance()时客户端实例还没完成初始化,或是在非客户端主线程、不合适的生命周期节点执行了这段代码。另外原代码没有逐层判空,哪怕客户端实例不为null,玩家对象、网络处理器或玩家列表条目也可能为空,同样会触发NPE。
解决步骤
绑定正确的客户端事件
必须在客户端完全初始化后的时机执行代码,比如使用HudRenderCallback.EVENT——这个事件在客户端每帧渲染HUD时触发,此时客户端实例、玩家对象都处于就绪状态。逐层判空规避NPE
依次检查MinecraftClient、player、networkHandler、playerListEntry是否非null,再调用getLatency()获取延迟值。
示例代码
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; public class PingHudMod implements ClientModInitializer { @Override public void onInitializeClient() { // 注册HUD渲染回调事件 HudRenderCallback.EVENT.register(this::renderPingDisplay); } private void renderPingDisplay(DrawContext drawContext, float tickDelta) { MinecraftClient client = MinecraftClient.getInstance(); // 逐层判空:未初始化客户端、未进入游戏、无网络连接时直接返回 if (client == null || client.player == null || client.player.networkHandler == null) { return; } // 获取当前玩家的延迟值 int ping = client.player.networkHandler.getPlayerListEntry(client.player.getUuid()).getLatency(); // 在屏幕右上角绘制Ping文本(坐标可自行调整) drawContext.drawText(client.textRenderer, "Ping: " + ping, client.getWindow().getScaledWidth() - 60, 10, 0xFFFFFF, true); } }
额外注意点
- 确保模组类实现
ClientModInitializer而非普通的ModInitializer,保证代码只在客户端环境运行。 - 如果在其他事件(比如按键触发)中获取Ping值,同样要先完成所有必要的空值检查。
- 1.19+版本绘制HUD需使用
DrawContextAPI,不要直接操作旧版的MatrixStack。
内容的提问来源于stack exchange,提问作者R0K0R lee
相关产品推荐
相关产品推荐

