ImmibisMicroblocks 模块(appeng.integration.modules.ImmibisMicroblocks)
基本信息
| 属性 | 值 |
|---|---|
| 源码 | appeng/integration/modules/ImmibisMicroblocks.java |
| 类声明 | 35,public class |
| 实现接口 | IIntegrationModule + IImmibisMicroblocks(integration/abstraction/IImmibisMicroblocks.java:18) |
| 静态单例 | public static ImmibisMicroblocks instance |
| modID | ImmibisMicroblocks(IntegrationType.java:52) |
| side | BOTH |
| 本 wiki 收录情况 | Immibis Microblocks 未被本 wiki 收录 —— 写全名 Immibis Microblocks |
生命周期
| 阶段 | 行号 | 动作 |
|---|---|---|
init() |
53 | 反射抓 MicroblockAPIUtils,失败只 debug 日志 |
postInit() |
74 | 空 {} |
注入内容:init() 里的反射(全部包在 try)
// ImmibisMicroblocks.java:54-70
try {
this.MicroblockAPIUtils = Class.forName("mods.immibis.microblocks.api.MicroblockAPIUtils");
this.mergeIntoMicroblockContainer = this.MicroblockAPIUtils.getMethod(
"mergeIntoMicroblockContainer",
ItemStack.class, EntityPlayer.class, World.class,
int.class, int.class, int.class, int.class, Block.class, int.class);
this.canConvertTiles = true;
} catch (final Throwable t) {
AELog.debug(t);
}
| 行号 | 动作 |
|---|---|
| 55 | Class.forName("mods.immibis.microblocks.api.MicroblockAPIUtils") |
| 56-66 | getMethod("mergeIntoMicroblockContainer", ...) —— 9 个参数 |
| 67 | this.canConvertTiles = true(唯一成功标志) |
| 68-70 | catch (Throwable t) { AELog.debug(t); } |
mergeIntoMicroblockContainer 的 9 个参数签名(按 :56-66 顺序):
| # | 类型 | 推测含义(源码未给参数名) |
|---|---|---|
| 1 | ItemStack |
要合并的微方块物品 |
| 2 | EntityPlayer |
玩家 |
| 3 | World |
世界 |
| 4-7 | int × 4 |
x, y, z, 面向(ForgeDirection 序数) |
| 8 | Block |
目标方块 |
| 9 | int |
metadata |
⚠️ 参数名在源码里不可见(getMethod 按类型匹配),
上表的「含义」是按类型推断,不是源码断言。
与 FMP 的区别:失败不崩游戏
| FMP | ImmibisMicroblocks | |
|---|---|---|
| 反射失败 | 抛 NoSuchMethodException → IntegrationNode 捕获 → FAILED |
catch 掉,只 AELog.debug(:69) |
| 后果 | 目标显示「Disabled」 | 目标显示「Enable」,但 canConvertTiles 保持 false |
⚠️ 这是本包唯一「反射失败仍报成功」的目标。
日志级别是 debug,默认不可见。
IntegrationNode.java:116 会打
Immibis Microblocks - Integration Enable(来自 IntegrationType.java:52
的 dspName)—— 实际没生效却在日志里说启用了。
IImmibisMicroblocks 只有 1 个方法
integration/abstraction/IImmibisMicroblocks.java:18:
| 方法 | 行号 | 语义 |
|---|---|---|
leaveParts(TileEntity te) |
26 | 让 tile 脱离微方块容器 |
另有 getOrCreateHost(EntityPlayer, int side, TileEntity)(ImmibisMicroblocks.java:77)
属于 IPartHost 契约(AE2 自己的),不在 abstraction/。
getOrCreateHost 的判定(:77-)
| 行号 | 条件 |
|---|---|
| 82-83 | isPartItem = 玩家手持的是 IPartItem |
| 85 | te instanceof IMultipartTile && this.canConvertTiles && isPartItem |
| 86 | 取 AEApi.instance().definitions().blocks().multiPart() |
| 88 | maybeMultiPartBlock / maybeMultiPartStack |
即微方块 + AE2 multipart 方块 + 玩家手持 AE2 part 物品时,
把微方块容器转成 AE2 的 IPartHost。
微方块不是 AE2 的方块
⚠️ Immibis Microblocks 的方块不是 AE2 的。
本模块做的是「双向容器转换」,不注册任何 AE2 方块。
blocks.multiPart() 是 AE2 自己的 multipart 方块
(ApiBlocks 里定义),只作为转换目标。
mod 没装时是否安全跳过
是,且最干净:唯一的 mods.immibis.* 引用是
Class.forName 的字符串(:55),没有 import。
所以 ImmibisMicroblocks.class 在 MB 缺席时也能正常加载,
init() 的 catch 保证不抛。