ValueSimple

str / num / var / invalid

基本信息

属性 值
路径 com.github.lunatrius.ingameinfo.value.ValueSimple
行数 92
注册函数数 4

4 个已注册函数

名 内部类 类型标识 用途
str ValueString str 字面文本(会做变量替换)
num ValueNumber num 数字字面量
var ValueVariable var 引用另一个 tag
invalid ValueInvalid invalid 解析失败占位

这 4 个是配置文件里出现频率最高的名字。默认配置 assets/ingameinfo/InGameInfo.xml 里 <str> / <num> / <var> 三种标签各占大量篇幅。

本类的两个覆写(:8-33)

public Value setRawValue(String value, boolean isText) { ... }   // :8
public String getRawValue(boolean isText) { ... }               // :17
public boolean isSimple() { return true; }                      // :26
public boolean isValidSize() { return true; }                    // :31

isSimple() == true 意味着无子节点,解析器会把它当叶子处理 (XmlParser 的 getValues 靠这个决定是否递归)。

四个内部类

ValueString(:35-49)

getValue() 返回 replaceVariables(this.value) —— 唯一会做 tag 变量替换的基础类型。

ValueNumber(:51-57)

getValue() 返回原始字符串(不做变量替换)。 数字字面量不需要替换,替换反而会让 { 参与算术运算导致混乱。

ValueVariable(:59-65)

getValue() 走 tag 引用路径 —— 配置里 <var>daytime</var> 即引用 TagPlayerGeneral 的 daytime tag。

⚠️ 实现上它复用 ValueString 的替换逻辑(同一个 replaceVariables), 所以 {...} 嵌在 <var> 里也能工作。

ValueInvalid(:67-83)—— 注意继承关系

public static class ValueInvalid extends ValueComplex {   // :67  ← 不是 ValueSimple!

⚠️ ValueInvalid 继承的是 ValueComplex 而不是 ValueSimple, 尽管它定义在本文件里。这不是笔误的推测 —— ValueRegistry 的 forName 失败时 return new ValueSimple.ValueInvalid(), 而 classStringMap 存的是 value.getClass(), 所以 forClass(ValueInvalid.class) 会正确返回 "invalid"。

但这意味着 invalid 是个复杂 value(isSimple() == false), 解析器会尝试给它挂子节点 —— 与「无效值」的语义不符。

覆写:

方法 实现
isValidSize() 返回 false(:70)
getValue() 返回空串(:75)
isValid() 返回 false(:80)

⚠️ 它没有覆写 isSimple(),所以继承 ValueComplex 的 false。

register(:85-91)—— 含别名

register(new ValueString().setName("str").setAliases("string"));
register(new ValueNumber().setName("num").setAliases("number", "int", "integer", "float", "double"));
register(new ValueVariable().setName("var").setAliases("variable"));
register(new ValueInvalid().setName("invalid"));
主名 别名
str string
num number、int、integer、float、double(5 个)
var variable
invalid 无

⚠️ num 的别名把整数与浮点类型名都映射到同一个实现 —— int / integer / float / double 四个名字背后是完全相同的 ValueNumber,不做整数/浮点区分(内部用 Double.parseDouble)。

注册顺序与 classStringMap

ValueRegistry 的 init() 顺序是 Complex → Logic → Math → Simple, 所以 invalid 是最后注册的。

ValueInvalid 继承 ValueComplex,但 classStringMap 用的是 Map.get(clazz) 精确类匹配(forClass,:63-66), 不是 isAssignableFrom。所以:

  • 9 个 ValueComplex 子类各自有精确条目(op / concat / max / …)→ 正常
  • ValueInvalid.class 有自己的条目 "invalid" → 正常
  • 但任何未显式注册的 ValueComplex 子类,forClass 会返回兜底 "invalid" —— 与「它就是 invalid」无法区分

ValueComplex.register() 的 9 个函数里 6 个带别名 (见 ValueComplex),别名不写 classStringMap, 所以主名始终是反查结果。

相关