事件绑定
事件绑定 是 main.yml 里的全局事件页。
它适合处理整场副本都会关心的节点,比如开场、正式开战、玩家进出、玩家死亡、通关、超时、团灭这类全局反应。
先记住这几条
脚本:事件触发时只执行一次。玩家脚本:会对当前副本内在线玩家逐个执行一次,不是只对触发者执行。玩家加入、玩家离开、玩家死亡这三个事件,现在会额外带上事件触发玩家。- 其他事件暂时不要按“事件触发玩家”去理解,像
区域进入、怪物死亡、Boss击杀、阶段开始这些,文档没写的就当没有。
基础写法
yaml
事件绑定:
副本开始:
脚本: |
消息.全体("&e副本开始")
副本.设置变量("天气阶段", "暴雨")
玩家脚本: |
消息.发送("&7当前天气阶段: 暴雨")这段的效果很简单:
脚本只跑一次。玩家脚本会对本内每个在线玩家各跑一次。
当前支持的事件
| 事件名 | 触发时机 | 常见用途 |
|---|---|---|
副本开始 | 副本开始流程启动后,进入倒计时阶段时 | 开场提示、初始化副本变量 |
进入战斗 | 副本正式进入 RUNNING 后 | 正式开战播报、战斗开关 |
玩家加入 | 玩家被加入实例后触发,中途加入也会触发 | 欢迎提示、同步公共状态 |
玩家离开 | 玩家真正移出实例前触发 | 离场提示、离场前清理 |
玩家死亡 | 副本内玩家死亡时触发 | 死亡播报、失败压力 |
阶段开始 | 阶段自己的开始脚本和开始玩家脚本执行完后 | 全局阶段播报 |
阶段完成 | 阶段自己的通关脚本和通关玩家脚本执行完后 | 收尾播报、阶段切换提示 |
区域解锁 | 某区域从锁定变为可用时 | 区域开放提示 |
区域进入 | 有玩家进入某个区域时 | 全局提醒 |
区域清除 | 某区域被标记为清除时 | 区域完成播报 |
怪物生成 | 一次怪物生成处理完成后 | 刷怪提示 |
怪物死亡 | 被追踪怪物死亡时 | 击杀统计、进度累计 |
Boss击杀 | 被击杀目标角色名为 Boss 时 | Boss 播报、结算前表现 |
副本通关 | 副本以通关结束时,结算传送前 | 通关播报、结算前收尾 |
副本超时 | 副本以超时结束时,传送出本前 | 超时失败提示 |
全员阵亡 | 副本以 ALL_DEAD 结束时,传送出本前 | 团灭提示、失败收尾 |
事件玩家上下文
这部分只和 玩家加入、玩家离开、玩家死亡 三个事件有关。
在 脚本 里怎么理解
这三个事件的 脚本 现在会直接把触发者放进当前玩家上下文。
所以你可以直接这样写:
yaml
事件绑定:
玩家加入:
脚本: |
消息.广播("&e" + 玩家名() + " &7加入了副本")也可以写占位符版:
yaml
事件绑定:
玩家加入:
脚本: |
消息.广播("&e{玩家} &7加入了副本")这两种写法在这里是等价的。
在 玩家脚本 里怎么理解
玩家脚本 还是老规则。
它会对当前副本内在线玩家逐个执行,所以这里的:
玩家名()玩家UUID(){玩家}
拿到的是当前这一轮执行脚本的那个玩家,不一定是事件触发者。
如果你在 玩家脚本 里想拿到真正触发事件的人,要改用:
事件玩家名()事件玩家UUID(){事件玩家}{事件玩家名}{事件玩家UUID}
例如:
yaml
事件绑定:
玩家加入:
玩家脚本: |
消息.发送("&e" + 事件玩家名() + " &7加入了副本")玩家脚本 的实际范围
事件绑定 里的 玩家脚本 会对当前副本内在线玩家逐个执行。
这意味着:
玩家死亡 -> 玩家脚本不等于只对死掉的人执行。区域进入 -> 玩家脚本不等于只对刚进区域的人执行。玩家离开 -> 玩家脚本也不是只对离开的人执行。
如果你只想处理某一个明确玩家,优先写普通 脚本,或者回到对应配置页处理。
如果你写的是 玩家加入、玩家离开、玩家死亡 这三个事件,又需要拿到触发者,就直接用 事件玩家名() 或 {事件玩家}。
副本开始 和 进入战斗
这两个节点不要混着用。
副本开始更靠前,开始流程一启动就会触发。进入战斗更靠后,副本真正进入运行状态后才会触发。
开场倒计时提示、初始化变量,适合放 副本开始。
正式开战播报、战斗状态切换,适合放 进入战斗。
全员阵亡 什么时候进
全员阵亡 不是有人死了就会触发,也不是所有人暂时倒地就立刻触发。
它是在副本真的以 ALL_DEAD 结束时才会触发。常见会进这个事件的情况是:
- 当前存活人数已经是
0。 - 复活系统判定已经没人还能继续复活。
- 或者副本里已经没人,掉线保护也不再保留这个实例。
如果你的本里是“全队都倒下了,但还在等复活机会”的设计,这个阶段通常还不会立刻进 全员阵亡。
事件绑定里拿不到哪些细节
当前 事件绑定 主要拿到的是副本上下文、当前执行玩家上下文,以及上面提到的那一小部分事件玩家上下文。
它不会自动给你塞这些专属信息:
- 当前进入的是哪一个区域。
- 当前完成的是哪一个阶段。
- 当前死的是哪一只怪。
- 当前触发的是哪个按钮、哪个交互点、哪个全息。
这类信息更适合回到各自的配置页里写。
推荐写法
开场初始化全局状态
yaml
事件绑定:
副本开始:
脚本: |
副本.设置变量("暴雪开启", 1)
消息.全体("&b寒潮正在逼近")正式开战后给全队统一处理
yaml
事件绑定:
进入战斗:
玩家脚本: |
消息.发送("&c战斗开始,小心第一波怪物")这里的 玩家脚本 会给本内每个在线玩家各发一条消息。
有玩家加入时给全队播报是谁进来了
yaml
事件绑定:
玩家加入:
脚本: |
消息.广播("&e{玩家} &7加入了副本")如果你更喜欢函数写法,也可以这样写:
yaml
事件绑定:
玩家加入:
脚本: |
消息.广播("&e" + 玩家名() + " &7加入了副本")如果你写在 玩家脚本 里,就不要再用 玩家名(),要改成 事件玩家名():
yaml
事件绑定:
玩家加入:
玩家脚本: |
消息.发送("&e" + 事件玩家名() + " &7加入了副本")通关或失败前做统一收尾
yaml
事件绑定:
副本通关:
脚本: |
消息.全体("&6副本通关")
全员阵亡:
脚本: |
消息.全体("&c队伍全灭")
玩家脚本: |
效果.药水("slowness", 0, 0)
效果.药水("blindness", 0, 0)使用建议
- 事件名用源码实际支持的名字,不要自己扩写。
事件绑定里优先放全局播报、全局变量、统一收尾。- 玩家定向处理、区域定向处理、交互定向处理,尽量回到各自配置。
- 想排查触发顺序时,先在对应事件里加一条
消息.全体(...),最快。 - 大段复杂逻辑不要全堆在
main.yml,后面排错会很累。
常见问题
事件写了但没有反应
先检查:
- 事件名是不是和源码支持的名字完全一致。
- 缩进有没有错。
- 脚本语法有没有错。
- 实际流程里这个事件是不是真的发生了。
玩家死亡 想只处理死掉的那个人
如果你写的是 脚本,现在可以直接按触发者来理解:
yaml
事件绑定:
玩家死亡:
脚本: |
消息.广播("&c" + 玩家名() + " 倒下了")如果你写的是 玩家脚本,当前副本内在线玩家都会各执行一次。
这时候想拿死掉的那个人,不要用 玩家名(),要用 事件玩家名()。
区域进入 想知道进的是哪一块区域
事件绑定 这里拿不到区域专属上下文。
这类需求更适合写在 区域.yml 的进入脚本里。
团灭后脚本没触发
先确认副本是不是真的以 ALL_DEAD 结束。
如果当前还保留复活机会,或者掉线保护还在保留实例,全员阵亡 通常还不会进。