兼容适配
[!INFO] 注册真源:
spiceOfLife/SpiceOfLifeCompat.java、waila/WailaCompat.java、_SpecialMobs.java:181-227
Special Mobs 的依赖极少(mcmod.info 中 dependencies: []),所有兼容都是软加载 + 反射,因此未安装对应 mod 时不会崩溃。
WAILIA 兼容
_SpecialMobs.java:391 通过 IMC 发送注册消息:
FMLInterModComms.sendMessage("Waila", "register", "toast.specialMobs.waila.WailaCompat.load");
实现类 waila/WailaCompat.java 提供 load() 静态方法供 WAILIA 调用,实现 tooltip 显示。
Spice of Life 兼容
spiceOfLife/SpiceOfLifeCompat.java 提供 3 个静态方法,供 Hungry Mob 进食 AI 判定食物来源:
| 方法 | 作用 |
|---|---|
addFoodSources(EntityPlayer, List<IInventory>) |
扫描玩家背包,把已打开的 ItemFoodContainer(午餐包等容器)内部背包登记为食物来源 |
checkFood(ItemStack) |
排除食物容器本身,返回该物品是否为 AppleCore 可识别的食物 |
getFoodValue(ItemStack) |
经 AppleCoreAPI.accessor.getUnmodifiedFoodValues(item).hunger 读取未修饰饥饿值 |
[!NOTE] 该类同时 import
squeek.applecore.api.AppleCoreAPI与squeek.spiceoflife.items.ItemFoodContainer, 并在方法体内用instanceof ItemFoodContainer与强制转换(:16-19、:26)。instanceof对缺失类会在方法执行时抛NoClassDefFoundError(非类加载时),因此只要调用方在 未安装 Spice of Life 时不调用这 3 个方法就不会出问题 —— 安全性取决于调用点的守卫,类本身不强制要求该依赖。本 mod 的
mcmod.info中dependencies: []为空,Spice of Life 与 AppleCore 均属可选软依赖。
Advanced Genetics 兼容
_SpecialMobs.java:182-227 通过反射对接 com.advGenetics.API.RegistrationHelper:
Class.forName("com.advGenetics.API.RegistrationHelper")探测 API 是否存在- 取得
addEntityToAbility(String, Class)方法 - 按 12 个
MONSTER_KEY顺序提供能力名数组advGeneticsAbilities[][],逐个invoke注册
能力映射表(源码注释标注,按 MONSTER_KEY 下标):
| 下标 | 生物 | 能力 |
|---|---|---|
| 0 | Blaze | fireballs |
| 1 | CaveSpider | climb, poison |
| 2 | Creeper | selfexplode |
| 3 | Enderman | deathenderchest, teleport |
| 4 | Ghast | fireballsexplode |
| 5 | PigZombie | lavaswim |
| 6 | Silverfish | (空数组) |
| 7 | Skeleton | infinity |
| 8 | Slime | slimy |
| 9 | Spider | climb |
| 10 | Witch | potionthrower |
| 11 | Zombie | resistance |
[!WARNING] 源缺陷(语义写反,非崩溃):
_SpecialMobs.java:218-226有一段位于主注册循环之前的 Advanced Genetics 能力注册,它用advGeneticsAbilities[_SpecialMobs.monsterKey("Enderman")](下标 3,即deathenderchest/teleport)去注册,却把类硬编码为EntityEnderCreeper(_SpecialMobs.java:220),而不是按循环变量传入的entityClass。后果:Enderman 的两个能力被额外挂到了 EnderCreeper(苦力怕亚种)身上。
EntityEnderCreeper类 确实存在(entity/creeper/EntityEnderCreeper.java,继承Entity_SpecialCreeper), 所以该调用会成功执行、不会抛异常,问题不会被日志暴露。由于主循环(
:246-254)已按advGeneticsAbilities[i] → entityClass正确注册了全部 12 种生物的 能力,这段早期代码属冗余且错位的重复注册,净效果是给 EnderCreeper 误挂两个能力。