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, 实际可用数量还取决于装了哪些集成。

相关