命令上下文

来自Minecraft Wiki
跳转到导航 跳转到搜索

命令上下文(Command Context),也称执行上下文(Execution Context)命令源(Command Origin)命令来源堆叠(Command Source Stack),是调用者和调用环境等参数构成的集合,用于为命令执行和文本组件解析提供上下文。

行为[编辑 | 编辑源代码]

命令上下文中主要有以下8[仅JE]/7[仅BE]个参数:

游戏在不同场景下执行命令或解析文本组件时,会为其提供相应的上下文,以使其可以在特定的环境下生效。

使用/function命令运行函数时,函数内部的命令会继承/function命令执行上下文中的“执行者参数”、“执行环境参数”和“执行权限等级”,不会继承“执行输出反馈”。在Java版中,函数内命令的“执行权限等级”被限制在2及以下,即使/function命令以2级以上的权限执行,函数内的命令也只会以2级执行。

基岩版中,通过/schedule命令计划的函数也会继承此/schedule命令执行上下文中的“执行者参数”、“执行环境参数”和“执行权限等级”。

动态参数[编辑 | 编辑源代码]

本段落所述内容仅适用于基岩版

Java版中,上下文中的“执行者名称”参数和各个执行环境参数都是静态的,各自都独立存在。也就是说,若不使用/execute的子命令修改,在执行命令过程中、或在执行函数中的各条命令过程中,这些参数不会改变。例如,即使在函数内中途修改了执行者实体的名称,也不会改变后续命令的上下文中的“执行者名称”参数;再例如,/execute at @n[type=sheep] run function test,即使在函数test内中途使用/tp改变了羊的位置、朝向或维度,也不会影响函数中后续命令的上下文中的“执行位置”、“执行朝向”、“执行维度”参数,这三个参数在使用at子命令修改后是静态的,与羊实体本身已经无关联。

基岩版中,上下文中的参数有些情况下是静态的,有些情况下是动态的,从某个实体身上实时获取。例如,“执行位置”参数可能并不独立存在,而是依赖于世界中的某个实体,实时获取其位置,也就是说,此时若在函数的中途移动了这个实体,则函数中后续命令的上下文中的“执行位置”参数是移动后的位置。[1]

具体来说,以下情形下存在动态参数:

  • 玩家在聊天栏执行命令、通过客户端的WebSocket服务器请求执行命令的上下文中,执行位置、执行朝向和执行维度是动态的,从此玩家实体上实时获取。
  • 命令方块矿车执行命令的上下文中,执行位置和执行朝向是动态的,从此矿车实体上实时获取。
  • 在实体事件响应中执行命令、在脚本中以实体执行命令、实体在行为包动画控制器中执行命令、NPC执行命令的上下文中,执行者名称、执行位置、执行朝向和执行维度是动态的,从此实体上实时获取。
  • /execute命令会时执行者名称转变为动态参数,从执行者实体上实时获取。也就是说,无论上下文中是否有静态的执行者名称,使用/execute命令执行命令时,执行者名称总是动态的,从执行者实体上实时获取。
  • /executeat ...positioned as ...子命令设置的执行位置是动态的,从其指定的实体上实时获取。
  • /executeat ...rotated as ...子命令设置的执行朝向是动态的,从其指定的实体上实时获取。

执行位置若是动态的,则实时获取某个实体的位置。如果此实体骑乘了其他实体,则有特殊处理:

  • 如果此实体的碰撞箱底部低于坐骑的碰撞箱底部,则使用坐骑的碰撞箱底部坐标作为执行位置的Y坐标。
    • 例如,玩家骑乘在矿车上,则使用玩家的X和Z坐标与矿车的Y坐标,作为执行位置。

若动态上下文参数所依赖的实体已经从世界中消失(例如盔甲架被杀死、羊播放完死亡动画),则此参数无法正常获取,此时使用的参数默认值如下:

  • “执行者名称”是空字符串
  • “执行维度”为空
  • “执行位置”是(0, 0, 0)
  • “执行朝向”是(0, 0)

例如,在命令方块中执行/execute run say hi,如上文所述,“执行者名称”被/execute命令转变为动态,从“执行者实体”上实时获取。由于上下文中没有“执行者实体”,故/say hi的“执行者名称”是空字符串。

