Minecraft指令手册

你好MC

首页 >> Minecraft指令手册 >> Minecraft指令手册最新章节(目录)
大家在看逆天剑帝 我的修炼时间和人不一样 陆地剑仙:剑阁守剑八十年 全家偷听我心声杀疯了,我负责吃奶 御兽之王 武映三千道 苟王,我的师兄太低调了 我的弟子全是大帝之资 灰烬领主 君有云 
Minecraft指令手册 你好MC - Minecraft指令手册全文阅读 - Minecraft指令手册txt下载 - Minecraft指令手册最新章节 - 好看的玄幻魔法小说

第七十四章 探究:execute的运行流程

上一章书 页下一章阅读记录

(注:非常不推荐在手机上阅读此章节,请使用平板或电脑阅读此章)

(本章用到了大量的字符画,有可能会出现严重的错位情况,可手动调整字体和大小至最佳状态)

(此章节已于2022年7月17日重写)

在第六十九章,我为了提醒你注意各个子命令的顺序,专门举了个例子:

\/execute as @e at @e run tp @s ~~1 ~

但是你是否有注意到游戏运行这条指令的过程:

1将玩家传送至玩家上方1米的位置(玩家此时抬高了1米)

2将玩家传送至村民上方1米的位置(玩家此时位于村民上方1米)

3将玩家传送至羊上方1米的位置(玩家此时位于羊上方1米)

4将村民传送至玩家上方1米的位置(村民此时位于玩家原本位置上方1米,玩家此时位于羊上方1米)

5将村民传送至村民上方1米的位置(村民此时位于村民原本位置上方1米,玩家此时位于羊上方1米)

6将村民传送至羊上方1米的位置(村民和玩家此时位于羊上方1米)

7将羊传送至玩家上方1米的位置(村民和玩家此时位于羊原本位置上方1米,羊位于玩家原本位置上方1米)

8将羊传送至村民上方1米的位置(村民和玩家此时位于羊原本位置上方1米,羊位于村民原本位置上方1米)

9将羊传送至羊上方1米的位置(村民、玩家和羊此时都位于羊原本位置上方1米)

这个过程有何特殊的呢?

你仔细看看第4、5、7、8和9条过程,你有没有什么发现?

当游戏将村民传送至玩家上方1米的位置时,虽然玩家已经被传送至了羊上方1米的位置,但游戏仍然将村民传送至玩家原本位置上方1米,而不是羊上方2米的位置。

这是怎么回事?

我们设玩家(2,2,2)为A、村民(3,2,3)为b、羊(4,2,4)为c,游戏在运行execute时,其实它的流程是这样的:

execute---A---------b---------c

游戏先解析as @e,得到了上面的三个目标。

execute---A---------b---------c

------------↓---------↓----------↓

---------2·2·2-----2·2·2-----2·2·2

------------↓---------↓----------↓

---------3·2·3-----3·2·3-----3·2·3

------------↓---------↓----------↓

---------4·2·4-----4·2·4-----4·2·4

然后游戏会解析at @e,预先将实体的位置记录下来。上面为了方便展示,用x·y·z来表示坐标。

execute---A------------------------b-----------------------c

------------↓-------------------|----↓------------------|-----↓

---------2·2·2—3·2·3—4·2·4-|-2·2·2—3·2·3—4·2·4-|-2·2·2—3·2·3—4·2·4

------------↓-------↓-------↓---|----↓------↓-------↓---|----↓-------↓-------↓

-----------1------2------3---|---4-----5------6---|---7------8------9

1:\/tp 玩家名 2 3 2

2:\/tp 玩家名 3 3 3

3:\/tp 玩家名 4 3 4

4:\/tp 村民UUId 2 3 2

5:\/tp 村民UUId 3 3 3

6:\/tp 村民UUId 4 3 4

7:\/tp 羊UUId 2 3 2

8:\/tp 羊UUId 3 3 3

9:\/tp 羊UUId 4 3 4

接下来游戏会解析run tp @s ~~1 ~,根据三要素,将其中的目标选择器和相对坐标等参数具体化(但计分板分数之类的不会具体化,因为没必要),得到具体的指令(如上)。

最后,游戏运行具体的指令,也就是本章最开头的那九个过程。

其中,最重要的,也是最关键的一点,就在于execute指令解析at @e的过程。

execute并不是说运行一次解析一次,而是先全部解析了再运行,所以并不会使得『村民传到玩家传送过后上方1米的位置』之类的事情发生。

能理解吧?

那问题来了,如果execute再套一个execute会发生什么?比如我们将上述指令写成:

\/execute as @e run execute at @e run tp @s ~~1 ~

其实效果还是一样的,具体原因就等你自己去推导吧,按照我上面的流程去推导。

这就是Java execute 1.13+版本的运行流程。如果你还不懂,我们再看一个简单并且效果比较明显的例子。

设有盔甲架A和b,分别位于主世界的(40,-60,29)和(42,-60,29)。盔甲架A的生成时间比盔甲架b更早,已加载区块中没有其他盔甲架。在盔甲架A、b旁运行如下指令:

