Skip to content
iPlugin

玩家输入

查询聊天、告示牌、多步输入、验证重试、取消与重新打开菜单。

输入捕获写在已有菜单的图标 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,并在回调中安排明确的后续行为。

下图对应搜索示例的实际流程:点击下排名称牌,关闭菜单后在聊天栏输入“说明”,成功返回四项筛选结果;聊天输入不是箱子内的输入框。

search-demo.yml配置效果示意 · 非游戏截图
图示状态完整列表 · 第 1 页
窗口槽位 13窗口坐标 4x1面板局部坐标 4x1字符 S

搜索按钮启动聊天输入,输入成功后带着关键词返回菜单。

Last updated on