第三方面模组集成
基本信息
| 属性 | 值 |
|---|---|
| 依赖方式 | 全部软依赖,运行时反射检测 |
| 检测 API | Loader.isModLoaded / Loader.instance().isModLoaded |
| 活跃集成数 | 3(ComputerCraft、MineFactory Reloaded、Thaumcraft) |
| 死代码集成 | 2(NEI、Morph) |
| 公共接口 | 1(IMC setSolutionColor) |
功能
本 mod 的跨模组集成以反射 + 软依赖方式实现,检测入口只有 2 处(grep -rn 'Loader.isModLoaded' src/):
| 位置 | 检测的 mod |
|---|---|
Handler/PeripheralProvider.java:22 |
ComputerCraft |
Entity/ModEntitys.java:25 |
MineFactoryReloaded |
Thaumcraft 与其他 mod 的检测使用 MixinBuilder.addRequiredMod(Mixins.java:39),不走 Loader。
活跃集成
ComputerCraft(1.7.10)
反射注册外设 Provider(Handler/PeripheralProvider.java:21-30):
if (Loader.isModLoaded("ComputerCraft")) {
Class clazz = Class.forName("dan200.computercraft.api.ComputerCraftAPI");
Method m = clazz.getDeclaredMethod("registerPeripheralProvider",
Class.forName("dan200.computercraft.api.peripheral.IPeripheralProvider"));
m.invoke(null, new PeripheralProvider());
}
类上标注 @Optional.Interface(iface = "dan200.computercraft.api.peripheral.IPeripheralProvider", modid = "ComputerCraft")(:20),确保软依赖安全。
3 个外设方块(PeripheralProvider.getPeripheral,:33-38):
| TileEntity | 方块 |
|---|---|
TileEntityCreativePlayerInterface |
创造模式玩家接口 |
TileEntityOnlineDetector |
在线侦测器 |
TileEntityNotificationInterface |
通知接口 |
getPeripheral 上的 @Optional.Method(modid = "ComputerCraft")(:31)保证无 CC 时方法体不被加载。
反射失败时 RandomThings.postInit 捕获异常并打 WARN 日志(RandomThings.java:139-144),不会崩溃。
MineFactory Reloaded
4 个实体加入 Safari Net 黑名单(Entity/ModEntitys.java:25-30):
| 实体 |
|---|
EntitySpirit |
EntitySoul |
EntityReviveCircle |
EntityHealingOrb |
EntityBloodmoonCircle 不在黑名单中。
注册同样走反射(Handler/ModCompability/MFR/MFRRegistry.java:9-18):
Class<?> registry = Class.forName("powercrystals.minefactoryreloaded.MFRRegistry");
Method reg = registry.getMethod("registerSafariNetBlacklist", Class.class);
reg.invoke(registry, blacklistedEntity);
Thaumcraft
通过 Mixin 加速**神秘树叶(Magical Leaves)**的衰减(Mixins.java:37-41):
THAUMCRAFT_FAST_LEAVE_DECAY(new MixinBuilder()
.addCommonMixins("MixinBlockMagicalLeaves")
.addRequiredMod(TargetedMod.THAUMCRAFT)
.setPhase(Phase.LATE)
.setApplyIf(() -> VanillaChanges.FASTER_LEAVEDECAY));
三重条件:需要 Thaumcraft + VanillaChanges.FasterLeaveDecay 开启 + 在 LATE 阶段应用。
矿物辞典协同(非特定 mod)
ModCompHandler.postInit 把其他 mod 注册的 obsidianRod 全部并入本 mod 的 stickObsidian(Handler/ModCompHandler.java:10-17):
ArrayList<ItemStack> rods = OreDictionary.getOres("obsidianRod");
for (ItemStack is : rods) {
OreDictionary.registerOre("stickObsidian", is);
}
这使本 mod 的黑曜石棒配方(物品收集器、生物群系画刷、灵魂之剑)能吃到异构模组的黑曜石棒。
死代码集成
NEI —— 处理器存在但从未注册
Handler/ModCompability/NEI/ 目录下有两个类:
| 类 | 内容 |
|---|---|
NEIRandomThingsConfig |
implements IConfigureNEI(NEIRandomThingsConfig.java:6) |
ImbuingStationRecipeHandler |
extends TemplateRecipeHandler(ImbuingStationRecipeHandler.java:22) |
NEIRandomThingsConfig 在构造函数中实例化 handler(:10),但该类本身从未被实例化 —— 全仓搜索(不限文件类型)只命中它自己的声明行:
grep -rn 'NEIRandomThingsConfig' . --exclude-dir=.git
# → ./src/.../NEIRandomThingsConfig.java:6:public class NEIRandomThingsConfig implements IConfigureNEI {
同时全仓 grep -rn '@NEIPlugin' 结果为 0。结论:NEI 集成在当前版本不可用,激素药水酿造台的配方不会在 NEI 中显示。
Morph —— 空类
Handler/ModCompability/Morph/DemorpherHandler.java 全文只有 3 行:
package lumien.randomthings.Handler.ModCompability.Morph;
public class DemorpherHandler {
}
全仓 grep -rn 'DemorpherHandler' 只命中这一处声明。结论:Morph 集成完全未实现。
公共接口
IMC setSolutionColor
RandomThings.imcMessages 处理唯一的 IMC 动作(RandomThings.java:183-198):
if (action.equals("setSolutionColor")) {
NBTTagCompound nbt = m.getNBTValue();
int biomeID = nbt.getInteger("biomeID");
int color = nbt.getInteger("color");
ItemBiomeCapsule.biomeColors.put(biomeID, color);
}
其他 mod 可通过发送 setSolutionColor IMC 修改生物群系胶囊的群系颜色表。NBT 键为 biomeID 与 color。
Mixin 列表
本 mod 使用 14 个 Mixin,由 GTNH 的 gtnhmixins 库加载(com.gtnewhorizon.gtnhmixins.builders.IMixins,Mixins.java:5-6)。清单定义在枚举 Mixins 中(Mixins.java:16-50):
| 组 | 阶段 | Mixin | 应用条件 |
|---|---|---|---|
MINECRAFT(客户端) |
EARLY | MixinEntityRenderer、GuiAccessor、MixinItem、MixinRenderGlobal |
无条件 |
MINECRAFT(通用) |
EARLY | EntityAccessor、EntityLivingAccessor、PotionAccessor、MixinSpawnerAnimals、WorldServerAccessor、WorldAccessor |
无条件 |
BLOCK_LEAVES_BASE |
EARLY | MixinBlockLeavesBase |
VanillaChanges.FASTER_LEAVEDECAY |
THAUMCRAFT_FAST_LEAVE_DECAY |
LATE | MixinBlockMagicalLeaves |
Thaumcraft + FASTER_LEAVEDECAY |
GUIVIDEOSETTINGS |
EARLY | MixinGuiVideoSettings |
VanillaChanges.LOCKED_GAMMA |
WORLD |
EARLY | MixinWorld |
ConfigBlocks.wirelessLever(恒 false) |
合计 14 个,与 Mixins/early/(13 个文件)+ Mixins/late/(1 个文件)一致。
Mixin 清单 JSON 位于 src/main/resources/mixins.RandomThings{,.early,.late}.json,minVersion 为 0.8.5-GTNH,target 为 @env(DEFAULT)。这三个 JSON 只声明包名,不含 mixin 数组 —— 实际清单由上面的 Java 枚举提供。
Mixins.java:11-15的注释明确警告:该文件加载极早,不得引用任何其他 mod 的类,Reference.java除外(且仅限字符串用途)。
数值
| 数值名 | 值 |
|---|---|
| 活跃集成 | 3(CC / MFR / Thaumcraft) |
| 死代码集成 | 2(NEI / Morph) |
| CC 外设方块 | 3 |
| MFR 黑名单实体 | 4(另有 1 个未加入) |
| Mixin 总数 | 14 |
| 条件 Mixin | 4(含 1 个恒 false) |
| IMC 动作 | 1 |
Loader.isModLoaded 调用点 |
2 |