\/execute as @e[type=minecraft:armor_stand] at @s run tp @e[type=minecraft:armor_stand,distance=1..3]~~10 ~

让我们分析一下,运行上述指令会发生什么。

首先,如果我们按照正常的思维去分析这条指令,就会得到以下结果:

A会先将b传送到自己上方10米的位置,b由于处于那个位置无法选取到A来传送,最终仅仅b会被传送到A的上方10米处。

但其实,如果你真的去运行这条指令,就会发现A和b都会被传送到对方原位置的上方10米处。

为什么?我们按照游戏的思维分析一下就可以了:

execute---A---------b

游戏先解析as @e[type=minecraft:armor_stand],得到了上面的两个目标:盔甲架A和盔甲架b。

execute---A--------------b

------------↓--------------↓

-------40·-60·29-----42·-60·29

然后游戏会解析at @s,预先将实体的位置记录下来。

execute---A--------------b

------------↓--------------↓

-------40·-60·29-----42·-60·29

------------↓--------------↓

-----------1-------------2

1:\/tp 盔甲架b的UUId 40 -50 29

2:\/tp 盔甲架A的UUId 42 -50 29

接下来游戏会解析run tp @e[type=minecraft:armor_stand,distance=1..3]~~10 ~,根据三要素,具体化指令,得到具体的指令。由于此时还未传送,所以目标选择器会分别选择到『盔甲架A』和『盔甲架b』。

最后,游戏按照顺序执行指令,分别将盔甲架A和盔甲架b传送到对方上面10米高的位置。

这个例子比较简单,你应该能够理解吧?

所以你明白了吗?

上面讲的是Java1.13更新后的execute指令其运行的具体流程,那么Java1.13更新前的呢?以及基岩版的呢?

2016年6月22日,mcbbS大佬pca006132在『矿工茶馆』发布了一个猜猜乐(Id:),大致的问题如下:

execute @e ~~~... summon ArmorStand,这个指令在初始实体不同数目的时候出来的结果是什么

没想到竟然没人能够解答这个问题,于是这位大佬在次日讲解了这个问题(帖子Id:)。他举了一个简单的例子:

当初始实体数为2时,运行execute @e ~~~ execute @e ~~~ summon Armorstand

这个例子的结果竟然是8。

那如果在相同的初始情况下,运行execute @e ~~~ execute @e ~~~ execute @e ~~~ summon Armorstand,即套了三个execute的指令会发生什么?

答案是:2048。

很令人震惊啊!那为什么会这样呢?

如果我们在Java1.13及以上版本,运行类似的指令,将达不到一样的效果,因为在Java1.13之前,execute的运行逻辑是完全不一样的。

那么到底是个怎么个逻辑法呢?其实在Java1.13前,execute并不会在运行前先存好各种数据,而是运行一遍解析一遍。以上面那个嵌套了3层execute的指令为例子,我们来解析一下。

条件:初始两个实体A(1,2,1)和b(2,2,2),A比b离执行地点更近。

execute---A----------b

------------↓

----------1·2·1

游戏先解析第一个『execute @e ~~~』,得到了上面的结果。后面我们将会忽略执行地点,因为这边不需要考虑执行地点的影响。

execute---A----------b

------------↓

---------A——b

游戏按照顺序,先以A为执行者运行指令,并解析了第二个『execute @e ~~~』,得到了上面的结果。

execute---A----------b

------------↓

---------A——b

---------↓

------A——b

游戏按照顺序,再次以A为执行者运行指令,并解析了第三个『execute @e ~~~』,得到了上面的结果。

execute---A----------b

------------↓

---------A——b

---------↓

------A——b

------↓-----↓

------c-----d

第三个execute运行指令,产生了新的盔甲架c和d。

execute------A----------b

---------------↓

---------A————b

---------↓---------↓

--------+2---b—A—c—d

游戏回到第二层execute,以目标选择器顺序选取b为执行者,由于之前已经生成了c和d,所以b运行第三层execute指令时,会选取到4个实体来运行指令,最终实体数量+4(现在为8=2+2+4)。

execute---A-----------------b

------------↓-----------------↓

----------+6----b—A—c—d—E—F—G—h

游戏回到第一层execute,以目标选择器顺序选取b为执行者。由于已经有了八个实体,因此这一次第二层execute会选取到八个实体来运行第三层execute。

execute---A-------------------------b

------------↓-------------------------↓

----------+6----b——A——c——d———E———F———G———h

-----------------↓-----↓-----↓-----↓-------↓-------↓-------↓-------↓

--增加实体数---+8--+16--+32-+64--+128--+256---+512--+1024

--增加后数量----16---32---64---128----256---512----1024---2048

随后,游戏按照顺序依次以这八个实体运行指令,实体数量在此过程中快速增长,最终变为2048。

不难发现,每一次第三层的execute指令被运行,都会将当前实体数量x2,而上面一共运行了10次第三层的execute,相当于2被乘以了10次2,也就是2x2x2x2x2x2x2x2x2x2x2,即2的11次方,结果为2048,即2048个实体。

