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 的典型元素类型

反向链接