Skip to content

条件系统

条件系统用于判断"某个操作是否允许继续"。它常见于配方、强化、技能、物品、GUI 和动作系统中。当条件不满足时,模块可以阻止操作、显示提示或执行拒绝动作。

条件能检查什么

条件系统支持多种检查维度:

  • 玩家权限。
  • 玩家等级、经验、经济余额。
  • Attribute 属性值或资源状态。
  • 物品来源、数量、PDC、Lore、材质。
  • 装备状态,例如强化星级、宝石插槽、套装部位。
  • PlaceholderAPI 占位符结果。
  • 表达式计算结果(数值比较、字符串比较、逻辑运算)。
  • 业务模块自己的状态,例如技能等级、工位状态、配方阶段。

具体可用条件取决于调用模块和已安装的桥接插件。

条件组配置

条件通常以"条件组"形式出现在配置中。一个条件组包含多个条件节点,并定义它们之间的组合逻辑。

完整字段参考

字段别名类型默认值说明
conditionsentrieslist[]条件节点列表。
condition_typetypestringall_of条件组合方式。
condition_required_countrequired_countinteger0at_leastexactly 模式下需要满足的条件数量。
invalid_as_failurebooleantrue条件配置异常或无法求值时是否视为失败。
deny_messagestring""条件不满足时向玩家发送的提示消息(MiniMessage 格式)。
deny_actionslist[]条件不满足时执行的动作列表。

条件组合方式

说明
all_of所有条件都必须为 true。适合严格门槛。
any_of至少一个条件为 true。适合多路线解锁。
none_of所有条件都必须为 false。适合排除检查。
at_least至少 required_count 个条件为 true。适合可替代条件。
exactly恰好 required_count 个条件为 true。适合精确匹配场景。

required_count 仅在 at_leastexactly 模式下生效,最小值为 1。

空条件组行为

如果条件列表为空(没有任何条件节点),条件组始终返回 true,即不做任何限制。

条件节点类型

每个条件节点可以是以下形式之一:

字符串节点(简写)

直接写一个表达式字符串:

yaml
conditions:
  - '%player_level% >= 10'
  - '%money% >= 1000'

expression 节点

使用对象形式,明确指定类型为 expression

yaml
conditions:
  - type: expression
    expression: '%player_level% >= 20 && %money% >= 1000'

表达式字段支持三个别名,取第一个非空值:expressionconditionvalue

group 节点(嵌套组)

在条件组内嵌套另一个条件组,实现复杂逻辑:

yaml
conditions:
  - type: group
    condition_type: any_of
    conditions:
      - '%vip_level% >= 1'
      - '%player_level% >= 50'
  - type: expression
    expression: '%money% >= 5000'

上面的配置含义:玩家必须满足"VIP 等级 ≥ 1 或玩家等级 ≥ 50",同时金币 ≥ 5000。

嵌套深度没有硬性限制,但建议不超过 3 层,否则难以维护和排错。

表达式语法

条件表达式最终由 CoreLib 的布尔表达式引擎求值。

比较运算符

运算符说明示例
==等于%phase% == "success"
!=不等于%world% != "world_nether"
<小于%level% < 10
<=小于等于%star% <= 5
>大于%score% > 100
>=大于等于%player_level% >= 20

逻辑运算符

运算符说明示例
&&逻辑与%level% >= 10 && %money% >= 100
||逻辑或%rarity% == "rare" || %rarity% == "epic"
!逻辑非!%locked%
()括号分组(%a% > 0 && %b% > 0) || %admin%

数值与字符串比较

  • 引擎会尝试把左右两侧都当作数值表达式求值。
  • 如果无法作为数值求值,则仅支持字符串 == / != 比较。
  • 字符串右值建议加引号(单引号或双引号),避免与数字表达式混淆。

布尔字面量

以下值被识别为 truetrueyesyon1

以下值被识别为 falsefalsenonoff0

完整配置示例

基础权限检查

yaml
conditions:
  condition_type: all_of
  conditions:
    - type: expression
      expression: '%has_permission_emaki.forge.use% == true'
  deny_message: '<red>你没有使用锻造台的权限。'

