me/ 网格核心(grid-core)

覆盖范围

本维度覆盖 appeng.me 包根目录的 15 个 .java 文件,也就是整个 ME 网络的 对象模型与生命周期:谁代表「一张网」、谁代表「网里的一个节点」、谁代表「一条边」、 以及网被拆开 / 合并时发生什么。

实测分母:find me -maxdepth 1 -name '*.java' | wc -l = 15。

源文件 行号 职责
Grid.java 40 IGrid 的唯一实现。持有 pivot 节点、机器集合、缓存表、事件总线;提供 add() / remove() 节点挂载与拆网逻辑
GridNode.java 55 IGridNode + IPathItem 的实现。网的最小单位,持有 owner / 位置 / 通道数 / 连接集合
GridConnection.java 40 IGridConnection + IPathItem。一条边;构造时做安全审计、查重、合并两张网、触发重算路径
GridStorage.java 30 IGridStorage。挂在 WorldData 上的跨存档持久化载体,以 long id 标识
GridStorageSearch.java 15 指向 GridStorage 的 WeakReference 容器,挂在 WorldData 的索引表里
GridCacheWrapper.java 19 IGridCache 装饰器。把一个 cache 的全部调用转发给另一个(调试/代理用)
GridPropagator.java 16 IGridVisitor:从 pivot 出发广度遍历整张网并把结果回填到新的 Grid
GridSplitDetector.java 16 IGridVisitor:遍历中一旦再次遇到 pivot 即判定该网已断开(包私有 class)
NetworkEventBus.java 28 反射式网络事件总线。以 @MENetworkEventSubscribe 注解建立「事件类型 → 订阅方法」表
NetworkList.java 21 Collection<Grid> 的只读风格实现,用于跨网查询(Storage Bus 互联场景)
MachineSet.java 19 HashSet<IGridNode> + IMachineSet。按 IGridHost 子类分组的节点集合
GridNodeCollection.java 21 IReadOnlyCollection<IGridNode> 视图,跨所有 MachineSet 汇总
GridNodeIterator.java 25 跨 MachineSet 的节点迭代器(remove() 为不支持操作)
GridAccessException.java 15 受检异常,表示代理当前没有连上任何网
GridException.java 13 非受检异常,网格内部错误

15 个文件 = 12 个顶层类型 + 1 个包私有类 + 2 个异常类

GridSplitDetector 是 class GridSplitDetector(GridSplitDetector.java:16), 不是 public,因此不构成对外 API 面。

关键设计:接口在 api/,实现在 me/

本维度所有类型的契约都不在 me/,而在 appeng/api/networking/:

me/ 侧 api/ 侧契约
Grid implements IGrid appeng/api/networking/IGrid.java
GridNode implements IGridNode, IPathItem appeng/api/networking/IGridNode.java
GridConnection implements IGridConnection, IPathItem appeng/api/networking/IGridConnection.java
GridStorage implements IGridStorage appeng/api/networking/IGridStorage.java
MachineSet implements IMachineSet appeng/api/networking/IMachineSet.java
GridPropagator / GridSplitDetector implements IGridVisitor appeng/api/networking/IGridVisitor.java

NetworkEventBus、GridCacheWrapper、GridNodeCollection、GridNodeIterator、 NetworkList、GridStorageSearch 没有 api/ 契约,是纯实现细节。

注册 / 注入点

本维度没有任何注册表注入。它是被别的部件调用的一侧:

调用方 位置 调用内容
core/Api.java:100 createGridNode(IGridBlock) new GridNode(blk)(客户端直接抛 IllegalStateException,网格纯服务端)
core/Api.java:109 createGridConnection(a, b) new GridConnection(a, b, ForgeDirection.UNKNOWN)
core/Registration.java(TickHandler.INSTANCE 注册于同文件) — Grid 通过 Grid.java:72 的 TickHandler.INSTANCE.addNetwork(this) 接入 tick
core/features/registries/GridCacheRegistry.java:42 createCacheInstance(IGrid) 由 Grid.java:59-60 调用,反查本网要实例化的 cache 列表

生命周期钩子

Grid 的全部生命周期动作集中在构造器与 tick 两条路径上; 缓存实例由注册表反射创建,存档走独立的 GridStorage 通道。

GridNode 构造                     Grid.java:55-74
  ├─ 反射实例化 9 个 IGridCache   GridCacheRegistry.createCacheInstance
  │                              (注册点 `core/Registration.java:544-552`,共 9 次 registerGridCache)
  ├─ eventBus.readClass(...)      为每个 cache 扫描订阅方法
  ├─ postEvent(MENetworkPostCacheConstruction)
  ├─ TickHandler.INSTANCE.addNetwork(this)
  └─ center.setGrid(this)

每 tick                          Grid.java:264-281  update()
  └─ 对每个 cache 调 onUpdateTick()(pivot != null 才调)

存档                            GridStorage.java:83-111  getValue()
  └─ currentGrid.saveState()  →  Grid.java:283-287  对每个 cache 调 populateGridStorage()

网格拓扑:6 面正交邻接,代码里没有「方形 / 六边形」

网格的边不是由 me/ 产生的,而是由线缆方块产生。链条是:

  1. parts/CableBusContainer.java:500-527 遍历 6 个 ForgeDirection.VALID_DIRECTIONS, 把每个侧面 part 的 IGridNode 与 center part(ForgeDirection.UNKNOWN)的节点相连。
  2. parts/CableBusContainer.java:471-487 updateConnections() 用 EnumSet.allOf(ForgeDirection.class) 减去被占用 / 被阻挡的面,得到 setValidSides。
  3. me/GridConnection.java:204-265 构造器不校验几何位置,只校验 「非自连」「安全审计通过」「未重复连接」,然后 mergeGrids(a, b)。

因此:只有正交面相邻才连,源码中不存在任何对角 / 棱边连接分支。 源码里从未出现 hexagon / square 字样 —— 所谓「方形不是六边形」是对这段 6 面枚举行为的外部描述,不是源码里的术语。这一点以 parts/CableBusContainer.java:473-481 和 me/GridConnection.java:204-265 为据, 不是照搬其它版本。

与既有维度的关系

关系 说明
→ cable-part 线缆 part 持有 IGridNode,CableBusContainer 负责把它们连成网。GridNode 是 part 与网之间的唯一桥
→ tile 方块类机器(如 方块控制器)通过 AENetworkProxy 拿到 IGridBlock,间接持有 IGridNode
→ me/grid-cache Grid.java:59-60 是本维度与 cache 子系统的唯一耦合点
→ me/pathfinding 每次 GridConnection 构造成功都会 p.repath()(GridConnection.java:261),路径系统由建边驱动
→ 配方 P2P 隧道 量子桥会跨维度建边:cluster/implementations/QuantumCluster.java:127 直接调 AEApi.instance().createGridConnection()

反向链接