Skip to content

交互.yml

交互.yml 用来定义按钮、拉杆、压力板、实体交互点这类触发器。

它的定位很明确:

  • 阶段.yml 管流程
  • 区域.yml 管空间
  • 交互.yml 管玩家主动触发的机关和交互点

如果你要做“拉一下开门”“点一下启动机关”“右键某个实体触发剧情”,这页就是核心。

交互点最常拿来做什么

  • 玩家点击按钮开门
  • 踩压力板启动机关
  • 右键实体触发剧情
  • 某个拉杆开启下一波怪
  • 某个交互点改副本变量

一份标准示例

yaml
入口拉杆:
  目标类型: 方块
  方块类型: LEVER
  坐标: '15,67,15'
  交互方式: 右键
  单次触发: true
  冷却: 0
  条件: '副本.读取变量("入口已开启") != true'
  触发脚本: |
    副本.设置变量("入口已开启", true)
    消息.全体("&e入口机关已启动")
    障碍物.关闭("入口门组")

祭坛守卫:
  目标类型: 实体
  实体MMID: DemoMob
  交互方式: 右键
  冷却: 20
  触发脚本: |
    消息.发送("&6你触碰了祭坛守卫")

核心字段

目标类型

当前支持两类:

  • 方块
  • 实体

源码也兼容英文写法,比如 entitymob

如果你填了 实体MMID,源码通常也会自动按实体目标处理。

正式配置里还是建议把 目标类型 写清楚。

方块类型

方块交互时可写:

yaml
方块类型: LEVER

这能避免别的方块误触发。

坐标

方块交互最稳的写法就是带坐标:

yaml
坐标: '15,67,15'

源码当前是按整数方块坐标匹配。

实体MMID

实体交互用的是 MythicMobs 的内部怪物类型名。

源码也兼容这些别名字段:

  • 实体MMID
  • 实体ID
  • MMID

文档建议统一用 实体MMID

区域

交互点还能限制在某个区域里才有效:

yaml
区域: 战斗区

这很适合防止同名机关在别的房间被误触发。

交互方式

按源码当前实现,支持这些写法:

  • 右键
  • 左键
  • 踩踏

默认值是 右键

单次触发

yaml
单次触发: true

只要触发过一次,这个交互点后面就不会再生效,除非实例重开或你手动重置。

冷却

yaml
冷却: 20

这里的单位是 tick。

20 大约等于 1 秒。

条件

交互点可以先过条件表达式,再决定要不要触发。

例如:

yaml
条件: '副本.读取变量("Boss房已开放") == true'

条件不满足时,这个交互点会直接不触发。

触发脚本

这是交互点的核心字段。

玩家实际触发以后,交互脚本会立刻执行。

交互页和全局事件的边界

这页最适合放“谁点了它,就立刻发生什么”的逻辑。

适合写在这里的:

  • 点按钮开门
  • 拉拉杆刷怪
  • 点祭坛改副本变量
  • 踩压力板播提示

不适合塞在这里的:

  • 整场副本统一播报
  • 某一波怪打完后的全局收尾
  • 副本通关或团灭统一处理

这些还是回到 阶段.ymlmain.yml -> 事件绑定 更清楚。

脚本上下文里能直接拿什么

交互脚本执行时,源码当前会放进这些变量:

  • interaction_id
  • interaction_target_type
  • interaction_block_type
  • interaction_block_x
  • interaction_block_y
  • interaction_block_z
  • interaction_entity_uuid
  • interaction_target_uuid
  • interaction_entity_mmid
  • interaction_target_mmid

另外,脚本里的玩家上下文就是实际触发这个交互点的玩家本人。

这类变量很适合拿来做:

  • 多机关共用同一段脚本
  • 按触发对象类型分支处理
  • 调试时快速确认当前触发的是哪个点

交互命中规则

源码当前逻辑大致是这样:

  • 方块目标:先看交互方式,再看方块类型、坐标、区域
  • 实体目标:先看交互方式,再看实体 MMID、区域
  • 条件成立后才执行脚本
  • 单次触发和冷却会在脚本执行前生效

所以正式副本里,推荐这样写:

  • 方块交互尽量同时写 方块类型 + 坐标
  • 实体交互尽量同时写 目标类型 + 实体MMID
  • 复杂副本再加 区域

推荐写法

最稳的按钮开门写法

yaml
Boss房开关:
  目标类型: 方块
  方块类型: STONE_BUTTON
  坐标: '30,65,10'
  交互方式: 右键
  单次触发: true
  触发脚本: |
    消息.全体("&eBoss 房入口已开启")
    障碍物.关闭("Boss房大门")

限制在某个区域才能触发

yaml
祭坛按钮:
  目标类型: 方块
  方块类型: STONE_BUTTON
  区域: 祭坛区
  坐标: '12,65,8'
  交互方式: 右键
  触发脚本: |
    副本.设置变量("祭坛已激活", true)

交互点当玩法入口

如果你要把外部道具或菜单逻辑接进副本,交互点也很适合当本内入口:

yaml
暴雪解除装置:
  目标类型: 方块
  方块类型: LEVER
  坐标: '40,65,22'
  交互方式: 右键
  条件: '副本.读取变量("暴雪开启") == 1'
  触发脚本: |
    副本.设置变量("暴雪开启", 0)
    消息.全体("&b暴雪已被解除")

配置建议

  • 第一个交互点先做简单,不要一开始就堆很多条件。
  • 重要机关尽量写坐标,别只靠方块类型碰运气。
  • 会影响流程的交互点最好配 单次触发 或明确冷却。
  • 交互点名字尽量表达用途,后面排错时很好用。
  • 交互脚本只管触发后的直接反馈,后续大流程还是交给阶段或全局事件。

常见问题

点了没反应

优先检查:

  • 坐标是否正确
  • 方块类型是否写对
  • 交互方式是否和玩家操作一致
  • 是否已经被 单次触发 用掉
  • 冷却是否还没结束
  • 条件表达式是否拦住了触发

实体交互没生效

先检查:

  • 实体MMID 是否真的是该实体的 MMID
  • 目标类型 是否写成了实体
  • 当前玩家是否在这个交互点要求的区域内

同一个机关触发了错误逻辑

这通常是交互点写得太泛了。

优先补:

  • 坐标
  • 方块类型
  • 区域

下一步阅读

TQ Minecraft Server Plugin Docs