API:模组间通信

基本信息

属性 值
API 包 thaumic.tinkerer.api(gradle.properties 中 apiPackage = api)
公开类型 2(1 个常量类 + 1 个标记接口)
IMC 处理入口 ThaumicTinkerer.HandleIMCMessages(FMLInterModComms.IMCEvent)
处理方法 @EventHandler 标注,ThaumicTinkerer.java:99

gradle.properties 声明 apiPackage = api 与 modGroup = thaumic.tinkerer,即本模组的对外 API 根包为 thaumic.tinkerer.api。

数值:IMC 键

InterModCommsOperations(api/InterModCommsOperations.java)全文只有两个 public static final String:

常量 键值 作用 处理位置
ADD_RESEARCH_BLACKLIST AddResearchBlacklist 追加 KAMI 研究自动前置的黑名单 ThaumicTinkerer.java:101-104
ADD_CC_BLACKLIST AddCCBlacklist 追加 CC 外设黑名单 ThaumicTinkerer.java:105-107

功能

AddResearchBlacklist

处理逻辑(ThaumicTinkerer.java:101-104):

if (message.key.equalsIgnoreCase(InterModCommsOperations.ADD_RESEARCH_BLACKLIST)) {
    String[] values = message.getStringValue().split(",");
    KamiResearchItem.Blacklist.addAll(Arrays.asList(values));
}
  • 键比较用 equalsIgnoreCase,因此大小写不敏感
  • 值按英文逗号分隔为多个条目后整体 addAll 进 KamiResearchItem.Blacklist
  • 目标列表 KamiResearchItem.Blacklist 初始已含 "MINILITH"(research/KamiResearchItem.java 静态块)
  • 该列表在 KamiResearchItem.setPages() 中被逐项匹配:id 以黑名单项开头的普通研究会被排除在 KAMI 研究的自动前置之外(详见 研究总览)

AddCCBlacklist

处理逻辑(ThaumicTinkerer.java:105-107):

if (message.key.equalsIgnoreCase(InterModCommsOperations.ADD_CC_BLACKLIST)) {
    if (LoadedMods.computerCraftLoaded) blackListCCDevices(message.getStringValue());
}
  • ComputerCraft 缺失时整条消息被忽略(不发警告、不记录)
  • blackListCCDevices(String) 带 @Optional.Method(modid = "ComputerCraft") 注解(ThaumicTinkerer.java:110-112),内部执行 PeripheralHandler.Blacklist.add(classname)
  • 与 AddResearchBlacklist 不同,此处不按逗号切分,整条字符串作为一个类名加入
  • 匹配在 PeripheralHandler.getPeripheral() 中以 s.equalsIgnoreCase(tile.getClass().getName()) 进行,即忽略大小写地比对类的全限定名(PeripheralHandler.java:34-37)

数值:标记接口

接口 用途 本仓实现方
INoRemoveEnchant 空标记接口(api/INoRemoveEnchant.java),标记「不应被移除附魔」的物品 0

INoRemoveEnchant 全文只有接口声明,无任何成员。它在本仓库内只被读取、从未被实现:两处 instanceof 检查分别是

  • SpellClothCraftingHandler.java:26:if (stack.isItemEnchanted() && !(stack.getItem() instanceof INoRemoveEnchant) && !foundEnchanted)
  • SpellClothRecipe.java:38:同一条件

两处都用于「合成咒文布时,带此标记的物品可保留已有附魔」。由于本模组自身没有任何类 implements INoRemoveEnchant,该分支对本模组自己的物品恒不成立;它是留给其他模组的扩展点。SpellClothCraftingHandler 在 TTCommonProxy.init() 中注册到 FML bus(TTCommonProxy.java:156)。

硬编码的非 IMC 集成

Waila 的注册不走 IMC 常量,而是在 preInit() 中直接发送一条字面量消息:

if (LoadedMods.wailaLoaded) {
    FMLInterModComms.sendMessage(
            "Waila",
            "register",
            "thaumic.tinkerer.common.compat.TTinkererProvider.callbackRegister");
}

(ThaumicTinkerer.java:63-68)

这条消息的「消息键」是字面量 "register",接收类名也是字面量字符串 —— 它属于 compat/TTinkererProvider 的回调注册契约,不在 InterModCommsOperations 中定义。

相关条目