网络与封包
基本信息
| 属性 | 值 |
|---|---|
| 通道名 | IC2NC(network/ChannelHandler.java:27) |
| 网络类型 | SimpleNetworkWrapper(NetworkRegistry.INSTANCE.newSimpleChannel,ChannelHandler.java:27) |
| 封包类数量 | 18(ls network/message/*.java | wc -l) |
| 注册封包数 | 20(ID 1–20,部分封包注册两向) |
| 初始化时机 | preInit,ChannelHandler.init()(IC2NuclearControl.java:189) |
| GUI 处理器注册 | NetworkRegistry.INSTANCE.registerGuiHandler(instance, proxy)(IC2NuclearControl.java:198) |
全部封包
| ID | 封包类 | 方向 | 引用 |
|---|---|---|---|
| 1 | PacketAlarm |
→ CLIENT | ChannelHandler.java:30 |
| 2 | PacketSensor |
→ CLIENT | ChannelHandler.java:31 |
| 3 | PacketSensorTitle |
→ CLIENT | ChannelHandler.java:32 |
| 4 | PacketChat |
→ CLIENT | ChannelHandler.java:33 |
| 5 | PacketEncounter |
→ CLIENT | ChannelHandler.java:34 |
| 6 | PacketAcounter |
→ CLIENT | ChannelHandler.java:35 |
| 7 | PacketClientSound |
→ SERVER | ChannelHandler.java:36 |
| 8 | PacketClientRequest |
→ SERVER | ChannelHandler.java:37 |
| 9 | PacketDispSettingsAll |
→ CLIENT | ChannelHandler.java:38 |
| 10 | PacketDispSettingsUpdate |
→ CLIENT | ChannelHandler.java:39 |
| 11 | PacketClientRangeTrigger |
→ SERVER | ChannelHandler.java:40 |
| 12 | PacketClientSensor |
→ SERVER | ChannelHandler.java:41 |
| 13 | PacketClientColor |
→ SERVER | ChannelHandler.java:42 |
| 14 | PacketClientDisplaySettings |
→ SERVER | ChannelHandler.java:43 |
| 15 | PacketServerUpdate |
→ SERVER | ChannelHandler.java:44 |
| 16 | PacketClientRemoteMonitor |
→ CLIENT | ChannelHandler.java:45-49 |
| 17 | PacketDataSorter |
→ CLIENT | ChannelHandler.java:50 |
| 18 | PacketDataSorter |
→ SERVER | ChannelHandler.java:51 |
| 19 | PacketDataSorterSync |
→ CLIENT | ChannelHandler.java:52 |
| 20 | PacketDataSorterSync |
→ SERVER | ChannelHandler.java:53 |
封包类文件为 18 个而注册条目为 20 个,差异来自双向注册:PacketDataSorter(ID 17/18)与 PacketDataSorterSync(ID 19/20)各注册两次,PacketServerUpdate(ID 15)与 PacketClientRemoteMonitor(ID 16)使用内部 Handler 类注册(ChannelHandler.java:44,46)。
GUI 打开流程
GUI ID 即子方块的 metadata(见 核控主方块),由 BlockNuclearControlMain.onBlockActivated 传入(BlockNuclearControlMain.java:443)。两个代理各实现一半分派逻辑:
服务端(CommonProxy.getServerGuiElement,CommonProxy.java:46-57):
if (ID == GuiRemoteMonitor.REMOTEMONITOR_GUI) {
return new ContainerRemoteMonitor(player.inventory, player.getHeldItem(),
new InventoryItem(player.getHeldItem()));
}
Subblock block = IC2NuclearControl.blockNuclearControlMain.getSubblock(ID);
if (block == null) return null;
return block.getServerGuiElement(world.getTileEntity(x, y, z), player);
客户端(ClientProxy.getClientGuiElement,ClientProxy.java:85-97)逻辑对称,末尾调用 block.getClientGuiElement(tileEntity, player)。
GuiRemoteMonitor.REMOTEMONITOR_GUI 是便携屏专用的保留 GUI ID,与 metadata 命名空间区分开。客户端渲染侧还注册了方块渲染器 MainBlockRenderer(modelId)(ClientProxy.java:82)。
容器
containers/ 下共 8 个容器类:ContainerAdvancedInfoPanel、ContainerAverageCounter、ContainerEmpty、ContainerEnergyCounter、ContainerInfoPanel、ContainerRangeTrigger、ContainerRemoteMonitor、ContainerRemoteThermo。ContainerEmpty 被温度监控器与两个警报器使用 —— 它们有 GUI 但没有槽位(ThermalMonitor.java:62、IndustrialAlarm.java:70、HowlerAlarm.java:59)。