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
------------↓--------------↓
-----------①-------------②
①:/tp 盔甲架B的UUID 40 -50 29
②:/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的运行逻辑是完全不一样的。
这章没有结束,请点击下一页继续阅读!
喜欢Minecraft指令手册请大家收藏:(m.2yq.org)Minecraft指令手册爱言情更新速度全网最快。