TagRegistry
151 个 tag 的注册表
基本信息
| 属性 | 值 |
|---|---|
| 路径 | com.github.lunatrius.ingameinfo.tag.registry.TagRegistry |
| 行数 | 78 |
| 单例 | public static final TagRegistry INSTANCE(:24) |
存储
private final Map<String, Tag> stringTagMap = new HashMap<>();
只有一张表,key 统一 toLowerCase()(:39、:51、:56),
所以配置文件里写 Seed 或 seed 都能命中 —— tag 名大小写不敏感。
register 的两段重载(:28-48)
register(String name, Tag tag):
if (this.stringTagMap.containsKey(name)) { logger.error("Duplicate tag key '{}'!", name); return; }
if (name == null) { logger.error("Tag name cannot be null!"); return; }
this.stringTagMap.put(name.toLowerCase(), tag);
⚠️ 判空顺序:containsKey(name) 在 name == null 之前。
HashMap.containsKey(null) 合法返回 false,所以 null 最终会被第二个判断拦住 ——
不会 NPE,但顺序反了,可读性差。
⚠️ containsKey 检查的是已小写化的表,传入的却是未小写的 name。
所以 Seed 和 seed 都能注册进同一格而不被判为重复:
若先注册 Seed、再注册 seed,第二次不会触发重复告警,会静默覆盖。
register(Tag tag)(:42-48)先注册主名,再遍历 tag.getAliases() 逐个注册。
别名与主名共享同一个 Tag 实例。
查表(:50-61)
| 方法 | 未命中时 |
|---|---|
getValue(String) |
返回 null |
getTag(String) |
返回 null |
getRegisteredTags() |
new ArrayList<>(stringTagMap.values())(浅拷贝) |
⚠️ getRegisteredTags() 返回的是 values 的快照列表,
且一个别名会作为独立元素出现(同一 Tag 实例重复)。
GuiTagList 遍历它构建列表时会看到重复条目。
init(:63-77)
TagFormatting.register(); TagMisc.register(); TagMouseOver.register();
TagNearbyPlayer.register(); TagPlayerEquipment.register(); TagPlayerGeneral.register();
TagPlayerPosition.register(); TagPlayerPotion.register(); TagRiding.register();
TagTime.register(); TagWorld.register();
Reference.logger.info("Registered {} tags.", stringTagMap.size());
11 个内置 tag 类在此注册。5 个第三方集成
(Blood Magic / Gregtech / SimplyJetpacks / TFC / Thaumcraft)
不在这里,由 PluginLoader 的 postInit
在 TagRegistry.init() 之后追加(ClientProxy.java:62-63 的顺序)。
因此日志里的 Registered N tags 只统计内置 tag,
实际可用数量还取决于装了哪些集成。
相关
- Tag - 被注册的基类
- GuiTagList -
getRegisteredTags的消费方 - PluginLoader - 集成 tag 的注册时机