me/ 多方块集群(cluster)
覆盖范围
appeng.me.cluster 包 + appeng.me.cluster.implementations 包,9 个 .java 文件。
实测:find me/cluster -name '*.java' | wc -l = 10
(cluster/ 根 3 + cluster/implementations/ 7),其中
CraftingCpuDiagnostics.java 归入 diagnostics 维度,
故本维度叙述 9 个类,另有 1 个源文件归入 diagnostics 维度。
精确说明:
me/cluster/与me/cluster/implementations/实际共 10 个文件。 本条目把CraftingCpuDiagnostics.java归入me/diagnostics维度叙述 (它服务于加工诊断而非多方块几何),因此本维度的类为 9 个:cluster/根 3 +implementations/6。
抽象层(me/cluster/ 根,3 个)
| 文件 | 行号 | 职责 |
|---|---|---|
IAECluster.java |
17 | 接口。一组 tile 构成的已成形多方块 |
IAEMultiBlock.java |
13 | 接口。一个能长成多方块的方块(起点) |
MBCalculator.java |
21 | 抽象类。几何算法模板:找包围盒 → 校验 → 建/复用 cluster → 回写 tile |
MBCalculator 的模板方法
MBCalculator.java:29-102 calculateMultiblock(World, WorldCoord) 是唯一的
具体流程,四个抽象方法由子类填:
| 抽象方法 | 行号 | 职责 |
|---|---|---|
checkMultiblockScale(WorldCoord min, WorldCoord max) |
104 | 尺寸对不对 |
createCluster(World, min, max) |
124 | 造新 cluster |
verifyInternalStructure(World, min, max) |
130 | 内部结构对不对 |
updateTiles(IAECluster, World, min, max) |
145 | 把 cluster 写回各 tile |
isValidTile(TileEntity) |
153 | 这个 tile 算不算成员 |
disconnect() |
135 | 解散 |
matchesExistingCluster(IAECluster, min, max) |
126 | protected,是否可复用已有 cluster |
matchesExistingCluster 不是抽象 —— SpatialPylonCalculator 覆写了它
(SpatialPylonCalculator.java:47),其余直接用基类实现。
三个实现(me/cluster/implementations/)
| 类 | 源文件:行 | 处理的方块 | 目标 | 判据(isValidTile 实现体) |
|---|---|---|---|---|
CraftingCPUCalculator |
29 | 加工单元 | CPU 多方块 | te instanceof TileCraftingTile(:123);产出 CraftingCPUCluster(:52) |
QuantumCalculator |
27 | 量子链接舱 / 量子环 | 量子桥 | te instanceof TileQuantumBridge(:125);产出 QuantumCluster(:52) |
SpatialPylonCalculator |
23 | 空间柱 | 空间 IO 多方块 | te instanceof TileSpatialPylon(:91);产出 SpatialPylonCluster(:40) |
CraftingCPUCluster |
138 | — | — | implements IAECluster, ICraftingCPU(双重身份) |
QuantumCluster |
38 | — | — | implements ILocatable, IAECluster |
SpatialPylonCluster |
22 | — | — | implements IAECluster |
三个 cluster 的差异
| 维度 | CraftingCPUCluster |
QuantumCluster |
SpatialPylonCluster |
|---|---|---|---|
| 构造器 | :234 (WorldCoord, WorldCoord) |
:51 同 |
:32 (DimensionalCoord, DimensionalCoord) |
| 坐标系 | WorldCoord(单维度) |
WorldCoord |
DimensionalCoord(跨维度) |
| 额外接口 | ICraftingCPU |
ILocatable |
无 |
| 有监听者机制 | ✅ addOnCompleteListener(:270)、addOnCancelListener(:275)、addCraftingUpdateListener(:280) |
❌ | ❌ |
| 世界卸载处理 | 无专门钩子 | onUnload(WorldEvent.Unload)(:58) |
无 |
| 效率计算 | 无 | updateStatus(:66) |
getCurrentAxis()(:76)、isValid()(:84) |
⚠️ 只有 SpatialPylonCluster 用 DimensionalCoord —— 空间柱是唯一跨维度多方块。
QuantumCluster 特殊之处:它会建网格边
QuantumCluster.java:127 直接调
AEApi.instance().createGridConnection(sideA.getNode(), sideB.getNode())。
这是全仓库 6 个 createGridConnection 调用点之一
(接口 appeng/api/IAppEngApi.java:94,实现 core/Api.java:109):
| 调用点 | 场景 |
|---|---|
parts/CableBusContainer.java:519 |
线缆 part ↔ center part(最常见) |
parts/p2p/PartP2PTunnelME.java:180 |
P2P 隧道,带实际方向 |
parts/misc/PartToggleBus.java:224 |
转换总线内外 proxy |
me/cluster/implementations/QuantumCluster.java:127 |
量子桥跨空间链接 |
tile/spatial/TileSpatialNetworkRelay.java:101 |
空间中继 |
tile/networking/TileWirelessBase.java:156 |
无线端子跨网 |
配套的 getConnection()(:254)返回 ConnectionWrapper
(me/cache/helpers/ConnectionWrapper.java:15)—— 量子桥是运行时重接网格的,
所以需要一个可变持有者而不是裸 IGridConnection。
与 tile / cable-part 维度的关系
| 关系 | 说明 |
|---|---|
| → 方块加工单元 | CraftingCPUCalculator.isValidTile(:123)认它 |
| → 方块量子链接舱 / 量子环 | QuantumCalculator 的成员 tile |
| → 方块空间柱 / 空间 IO 端口 | SpatialPylonCalculator 的成员 tile |
→ me/grid-cache |
CraftingCPUCluster 的 CPU 索引写进 CraftingGridCache(见 CraftingGridCache) |
→ me/grid-core |
QuantumCluster 建边,见上 |