Skip to content

触发器与任务

AchieveMaster 的成就推进,核心都落在 trigger: 这一个块里。你可以把它理解成:

  • 什么事件会把这条成就叫醒
  • 先用哪些条件筛一遍
  • 命中以后是直接加进度,还是交给脚本自己算

先记住两种写法

方式 1:简单配置

适合“条件很明确,命中后直接加进度”的场景。

yaml
trigger:
  type: ENTITY_KILL
  条件:
    实体类型: "ZOMBIE"
  进度: +1

这类配置最适合:

  • 击杀指定怪
  • 进入指定区域
  • 拾取指定物品
  • 达到某个数值阈值

方式 2:脚本配置

适合“同一触发器下要做多步判断、写标记、算多目标、读外部变量”的场景。

yaml
trigger:
  type: MYTHICMOBS_KILL
  script: |
    设置标记("杀过骷髅王")
    if (存在标记("杀过骷髅王")) {
      设置进度(1)
    }

当前实现里,脚本字段支持这些写法:

  • script
  • 脚本
  • script-js
  • 脚本js
  • js

其中:

  • script / 脚本 走 AchieveMaster 自己的脚本体系
  • script-js / js 字段名虽然叫 js,实际走的是插件内置的 AviatorScript 表达式引擎

trigger 里常见字段

字段作用
type触发器类型
条件YAML 过滤条件,适合简单场景
进度简单进度规则,+1 表示增加,纯数字表示直接设置
script / 脚本复杂逻辑脚本
script-js / 脚本js / jsAviatorScript 脚本
interval定时器触发间隔

另外有一个细节很重要:

  • INVENTORY_SCAN 的全局扫描频率在 config.yml -> inventory-scan
  • TIMER 的单成就触发频率在成就自己的 trigger.interval

当前版本可用的触发器

按当前命令帮助和触发器管理逻辑,常用触发器可以按下面理解。

玩家基础

类型说明
PLAYER_JOIN玩家进入服务器
PLAYER_QUIT玩家退出服务器
PLAYER_DEATH玩家死亡
PLAYER_RESPAWN玩家复活
PLAYER_CHAT玩家聊天
PLAYER_JUMP玩家跳跃
PLAYER_SNEAK玩家潜行 / 取消潜行
PLAYER_MOVE玩家移动,高频触发
PLAYER_TELEPORT玩家传送
WORLD_CHANGE切换世界
COMMAND玩家执行指令
GAMEMODE_CHANGE切换游戏模式

战斗

类型说明
ENTITY_KILL击杀原版实体
DEAL_DAMAGE玩家造成伤害
TAKE_DAMAGE玩家受到伤害
PROJECTILE_LAUNCH发射投射物
PROJECTILE_HIT投射物命中
MYTHICMOBS_KILL击杀 MythicMobs
CUSTOMNPCS_KILL击杀 CustomNPCs

方块、物品、容器

类型说明
BLOCK_BREAK破坏方块
BLOCK_PLACE放置方块
SIGN_CHANGE编辑告示牌
ITEM_PICKUP拾取物品
ITEM_CONSUME吃食物 / 用药水
ITEM_BREAK工具损坏
CRAFT_ITEM合成物品
BUCKET_FILL装桶
BUCKET_EMPTY倒桶
ANVIL_USE使用铁砧
BOOK_EDIT编辑书本
INVENTORY_OPEN打开容器 / GUI
INVENTORY_CLOSE关闭容器 / GUI
INVENTORY_SCAN定时扫描背包

其他与联动

类型说明
BED_ENTER / BED_LEAVE上床 / 离床
VEHICLE_ENTER / VEHICLE_EXIT进入 / 离开载具
FISHING钓鱼
REGION_ENTER / REGION_LEAVE进入 / 离开区域
TIMER定时触发
CHEMDAH_QUEST_COMPLETEChemdah 任务完成

你也可以直接在服里用:

text
/ach triggers
/ach triggers 区域
/ach triggers DAMAGE

来现场搜索。

条件值怎么写

简单条件最常见的是三种:

  • 精确匹配:"SkeletonKing"
  • 数值比较:">=10""<5""<=100"
  • 布尔:true / false

