me/helpers 网格代理与通用工具(helpers)
覆盖范围
appeng.me.helpers 包,5 个 .java 文件。
实测:find me/helpers -name '*.java' | wc -l = 5。
这是 tile 维度接入网格的桥
本包最重要的类是 AENetworkProxy。方块类机器(TileEntity)要上网,
必须实现 IGridProxyable 并持有一个 AENetworkProxy;
me/ 不认识任何 TileEntity,认识的是 IGridBlock。
TileEntity(tile 维度)
└─ implements IGridProxyable me/helpers/IGridProxyable.java:16
├─ getProxy() → AENetworkProxy
├─ getLocation() → DimensionalCoord
└─ gridChanged()
└─ AENetworkProxy implements IGridBlock me/helpers/AENetworkProxy.java:48
└─ 内部持有 IGridNode → 接入 Grid
逐类职责
| 文件 | 行号 | 职责 |
|---|---|---|
AENetworkProxy.java |
48 | implements IGridBlock。IGridBlock 的唯一内置实现。方块与 part 进入网格的门面 |
AENetworkProxyMultiblock.java |
25 | extends AENetworkProxy + implements IGridMultiblock。多方块宿主专用,额外暴露 getMultiblockNodes()(:33) |
IGridProxyable.java |
16 | 接口。extends IGridHost,3 个方法:getProxy()(:18)、getLocation()(:20)、gridChanged()(:22) |
GenericInterestManager.java |
20 | GenericInterestManager<T>。基于 Multimap 的「谁关心哪个栈」索引,带事务缓冲 |
ChannelPowerSrc.java |
18 | implements IEnergySource。按通道收费的能量来源包装(走线缆取电的机器用它) |
AENetworkProxy 的关键行为
构造器 :63-70,5 个参数:(IGridProxyable te, String nbtName, ItemStack visual, boolean inWorld)。
| 能力 | 行号 | 说明 |
|---|---|---|
| 拿节点 | getNode() |
121 |
| 拿路径网 | getPath() |
145,throws GridAccessException |
| 拿网格 | getGrid() |
163,throws GridAccessException |
| 拿 tick 管理 | getTick() |
174,throws GridAccessException |
| 有效面 | setValidSides(EnumSet<ForgeDirection>) |
82 |
| 刷新连接 | validate() |
89 |
| 区块卸载 | onChunkUnload() |
95 |
| 失效 | invalidate() |
100 |
| 就绪回调 | onReady() |
108 |
| NBT | readFromNBT / writeToNBT |
131 / 76 |
| 视觉表示 | setVisualRepresentation(ItemStack) |
72 |
getGrid() 的双重 null 检查
// AENetworkProxy.java:163-172
public IGrid getGrid() throws GridAccessException {
if (this.node == null) { throw new GridAccessException(); }
final IGrid grid = this.node.getGrid();
if (grid == null) { throw new GridAccessException(); }
return grid;
}
两个 null 语义不同:节点没建 vs 节点建了但没连上网。都抛同一个异常, 调用方无法区分 —— 这是本移植版的一个粗糙处。
⚠️ nbtName 字段(:52)与 GridNode 的 NBT 方法(loadFromNBT /
saveToNBT,me/GridNode.java:307 / :322)的 String name 参数是同一套
命名约定:宿主负责给自己的网格数据分段。
GenericInterestManager 的事务缓冲
GenericInterestManager.java:20。Multimap<IAEStack, T> 之上的索引,
关键方法是 enableTransactions()(:30)/ disableTransactions()(:38):
| 方法 | 行号 |
|---|---|
put(IAEStack, T) |
55 |
remove(IAEStack, T) |
64 |
containsKey(IAEStack) |
73 |
get(IAEStack) |
77 |
内部类 SavedTransactions |
81 |
事务期间的操作被 SavedTransactions(:81)攒起来,
disableTransactions 时才真正落 Multimap —— 避免批量搬运时
反复重建索引。
ChannelPowerSrc 的通道语义
ChannelPowerSrc.java:18,构造器 :23 (IGridNode networkNode, IEnergySource src)。
extractAEPower(:29)是唯一方法。名字表明它让一个
IEnergySource 按占用的通道数扣费 —— 与
EnergyGridCache 的普通取电不同。
对应开关:AEFeature.Channels。
与既有维度的关系
| 关系 | 说明 |
|---|---|
→ tile 维度 |
几乎所有上网的方块都经 AENetworkProxy。典型:方块控制器、方块安全站、方块线缆总线 |
→ cable-part 维度 |
part 有自己的 proxy 体系(AENetworkProxy 的同类在 parts/),本类是方块侧的门面 |
| → me/grid-core | AENetworkProxy 内部持有 IGridNode,是 tile 与 Grid 之间唯一通道 |
| → GridStorageCache | GenericInterestManager<ItemWatcher> 的实例持有者 |
| → me/storage | ItemWatcher(me/storage/ItemWatcher.java:25)是 GenericInterestManager 的典型元素类型 |