P2PCache(appeng.me.cache.P2PCache)
基本信息
| 属性 | 值 |
|---|---|
| 源码 | appeng/me/cache/P2PCache.java |
| 类声明行号 | 33 |
| 实现接口 | 无(直接实现 IGridCache) |
| 注册 | core/Registration.java:548,键与实现同为 P2PCache.class |
职责
P2P 隧道的频率索引。回答两个问题: 「频率 F 上有哪些输出隧道(且是这一类的)?」「频率 F 的输入隧道是哪个?」
查询 API
| 方法 | 行号 | 说明 |
|---|---|---|
getOutputs(long freq, Class<? extends PartP2PTunnel> c) |
170 | 返回 TunnelCollection<PartP2PTunnel>,按类型过滤 |
getInput(long freq) |
184 | 返回单个 PartP2PTunnel,可为 null |
unbind(PartP2PTunnel) |
160 | 解绑 |
updateFreq(PartP2PTunnel, long newFrequency) |
145 | 改频 |
事件订阅
两个 bootComplete 重载:
| 方法 | 行号 | 事件 |
|---|---|---|
bootComplete(MENetworkBootingStatusChange) |
45 | 启动进度 |
bootComplete(MENetworkPowerStatusChange) |
55 | 供电状态 |
节点收集
addNode(:90)与 removeNode(:68)有实现;onUpdateTick(:65)是
空 {} —— P2P 缓存不参与 tick。
三个钩子刻意为空
onSplit(:112)、onJoin(:115)、populateGridStorage(:118)
都是空 {}。P2P 隧道是硬连接语义:频率绑定由隧道 part 自己的 NBT 承担,
拆网时两侧各自重建索引,不走存储复制。
配套数据结构(me/cache/helpers/)
| 类 | 行号 | 作用 |
|---|---|---|
TunnelCollection<T extends PartP2PTunnel> |
TunnelCollection.java:19 |
Iterable,按类型过滤;matches(:45)/ getClz(:49) |
TunnelIterator<T extends PartP2PTunnel> |
TunnelIterator.java:18 |
同上过滤语义的迭代器 |
TunnelConnection |
TunnelConnection.java:16 |
一对 (PartP2PTunnelME, IGridConnection) |
Connections |
Connections.java:21 |
延迟建链批处理器,IWorldCallable<Void> |
Connections 是 P2P 的关键时序设计:markCreate()(:44)/
markDestroy()(:39)只打标记,真正的建链/拆链由
PartP2PTunnelME.updateConnections(Connections)(parts/p2p/PartP2PTunnelME.java:141)
在正确时机统一执行,避免建链过程中的半连接状态。
隧道 part 与 AEFeature 的对应
| part | 条目 | 开关 |
|---|---|---|
| ME P2P | P2P 隧道(ME) | AEFeature.P2PTunnelME |
| 物品 P2P | P2P 隧道(物品) | AEFeature.P2PTunnelItems |
| 流体 P2P | P2P 隧道(流体) | AEFeature.P2PTunnelLiquids |
| 压力 P2P | P2P 隧道(压力) | AEFeature.P2PTunnelPressure |
| 开放计算机 P2P | P2P 隧道(开放计算机) | AEFeature.P2PTunnelOpenComputers |
P2P 通道的注册不在 me/ 也不在 integration/,而在
core/features/registries/P2PTunnelRegistry.java(不在本分片)。