再例如,在/schedule计划还未执行前杀死执行者实体,会由于上下文中的“执行维度”为空而无法执行计划的函数。

以下情形下会使得动态参数转变为静态参数:

  • /execute命令本身会使执行维度静态化
  • /execute命令本身会使执行朝向静态化
  • /executealign ...子命令会使执行位置静态化
  • /executein ...子命令会使执行位置静态化
  • /executepositioned <坐标>子命令会使执行位置静态化
  • /executefacing ...子命令会使执行朝向静态化
  • /executerotated <角度>子命令会使执行朝向静态化
  • 如果执行位置是动态的,则/executeanchored ...子命令会使执行位置静态化,设置为实体脚部或眼部的位置;如果执行位置是静态的,则/execute anchored ...不生效[2]

例如:

  • 玩家在聊天栏执行/function ...,函数中各个命令的执行位置、执行朝向和执行维度是动态的,实时获取此玩家的位置、朝向、维度。
  • 玩家在聊天栏执行/execute run <命令><命令>的执行位置是动态的,执行朝向和执行维度是静态的。
  • 玩家在聊天栏执行/execute at @s run <命令><命令>的执行位置和执行朝向是动态的,执行维度是静态的。
  • 玩家在聊天栏执行/execute at @s rotated ~ ~ run <命令><命令>的执行位置是动态的,执行朝向和执行维度是静态的。
  • 玩家在聊天栏执行/execute at @s rotated ~ ~ positioned ~ ~ ~ run <命令><命令>的执行位置、执行朝向和执行维度都是静态的。
  • 玩家在聊天栏执行/execute positioned ~ ~ ~ run <命令><命令>的执行位置、执行朝向和执行维度都是静态的。
  • 假如玩家所在维度上有至少三个实体,玩家在聊天栏执行/execute rotated as @e[c=3] run tp @s ~ ~1 ~,会使玩家传送到原位置的上方3格。

参数[编辑 | 编辑源代码]

执行权限等级[编辑 | 编辑源代码]

主条目:权限等级

执行权限等级不可使用/execute命令修改。

Java版中,使用/function命令运行函数时,函数内命令的执行权限等级会被限制在2及以下。执行权限等级如果大于2,函数内的命令会以2级执行。

执行者[编辑 | 编辑源代码]

执行者是执行命令的主体。包括“执行者名称”和“执行者实体”两个参数,其中“执行者实体”参数可能为空(如使用命令方块执行命令时)。主要有以下情形会使用执行者参数:

  • 使用/msg/say等命令发送消息时,会使用“执行者名称”参数作为消息的发送者。
  • 目标选择器中的@s会直接选择“执行者实体”。
  • /tp/kill等命令的目标实体默认为“执行者实体”。
  • /clear/gamemode/playsound等命令的目标玩家默认为“执行者实体”,要求“执行者实体”为玩家。
  • Java版中,/trigger/teammsg等命令会以“执行者实体”的身份生效,且要求“执行者实体”为玩家。
  • Java版中,执行锚点对Y轴坐标的修改基于执行者实体的眼睛高度。

执行者参数可以使用/execute命令的asonsummon子命令修改。在Java版中,执行者名称和执行者实体两个参数会同时修改。在基岩版中,只会修改执行者实体参数,如上文所述,执行者名称会保持动态,从执行者实体上实时获取。

执行维度[编辑 | 编辑源代码]

执行命令所在的维度。主要有以下情形会使用执行维度参数:

  • 凡是指定坐标时,指定的都是执行维度内的坐标。
  • 目标选择器在指定了distance[仅JE]r[仅BE]rm[仅BE]dxdydz时,则只会选择执行维度内的实体。
  • Java版中,目标选择器在指定了xyz时,也只会选择执行维度内的实体
  • /locate等命令在执行维度内运行。

执行维度可以使用/execute命令的atin子命令修改。在基岩版中,/execute命令本身会使执行维度静态化。

执行位置[编辑 | 编辑源代码]

执行命令所在的坐标。主要有以下情形会使用执行位置参数:

