Condition

基本信息

属性 值
类名 mytown.protection.segment.Condition
文件 src/main/java/mytown/protection/segment/Condition.java
行数 99
启用版本 Minecraft 1.7.10

功能

保护规则的条件求值器。构造时收一个条件字符串, execute(Object object, Getter.Container getters) 在判定时逐条求值。

conditionString == null 时直接 return true(视为无条件通过)。

求值算法

以 步长 4 遍历条件串,每 4 字符为一个四元组:

偏移 含义
i + 0 字段名(交给 getters.get(...) 反射取值)
i + 1 比较符
i + 2 目标值
i + 3 与下一条之间的连接词 AND / OR

取值统一走 getters.get(name).invoke(类型, instance, object), 由 Segment 的 getter 子系统完成。

四条类型分支

按 i + 2 依次尝试解析,先 Boolean,再 Integer,再 Float,最后单引号字符串:

分支 支持比较符 取值时请求的类型
Boolean ==、!= Boolean.class
Integer ==、!=、<、> Integer.class
Float ==、!=、<、> Integer.class(见下方缺陷)
String(单引号包裹) ==、!= String.class

四者都不匹配 → 抛 ConditionException("The element with number N has an invalid type to be checked against!")。

字符串比较会先 substring(1, length - 1) 剥掉两侧单引号再 equals。

AND / OR 短路

if (conditionString.length <= i + 3
    || current && "OR".equals(conditionString[i + 3])
    || !current && "AND".equals(conditionString[i + 3])) return current;

i + 3 位置是最后一条时(长度不足)立即返回当前结果; 匹配到 OR(当前真)或 AND(当前假)也立即返回 —— 即短路求值。

i + 3 既非 OR 也非 AND → 抛 ConditionException("Invalid condition element: ...")。

循环走完(未提前返回)则 return false。

实现要点与源码缺陷

⚠️ Float 分支类型不一致(Condition.java:56-58):

float value = (Integer) getters.get(conditionString[i])
    .invoke(Integer.class, instance, object);

声明为 float,却强转 Integer 并以 Integer.class 取值,再与 Float.parseFloat(...) 比较。取值链与比较链的类型不匹配; 之所以能编译通过,靠的是 Integer 拆箱为 int 再拓宽到 float。 含小数条件值的规则可能取不到期望值,或直接 ClassCastException。

⚠️ i += 4 的步长要求条件串长度为 4 的倍数,长度不合法会截断,不是宽松解析。

⚠️ 源码中 // MyTown.instance.log.info("Checking condition: ...") 是被注释掉的调试日志, 不参与编译,不能当作现存调试能力描述。

相关条目