TagNearbyPlayer
2 个附近玩家 tag(索引 0–15)
基本信息
| 属性 | 值 |
|---|---|
| 路径 | com.github.lunatrius.ingameinfo.tag.TagNearbyPlayer |
| 行数 | 122 |
| 分类 | nearbyplayer |
| 注册 tag 数 | 2(各自按索引展开) |
索引机制
public static final int MAXIMUM_INDEX = 16; // :14
public boolean isIndexed() { return true; } // :53
public int getMaximumIndex() { return MAXIMUM_INDEX - 1; } // :58 → 15
⚠️ MAXIMUM_INDEX = 16 但 getMaximumIndex() 返回 15 ——
两者差 1,因为 getMaximumIndex() 是闭区间上界。
实际可用索引是 0…15,共 16 个槽位,与循环边界 i < MAXIMUM_INDEX 一致。
getFormattedName()(Tag 的 :63-65)因此显示为
nearbyplayername[0..15]。
两个 tag
| tag 名 | 内部类 | 取值 |
|---|---|---|
nearbyplayername |
Name |
第 i 近玩家的名字 |
nearbyplayerdistance |
Distance |
到该玩家的距离 |
注册处(:113-114):
for (int i = 0; i < MAXIMUM_INDEX; i++) {
TagRegistry.INSTANCE.register(new Name(i).setName("nearbyplayername"));
TagRegistry.INSTANCE.register(new Distance(i).setName("nearbyplayerdistance"));
}
⚠️ 两个 tag 各注册 16 次,但名字完全相同 ——
setName("nearbyplayername") 不带索引后缀。
所以 TagRegistry 的
containsKey 去重检查会把第 2 次起的 30 次注册全部拒绝
(每个 tag 15 次),只留下 i = 0 的那一份实例。
索引语法实际未被实现
isIndexed() / getMaximumIndex() / getFormattedName() 三件套齐备,
getFormattedName() 会渲染成 nearbyplayername[0..15],
/igi taglist 的 GuiTagList 也据此显示。
但取值路径完全不支持 [N]:
Value 的 getVariableValue(:117-132)拿到 { 与 }
之间的原文后,直接 TagRegistry.INSTANCE.getTag(var),
而 getTag 只做 toLowerCase(),不剥离 [N] 后缀。
所以配置里写 {nearbyplayername[3]} 的实际结果是:
查表 miss → tag 为 null → tag.getValue() 抛 NPE →
被 catch (Exception) 吞掉 → 返回字面量 <ERROR>。
而 jar 内默认配置 assets/ingameinfo/InGameInfo.xml 里
grep '\[[0-9]+\]' 零命中 —— 默认配置从未使用索引语法,
与该功能未完成一致。
TagPlayerPotion 有完全相同的问题(同样的重复注册模式)。
每 tick 的排序开销
要支持「按距离排序取第 N 近」,每 tick 需遍历所有玩家并排序。
MAXIMUM_INDEX = 16 是固定上限,多人服上会截断到 16 个最近玩家。
相关
- Tag - 索引 tag 的基类机制
- TagPlayerPotion - 另一组索引 tag
- Value -
{tag[N]}索引的解析