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: ...") 是被注释掉的调试日志,
不参与编译,不能当作现存调试能力描述。
相关条目
- Segment - 持有 Condition 的规则段
- Segment 类型枚举 -
Priority等 - Protection - 保护规则载体