多条件组合

yaml
conditions:
  condition_type: all_of
  conditions:
    - '%player_level% >= 30'
    - '%money% >= 5000'
    - '%world% == "world"'
  deny_message: '<red>需要 30 级以上、5000 金币,且在主世界。'
  deny_actions:
    - 'playsound sound=minecraft:entity.villager.no volume=1 pitch=1'

任意满足(多路线解锁)

yaml
conditions:
  condition_type: any_of
  conditions:
    - '%vip_level% >= 2'
    - '%player_level% >= 60'
    - '%quest_completed_master_smith% == true'
  deny_message: '<red>需要 VIP2 以上、60 级或完成大师铁匠任务。'

满足指定数量

yaml
conditions:
  condition_type: at_least
  condition_required_count: 3
  conditions:
    - '%strength% >= 50'
    - '%agility% >= 50'
    - '%intelligence% >= 50'
    - '%vitality% >= 50'
    - '%luck% >= 50'
  deny_message: '<red>至少需要 3 项属性达到 50。'

嵌套条件组

yaml
conditions:
  condition_type: all_of
  conditions:
    - type: group
      condition_type: any_of
      conditions:
        - '%class% == "warrior"'
        - '%class% == "paladin"'
    - type: expression
      expression: '%player_level% >= 40'
    - type: expression
      expression: '%star% < 10'
  deny_message: '<red>仅限战士或圣骑士,40 级以上,当前强化低于 +10。'

配合动作系统的 @if 前缀

条件也可以直接写在动作行的 @if 控制前缀中:

yaml
actions:
  - '@if=%phase%=="success" sendmessage text="<green>成功阶段"'
  - '@if=%player_level%>=50 givemoney amount=500 provider=vault'
  - '@if=%world%!="world_nether" && %money%>=100 sendmessage text="<gold>奖励条件满足"'

invalid_as_failure 的作用

当条件配置有误(例如变量不存在、表达式语法错误、外部插件未加载)时:

  • invalid_as_failure: true(默认):异常条件视为失败,操作被阻止。这是生产服推荐设置,防止配置错误导致玩家绕过限制。
  • invalid_as_failure: false:异常条件被跳过,不计入结果。适合开发调试阶段,或者某些条件依赖可选插件时使用。
yaml
# 生产服推荐
conditions:
  invalid_as_failure: true
  conditions:
    - '%attribute_attack% >= 100'

# 开发调试或可选条件
conditions:
  invalid_as_failure: false
  conditions:
    - '%optional_plugin_value% >= 10'

变量来源

条件表达式中的变量 %name% 由调用模块注入。不同场景可用变量不同:

场景常见变量
强化%star%%level%%recipe_id%
锻造%quality%%recipe_id%%material_count%
技能%skill_level%%skill_id%%cooldown%
宝石%gem_level%%slot_count%%gem_type%
物品触发%item_id%%trigger_type%
通用%player_level%%money%%world%%has_permission_xxx%

各模块实际注入的变量名请参阅对应模块文档。如果变量不存在且 invalid_as_failure 为 true,条件会失败。

与 PlaceholderAPI 的关系

如果服务器安装了 PlaceholderAPI,条件表达式中的 %placeholder% 格式占位符会在求值前被解析。这意味着你可以使用任何 PAPI 占位符作为条件变量:

yaml
conditions:
  conditions:
    - '%player_level% >= 30'
    - '%vault_eco_balance% >= 10000'

注意:PAPI 占位符返回的是字符串,如果返回值包含颜色代码或非数字字符,数值比较可能失败。建议使用返回纯数字的占位符。

错误:YAML 会把 > 解析为折叠块标记

conditions:

  • %level% > 10

正确:加引号

conditions:

  • '%level% > 10'

### 条件中使用了不存在的变量

如果变量不存在:

- 数值比较会失败(无法转为数字)。
- 字符串比较中,缺失变量会被替换为空字符串。
- 当 `invalid_as_failure: true` 时,整个条件视为失败。

建议在配置前确认当前模块和场景支持哪些变量。