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 个最近玩家。

相关