API 参考 (Api Reference)

基本信息

属性 值
键定义 betterquesting.api.api.ApiReference(ApiReference.java:25-47)
访问入口 betterquesting.api.api.QuestingAPI
API 键总数 15(11 公共 + 4 客户端)
核心侧注册数 15,与键数 1:1 对应
装载器 betterquesting.core.ExpansionLoader(单例 INSTANCE)
附属包接入方式 声明 @Mod(dependencies = "required-after:betterquesting"),在 postInit 调 proxy.registerExpansion()

功能

ApiReference 定义了 15 个 ApiKey<T> 常量,每个对应一个核心提供的服务。附属包通过 QuestingAPI.getAPI(ApiReference.XXX) 拿到实例。

ApiReference 顶部有一条作者注释值得注意:「Don’t make these client side only. It’ll just crash servers regardless of which are used」(ApiReference.java:23-24)—— 即 4 个纯客户端的键(THEME_REG / RESOURCE_REG / TOOL_REG / IMPORT_REG)也故意定义在公共类里,以免服务端加载该类时崩溃。它们由 @SideOnly(Side.CLIENT) 方法提供实现(ExpansionLoader.initClientAPIs(),ExpansionLoader.java:44-50)。

15 个 API 键

公共 API(initCommonAPIs(),ExpansionLoader.java:26-42)

常量 类型 注册的实现
QUEST_DB IQuestDatabase QuestDatabase.INSTANCE
LINE_DB IQuestLineDatabase QuestLineDatabase.INSTANCE
PARTY_DB IPartyDatabase PartyManager.INSTANCE
LIFE_DB ILifeDatabase LifeDatabase.INSTANCE
TASK_REG IRegistry<IFactoryData<ITask, NBTTagCompound>, ITask> TaskRegistry.INSTANCE
REWARD_REG IRegistry<IFactoryData<IReward, NBTTagCompound>, IReward> RewardRegistry.INSTANCE
PACKET_SENDER IPacketSender PacketSender.INSTANCE
PACKET_REG IPacketRegistry PacketTypeRegistry.INSTANCE
SETTINGS IQuestSettings QuestSettings.INSTANCE
NAME_CACHE INameCache NameCache.INSTANCE
CREATIVE_TAB CreativeTabs BetterQuesting.tabQuesting

客户端 API(initClientAPIs(),ExpansionLoader.java:44-50,@SideOnly(Side.CLIENT))

常量 类型 注册的实现
THEME_REG IThemeRegistry ThemeRegistry.INSTANCE
RESOURCE_REG IResourceReg ResourceRegistry.INSTANCE
TOOL_REG IToolRegistry ToolboxRegistry.INSTANCE
IMPORT_REG IImportRegistry ImporterRegistry.INSTANCE

15 = 11 公共 + 4 客户端。

计数核对

两个数字独立统计后完全一致,且键名逐个对齐:

  • grep -cE 'public static final ApiKey<' ApiReference.java = 15
  • grep -c 'QuestingAPI.registerAPI' ExpansionLoader.java = 15(initCommonAPIs 11 次 + initClientAPIs 4 次)
  • 两份键名清单做 comm 差集,「已声明未注册」与「已注册未声明」两个集合均为空

(comm 初次运行时 TASK_REG / REWARD_REG 曾误报为「已注册未声明」,原因是用于抽取键名的正则 ApiKey<[^>]*> [A-Z_]+ = 无法匹配这两行的嵌套泛型 IRegistry<IFactoryData<ITask, NBTTagCompound>, ITask> —— 其中内层 > 提前终止了匹配。这是抽取脚本的缺陷,不是源码缺陷;public static final ApiKey< 的行数统计不受影响。)

结论:15 个键全部有实现,无死键、无未实现键。

附属包标准接入流程

以同仓库的 bq_standard 为实例(这是本仓唯一可验证的完整范例):

  1. @Mod(modid = ..., dependencies = "required-after:betterquesting")(BQ_Standard.java:32-36)
  2. postInit 中判断 if (Loader.isModLoaded("betterquesting")) 再调 proxy.registerExpansion()(BQ_Standard.java:79-83)
  3. 在 registerExpansion() 里向 TASK_REG / REWARD_REG 注册工厂、向 PACKET_REG 注册处理器、把物品塞进 CREATIVE_TAB(bq_standard/core/proxies/CommonProxy.java:58-92)
  4. 客户端侧另在 ClientProxy.registerExpansion() 覆写中调 super.registerExpansion() 后追加 IMPORT_REG 注册与纹理注册(bq_standard/core/proxies/ClientProxy.java:26-37)

数值

数值名 值
ApiKey 常量数 15
initCommonAPIs() 中的 registerAPI 调用 11
initClientAPIs() 中的 registerAPI 调用 4
registerAPI 调用合计 15(与键数 1:1,无未注册键)
带 @SideOnly(Side.CLIENT) 的装载方法 1(initClientAPIs)
附属包需声明的硬依赖字符串 required-after:betterquesting

相关条目