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/ 产生的,而是由线缆方块产生。链条是:
parts/CableBusContainer.java:500-527遍历 6 个ForgeDirection.VALID_DIRECTIONS, 把每个侧面 part 的IGridNode与 center part(ForgeDirection.UNKNOWN)的节点相连。parts/CableBusContainer.java:471-487updateConnections()用EnumSet.allOf(ForgeDirection.class)减去被占用 / 被阻挡的面,得到setValidSides。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() |