玩家输入
查询聊天、告示牌、多步输入、验证重试、取消与重新打开菜单。
输入捕获写在已有菜单的图标 action 或其他有菜单会话的动作位置。开始时先关闭原菜单,再等待输入;成功后可以携带答案重新打开原菜单。
聊天输入
把下面对象放到图标的 action 字段。没有 content、signLine 时,接收下一条聊天消息:
action:
catch: nickname
cancel:
- cancel
- exit
reopen: true
beforeInput: "mmsg '&e请输入昵称,cancel 取消'"
afterInput: "mmsg '&a收到:{{&nickname}}'"
onCancel: "mmsg '&7已取消,菜单保持关闭'"输入“Alex”后,先保存为 nickname,再发送“收到:Alex”,最后重开原菜单。输入 cancel / exit 时只执行 onCancel,不会保存这条取消词,也不会自动重开。
告示牌输入
填写 content 或 signLine 任意一个字段,即改为告示牌输入;没有额外的 type: SIGN 字段。
action:
catch: keyword
content:
- '输入关键词:'
- ''
- '确认后返回菜单'
- ''
signLine: 1
cancel:
- cancel
afterInput: "mmsg '&a搜索词:{{&keyword}}'"signLine: 1 读取第二行。省略它或填写负数时,把所有行直接连接,不添加分隔符;因此有提示文字时应明确指定输入行。超出可用行号时会限制到首行或末行。初始文字可包含菜单变量;建议按四行填写。
单步字段
以下字段位于一次输入对象;多步时位于每个 catchers 项。reopen 例外,始终位于整个动作外层。
| 字段 | 类型 | 必填 | 省略行为 | 说明 |
|---|---|---|---|---|
catch | 文字 | 是 | 无法读取此步骤 | 答案变量名,使用普通名字,不带 player@ / global@ |
content | 文字列表 | 否 | 无初始行内容 | 设置后使用告示牌;不是一段多行标量 |
signLine(signIndex、index、line) | 整数 | 否 | 告示牌输入时连接所有行 | 0~3 对应四行;负数连接所有行,设置此字段即使用告示牌 |
cancel | 文字或文字列表 | 否 | 无取消关键词 | 与完整输入相等时取消,不区分大小写;不会自动去掉前后空格 |
reopen | 布尔值 | 否 | true | 单步成功或全部步骤成功后重开原菜单;取消不触发 |
beforeInput | 动作或动作列表 | 否 | 不执行 | 此步骤首次开始接收输入前启动,重试时不重复启动 |
afterInput | 动作或动作列表 | 否 | 接受答案 | 保存非取消答案后执行;即时返回 false 时要求重输 |
onRepeat | 动作或动作列表 | 否 | 无额外动作 | 验证失败后启动,然后重新接收当前步骤 |
onCancel | 动作或动作列表 | 否 | 结束捕获并保持关闭 | 匹配取消词后启动,不再进入后续步骤 |
单独填写 afterInput 不等于定义捕获器,catch 仍然必填;它不是 catch 的字段别名。
没有内置的输入超时或最大重试次数。新的输入捕获会取消玩家尚未完成的聊天捕获,不会把两次捕获排成队列。
验证与重试
例如只接受非空白答案,把单步对象改为:
action:
catch: nickname
cancel:
- cancel
beforeInput: "mmsg '&e请输入昵称'"
afterInput:
if: 'js "String(nickname).trim().length > 0"'
then: true
else: false
onRepeat: "mmsg '&c昵称不能为空,请重新输入'"
onCancel: "mmsg '&7已取消'"验证失败时,当前步骤重试,beforeInput 不重发,onRepeat 会执行。无效答案已写入本次捕获上下文,下一次非取消答案会覆盖它。
验证必须能立即返回;包含等待或其他尚未完成操作的 afterInput 不会可靠地阻止通过。beforeInput、onRepeat、onCancel 的返回值不决定后续流程,也不会等待它们的延迟动作结束。
多步输入
catchers 按顺序接收答案。下面先接收昵称,再接收留言,第二步可以读取第一步的 nickname:
action:
reopen: true
catchers:
- catch: nickname
cancel:
- cancel
beforeInput: "mmsg '&e请输入昵称,cancel 取消'"
onCancel: "mmsg '&7已取消本次填写'"
- catch: message
beforeInput: "mmsg '&e请输入留言,cancel 取消'"
afterInput: "mmsg '&a{{&nickname}} 的留言:{{&message}}'"| 字段 | 类型 | 必填 | 省略行为 | 说明 |
|---|---|---|---|---|
catchers | 输入步骤对象列表 | 是 | 不构成此结构 | 至少一个步骤;不接受空列表 |
reopen | 布尔值 | 否 | true | 所有步骤完成后重开;写在单个步骤内不控制重开 |
后续步骤未填写的 cancel、beforeInput、onRepeat、onCancel 会沿用第一步的对应设置,不是沿用上一步。afterInput 从不继承。
第一步使用告示牌时,后续没有填写 content / signLine 的步骤会沿用告示牌输入方式,但不会复制第一步的初始文字和行号,因此默认接收全部行的连接结果。混合输入方式时,为各步骤明确填写所需的告示牌内容与行号;不能用一个不存在的 type 字段切回聊天。
任一步取消都会终止整组输入,不会执行后续步骤或最终重开。
成功重开、取消返回与变量
捕获期间原窗口已经关闭:
- 回调用
{{&nickname}}、{{&message}}等读取本次答案,不用ctx get去寻找已经关闭的原会话。 reopen: true在成功后重新打开原菜单 ID并带回答案;新菜单的打开事件仍会执行,无条件初始化可能覆盖答案。- 输入后的显示更新通常交给重开时的图标与生成器构建,不在回调里执行
icon refresh、翻页或regenerate。 - 捕获变量不会因名字带持久前缀而自动存储。需要保存个人设置时,在回调里明确用
persist。
取消后要回到搜索列表,可将 onCancel 写成 menu open search-demo。这是全新打开,不携带之前的普通筛选状态;见完整搜索示例。不想成功后重开时设置 reopen: false,并在回调中安排明确的后续行为。
下图对应搜索示例的实际流程:点击下排名称牌,关闭菜单后在聊天栏输入“说明”,成功返回四项筛选结果;聊天输入不是箱子内的输入框。
搜索按钮启动聊天输入,输入成功后带着关键词返回菜单。
Last updated on