网络处理器
基本信息
| 属性 | 值 |
|---|---|
| 类 | 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 的模式切换键位即基于它。