交互.yml
交互.yml 用来定义按钮、拉杆、压力板、实体交互点这类触发器。
它的定位很明确:
阶段.yml管流程区域.yml管空间交互.yml管玩家主动触发的机关和交互点
如果你要做“拉一下开门”“点一下启动机关”“右键某个实体触发剧情”,这页就是核心。
交互点最常拿来做什么
- 玩家点击按钮开门
- 踩压力板启动机关
- 右键实体触发剧情
- 某个拉杆开启下一波怪
- 某个交互点改副本变量
一份标准示例
yaml
入口拉杆:
目标类型: 方块
方块类型: LEVER
坐标: '15,67,15'
交互方式: 右键
单次触发: true
冷却: 0
条件: '副本.读取变量("入口已开启") != true'
触发脚本: |
副本.设置变量("入口已开启", true)
消息.全体("&e入口机关已启动")
障碍物.关闭("入口门组")
祭坛守卫:
目标类型: 实体
实体MMID: DemoMob
交互方式: 右键
冷却: 20
触发脚本: |
消息.发送("&6你触碰了祭坛守卫")核心字段
目标类型
当前支持两类:
方块实体
源码也兼容英文写法,比如 entity、mob。
如果你填了 实体MMID,源码通常也会自动按实体目标处理。
正式配置里还是建议把 目标类型 写清楚。
方块类型
方块交互时可写:
yaml
方块类型: LEVER这能避免别的方块误触发。
坐标
方块交互最稳的写法就是带坐标:
yaml
坐标: '15,67,15'源码当前是按整数方块坐标匹配。
实体MMID
实体交互用的是 MythicMobs 的内部怪物类型名。
源码也兼容这些别名字段:
实体MMID实体IDMMID
文档建议统一用 实体MMID。
区域
交互点还能限制在某个区域里才有效:
yaml
区域: 战斗区这很适合防止同名机关在别的房间被误触发。
交互方式
按源码当前实现,支持这些写法:
右键左键踩踏
默认值是 右键。
单次触发
yaml
单次触发: true只要触发过一次,这个交互点后面就不会再生效,除非实例重开或你手动重置。
冷却
yaml
冷却: 20这里的单位是 tick。
20 大约等于 1 秒。
条件
交互点可以先过条件表达式,再决定要不要触发。
例如:
yaml
条件: '副本.读取变量("Boss房已开放") == true'条件不满足时,这个交互点会直接不触发。
触发脚本
这是交互点的核心字段。
玩家实际触发以后,交互脚本会立刻执行。
交互页和全局事件的边界
这页最适合放“谁点了它,就立刻发生什么”的逻辑。
适合写在这里的:
- 点按钮开门
- 拉拉杆刷怪
- 点祭坛改副本变量
- 踩压力板播提示
不适合塞在这里的:
- 整场副本统一播报
- 某一波怪打完后的全局收尾
- 副本通关或团灭统一处理
这些还是回到 阶段.yml 或 main.yml -> 事件绑定 更清楚。
脚本上下文里能直接拿什么
交互脚本执行时,源码当前会放进这些变量:
interaction_idinteraction_target_typeinteraction_block_typeinteraction_block_xinteraction_block_yinteraction_block_zinteraction_entity_uuidinteraction_target_uuidinteraction_entity_mmidinteraction_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目标类型是否写成了实体- 当前玩家是否在这个交互点要求的区域内
同一个机关触发了错误逻辑
这通常是交互点写得太泛了。
优先补:
- 坐标
- 方块类型
- 区域