执行位置可以使用/execute命令的alignatpositioned子命令修改,in子命令也会影响执行位置。在基岩版中,atpositioned as子命令设置的执行位置是动态的,从其指定的实体上实时获取。在基岩版中,alignanchoredinpositioned <坐标>子命令会使执行位置参数静态化。

执行朝向[编辑 | 编辑源代码]

执行命令所朝向的方向。主要有以下情形会使用执行朝向参数:

  • 局部坐标的坐标系基于执行朝向。
  • /tp/spawnpoint等命令中以波浪号(~)指定相对朝向时,以执行朝向为基准。

执行朝向可以使用/execute命令的atfacingrotated子命令修改。在基岩版中,asrotated as子命令设置的执行朝向是动态的,从其指定的实体上实时获取。在基岩版中,/execute命令本身和其facingrotated <角度>子命令会使执行朝向静态化。

执行锚点[编辑 | 编辑源代码]

本段落所述内容仅适用于Java版

局部坐标的原点、/teleportfacing的起点和/executefacing子命令的起点是基于执行者实体的脚还是眼睛。

  • 如果是脚,则直接使用执行位置。
  • 如果是眼睛,则在执行位置的基础上,Y轴加上执行者实体的眼睛高度。

只有以下情形会使用执行锚点参数:

执行锚点可以使用/execute命令的anchored子命令修改。

基岩版中,没有执行锚点参数。/execute命令的anchored子命令直接修改执行位置。如果执行位置原本是动态的,则anchored子命令会使执行位置静态化,设置为实体的脚部或眼部的位置;如果执行位置是静态的,则anchored子命令没有任何效果。

执行输出反馈[编辑 | 编辑源代码]

执行输出反馈用于接收命令的输出

命令方块命令方块矿车或脚本[仅基岩版]中执行命令时,会接收命令的成功次数。

Java版中,可以使用/execute命令的store子命令保留已有反馈的同时添加新反馈。已有的反馈无法使用/execute命令清除。

使用/function命令或/schedule运行函数时,函数内命令的执行不会继承其执行输出反馈。

不同场景下的上下文[编辑 | 编辑源代码]

命令执行[编辑 | 编辑源代码]

服务器控制台[编辑 | 编辑源代码]

服务器控制台中输入的命令的上下文为:

  • 执行权限等级:4
  • 执行者名称:Server[仅Java版]/服务器[仅基岩版]
  • 执行者实体:无
  • 执行维度:主世界
  • 执行位置:世界出生点方块位置的西北下角[仅Java版]/(0, 0, 0)[仅基岩版]
  • 执行朝向:(0, 0)
  • 执行锚点[仅JE]:脚
  • 执行输出反馈:无

服务端执行函数[编辑 | 编辑源代码]

以下函数由服务端执行:

  • 通过loadtick标签调用的函数[仅Java版]
  • 通过load.jsontick.json调用的函数[仅基岩版]
  • 通过/schedule命令计划的函数[仅Java版]

由服务端执行的函数中的命令的上下文为:

  • 执行权限等级:2[仅Java版]/1[仅基岩版]
  • 执行者名称:Server[仅Java版]/服务器[仅基岩版]
  • 执行者实体:无
  • 执行维度:主世界
  • 执行位置:世界出生点方块位置的西北下角[仅Java版]/(0, 0, 0)[仅基岩版]
  • 执行朝向:(0, 0)
  • 执行锚点[仅JE]:脚
  • 执行输出反馈:无

玩家[编辑 | 编辑源代码]

玩家在聊天栏执行命令、通过客户端的WebSocket服务器或开发者控制台执行命令[仅基岩版]的上下文为:

  • 执行权限等级:玩家的权限等级
  • 执行者名称:玩家名;使用WebSocket服务器:“外部”;使用开发者控制台:“DevConsole”[仅基岩版]
  • 执行者实体:玩家
  • 执行维度:玩家所在的维度(动态)[仅基岩版]
  • 执行位置:玩家所在的位置(动态)[仅基岩版]
  • 执行朝向:玩家的朝向(动态)[仅基岩版]
  • 执行锚点[仅JE]:脚
  • 执行输出反馈:无

命令方块[编辑 | 编辑源代码]

