扩展示例加载器 (Expansion Loader)

基本信息

属性 值
类 betterquesting.core.ExpansionLoader(单例 INSTANCE)
公共方法 initCommonAPIs() —— 11 次 QuestingAPI.registerAPI
客户端方法 initClientAPIs() —— 4 次 registerAPI,带 @SideOnly(Side.CLIENT)
调用方 betterquesting.core.proxies.CommonProxy 与 ClientProxy
注册的 API 键 15,与 ApiReference 的 15 个常量 1:1(见 API 参考)
附属包接入 声明 required-after:betterquesting 后在其 postInit 注册自己的工厂

功能

ExpansionLoader 是 BetterQuesting 的服务定位器装配脚本。它本身不含业务逻辑,只做一件事:把 15 个单例实例逐一登记进 QuestingAPI,供附属包通过 QuestingAPI.getAPI(ApiReference.XXX) 取用。

侧别拆分是有意设计

initClientAPIs() 带 @SideOnly(Side.CLIENT)(ExpansionLoader.java:44),内含 ThemeRegistry / ResourceRegistry / ToolboxRegistry / ImporterRegistry —— 这 4 个类全部是客户端专属(主题解析、GUI 工具箱、任务导入器在服务端毫无意义)。

对应的理由写在 ApiReference 顶部注释里:「Don’t make these client side only. It’ll just crash servers regardless of which are used」(ApiReference.java:23-24)。即 ApiReference 里的 4 个客户端键故意仍定义在公共类中,只把注册动作放进 @SideOnly 方法 —— 若把键本身挪进客户端类,服务端只要引用 ApiReference 的任意一个键就会因缺类而崩溃。

ResourceRegistry 里还有一条作者注记:「Only going to cover the basics here. Advanced GUI elements would be better suited to code based themes」(ResourceRegistry.java:32)—— 说明资源工厂集是刻意保持精简的。

注册顺序

initCommonAPIs() 的 11 次注册有依赖顺序:

  1. QUEST_DB ← QuestDatabase.INSTANCE
  2. LINE_DB ← QuestLineDatabase.INSTANCE
  3. PARTY_DB ← PartyManager.INSTANCE
  4. LIFE_DB ← LifeDatabase.INSTANCE
  5. TASK_REG ← TaskRegistry.INSTANCE
  6. REWARD_REG ← RewardRegistry.INSTANCE
  7. PACKET_SENDER ← PacketSender.INSTANCE
  8. PACKET_REG ← PacketTypeRegistry.INSTANCE
  9. SETTINGS ← QuestSettings.INSTANCE
  10. NAME_CACHE ← NameCache.INSTANCE
  11. CREATIVE_TAB ← BetterQuesting.tabQuesting(一个 CreativeTabs,不是 BQ 自定义类型)

顺序有意义:QuestLine 的构造函数会 QuestingAPI.getAPI(ApiReference.LINE_DB) 取父数据库(questing/QuestLine.java:36),所以 LINE_DB 必须在任何 QuestLine 被构造前就位。TaskRegistry.createNew 与 RewardRegistry.createNew 在缺类型时调 BetterQuesting.logger,故也依赖日志器先行初始化。

附属包扩展点一览

ExpansionLoader 实际暴露给附属包的扩展面:

扩展点 接入方式
新任务类型 QuestingAPI.getAPI(ApiReference.TASK_REG).register(IFactoryData<ITask, NBTTagCompound>)
新奖励类型 QuestingAPI.getAPI(ApiReference.REWARD_REG).register(IFactoryData<IReward, NBTTagCompound>)
新封包 PACKET_REG.registerServerHandler(ResourceLocation, …) / registerClientHandler(…)
新任务导入器 IMPORT_REG.registerImporter(IImporter)(仅客户端)
新 GUI 设计工具页签 TOOL_REG.registerToolTab(ResourceLocation, IToolTab)(仅客户端)
新主题 / 纹理 / 颜色 / 线条 THEME_REG / RESOURCE_REG(仅客户端)
放入创造标签 CREATIVE_TAB

本仓唯一可验证的完整范例是 bq_standard,其 registerExpansion() 一次性完成 13 个任务工厂、6 个奖励工厂、7 条封包、3 个导入器与创造标签设置(bq_standard/core/proxies/CommonProxy.java:58-92、ClientProxy.java:26-37)。

数值

数值名 值
registerAPI 调用总数 15
公共 / 客户端拆分 11 / 4
@SideOnly(Side.CLIENT) 的装载方法 1
暴露的扩展点种类 7(TASK / REWARD / PACKET / IMPORT / TOOL / THEME+RESOURCE / CREATIVE_TAB)
附属包硬依赖字符串 required-after:betterquesting

相关条目