例如:

yaml
trigger:
  type: DEAL_DAMAGE
  条件:
    伤害值: ">=100"
    是PVP: false
  进度: +1

简单条件更适合“筛掉不相关触发”。一旦逻辑开始需要:

  • 多个分支
  • 跨事件标记
  • 依赖区域 / 外部属性 / 计时
  • 动态计算进度

就建议切到脚本。

触发器里几个最容易写偏的点

COMMAND 不是任意指令监听的万能替代

当前实现里,最推荐的接法是:

  1. commands.yml 注册脚本命令
  2. 在成就里使用 COMMAND / 指令 触发器
  3. 在脚本里读取 commandargs参数1 这些上下文

这样最稳定,也最方便热重载。

REGION_ENTER / REGION_LEAVE 同时支持两套区域源

  • 自定义区域:直接填你在 regions/ 里定义的区域 ID
  • WorldGuard 区域:写成 wg:区域名

如果你服里区域比较多,推荐把真正可维护的内容放进 regions/,别全堆到 config.yml -> custom-regions

INVENTORY_SCAN 不是每 tick 都跑

它走的是全局背包扫描任务,频率来自:

yaml
inventory-scan:
  interval: 3
  batch-size: 10

所以这类成就适合做:

  • 收集型
  • 是否持有型
  • 定期盘点型

不适合拿来做那种“必须瞬时响应”的玩法。

TIMER 自己要配 interval

yaml
trigger:
  type: TIMER
  interval: 60
  script: |
    if (拥有属性("物理伤害", 50)) {
      设置进度(1)
    }

interval 写的是这个成就自己的轮询间隔,不是全局扫描间隔。

任务模式不是另一个插件,而是成就上的一层配置

AchieveMaster 的任务系统不是单独开一个“任务目录”,而是在普通成就上加一段 quest: 配置。

最常见的几项是:

字段作用
require-accept是否需要手动接取
auto-submit完成后是否自动提交
allow-cancel是否允许取消
cancel-reset-progress取消时是否重置进度
max-accepts最大接取次数
concurrent-limit同时进行上限
accept-conditions接取前检查等级、权限、金币、成就分、前置成就
accept-cost接取时真正扣除的金币 / 成就分 / 物品
submit-conditions手动提交时需要交付的物品
completion-description任务完成待提交时显示的额外描述

最小任务示例:

yaml
quest:
  enabled: true
  require-accept: true
  auto-submit: false
  allow-cancel: true
  completion-description:
    - "&a任务已完成"
    - "&7请使用 &e/ach submit collect_materials"

重置系统怎么理解

成就可以自己带 reset:,不管它是不是任务模式。

支持的重置类型有:

  • daily
  • weekly
  • monthly
  • cron

最常见的写法:

yaml
reset:
  enabled: true
  type: weekly
  day: 1
  time: "04:00"

这类配置适合:

  • 每日签到
  • 周常 Boss
  • 月度收集
  • 限时任务

使用建议

  • 能用简单条件的,先别上复杂脚本。
  • 高频触发器如 PLAYER_MOVE,尽量少做重逻辑。
  • 跨事件统计用标记、时间标记、多目标,比硬写一堆临时变量更稳。
  • 要给玩家主动入口时,优先走 commands.yml + COMMAND
  • 想看当前服到底有什么函数、什么触发器,直接用 /ach functions/ach triggers 反查。

常见问题

一个触发器里能不能同时写 条件script

可以,但更推荐这样理解:

  • 条件 用来做第一层快速过滤
  • script 用来做真正复杂逻辑

如果你的脚本本来就会完整处理过滤,那 条件 不是必须写。

script-js 真的是浏览器那种 JavaScript 吗

不是。

字段名叫 script-js,但当前实现实际走的是插件内置的 AviatorScript 引擎。写法和浏览器原生 JS 不要直接混抄。

任务完成了,却还要手动 /ach submit

这是正常的,只要你把:

yaml
auto-submit: false

关掉了自动提交,任务就会进入“已完成待提交”状态。

下一步阅读

TQ Minecraft Server Plugin Docs