命令方块执行命令的上下文为:

  • 执行权限等级:2[仅Java版]/1[仅基岩版]
  • 执行者名称:命令方块的自定义名称,若无则为@[仅Java版]/![仅基岩版]
  • 执行者实体:无
  • 执行维度:命令方块所在的维度
  • 执行位置:命令方块的正中心
  • 执行朝向:命令方块的朝向[仅Java版]/(0, 0)[仅基岩版]
  • 执行锚点[仅JE]:脚
  • 执行输出反馈:接收命令的成功次数

命令方块矿车[编辑 | 编辑源代码]

命令方块矿车执行命令的上下文为:

  • 执行权限等级:2[仅Java版]/1[仅基岩版]
  • 执行者名称:命令方块矿车的自定义名称,若无则为@[仅Java版]/![仅基岩版]
  • 执行者实体:命令方块矿车
  • 执行维度:命令方块矿车所在的维度
  • 执行位置:命令方块矿车所在的位置(动态)[仅基岩版]
  • 执行朝向:命令方块矿车的朝向(动态)[仅基岩版]
  • 执行锚点[仅JE]:脚
  • 执行输出反馈:接收命令的成功次数

告示牌[编辑 | 编辑源代码]

本段落所述内容仅适用于Java版

玩家点击执行告示牌上的命令的上下文为:

  • 执行权限等级:2
  • 执行者名称:玩家名
  • 执行者实体:玩家
  • 执行维度:告示牌所在的维度
  • 执行位置:告示牌所在方块的正中心
  • 执行朝向:(0, 0)
  • 执行锚点:脚
  • 执行输出反馈:无

自定义进度[编辑 | 编辑源代码]

本段落所述内容仅适用于Java版

字符串function进度奖励调用的函数中的命令的上下文为:

  • 执行权限等级:2
  • 执行者名称:玩家名
  • 执行者实体:获得进度的玩家
  • 执行维度:玩家所在的维度
  • 执行位置:玩家所在的位置
  • 执行朝向:玩家的朝向
  • 执行锚点:脚
  • 执行输出反馈:无

自定义魔咒[编辑 | 编辑源代码]

本段落所述内容仅适用于Java版

run_function魔咒实体效果调用的函数中的命令的上下文为:

  • 执行权限等级:2
  • 执行者名称:魔咒效果的作用实体的名称
  • 执行者实体:魔咒效果的作用实体
  • 执行维度:魔咒生效的维度
  • 执行位置:魔咒效果的作用位置
  • 执行朝向:魔咒效果的作用实体的朝向
  • 执行锚点:脚
  • 执行输出反馈:无

行为包中实体执行命令[编辑 | 编辑源代码]

本段落所述内容仅适用于基岩版

在实体事件响应中执行命令、在脚本中以实体执行命令、实体在行为包动画控制器中执行命令、NPC实体执行命令的上下文如下:

  • 执行权限等级:1
  • 执行者名称:此实体的名称(动态)[仅基岩版]
  • 执行者实体:此实体
  • 执行维度:此实体所在的维度(动态)[仅基岩版]
  • 执行位置:此实体的位置(动态)[仅基岩版]
  • 执行朝向:此实体的朝向(动态)[仅基岩版]
  • 执行输出反馈:若在脚本中,则返回成功次数

脚本中维度执行命令[编辑 | 编辑源代码]

本段落所述内容仅适用于基岩版

在脚本中以维度执行命令的上下文如下:

  • 执行权限等级:1
  • 执行者名称:脚本引擎
  • 执行者实体:无
  • 执行维度:此维度
  • 执行位置:(0, 0, 0)
  • 执行朝向:(0, 0)
  • 执行输出反馈:返回成功次数

文本组件解析[编辑 | 编辑源代码]

文本组件解析时,其中的相对坐标局部坐标目标选择器的解析需要使用命令上下文。命令上下文中的执行输出反馈不会被文本组件使用。

注意,在score类型的文本组件解析时,若字符串name*,则会显示阅读者自己的分数。下文中除了命令上下文外,还列出了文本组件的阅读者。

命令调用文本组件[编辑 | 编辑源代码]

由命令调用的文本组件,会继承命令的上下文。包括以下调用方式:

  • /bossbar[仅Java版]
    • 阅读者:无
  • /tellraw
    • 阅读者:各个接收到此标题的玩家
  • /title
    • 阅读者:各个接收到此标题的玩家

