命令上下文
命令上下文(Command Context),也称执行上下文(Execution Context)、命令源(Command Origin)、命令来源堆叠(Command Source Stack),是调用者和调用环境等参数构成的集合,用于为命令执行和文本组件解析提供上下文。
行为[编辑 | 编辑源代码]
游戏在不同场景下执行命令或解析文本组件时,会为其提供相应的上下文,以使其可以在特定的环境下生效。
使用/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
命令执行命令时,执行者名称总是动态的,从执行者实体上实时获取。/execute
的at ...
和positioned as ...
子命令设置的执行位置是动态的,从其指定的实体上实时获取。/execute
的at ...
和rotated as ...
子命令设置的执行朝向是动态的,从其指定的实体上实时获取。
执行位置若是动态的,则实时获取某个实体的位置。如果此实体骑乘了其他实体,则有特殊处理:
- 如果此实体的碰撞箱底部低于坐骑的碰撞箱底部,则使用坐骑的碰撞箱底部坐标作为执行位置的Y坐标。
- 例如,玩家骑乘在矿车上,则使用玩家的X和Z坐标与矿车的Y坐标,作为执行位置。
若动态上下文参数所依赖的实体已经从世界中消失(例如盔甲架被杀死、羊播放完死亡动画),则此参数无法正常获取,此时使用的参数默认值如下:
- “执行者名称”是空字符串
- “执行维度”为空
- “执行位置”是
(0, 0, 0)
- “执行朝向”是
(0, 0)
例如,在命令方块中执行/execute run say hi
,如上文所述,“执行者名称”被/execute
命令转变为动态,从“执行者实体”上实时获取。由于上下文中没有“执行者实体”,故/say hi
的“执行者名称”是空字符串。
再例如,在/schedule
计划还未执行前杀死执行者实体,会由于上下文中的“执行维度”为空而无法执行计划的函数。
以下情形下会使得动态参数转变为静态参数:
/execute
命令本身会使执行维度静态化/execute
命令本身会使执行朝向静态化/execute
的align ...
子命令会使执行位置静态化/execute
的in ...
子命令会使执行位置静态化/execute
的positioned <坐标>
子命令会使执行位置静态化/execute
的facing ...
子命令会使执行朝向静态化/execute
的rotated <角度>
子命令会使执行朝向静态化- 如果执行位置是动态的,则
/execute
的anchored ...
子命令会使执行位置静态化,设置为实体脚部或眼部的位置;如果执行位置是静态的,则/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
命令的as
、on
和summon
子命令修改。在Java版中,执行者名称和执行者实体两个参数会同时修改。在基岩版中,只会修改执行者实体参数,如上文所述,执行者名称会保持动态,从执行者实体上实时获取。
执行维度[编辑 | 编辑源代码]
执行命令所在的维度。主要有以下情形会使用执行维度参数:
- 凡是指定坐标时,指定的都是执行维度内的坐标。
- 目标选择器在指定了
distance
[仅JE]、 r
[仅BE]、 rm
[仅BE]、 dx
、dy
或dz
时,则只会选择执行维度内的实体。 - 在Java版中,目标选择器在指定了
x
、y
或z
时,也只会选择执行维度内的实体 /locate
等命令在执行维度内运行。
执行维度可以使用/execute
命令的at
和in
子命令修改。在基岩版中,/execute
命令本身会使执行维度静态化。
执行位置[编辑 | 编辑源代码]
执行命令所在的坐标。主要有以下情形会使用执行位置参数:
- 相对坐标会以执行位置为原点。
- 在Java版中,局部坐标在执行位置的基础上,根据执行锚点改变其原点。
- 在基岩版中,局部坐标以执行位置为原点。
- 在Java版中,
/execute facing ...
和/tp ... facing ...
在执行位置的基础上,根据执行锚点改变其起点。 - 在基岩版中,
/execute facing ...
和/tp ... facing ...
以执行位置为起点。 /locate
等命令会使用执行位置作为起点。/summon
、/spawnpoint
、/playsound
等命令中,如果未指定命令生效的位置,则使用执行位置。
执行位置可以使用/execute
命令的align
、at
、positioned
子命令修改,in
子命令也会影响执行位置。在基岩版中,at
和positioned as
子命令设置的执行位置是动态的,从其指定的实体上实时获取。在基岩版中,align
、anchored
、in
和positioned <坐标>
子命令会使执行位置参数静态化。
执行朝向[编辑 | 编辑源代码]
执行命令所朝向的方向。主要有以下情形会使用执行朝向参数:
- 局部坐标的坐标系基于执行朝向。
/tp
、/spawnpoint
等命令中以波浪号(~
)指定相对朝向时,以执行朝向为基准。
执行朝向可以使用/execute
命令的at
、facing
和rotated
子命令修改。在基岩版中,as
和rotated as
子命令设置的执行朝向是动态的,从其指定的实体上实时获取。在基岩版中,/execute
命令本身和其facing
、rotated <角度>
子命令会使执行朝向静态化。
执行锚点[编辑 | 编辑源代码]
局部坐标的原点、/teleport
的facing
的起点和/execute
的facing
子命令的起点是基于执行者实体的脚还是眼睛。
- 如果是脚,则直接使用执行位置。
- 如果是眼睛,则在执行位置的基础上,Y轴加上执行者实体的眼睛高度。
只有以下情形会使用执行锚点参数:
执行锚点可以使用/execute
命令的anchored
子命令修改。
在基岩版中,没有执行锚点参数。/execute
命令的anchored
子命令直接修改执行位置。如果执行位置原本是动态的,则anchored
子命令会使执行位置静态化,设置为实体的脚部或眼部的位置;如果执行位置是静态的,则anchored
子命令没有任何效果。
执行输出反馈[编辑 | 编辑源代码]
执行输出反馈用于接收命令的输出。
在命令方块、命令方块矿车或脚本
在Java版中,可以使用/execute
命令的store
子命令保留已有反馈的同时添加新反馈。已有的反馈无法使用/execute
命令清除。
使用/function
命令或/schedule
运行函数时,函数内命令的执行不会继承其执行输出反馈。
不同场景下的上下文[编辑 | 编辑源代码]
命令执行[编辑 | 编辑源代码]
服务器控制台[编辑 | 编辑源代码]
服务器控制台中输入的命令的上下文为:
- 执行权限等级:4
- 执行者名称:Server
[仅Java版]/服务器 [仅基岩版] - 执行者实体:无
- 执行维度:主世界
- 执行位置:世界出生点方块位置的西北下角
[仅Java版] /(0, 0, 0)
[仅基岩版] - 执行朝向:
(0, 0)
- 执行锚点
[仅JE]:脚 - 执行输出反馈:无
服务端执行函数[编辑 | 编辑源代码]
以下函数由服务端执行:
由服务端执行的函数中的命令的上下文为:
- 执行权限等级: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]:脚 - 执行输出反馈:接收命令的成功次数
告示牌[编辑 | 编辑源代码]
玩家点击执行告示牌上的命令的上下文为:
- 执行权限等级:2
- 执行者名称:玩家名
- 执行者实体:玩家
- 执行维度:告示牌所在的维度
- 执行位置:告示牌所在方块的正中心
- 执行朝向:
(0, 0)
- 执行锚点:脚
- 执行输出反馈:无
自定义进度[编辑 | 编辑源代码]
function进度奖励调用的函数中的命令的上下文为:
- 执行权限等级:2
- 执行者名称:玩家名
- 执行者实体:获得进度的玩家
- 执行维度:玩家所在的维度
- 执行位置:玩家所在的位置
- 执行朝向:玩家的朝向
- 执行锚点:脚
- 执行输出反馈:无
自定义魔咒[编辑 | 编辑源代码]
run_function
魔咒实体效果调用的函数中的命令的上下文为:
- 执行权限等级:2
- 执行者名称:魔咒效果的作用实体的名称
- 执行者实体:魔咒效果的作用实体
- 执行维度:魔咒生效的维度
- 执行位置:魔咒效果的作用位置
- 执行朝向:魔咒效果的作用实体的朝向
- 执行锚点:脚
- 执行输出反馈:无
行为包中实体执行命令[编辑 | 编辑源代码]
在实体事件响应中执行命令、在脚本中以实体执行命令、实体在行为包动画控制器中执行命令、NPC实体执行命令的上下文如下:
- 执行权限等级:1
- 执行者名称:此实体的名称(动态)
[仅基岩版] - 执行者实体:此实体
- 执行维度:此实体所在的维度(动态)
[仅基岩版] - 执行位置:此实体的位置(动态)
[仅基岩版] - 执行朝向:此实体的朝向(动态)
[仅基岩版] - 执行输出反馈:若在脚本中,则返回成功次数
脚本中维度执行命令[编辑 | 编辑源代码]
在脚本中以维度执行命令的上下文如下:
- 执行权限等级:1
- 执行者名称:脚本引擎
- 执行者实体:无
- 执行维度:此维度
- 执行位置:
(0, 0, 0)
- 执行朝向:
(0, 0)
- 执行输出反馈:返回成功次数
文本组件解析[编辑 | 编辑源代码]
文本组件解析时,其中的相对坐标、局部坐标、目标选择器的解析需要使用命令上下文。命令上下文中的执行输出反馈不会被文本组件使用。
注意,在score
类型的文本组件解析时,若name为*
,则会显示阅读者自己的分数。下文中除了命令上下文外,还列出了文本组件的阅读者。
命令调用文本组件[编辑 | 编辑源代码]
由命令调用的文本组件,会继承命令的上下文。包括以下调用方式:
玩家打开成书[编辑 | 编辑源代码]
玩家打开成书时的上下文:
- 执行权限等级:玩家的权限等级
- 执行者名称:玩家名
- 执行者实体:玩家
- 执行维度:玩家所在的维度
- 执行位置:玩家所在的位置
- 执行朝向:玩家的朝向
- 执行锚点:脚
- 阅读者:此玩家
讲台上放入成书[编辑 | 编辑源代码]
- 执行权限等级:2
- 执行者名称:
Lectern
- 执行者实体:无
- 执行维度:讲台所在的维度
- 执行位置:讲台所在方块的正中心
- 执行朝向:
(0, 0)
- 执行锚点:脚
- 阅读者:无
告示牌[编辑 | 编辑源代码]
使用NBT修改告示牌中文本时的上下文:
- 执行权限等级:2
- 执行者名称:
Sign
- 执行者实体:无
- 执行维度:告示牌所在的维度
- 执行位置:告示牌所在方块的正中心
- 执行朝向:
(0, 0)
- 执行锚点:脚
- 阅读者:无
文本展示实体[编辑 | 编辑源代码]
文本展示实体解析文本组件时的上下文:
- 执行权限等级:2
- 执行者名称:此文本展示实体的名称
- 执行者实体:此文本展示实体
- 执行维度:文本展示实体所在的维度
- 执行位置:文本展示实体所在的位置
- 执行朝向:文本展示实体的朝向
- 执行锚点:脚
- 阅读者:此文本展示实体
物品修饰器[编辑 | 编辑源代码]
物品修饰器的set_name
和set_lore
,如果其entity指定的实体存在,则进行文本组件解析:
- 执行权限等级:2
- 执行者名称:entity指定的实体的名称
- 执行者实体:entity指定的实体
- 执行维度:entity指定的实体所在的维度
- 执行位置:entity指定的实体所在的位置
- 执行朝向:entity指定的实体的朝向
- 执行锚点:脚
- 阅读者:entity指定的实体
历史[编辑 | 编辑源代码]
Java版 | |||||||
---|---|---|---|---|---|---|---|
1.13 | 17w45a | 重写了/execute 命令。允许对各个命令上下文参数单独修改。 | |||||
移除了上下文中的命令统计值反馈。 | |||||||
加入了/execute store ... ,可以增加执行输出反馈。 | |||||||
18w02a | 加入了“执行锚点”参数。 | ||||||
加入了/execute anchored ... ,可以修改执行锚点参数。 | |||||||
1.20 | 23w16a | 现在/return 命令通过命令上下文为函数设置返回值。 | |||||
1.20.3 | 23w41a | 使用/function 命令执行函数时,函数中命令不再继承执行输出反馈。 | |||||
23w44a | 现在/return 命令为函数设置返回值,是函数自身的行为,而不再通过命令上下文实现。 | ||||||
基岩版 | |||||||
1.9.0 | 1.9.0.2 | 命令方块里的命令不再拓展到其他维度里。[3] | |||||
1.13.0 | 1.13.0.1 | 现在/execute 的detect 选项使用执行者实体的位置和朝向,以便它可以正确使用局部坐标。[4] | |||||
1.16.220 | 1.16.220.50 | 现在/teleport 和/execute 命令配合使用时,会使用命令执行者所在的维度。[5] | |||||
1.19.10 | 1.19.10.20 | 更改了/execute 命令的语法,可以修改上下文参数,属于实验性玩法。 | |||||
1.19.50 | 1.19.50.23 | /execute 命令的新语法不再属于实验性玩法。 | |||||
命令方块执行的/execute as 命令不再继承实体的旋转方向。[6] | |||||||
1.19.70 | 1.19.70.20 | 现在/teleport 命令中指定相对朝向时,会基于执行朝向而不再基于要传送的实体的朝向。 |
参考[编辑 | 编辑源代码]
- ↑ 参见MCPE-179363
- ↑ 参见MCPE-162681和MCPE-165051
- ↑ MCPE-33892 — 漏洞状态为“无法复现”。
- ↑ MCPE-29942 — 漏洞状态为“已修复”。
- ↑ MCPE-44104 — 漏洞状态为“已修复”。
- ↑ MCPE-162680 — 漏洞状态为“已修复”。
导航[编辑 | 编辑源代码]
[隐藏] | |||||
---|---|---|---|---|---|
版本 | |||||
开发周期 |
| ||||
技术 |
| ||||
多人游戏 | |||||
游戏订制 |
[隐藏] | |||||||
---|---|---|---|---|---|---|---|
版本 |
| ||||||
开发 |
| ||||||
技术性 | |||||||
多人游戏 | |||||||
特色功能 |