实在是太令人惊讶了是不是?在Java1.13以下的execute指令中,execute仅仅会在被选取的执行者开始执行指令时才会进行下一步的解析动作,而且不会一下子就将所有执行者运行指令的情况全部解析出来再运行指令。

所以,Java1.13对execute的改动不仅仅是格式上的,还有运行流程上的改动。

如果你并不能很好理解上面为什么会由2个实体产生出2048个实体,别担心,我们继续以刚才两个盔甲架互相传送为例子,看看类似的指令在Java1.13以下的版本有何不同的效果。

还是设有盔甲架A和b,分别位于主世界的(40,60,29)和(42,60,29)。盔甲架A的比盔甲架b更靠近执行地点,已加载区块中没有其他盔甲架。在盔甲架A、b旁运行如下指令:

\/execute @e[type=armor_stand]~~~ teleport @e[type=armor_stand,r=3,rm=1]~~10 ~

游戏先解析『execute @e[type=armor_stand]~~~』得到如下结果:

execute---A----------b

------------↓

-------40·60·29

然后以A为执行者,解析『teleport @e[type=armor_stand,r=3,rm=1]~~10 ~』,得到了如下指令:

\/teleport 盔甲架b的UUId 40 70 29

运行上述指令,盔甲架b被传送至(40,70,29)处。随后游戏以b为执行者,先解析执行地点参数『~~~』,得到如下结果:

execute---A------------------b

------------↓------------------↓

-------40·60·29---------40·70·29

--将b传送至40·70·29

接下来,游戏以b为执行者,再次解析指令,得到如下内容:

选择器'@e[type=armor_stand,r=3,rm=1]'什么都没找到

没错,由于b被传送到了(40,70,29),因此目标选择器就选不到A,自然就无法执行指令。最终,正如我们在最开始以正常思维分析的那样,得到了如下结果:

A会先将b传送到自己上方10米的位置,b由于处于那个位置无法选取到A来传送,最终仅仅b会被传送到A的上方10米处。

虽然在Java1.13更新后,我们的『正常思维』没用了,但在Java1.13以下版本还是很准的。

那在基岩版呢?

作者在基岩版也测试过了(用的上面的两个盔甲架tp法),确认基岩版不管是旧版还是新版(1.19.10更新的)的execute,都是会得到和Java版1.13以下版本一模一样的数据。

其中,对于目前还在测试的新版execute,用的是如下指令:

execute as @e[type=armor_stand] at @s run tp @e[type=armor_stand,r=3,rm=1]~~10 ~

也就是说,如果你在基岩版运行上面套了3层execute的生成指令,在初始实体数为2的情况下,也会得到有2048个实体的纟

......

......

......

:(

你的电脑遇到问题,需要重新启动。

我们只收集某些错误信息,然后为你重新启动。

......

......

......

——附录:跟本章有关系的mcbbS帖子原链接

(上述帖子均已被mcbbS论坛系统自动关闭)

上一章目 录下一章存书签
站内强推大奉打更人 将门:爷爷莫慌,老子真无敌了! 没钱上大学的我只能去屠龙了 斗罗绝世:谁让他进史莱克的! 丹武双绝 庶子夺唐 她是剑修 洪荒:第十三祖巫?不!得叫老子巫祖! 天后上班我睡觉,直到歌词家中曝 权力医途 寻忆:武灵天下 处分我退学,高考又求我回去? 重生后,我成了奸臣黑月光 掌天图 繁花织梦重生女总裁的逆袭时代 豪门商途璀璨家族的风云岁月 打坐就能涨法力,贫道要无敌 快穿之病娇男二黑化了 赶海:一双紫金瞳,驾驭全球海洋 绝世战神赘婿 
经典收藏灰烬领主 巨龙:我的两个龙妹一蠢一屑 我在崩坏世界苟到末日降临 诸天从四合院启航 嫡嫁千金 长生:一曲唢呐,送葬诸天仙帝 万界征服系统:我是大魔王 洪荒:我镇元子才是地道之主 夭寿啦!老祖宗你还有多少前女友 系统:没有资源?我直接无限复制 开局成杀神,陛下为何造反? 行走在诸天万界 天武神帝云飞扬林雨初 开局系统签到,满级神功开始无敌 御兽仙尊 全民求生之超凡领主 金丹是恒星,你管这叫修仙? 一人一剑一坟冢!一诗一酒一人间 国王 一代天神,系统签到无敌,我怕谁 
最近更新气域传说之战神再起 五行真经 沧澜仙魔录 创造源 别动这个剧本 魔界龙羽生 于彼天逍遥 神源录 绝域凡仙行 最强模拟,没有选项,全继承 后室之UT大酒店 万界执掌 魔起苍山 开局挖弟弟至尊骨,我直接捏爆 斗皇传说1双神风云 败犬圣女,把头发盘起来! 圣元纪事一双华传奇 银霜领主 鼎炼乾坤 月夜的传说之寻觅 
Minecraft指令手册 你好MC - Minecraft指令手册txt下载 - Minecraft指令手册最新章节 - Minecraft指令手册全文阅读 - 好看的玄幻魔法小说