Skip to content

Script Engine

Noogear edited this page Mar 11, 2026 · 5 revisions

脚本引擎

WarriorView 使用 GloomLib Script 作为脚本引擎,YAML 配置文件可直接驱动事件处理逻辑。

节点语法、操作符、模板字符串、属性链解析的完整文档GloomLib Wiki

目录


顶层结构

id: "my-script"                              # 脚本标识符(可选,默认 AnonymousScript)
event: "com.example.MyEvent"                 # 必填,事件/载荷类的全限定名
priority: 0                                  # 可选,事件优先级(整数,默认 0)
ignore-cancelled: false                      # 可选,指定 true 时已取消事件不触发(默认 true)

variables:
  # ...

flow:
  # ...
字段 类型 必填 默认值 说明
id String AnonymousScript 脚本唯一标识,用于日志和错误追踪
event String 载荷类全限定名
priority Integer 0 事件监听优先级
ignore-cancelled boolean true true 时已被其他插件取消的事件不会触发脚本
variables Map {} 变量声明映射
flow List [] 流程节点列表

variables 变量声明

将载荷类的属性映射为脚本内的变量名。

variables:
  # 简单属性:映射 event.getDamage()
  damage: "damage"

  # 链式属性:映射 event.getEntity().getName()
  entityName: "entity.name"

  # 集合索引:映射 event.getPlayer().getInventory().get(0)
  firstItem: "player.inventory[0]"

  # Map 索引:映射 event.getMetadata().get("key")
  metaValue: "metadata[key]"
  quotedKey: "metadata['damage_all']"

  # payload 别名:直接引用事件对象本身
  event: "$self"

属性解析规则

语法 示例 解析方式
简单属性 damage 调用 getDamage()damage()
链式属性 entity.name 依次调用 getEntity()getName()
List 索引 inventory[0] 调用 getInventory()List.get(0)
Map 索引 metadata[key] 调用 getMetadata()Map.get("key")
payload 别名 $self 直接复用事件对象

getter 查找优先级

  1. getXxx() — 标准 Java Bean getter
  2. isXxx() — boolean getter
  3. xxx() — Record 风格 accessor

flow 流程节点

flow 是一个有序列表,引擎按顺序执行每个节点。共支持 7 种节点类型

类型 YAML 触发键 说明 详细参考
CHECK check 条件判断 → GloomLib
ACTION action 或动态推断 调用已注册动作 → GloomLib
RETURN return 返回值并终止 → GloomLib
SWITCH switch 多分支选择 → GloomLib
MATH math 数学表达式求值 → GloomLib
ANY any OR 复合条件 → GloomLib
ALL all AND 复合条件 → GloomLib

节点类型通过触发键自动推断,无需显式声明 type 字段。各节点的字段说明、value 类型、操作符请查阅上方链接。


- check: damage
  op: ">"
  value: 100
  on_fail:
    - return

完整字段说明、操作符列表 → Check-Node · 操作符参考


action 动作调用(快速参考)

# 标准格式
- action: "showIndicator"
  args: ["{target}", "{source}", "{value}", "CRITICAL"]

# 短语法(推荐)
- showIndicator: ["{target}", "{source}", "{value}", "{cause.name}"]

完整说明 → Action-Node

WarriorView 内置动作

动作 参数 说明
showIndicator [target, source, value, tag] 触发指示器显示
  • target — 受击实体(LivingEntity)
  • source — 攻击来源实体(Entity)
  • value — 数值(double)
  • tag — 指示器标签,对应 indicator/*.yml 中的 tag 名称

第三方插件可通过 API 注册自定义动作,详见 WarriorView API。


完整示例

示例 1:伤害指示器(实际默认配置)

id: "damage-indicator"
event: "org.bukkit.event.entity.EntityDamageByEntityEvent"
priority: 3

variables:
  target: "entity"
  source: "damager"
  value: "finalDamage"
  cause: "cause"
  critical: "critical"

flow:
  - check: target
    op: "instanceof"
    value: "org/bukkit/entity/LivingEntity"

  - check: value
    op: ">"
    value: "0"

  - check: critical
    op: "!="
    value: true
    on_fail:
      - showIndicator: ["{target}", "{source}", "{value}", "CRITICAL"]
      - return

  - showIndicator: ["{target}", "{source}", "{value}", "{cause.name}"]

示例 2:复合条件与失败回退

id: "pvp-guard"
event: "org.bukkit.event.entity.EntityDamageByEntityEvent"

variables:
  damage: "damage"
  entity: "entity"
  weapon: "damager.itemInMainHand.type.name"

flow:
  - all:
      - check: damage
        op: ">"
        value: 5
      - check: weapon
        op: "in"
        value: ["DIAMOND_SWORD", "IRON_SWORD", "NETHERITE_SWORD"]
      - check: entity
        op: "!null"
    on_fail:
      - return

  - any:
      - check: damage
        op: "between"
        value: [100, 999]
      - check: weapon
        op: "starts_with"
        value: "NETHERITE"

  - showIndicator: ["{entity}", "{entity}", "{damage}", "SPECIAL"]

Clone this wiki locally