Skip to content

事件绑定

事件绑定main.yml 里的全局事件页。

它适合处理整场副本都会关心的节点,比如开场、正式开战、玩家进出、玩家死亡、通关、超时、团灭这类全局反应。

先记住这几条

  • 脚本:事件触发时只执行一次。
  • 玩家脚本:会对当前副本内在线玩家逐个执行一次,不是只对触发者执行。
  • 玩家加入玩家离开玩家死亡 这三个事件,现在会额外带上事件触发玩家。
  • 其他事件暂时不要按“事件触发玩家”去理解,像 区域进入怪物死亡Boss击杀阶段开始 这些,文档没写的就当没有。

基础写法

yaml
事件绑定:
  副本开始:
    脚本: |
      消息.全体("&e副本开始")
      副本.设置变量("天气阶段", "暴雨")
    玩家脚本: |
      消息.发送("&7当前天气阶段: 暴雨")

这段的效果很简单:

  • 脚本 只跑一次。
  • 玩家脚本 会对本内每个在线玩家各跑一次。

当前支持的事件

事件名触发时机常见用途
副本开始副本开始流程启动后,进入倒计时阶段时开场提示、初始化副本变量
进入战斗副本正式进入 RUNNING正式开战播报、战斗开关
玩家加入玩家被加入实例后触发,中途加入也会触发欢迎提示、同步公共状态
玩家离开玩家真正移出实例前触发离场提示、离场前清理
玩家死亡副本内玩家死亡时触发死亡播报、失败压力
阶段开始阶段自己的开始脚本和开始玩家脚本执行完后全局阶段播报
阶段完成阶段自己的通关脚本和通关玩家脚本执行完后收尾播报、阶段切换提示
区域解锁某区域从锁定变为可用时区域开放提示
区域进入有玩家进入某个区域时全局提醒
区域清除某区域被标记为清除时区域完成播报
怪物生成一次怪物生成处理完成后刷怪提示
怪物死亡被追踪怪物死亡时击杀统计、进度累计
Boss击杀被击杀目标角色名为 BossBoss 播报、结算前表现
副本通关副本以通关结束时,结算传送前通关播报、结算前收尾
副本超时副本以超时结束时,传送出本前超时失败提示
全员阵亡副本以 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 结束。

如果当前还保留复活机会,或者掉线保护还在保留实例,全员阵亡 通常还不会进。

下一步阅读

TQ Minecraft Server Plugin Docs