触发器与任务
AchieveMaster 的成就推进,核心都落在 trigger: 这一个块里。你可以把它理解成:
- 什么事件会把这条成就叫醒
- 先用哪些条件筛一遍
- 命中以后是直接加进度,还是交给脚本自己算
先记住两种写法
方式 1:简单配置
适合“条件很明确,命中后直接加进度”的场景。
yaml
trigger:
type: ENTITY_KILL
条件:
实体类型: "ZOMBIE"
进度: +1这类配置最适合:
- 击杀指定怪
- 进入指定区域
- 拾取指定物品
- 达到某个数值阈值
方式 2:脚本配置
适合“同一触发器下要做多步判断、写标记、算多目标、读外部变量”的场景。
yaml
trigger:
type: MYTHICMOBS_KILL
script: |
设置标记("杀过骷髅王")
if (存在标记("杀过骷髅王")) {
设置进度(1)
}当前实现里,脚本字段支持这些写法:
script脚本script-js脚本jsjs
其中:
script/脚本走 AchieveMaster 自己的脚本体系script-js/js字段名虽然叫js,实际走的是插件内置的AviatorScript表达式引擎
trigger 里常见字段
| 字段 | 作用 |
|---|---|
type | 触发器类型 |
条件 | YAML 过滤条件,适合简单场景 |
进度 | 简单进度规则,+1 表示增加,纯数字表示直接设置 |
script / 脚本 | 复杂逻辑脚本 |
script-js / 脚本js / js | AviatorScript 脚本 |
interval | 定时器触发间隔 |
另外有一个细节很重要:
INVENTORY_SCAN的全局扫描频率在config.yml -> inventory-scanTIMER的单成就触发频率在成就自己的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_COMPLETE | Chemdah 任务完成 |
你也可以直接在服里用:
text
/ach triggers
/ach triggers 区域
/ach triggers DAMAGE来现场搜索。
条件值怎么写
简单条件最常见的是三种:
- 精确匹配:
"SkeletonKing" - 数值比较:
">=10"、"<5"、"<=100" - 布尔:
true/false
例如:
yaml
trigger:
type: DEAL_DAMAGE
条件:
伤害值: ">=100"
是PVP: false
进度: +1简单条件更适合“筛掉不相关触发”。一旦逻辑开始需要:
- 多个分支
- 跨事件标记
- 依赖区域 / 外部属性 / 计时
- 动态计算进度
就建议切到脚本。
触发器里几个最容易写偏的点
COMMAND 不是任意指令监听的万能替代
当前实现里,最推荐的接法是:
- 在
commands.yml注册脚本命令 - 在成就里使用
COMMAND/指令触发器 - 在脚本里读取
command、args、参数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:,不管它是不是任务模式。
支持的重置类型有:
dailyweeklymonthlycron
最常见的写法:
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关掉了自动提交,任务就会进入“已完成待提交”状态。