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 的检查功率。
相关条目
- AE2 Integration - 完整的 AE2 数据流与网络包
- Botania 集成 - 另一个材料来源(
countItems的另一半) - 网络协议 -
SyncServer/SyncClient包 - BFS 方块扩展算法 - 数量如何影响放置上限