网络与封包

基本信息

属性 值
通道名 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)。

相关条目