Operation

格式化操作枚举

基本信息

属性 值
路径 com.github.lunatrius.ingameinfo.value.Operation
行数 144
类型 enum,7 个常量
公开数组 public static final Operation[] VALUES = values();(:131)

7 个常量

常量 行 语义
INVALID :5 兜底,返回字面量 "null"
GT :12 base > operand
LT :28 base < operand
GE :44 base >= operand
LE :60 base <= operand
EQ :76 base == operand
NE :103 base != operand

⚠️ 6 个比较常量(GT/LT/GE/LE/EQ/NE)不是颜色或文本操作 —— 它们是多路分支选择器,即把 ValueLogic 的 if 从三元扩展成「n 路」的形式。

⚠️ 常量用大写下划线-free 的双字母缩写(GT 而非 GREATER_THAN), 与本 mod 其他枚举的命名风格(Alignment 的 TOPLEFT、MessageSeed 的 Side.CLIENT)不同。

比较逻辑的分支结构

6 个比较常量共享同一套骨架(以 GT 的 :15-26 为例):

int size = value.values.size();
int operandCount = (size - 2) / 2;      // 前提:第 0 个子节点是操作名
double base = value.getDoubleValue(1);   // 第 1 个是基准值
for (int i = 2; i < 2 + operandCount; i++) {
    double operand = value.getDoubleValue(i);
    if (base > operand) {
        return value.getValue(operandCount + i);   // 命中 → 取对应的结果节点
    }
}
return size % 2 == 0 ? "" : value.getValue(size - 1);

子节点布局:[0] = 操作名,[1] = base, [2 .. 2+operandCount) = 各 operand, [2+operandCount ..] = 与 operand 一一对应的结果, 最后可跟 1 个「全不命中时的默认结果」。

size 布局
偶数 无默认结果,全不命中返回 ""
奇数 末位是默认结果

⚠️ 布局依赖 operandCount = (size - 2) / 2 的整除, 所以 operand 数与结果数必须严格配对,多一个或少一个都会让 operandCount 偏移一位 —— 配置写错时不会报错,只会静默取到错误的节点。

⚠️ 全部 6 个比较都走 getDoubleValue,即纯数值比较, 对文本 tag(如 worldname)会抛 NumberFormatException。

EQ 与 NE 的行距异常

EQ 在 :76,NE 在 :103 —— 相隔 27 行, 而 GT→LT、LT→GE、GE→LE、LE→EQ 都是 16 行。 说明 NE 的实现体比其余 5 个多约 11 行 (推测为取反逻辑 !(a == b) 的展开)。

INVALID 返回 “null”(:5-11)

INVALID {
    @Override
    public String getValue(Value value) { return "null"; }
}

⚠️ 兜底值是字符串 "null"(4 个字符), 不是 Java 的 null 引用、也不是空串。 所以配置里写错操作名时,HUD 上会显示字面的 “null” 而不是什么都不显示。

fromString(:135-143)

public static Operation fromString(String str) {
    for (Operation op : VALUES) {
        if (String.valueOf(op).equalsIgnoreCase(str)) return op;
    }
    return INVALID;
}
  • 用 String.valueOf(op) 隐式 toString() 得到常量名
  • equalsIgnoreCase —— 所以 gt / Gt / GT 都接受
  • 未命中返回 INVALID(→ 渲染 “null”)

与 ValueLogic 的分工

需求 用哪个
二选一 ValueLogic 的 if(3 节点)
多路分支 op + 本枚举(size ≥ 4 节点)
简单比较后接文本 ValueLogic 的 greater / lesser / equal(返回 true/false)

相关