特性注册 API
openmods.config.game 包是 OpenModsLib 暴露给其它 mod 的注册辅助层:让一个 mod 用注解声明方块/物品,自动获得「配置开关 + ID 装饰 + 旧名重映射 + 配置 GUI 展示」四项能力。
OpenModsLib 自身不使用这套 API —— 全仓库 @RegisterBlock / @RegisterItem / @RegisterTileEntity / GameConfigProvider 的引用只出现在 openmods.config.game 包内部,外部零引用。OpenModsLib 自身只注册 1 个实体(EntityBlock),见coremod 补丁。
基本信息
| 属性 | 值 |
|---|---|
| 包路径 | openmods.config.game(11 个类) |
| 入口类 | openmods.config.game.ModStartupHelper |
| 底层执行器 | openmods.config.game.GameConfigProvider(src/main/java/openmods/config/game/GameConfigProvider.java:30) |
| 方块注解 | @RegisterBlock(src/main/java/openmods/config/game/RegisterBlock.java:12) |
| 物品注解 | @RegisterItem(src/main/java/openmods/config/game/RegisterItem.java:10) |
| 持有容器接口 | BlockInstances / ItemInstances(src/main/java/openmods/config/) |
| 自有注册内容 | 0 个(OpenModsLib 不注册任何方块或物品) |
功能
使用流程
ModStartupHelper(src/main/java/openmods/config/game/ModStartupHelper.java:21)是 mod 侧唯一需要接触的类,标准 preInit 流程为:
registerBlocksHolder(类)/registerItemsHolder(类)—— 登记持有静态字段的容器类preInit(configFile)—— 一次性完成全部工作(ModStartupHelper.java:42-71):- 建
ConfigurableFeatureManager,从容器类反射收集所有@RegisterBlock/@RegisterItem条目 populateConfig钩子(:53)供子类追加自定义配置registerCustomFeatures钩子(:55)供子类追加非注解特性features.loadFromConfiguration(config)读入开关值,注册进FeatureRegistry.instance(:57-58)ConfigStorage.instance.register(config)挂到全局配置存储(:62)setupIds/setupBlockFactory/setupItemFactory三个钩子(:66,68,70)- 逐个容器类调用
gameConfig.registerBlocks()/registerItems()完成实际注册(:72-74)
- 建
handleRenames(FMLMissingMappingsEvent)—— 处理旧版 ID 重映射(ModStartupHelper.java:73)
ModStartupHelper 预留了 6 个 protected 钩子供子类覆写:setupItemFactory、setupBlockFactory、populateConfig、registerCustomFeatures、setupIds、setupProvider。
注解属性
@RegisterBlock(RegisterBlock.java:12):
| 属性 | 类型 | 默认值 | 用途 |
|---|---|---|---|
name |
String |
必填 | 注册名(经 IdDecorator 装饰后传给 GameRegistry.registerBlock) |
itemBlock |
Class<? extends ItemBlock> |
ItemOpenBlock.class |
物品形式类 |
tileEntity |
Class<? extends TileEntity> |
TileEntity.class |
主 TileEntity;等于 TileEntity.class 时视为 null 不注册(GameConfigProvider.java:257) |
tileEntities |
RegisterTileEntity[] |
{} |
附属 TileEntity 数组 |
unlocalizedName |
String |
[default] |
未本地化名;[default] 用装饰名,[none] 跳过 |
textureName |
String |
[default] |
纹理名;同上 |
isEnabled |
boolean |
true |
是否默认启用 |
isConfigurable |
boolean |
true |
是否暴露到配置 GUI |
两个哨兵常量 DEFAULT = "[default]" 与 NONE = "[none]"(RegisterBlock.java:15-16)由 setPrefixedId(GameConfigProvider.java:182)解析:[default] 时用装饰后的 objectName,[none] 时完全不设置。
@RegisterItem(RegisterItem.java:10)属性为 name、unlocalizedName、textureName、isEnabled、isConfigurable,结构对称但无 TileEntity 相关项。
三种 ID 装饰器
GameConfigProvider 用三个 IdDecorator 实例分别处理未本地化名、纹理名、TileEntity 名,允许各指向不同 mod:
| 装饰器 | 连接符 | 用途 | 覆写方法 |
|---|---|---|---|
langDecorator |
"." |
未本地化名 | setLanguageModId(String)(GameConfigProvider.java:113) |
| 纹理装饰器 | "." |
纹理名 | setTextureModId(String)(:117) |
teDecorator |
":" |
TileEntity 名 | setTileEntityModId(String)(:121) |
IdDecorator.decorate(GameConfigProvider.java:84)拼接为 modId + joiner + id。
旧名重映射
remapFromLegacy 字段(GameConfigProvider.java:62,默认 true)控制注册策略。物品侧(GameConfigProvider.java:208-215):
true:用新名name注册,同时把modId:legacyName → item存入itemRemapsfalse:直接用旧名legacyName注册
方块侧逻辑对称(:263-270)。累积的重映射表在 FMLMissingMappingsEvent 中通过 handleRemaps 生效(ModStartupHelper.java:73)。这是为了让从旧版 OpenBlocks 系列迁移的下游 mod 无需改代码。
特性开关
每个条目的 isEnabled(String) 回调(GameConfigProvider.java:239、:311)委托给 AbstractFeatureManager。未设置时使用内置的 NULL_FEATURE_MANAGER(GameConfigProvider.java:41-57)—— 它的 isEnabled 恒返回 true,且分类集合恒为空,即不设置时所有特性强制启用且不产生配置项。
ModStartupHelper 会构造真正的 ConfigurableFeatureManager(ModStartupHelper.java:46)并注册进 FeatureRegistry.instance(:58),使其它 mod 的特性开关能汇总显示在同一个配置 GUI 中(对应 openmodslib.config.features 页签)。
工厂替换
FactoryRegistry<T>(src/main/java/openmods/config/game/FactoryRegistry.java:10)允许按特性名替换实例的创建方式。construct(feature, cls)(:24)先查自定义工厂,未命中才回退到 cls.newInstance()(:38)。若自定义工厂返回的类型不匹配声明字段类型,会 Preconditions.checkArgument 失败并给出期望/实际类名(:29-35)。
数值
| 数值名 | 值 |
|---|---|
config.game 包类数 |
11 |
@RegisterBlock 可配置属性数 |
8(含 1 个必填 name) |
@RegisterItem 可配置属性数 |
5(含 1 个必填 name) |
GameConfigProvider 的 IdDecorator 实例数 |
3(lang / texture / tileEntity) |
| ID 哨兵常量 | 2([default]、[none]) |
ModStartupHelper 的 protected 扩展钩子 |
6 |
| OpenModsLib 自身通过该 API 注册的方块/物品数 | 0 |
交互
该 API 不直接面向玩家。玩家的可见入口是配置 GUI 的 features / blocks / items 三个页签(en_US.lang:75-77),其内容由各 mod 通过 FeatureRegistry 注册的特性填充。GameConfigProvider 中的 registerItems(:195)与 registerBlocks(:255)是真正调用 GameRegistry.registerItem / registerBlock / registerTileEntity 的位置(:210,213,267,270,291,299)。
相关条目
- OpenModsLib 配置 — OpenModsLib 自身的 4 个配置属性与配置 GUI
- coremod 补丁 — OpenModsLib 自身唯一的注册内容(1 个实体)