玩家打开成书[编辑 | 编辑源代码]

本段落所述内容仅适用于Java版

玩家打开成书时的上下文:

  • 执行权限等级:玩家的权限等级
  • 执行者名称:玩家名
  • 执行者实体:玩家
  • 执行维度:玩家所在的维度
  • 执行位置:玩家所在的位置
  • 执行朝向:玩家的朝向
  • 执行锚点:脚
  • 阅读者:此玩家

讲台上放入成书[编辑 | 编辑源代码]

本段落所述内容仅适用于Java版

讲台上放入成书时的上下文:

  • 执行权限等级:2
  • 执行者名称:Lectern
  • 执行者实体:无
  • 执行维度:讲台所在的维度
  • 执行位置:讲台所在方块的正中心
  • 执行朝向:(0, 0)
  • 执行锚点:脚
  • 阅读者:无

告示牌[编辑 | 编辑源代码]

本段落所述内容仅适用于Java版

使用NBT修改告示牌中文本时的上下文:

  • 执行权限等级:2
  • 执行者名称:Sign
  • 执行者实体:无
  • 执行维度:告示牌所在的维度
  • 执行位置:告示牌所在方块的正中心
  • 执行朝向:(0, 0)
  • 执行锚点:脚
  • 阅读者:无

文本展示实体[编辑 | 编辑源代码]

本段落所述内容仅适用于Java版

文本展示实体解析文本组件时的上下文:

  • 执行权限等级:2
  • 执行者名称:此文本展示实体的名称
  • 执行者实体:此文本展示实体
  • 执行维度:文本展示实体所在的维度
  • 执行位置:文本展示实体所在的位置
  • 执行朝向:文本展示实体的朝向
  • 执行锚点:脚
  • 阅读者:此文本展示实体

物品修饰器[编辑 | 编辑源代码]

本段落所述内容仅适用于Java版

物品修饰器set_nameset_lore,如果其字符串entity指定的实体存在,则进行文本组件解析:

  • 执行权限等级:2
  • 执行者名称:字符串entity指定的实体的名称
  • 执行者实体:字符串entity指定的实体
  • 执行维度:字符串entity指定的实体所在的维度
  • 执行位置:字符串entity指定的实体所在的位置
  • 执行朝向:字符串entity指定的实体的朝向
  • 执行锚点:脚
  • 阅读者:字符串entity指定的实体

历史[编辑 | 编辑源代码]

Java版
1.1317w45a重写了/execute命令。允许对各个命令上下文参数单独修改。
移除了上下文中的命令统计值反馈。
加入了/execute store ...,可以增加执行输出反馈。
18w02a加入了“执行锚点”参数。
加入了/execute anchored ...,可以修改执行锚点参数。
1.2023w16a现在/return命令通过命令上下文为函数设置返回值。
1.20.323w41a使用/function命令执行函数时,函数中命令不再继承执行输出反馈。
23w44a现在/return命令为函数设置返回值,是函数自身的行为,而不再通过命令上下文实现。
基岩版
1.9.01.9.0.2命令方块里的命令不再拓展到其他维度里。[3]
1.13.01.13.0.1现在/executedetect选项使用执行者实体的位置和朝向,以便它可以正确使用局部坐标。[4]
1.16.2201.16.220.50现在/teleport/execute命令配合使用时,会使用命令执行者所在的维度。[5]
1.19.101.19.10.20更改了/execute命令的语法,可以修改上下文参数,属于实验性玩法
1.19.501.19.50.23/execute命令的新语法不再属于实验性玩法
命令方块执行的/execute as命令不再继承实体的旋转方向。[6]
1.19.701.19.70.20现在/teleport命令中指定相对朝向时,会基于执行朝向而不再基于要传送的实体的朝向。

参考[编辑 | 编辑源代码]

  1. 参见MCPE-179363
  2. 参见MCPE-162681MCPE-165051
  3. MCPE-33892 — 漏洞状态为“无法复现”。
  4. MCPE-29942 — 漏洞状态为“已修复”。
  5. MCPE-44104 — 漏洞状态为“已修复”。
  6. MCPE-162680 — 漏洞状态为“已修复”。

导航[编辑 | 编辑源代码]