兼容适配

[!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:

  1. Class.forName("com.advGenetics.API.RegistrationHelper") 探测 API 是否存在
  2. 取得 addEntityToAbility(String, Class) 方法
  3. 按 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 误挂两个能力。

关联:特殊生物总表 · 网络消息