网络处理器

基本信息

属性 值
类 com.gtnewhorizon.gtnhlib.network.NetworkHandler
源码 src/main/java/com/gtnewhorizon/gtnhlib/network/(11 个类)
初始化 NetworkHandler.init(),由 CommonProxy.init() 调用(CommonProxy.java:108)
通道数 1
注册的数据包 7

功能

统一的 SimpleNetworkWrapper 通道,服务端 → 客户端 6 个,服务端 ← 客户端 1 个。

NetworkHandler.init() 全文(network/NetworkHandler.java:14-23):

public static void init() {
    instance.toClient(new PacketMessageAboveHotbar());
    instance.toClient(new PacketSyncConfig());
    instance.toClient(new PacketViewDistance());
    instance.toClient(new MessageTitle());
    instance.toClient(new TeamInfoSync());
    instance.toClient(new TeamDataSync());

    instance.toServer(new PacketKeyDown());
}

数据包清单

数据包 方向 类 用途
PacketMessageAboveHotbar → 客户端 network/PacketMessageAboveHotbar.java 快捷栏上方显示消息(sendMessageAboveHotbar)
PacketSyncConfig → 客户端 config/PacketSyncConfig.java 把服务端配置项推给客户端(@Config.Sync)
PacketViewDistance → 客户端 network/PacketViewDistance.java 玩家加入时下发服务端视距
MessageTitle → 客户端 network/MessageTitle.java 标题覆盖层数据
TeamInfoSync → 客户端 network/teams/TeamInfoSync.java 队伍信息同步
TeamDataSync → 客户端 network/teams/TeamDataSync.java 队伍自定义数据同步
PacketKeyDown ← 服务端 keybind/PacketKeyDown.java 同步按键状态

PacketViewDistance 的下发点是 CommonProxy.onPlayerLogin(CommonProxy.java:197-202),在玩家加入时读取 MinecraftServer.getServer().getConfigurationManager().getViewDistance()。

sendMessageAboveHotbar 对 FakePlayer 直接返回不发包(CommonProxy.java:192):

if (player instanceof FakePlayer) return;

避免合成器等 FakePlayer 触发 HUD 消息。

底座

network/base/ 下 3 个类构成自研通道封装:

类 角色
NetworkChannel 通道封装,提供 toClient / toServer 便捷方法
IPacket 数据包接口
NetworkUtils 工具方法

NetworkHandler.instance 为单例静态字段,7 个数据包通过 toClient(IPacket) / toServer(IPacket) 注册。

数值

数值名 值
通道数 1
→ 客户端 数据包 6
← 服务端 数据包 1
network 包类数 11(含 base 3 个、teams 2 个)
初始化的生命周期阶段 init(CommonProxy.init())

交互

PacketKeyDown 是唯一的上行包,配合 keybind/SyncedKeybind 实现"服务端也能读到该键是否按下"。GTNHLib 自身只在反混淆开发环境下注册一个测试键位(CommonProxy.java:111-114):

if ((boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment")) {
    SyncedKeybind.createConfigurable("gtnhlib.test_keybind", "debug", 0).registerGlobalListener(...);
}

生产环境不注册测试键位,但 SyncedKeybind API 对下游 mod 可用 —— 例如 ae2stuff 的模式切换键位即基于它。

相关条目