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= 15grep -c 'QuestingAPI.registerAPI' ExpansionLoader.java= 15(initCommonAPIs11 次 +initClientAPIs4 次)- 两份键名清单做
comm差集,「已声明未注册」与「已注册未声明」两个集合均为空
(comm 初次运行时 TASK_REG / REWARD_REG 曾误报为「已注册未声明」,原因是用于抽取键名的正则 ApiKey<[^>]*> [A-Z_]+ = 无法匹配这两行的嵌套泛型 IRegistry<IFactoryData<ITask, NBTTagCompound>, ITask> —— 其中内层 > 提前终止了匹配。这是抽取脚本的缺陷,不是源码缺陷;public static final ApiKey< 的行数统计不受影响。)
结论:15 个键全部有实现,无死键、无未实现键。
附属包标准接入流程
以同仓库的 bq_standard 为实例(这是本仓唯一可验证的完整范例):
@Mod(modid = ..., dependencies = "required-after:betterquesting")(BQ_Standard.java:32-36)postInit中判断if (Loader.isModLoaded("betterquesting"))再调proxy.registerExpansion()(BQ_Standard.java:79-83)- 在
registerExpansion()里向TASK_REG/REWARD_REG注册工厂、向PACKET_REG注册处理器、把物品塞进CREATIVE_TAB(bq_standard/core/proxies/CommonProxy.java:58-92) - 客户端侧另在
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 |