跳到正文
烈焰甘蔗Wiki

Baubles 集成

BetterBuildersWands 集成 Baubles 饰品模组:当玩家的 AE2 无线终端 放在饰品栏而不是背包里时,也能被识别。

触发条件

MEHandler 里的两处 Baubles 分支都用运行时检测:

if (Loader.isModLoaded("Baubles")) {
    return hasTerminalBaubles(player);      // 计数路径
}
…
if (Loader.isModLoaded("Baubles")) {
    return readBaubles(player);             // 取 GUI 对象路径
}

两个方法都标注了 @Optional.Method(modid = "Baubles"), 所以 Baubles 是可选依赖:未安装时相关代码被剔除,不影响模组运行。

⚠️ 这是 AE2 集成的子功能,不是独立特性。Baubles 本身不提供方块, 它只扩大"无线终端藏在哪"的搜索范围。不安装 AE2 时 Baubles 分支完全不会被触达。

行为

1. hasTerminalBaubles(EntityPlayer) —— 存在性检查

遍历饰品栏,查找 AE2 的 IWirelessTermHandler:

for (int i = 0; i < BaublesApi.getBaubles(player).getSizeInventory(); i++) {
    ItemStack item = BaublesApi.getBaubles(player).getStackInSlot(i);
    if (item == null) continue;
    if (item.getItem() instanceof IWirelessTermHandler) {
        IWirelessTermHandler t = (IWirelessTermHandler) item.getItem();
        if (t.canHandle(item)) return true;
    }
}
return false;

客户端(BasicPlayerShim.getAEItem 的 isRemote 分支)用它决定 “要不要向服务端发起数量查询”。

2. readBaubles(EntityPlayer) —— 取无线终端 GUI 对象

找到后返回 getTerminalGuiObject(item, player, i, 1),注意 y 槽位参数 被传成 1 而不是 0 —— 这是为了让 AE2 的 GUI 定位在饰品栏这一行 而不是主背包行。

对比:主背包命中的分支传 y = 0。

3. 搜索顺序

MEHandler.getTerminalGuiObject(EntityPlayer) 的顺序是先主背包、后饰品栏:

顺序 来源 方法
1 主背包 player.inventory(36 格) 内联循环
2 饰品栏 BaublesApi.getBaubles(player) hasTerminalBaubles / readBaubles

也就是说,如果主背包和饰品栏里同时有无线终端,只有主背包里那个会被使用。

后续校验(在 MEHandler 而非 Baubles 专属)

拿到 WirelessTerminalGuiObject 后,还要通过一连串 AE2 侧校验, 这些校验对 Baubles 饰品和背包物品一视同仁:

校验 方法 不通过的后果
是否在客户端 Platform.isClient() 直接返回 null
是无线终端 registry.isWirelessTerminal(item) 返回 null
有加密 key handler.getEncryptionKey(item) 非空 返回 null
key 对应安全站 locatable instanceof TileSecurity 返回 null
有电 handler.hasPower(player, 1000F, item) 返回 null
在范围内 obj.rangeCheck() 数量按 0 计
有 EXTRACT 权限 securityCheck(player, obj.getGrid(), SecurityPermissions.EXTRACT) 不抽取,数量按 0 计

⚠️ 必须把无线终端绑定到一个 AE2 安全站(Security Station), 否则 locatable 查不到 TileSecurity,整个 AE2 集成对本玩家失效。 还要消耗 1000 AE 的检查功率。

相关条目

浏览全部模组