特性注册 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 流程为:

  1. registerBlocksHolder(类) / registerItemsHolder(类) —— 登记持有静态字段的容器类
  2. 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)
  3. 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 存入 itemRemaps
  • false:直接用旧名 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)。

相关条目