菜单打开入口
配置命令、物品、聊天、潜行换手、实体和 NPC 入口,了解各自携带的变量。
bindings 写在菜单文件顶层,别名为 binding、activator、activators。下面的片段都合并到要打开的那个菜单中;保存后按文件更新规则重载。
入口字段
| 字段 | 类型 | 必填 | 省略行为 | 说明 |
|---|---|---|---|---|
bindings(binding、activator、activators) | 对象 | 否 | 不添加任何绑定入口 | 菜单顶层;不影响管理命令或脚本直接打开 |
command(commands、cmd、cmds) | 命令名文字、命令对象或它们的列表 | 否 | 不注册绑定命令 | 注册打开本菜单的玩家命令 |
item(读取别名 items) | 文字或文字列表 | 否 | 不启用物品入口 | 任意一条物品表达式匹配即可;实际事件使用 item |
chat(读取别名 chats) | 文字或文字列表 | 否 | 不启用聊天入口 | 匹配完整聊天或命令文字,忽略大小写;实际事件使用 chat |
shift_f | 整数,毫秒 | 否 | 不启用按键入口 | 潜行状态切换后按换手键的时间窗口;填写小于 50 的值按 50 处理 |
entity | 文字或文字列表 | 否 | 不启用实体入口 | 右键指定实体类型,忽略大小写 |
adyeshach(读取别名 ady) | 文字或文字列表 | 否 | 不启用 NPC 入口 | Adyeshach NPC ID,忽略大小写;实际事件使用 adyeshach |
items、chats、ady 能被配置读取,但不会由对应物品、聊天和 NPC 事件触发;请使用 item、chat、adyeshach。命令的四种字段名都能注册命令;同一菜单中同时使用这些命令字段时,定义会合并检查,而不是后者覆盖前者。没有对应入口的字段会被忽略,不会自动成为一个新入口。
命令入口
bindings:
command: hello-menu保存并重载后,玩家执行 /hello-menu 打开这个菜单;绑定名称不含开头 /。这种打开不要求管理命令权限,也不受其他事件入口的一秒共享间隔限制。
多个命令可写成列表,共同打开当前菜单,但分别定义自己的参数和权限:
bindings:
command:
- name: guide
aliases:
- menu-guide
- name: help-menu
description: '打开同一个帮助菜单'命令名称与别名会转成小写,别名会去重;命令名不能空白或含空格。同一菜单内任何命令名、别名都不能与另一条定义重名。其他菜单占用相同的 Invero 命令标签时会注册失败;其他插件占用普通标签时,可能只能使用 /invero:<命令名>,按后台冲突提示确定实际入口。
命令字段
命令对象写在 bindings.command 下;只有名称时直接写文字即可。
| 字段 | 类型 | 必填 | 省略行为 | 说明 |
|---|---|---|---|---|
name | 文字 | 是 | 无法注册 | 命令名,不含 / |
aliases | 文字列表 | 否 | 没有别名 | 同一命令的其他名称;不能代替 name |
description | 文字 | 否 | 使用命令名 | 空文字也使用命令名 |
usage | 文字 | 否 | 根据名称与参数生成 | 空文字也自动生成;可选参数用方括号,必填参数用尖括号 |
permission | 文字 | 否 | 自动使用 invero.command.<小写命令名>.use,首次注册默认所有玩家可用 | 显式填写时,该权限首次注册默认授予 OP;已有权限的授权规则保留 |
permissionMessage | 文字 | 否 | 使用服务端命令框架的无权限提示 | 空文字同省略;只影响无权限,不影响参数错误 |
arguments(argument、args) | 参数文字或参数对象的列表 | 否 | 不声明参数变量 | 按列表顺序接收;每项文字相当于只填写 id |
命令权限仅限制这一条绑定命令。 它不自动限制指南针、聊天、实体或管理命令直接打开同一菜单。需要所有入口共用的打开条件,写在菜单的 events.pre_open,见菜单事件。
命令参数
以下片段让 /profile 默认查看“自己”,也允许输入 /profile Steve,并要求绑定命令权限:
bindings:
command:
name: profile
aliases:
- my-profile
description: '打开资料菜单'
permission: 'invero.profile'
permissionMessage: '你没有权限打开资料菜单。'
arguments:
- id: target
type: ANY
optional: true
default: '自己'
suggest:
- 自己
- Steve此处 default: '自己' 是示例中显式填写的值,不是参数省略后的内置值。允许使用该命令的玩家输入 /profile Steve 时,{{&target}} 为 Steve;输入 /profile 时为 自己。
| 字段 | 类型 | 必填 | 省略行为 | 说明 |
|---|---|---|---|---|
id(key、name、label) | 文字 | 是 | 参数定义无效 | 打开后使用的变量名;同一命令内非空且不能重复 |
type | 文字枚举 | 否 | ANY | 使用下表的大写名称 |
suggest | 文字列表 | 否 | 没有额外候选 | ANY 的候选,或 PLAYER / WORLD 的追加候选;数字和布尔类型不使用它 |
restrict | 布尔值 | 否 | false | 仅对 ANY 生效;为 true 时只能输入候选列表中完全相同的文字 |
optional | 布尔值 | 否 | true | 为 false 时必须在命令里提供该位置的参数 |
default | 文字、数字或布尔值 | 否 | 可选参数未输入时,不提供该变量 | 补入的值统一作为文字;不替代必填位置,也不重新按类型或候选校验 |
incorrectMessage | 文字 | 否 | 使用固定的参数错误提示 | 能读取但不生效;填写也不能自定义错误提示 |
type | 实际接受的输入 |
|---|---|
ANY | 任意文字;只有 restrict: true 时检查 suggest,比较区分大小写;此时空候选会使任何输入都无法通过 |
DECIMAL | 能解析为小数的输入 |
INTEGER | 能解析为整数的输入 |
BOOLEAN | 严格的小写 true 或 false,不接受 1、0、TRUE |
PLAYER | 当前在线玩家名及 suggest 追加文字;按候选精确匹配,不转换为玩家对象 |
WORLD | 当前世界名及 suggest 追加文字;按候选精确匹配,不转换为世界对象 |
输入和默认值进入菜单后都是文字,不会因为 INTEGER 或 BOOLEAN 自动变成对应变量类型。参数按位置填写,不能跳过中间某个参数;将必填参数放在可选参数前。最后一个参数会收下剩余的空格内容,因此不要把它当作禁止多余尾部文字的严格结构。
物品、聊天与按键
bindings:
item: 'minecraft:compass'
chat:
- '打开菜单'
- '/open-guide'
shift_f: 800| 入口 | 上例的实际触发方式与限制 |
|---|---|
item | 用主手指南针进行交互,左右键不单独区分;副手被跳过,已有 Invero 菜单会话时不触发。匹配后取消原交互 |
chat | 发送完整的“打开菜单”,或输入完整的 /open-guide;不是包含匹配或正则。匹配后取消原聊天或命令,不再公开发送或继续执行;已被取消的事件不处理 |
shift_f | 切换潜行状态后少于 800 毫秒按换手键;进入或退出潜行都会记录时间,不是一直潜行时随时按 F。每次换手会消耗这次记录,匹配后取消换手 |
800 是上例选择的窗口,不是省略 shift_f 后自动启用的值。换手键使用玩家实际绑定的按键,不要求客户端一定使用字母 F。
物品匹配写法
item 列表中任意一条表达式匹配即可。内置材质匹配使用小写名称,可省略 minecraft:,也可用 material::
bindings:
item:
- 'minecraft:compass[name=菜单]'
- 'material:clock'第一条要求指南针名称包含“菜单”,第二条匹配时钟。材质条件支持 *(任意材质)、^前缀、后缀$、(包含文字);这些不是完整正则,多个材质标记也不是逐项“且”判断。%标签% 不提供物品标签匹配。
方括号内用逗号分隔条件,所有条件同时满足才算匹配。内置条件键如下:
| 字段 | 类型 | 必填 | 省略行为 | 说明 |
|---|---|---|---|---|
name | 文字条件 | 否 | 不检查名称 | 物品名称包含指定文字,区分大小写;不论书写的运算符是什么,都按包含判断 |
lore | 文字条件 | 否 | 不检查 Lore | Lore 的文字表示包含指定文字,区分大小写;同样固定为包含判断 |
damage(durability) | 数值条件 | 否 | 不检查损伤值 | 对比物品损伤值 |
model(custom-model-data) | 数值条件 | 否 | 不检查 CustomModelData | 对比 CustomModelData;物品未设置时按 0 |
ench(enchant、enchants、enchantment) | 名称条件 | 否 | 不检查附魔 | 对比某项附魔的名称,不是等级 |
potion(potions) | 名称条件 | 否 | 不检查药水 | 对比基础药水或自定义效果的类型名 |
nbt.<路径>(tag.<路径>) | 数据条件 | 否 | 不检查该路径 | 对比对应深层 NBT 数据;路径不存在则不匹配 |
ench.<附魔名>(enchant.<附魔名>、enchantment.<附魔名>) | 等级条件,目前不可可靠使用 | 否 | 不检查该附魔等级 | 能识别这些键,但当前不按数值等级正确比较,不能用来可靠限制等级 |
除名称与 Lore 固定包含判断外,可写 =、!=、>、>=、<、<=,以及 键(值一|值二)。数值大小比较的方向是配置值与物品值比较:例如 damage>10 实际检查 10 > 物品损伤值,不是“损伤值大于 10”。未支持的条件键不匹配。
显示图标使用的外部物品 source 不等于这里的匹配命名空间;内置匹配不提供各物品插件 ID 的自动识别。不要把 itemsadder:某ID 等显示来源写法直接当作已经支持的入口条件。
实体入口
bindings:
entity:
- VILLAGER
- WANDERING_TRADER右键这两种实体时打开当前菜单,填写实体类型而不是显示名;单个类型可直接写 entity: VILLAGER。副手触发与已取消的事件会被跳过,匹配本身不取消原实体交互。
Adyeshach NPC 入口
安装并启用 Adyeshach 后,按 NPC ID 配置:
bindings:
adyeshach:
- menu_guide
- help_guide主手交互任意一个 ID 即可打开,不填写 NPC 显示名。该入口不取消原 NPC 交互;只写别名 ady 不会由事件触发。
入口变量
这些变量在对应入口打开菜单时传入,可在文字中用 {{&变量名}} 读取。物品和实体本身是对象,不等同于其名称或 ID。
| 打开方式 | 变量 | 内容 |
|---|---|---|
| 绑定命令 | arguments 定义的各个 id | 实际输入或显式默认值;没有额外的命令名变量 |
| 聊天或命令文字匹配 | activator_message | 玩家实际提交的完整文字,保留原大小写与 / |
| 物品交互 | activator_item | 此次交互的物品对象 |
| 实体交互 | activator_entity | 被交互的实体对象 |
| 实体交互 | activator_entity_is_npc | 布尔值;仅识别“玩家类型但不在在线玩家列表”的实体,不是通用 NPC 插件检测 |
| 实体交互 | activator_entity_uuid | 实体 UUID |
| 实体交互 | activator_entity_type | 实体类型名 |
| 实体交互 | activator_entity_location_x、activator_entity_location_y、activator_entity_location_z | 两位小数的坐标文字 |
| 实体交互 | activator_entity_name | 自定义名;没有时使用实体名称 |
| Adyeshach 交互 | activator_ady | 交互的 NPC ID |
| 潜行换手 | 无额外变量 | 不提供时间差或按键变量 |
其他入口不会自动获得上述变量。管理打开可用分号格式显式传值,见命令;通用玩家信息见占位符。
其他打开方式与变量保留
| 打开方式 | 变量行为 |
|---|---|
/invero menu open / /menu open | 只传显式 arguments,不会补绑定命令默认值 |
动作 menu open <ID> | 不保留原菜单临时变量;可用 with '键=值;键=值' 传入 |
动作 menu switch <ID>(menu open_ctx) | 保留当前会话变量,再用 with 中的同名值覆盖 |
输入成功后的 reopen | 重开原菜单并携带输入流程保留的变量;取消不会自动走成功重开 |
| 已加载菜单重载后重开 | 携带旧会话变量,但会重新建立窗口和面板状态 |
| 其他插件通过菜单接口打开 | 变量由调用方传入,不自动套用绑定命令参数 |
脚本打开还可用 for <准确在线玩家名> 指定目标,省略时使用当前玩家;显式目标不存在时会回退到当前脚本玩家。脚本菜单 ID 区分大小写。菜单跳转见导航示例,输入流程见输入收集。
多入口同时存在
物品、聊天、潜行换手、实体、Adyeshach 事件共用每名玩家约一秒的触发间隔;没有匹配到菜单的尝试也可能占用这个间隔。同一事件匹配多个菜单时只尝试其中一个,不提供固定优先顺序。pre_open 拒绝打开也不会继续尝试下一个匹配菜单,已被取消的聊天、物品或换手行为不会因此恢复。
所有打开方式仍经过菜单打开条件;已有菜单会话创建不足约 200 毫秒时,紧接着再次打开也会被忽略。这与事件入口共享的一秒间隔不是同一个限制。
Last updated on