扩展示例加载器 (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 次注册有依赖顺序:
QUEST_DB←QuestDatabase.INSTANCELINE_DB←QuestLineDatabase.INSTANCEPARTY_DB←PartyManager.INSTANCELIFE_DB←LifeDatabase.INSTANCETASK_REG←TaskRegistry.INSTANCEREWARD_REG←RewardRegistry.INSTANCEPACKET_SENDER←PacketSender.INSTANCEPACKET_REG←PacketTypeRegistry.INSTANCESETTINGS←QuestSettings.INSTANCENAME_CACHE←NameCache.INSTANCECREATIVE_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 |