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指令被运行,都会将当前实体数量×2,而上面一共运行了10次第三层的execute,相当于2被乘以了10次2,也就是2×2×2×2×2×2×2×2×2×2×2,即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论坛系统自动关闭)