CubicChunks 网络通道
基本信息
| 属性 | 值 |
|---|---|
| 通道名 | cubicchunks1(CubicChunks.MODID + "1") |
| 通道类 | com.cardinalstar.cubicchunks.network.NetworkChannel |
| 编解码器 | MessageToMessageCodec<FMLProxyPacket, CCPacket> |
| 封包条目数 | 8(CCPacketEntry 枚举常量) |
| 封包接口 | CCPacketEncoder<CCPacket> |
| 初始化时机 | CubicChunks.init → NetworkChannel.init()(CubicChunks.java:181) |
功能
NetworkChannel 是整个模组唯一的 FML 网络通道。它继承 MessageToMessageCodec<FMLProxyPacket, CCPacket>,在 init()(由 NetworkChannel.init() 强制类加载,CubicChunks.java:181 → NetworkChannel.java:65-67)时通过 NetworkRegistry.INSTANCE.newChannel(...) 建立双向通道(NetworkChannel.java:38)。
每帧编码时先写 1 字节封包 ID,再由对应 CCPacketEncoder 写入包体,最后包进 FMLProxyPacket(NetworkChannel.java:72-84);解码时先读 ID 再派发(:86-98)。构造器会用各 encoder 的 getPacketID() 最大值分配数组,并在 ID 冲突时抛 IllegalArgumentException("Duplicate Packet ID! ...")(NetworkChannel.java:41-59)。
发送方法共 5 个:发给单个玩家 sendToPlayer(:100)、以玩家为中心的 sendToAllAround(:117)、发给全部 sendToAll(:128)、发给服务器 sendToServer(:137)、以及按世界与水平范围发包 sendPacketToAllPlayersInRange(:146)。
数值
8 个封包(network/CCPacketEntry.java:5-12):
| 枚举常量 | 编码器 | 用途 |
|---|---|---|
Cube |
PacketEncoderCube |
整块立方体方块数据 |
Column |
PacketEncoderColumn |
整列数据 |
UnloadColumn |
PacketEncoderUnloadColumn |
卸载一列 |
UnloadCube |
PacketEncoderUnloadCube |
卸载一个立方体 |
CubeBlockChange |
PacketEncoderCubeBlockChange |
单个方块变更 |
HeightMapUpdate |
PacketEncoderHeightMapUpdate |
高度图更新 |
CubeSkyLightUpdates |
PacketEncoderCubeSkyLightUpdates |
天空光照批量更新 |
WorldHeight |
PacketEncoderWorldHeight |
世界高度同步 |
| 数值名 | 值 | 来源 |
|---|---|---|
| 封包总数 | 8 | CCPacketEntry.java:5-12 |
| 通道名 | cubicchunks1 |
NetworkChannel.java:38 |
配套的编解码辅助类位于 network/:CCPacket、CCPacketBuffer、CCPacketEncoder、PacketEncoderColumn、PacketEncoderCube、PacketEncoderCubeBlockChange、PacketEncoderCubeSkyLightUpdates、PacketEncoderHeightMapUpdate、PacketEncoderUnloadColumn、PacketEncoderUnloadCube、PacketEncoderWorldHeight、WorldEncoder;加入/重生同步接口为 ICubicJoinGamePacket 与 ICubicRespawnPacket。服务端侧的分发逻辑在 server/VanillaNetworkHandler.java,另有 server/WorldSyncStateMachine.java。
交互
| 触发 | 行为 |
|---|---|
| 客户端进入服务器 | 通过 WorldHeight 等封包同步世界高度与已加载立方体 |
| 立方体被加载 | 服务端发 Cube / Column 封包 |
| 立方体被卸载 | 服务端发 UnloadCube / UnloadColumn 封包 |
| 方块被放置或破坏 | 发 CubeBlockChange |
| 高度图变化 | 发 HeightMapUpdate |
| AE2 区块段重发 | 经 MIXIN_AE2_PLATFORM_SEND_CHUNK 改走立方体同步协议(mixin/Mixins.java) |