跨模组集成
基本信息
crossmod/ 下 3 组集成,共 14 个类,全部是软依赖,
按需探测后注册。
| 组 | 目录 | 类数 | 目标 mod |
|---|---|---|---|
| WAILA | crossmod/waila/ |
9 | Waila(含 FMP 分支) |
| OpenComputers | crossmod/opencomputers/ |
4 | OpenComputers |
| Thaumic Energistics | crossmod/thaumcraft/ |
1 | thaumicenergistics + thaumcraftneiplugin |
一、WAILA(9 个类)
入口 WailaInit.run(),用
FMLInterModComms.sendMessage("Waila", "register", "…WailaInit.register")
把 register(IWailaRegistrar) 交给 WAILA 回调。
WailaInit.register 的注册动作:
| 动作 | 目标类 | 条件 |
|---|---|---|
registerBodyProvider + registerNBTProvider |
IPartHost(AE2 部件) |
无条件 |
| 同上 | codechicken.multipart.TileMultipart |
IntegrationRegistry.INSTANCE.isEnabled(IntegrationType.FMP),且用 Class.forName 反射,ClassNotFoundException 被吞掉 |
GuiContainerManager.addTooltipHandler(new FCTooltipHandlerWaila()) |
— | Platform.isClient() |
registerBodyProvider + registerNBTProvider |
AEBaseTile |
无条件 |
registerBodyProvider |
TileCertusQuartzTank |
!ModAndClassUtil.WAILA_PLUGINS |
最后一条的判断是取反的:只有当
WAILA_PLUGINS为假时才 注册石英罐的 provider,即安装了 WAILA 插件版时不重复注册。 这与前几条的isEnabled/isClient方向相反,读代码时容易看反。
数据提供者类:
PartWailaDataProvider(part/FluidInvWailaDataProvider 为其子类)、
TileWailaDataProvider(tile/FluidInvWailaDataProvider、
tile/LevelMaintainerWailaDataProvider 为其子类)、
CertusQuartzTankWailaDataProvider。
另有工具类 Tooltip(物品 tooltip 格式串)。
二、OpenComputers(4 个类)
OCDriverInit.run()(由 FluidCraft.java:53 的 init() 在
ModAndClassUtil.OC 为真时调用)内含 6 次 li.cil.oc.api.Driver.add,
即 3 个驱动 + 3 个 Provider(OC 要求成对注册):
| 驱动 | Provider |
|---|---|
DriverOCPatternEditor |
DriverOCPatternEditor.Provider |
DriverLevelMaintainer |
DriverLevelMaintainer.Provider |
DriverDualFluidInterface |
DriverDualFluidInterface.Provider |
三者在 Gui Types 里都有对应界面
(OC_PATTERN_EDITOR、LEVEL_MAINTAINER、DUAL_INTERFACE_FLUID)。
三、Thaumic Energistics(1 个类)
ThaumicEnergisticsCrafting.postInit(),由
CommonProxy.postInit() 在 if (ModAndClassUtil.ThE) 分支下调用
(CommonProxy.java:92-95)。
它解决的是「魔术侧要素物品不能直接塞进 ME 网络」的问题:
| 成员 | 说明 |
|---|---|
neiAddonAspect |
GameRegistry.findItem("thaumcraftneiplugin", "Aspect") |
thaumicEnergisticsAspect |
GameRegistry.findItem("thaumicenergistics", "crafting.aspect") |
isAspectStack(ItemStack) |
判断是否上述两件物品 |
convertItemAspectStack(IAEStack<?>) |
把要素物品转成带 "AspectTag" 的 IAEStack |
getAspectTag(ItemStack) |
私有;两种物品读 不同的 NBT 键 |
getAspectTag 的两分支:
| 来源 | 读取方式 |
|---|---|
thaumcraftneiplugin 的 Aspect |
NBT Aspects 标签(NBTTagList);非 NBTTagList 返回 null |
thaumicenergistics 的 crafting.aspect |
NBT 的 Aspect 字符串键 |
两个字段在
postInit里findItem,模组缺失时为null;isAspectStack用==比较,null 时不会误判 —— 但 AE2 侧未装 Thaumcraft 时这条分支根本不会执行。
相关条目
- Gui Types — OC 三个驱动的界面
- Certus Quartz Tank — 条件注册的 WAILA provider
- Level Maintainer
- AE2 升级卡注册 — 另两处 AE2 注册表调用
源码
src/main/java/com/glodblock/github/crossmod/waila/(9 个.java)src/main/java/com/glodblock/github/crossmod/opencomputers/{OCDriverInit,DriverOCPatternEditor,DriverLevelMaintainer,DriverDualFluidInterface}.javasrc/main/java/com/glodblock/github/crossmod/thaumcraft/ThaumicEnergisticsCrafting.java- 复算:
grep -c 'Driver.add' src/main/java/com/glodblock/github/crossmod/opencomputers/OCDriverInit.java→ 6