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 建边,见上

反向链接