【MCBE/命令教程】1Tick获取所有实体坐标(1链式版本/适用于网易BE租赁服)

【前言/专栏阅读须知】
1. 本专栏取材于 入戏DL
2. 具体效果可见站内视频 [mcbe]纯命令1gt获取多实体坐标 - 入戏DL
3. 专栏编写不易,请读者根据实际情况点赞、收藏、投币和关注
4. 若需要转载本专栏则需要注明来源
5. 本专栏不会涉及太多的命令(命令一般以范例的形式出现),因此若需要直接取得命令函数,请前往本专栏文尾获取
6. 本专栏所讲述的方法相比初始方法的“execute @e ~ ~ ~ function”更加耗费设备性能。函数玩家应当酌情选择本方法

【教程】
部分用语规定:
每个需要取得坐标的实体都被称为实体A
准备过程:
1. 确定所有实体A所在的维度(对于租赁服可使用rm法快捷确定)
2. 在相应维度的原点处[坐标(0.0,0.0,0.0)]处生成1实体(下称实体Target;可以选择先在加载区域生成完成后再传送到该位置)
3. 在每个需要取得实体的位置处生成1实体
*说明:单个Tick内生物可能仍会有所移动。如果需要减少误差,建议在每个实体A处生成1实体B用于代替每个实体A。
正式过程:
X轴
1. 以所有Teleport实体的(~,0.0,0.0)位置作为执行点并将其传送传送到执行点位置(命令范例:execute @e[tag=Teleport] ~ 0.0 0.0 tp ~ ~ ~)
2. 若有Teleport实体在X轴的负半轴,则将其转入到正半轴区间内并对其进行标记(若求取X轴坐标的范围为-1024~1024,则将该实体的X轴坐标向X轴正方向偏移1024格方块;标记可用标签<tag>来完成)
3. 让所有Teleport实体朝向当个维度内的Target实体
*说明:此时每个实体A对应的实体Teleport都朝向了当个维度内的Target实体,情况大致如图例1所示:

4. 让所有Teleport实体朝着Target实体二分,直到到达Target实体的位置。二分结束后,Teleport实体会有其X轴坐标的分数(若不会二分,请见下文的“【二分/读取坐标(基础) 详细教程】”)
*说明:二分结束后,所有的Teleport实体应当都在实体Target的1格内,情况大致如图例2所示:

5. 让所有Teleport备份其刚刚得到的X轴坐标的分数并通过还原该分数以回到原位置(即完成步骤2时的情况,示例图可见图例1;若不会还原坐标,请见下文的“【分数转坐标详细教程】”)
6. 如果在二分前有实体Teleport由X轴的负半轴转入了正半轴,则现在需要转回负半轴
7. 以每个实体A的(~,0.0,0.0)位置作为执行点,将该位置最近的Teleport实体得到的X轴坐标分数同步给实体A(命令范例:execute @e[tag=a] ~ 0.0 0.0 scoreboard players operation @s posx = @e[c=1,tag=Teleport] posx_save)
*说明:因为步骤5~6已经让所有Teleport实体回到了完成步骤1时的情况,即每个Teleport实体的坐标可以用每个实体A坐标(~,0.0,0.0)来表示。通过c=1这一参数即可限定分数同步条件,确定实体A最终得到的分数是来源于正确的Teleport实体
8. 清理实体Teleport、实体Target、整个X轴坐标的求取宣告结束
【同理可得Y轴、Z轴坐标,本专栏将不再赘述方法】
【二分/读取坐标(基础) 详细教程】
准备过程:
已知任意一个正整数可以被拆分为多个2^n之和的形式,同时每个已经使用过的2^n不会被再次使用。以下是2^n的一部分例子(下称为2^n集合表):
2^0 2^1 2^2 2^3 2^4 2^5 2^6 2^7 2^8 ... 对应 0 2 4 8 16 32 64 128 256 ...
拆分范例:
Ⅰ. 127 = 64 + 32 + 16 + 8 + 4 + 2 + 1
Ⅱ. 233 = 128 + 64 + 32 + 8 + 1
Ⅲ. 337 = 256 + 64 + 16 + 1
用语规定:此处称 127 , 233 , 337 为目标数
解析:通过 拆分范例 可知,我们从给出的2^n集合表的最大数字开始向较小的数字依次选择,直到选择到的数≦目标数。当满足“选择到的数≦目标数”时,将目标数减去选择到的数,完成首次拆分并继续向较小数选择,直到目标数被减为0
拆分过程范例:
以目标数为127为例,2^n集合表保持不变:256≧127,不满足,向较小数 128 选择。128≧127,不满足,向较小数 64 选择。64≦127,满足,作差,得目标数为 127-64=63 ,63≠0,需要继续选择较小数 32 。32≦63 ,满足,作差,得目标数为 63-32=31 ,31≠0 ,需要继续选择较小数 16 。16≦31,满足,作差,得目标数为 31-16=15 ,15≠0 ,需要继续选择较小数 8 。8≦15,满足,作差,得目标数为 15-8=7 ,7≠0 ,需要继续选择较小数 4 。4≦7,满足,作差,得目标数为 7-4=3 ,3≠0 ,需要继续选择较小数 2 。2≦3,满足,作差,得目标数为 3-2=1 ,1≠0 ,需要继续选择较小数 1 。1≦1,满足,作差,得目标数为 1-1=0 ,0=0 ,拆分结束。其中满足条件是2^n数分别有:63,32,16,8,4,2,1,固127可被拆分为63+32+16+8+4+2+1.
正式过程:
语言说明:
1. 让实体Target选中距离大于2^n(此处的n根据坐标求取范围而定)的Teleport实体
2. 将选到的这些实体在计分板上变动分数
3. 将选到的这些实体向Target实体的方向传送2^n格
4. 让实体Target选中距离大于2^(n-1)的Teleport实体
5. 将选到的这些实体在计分板上变动分数
6. 将选到的这些实体向Target实体的方向传送2^(n-1)格
7. 让实体Target选中距离大于2^(n-2)的Teleport实体
8. 将选到的这些实体在计分板上变动分数
9. 将选到的这些实体向Target实体的方向传送2^(n-2)格
...
n. 让实体Target选中距离大于2^0的Teleport实体
n+1. 将选到的这些实体在计分板上变动分数
n+2. 将选到的这些实体向Target实体的方向传送2^0格
命令范例(“#”表示注释,不属于指令;distance表示储存坐标的计分板):
execute @e[tag=Target] ~ ~ ~ scoreboard players add @e[rm=2^n,tag=Teleport] distance 2^n
execute @e[tag=Target] ~ ~ ~ execute @e[rm=2^n,tag=Teleport] ~ ~ ~ tp ^ ^ ^2^n
#1
execute @e[tag=Target] ~ ~ ~ scoreboard players add @e[rm=2^(n-1),tag=Teleport] distance 2^(n-1)
execute @e[tag=Target] ~ ~ ~ execute @e[rm=2^n,tag=Teleport] ~ ~ ~ tp ^ ^ ^2^(n-1)
#2
execute @e[tag=Target] ~ ~ ~ scoreboard players add @e[rm=2^(n-2),tag=Teleport] distance 2^(n-2)
execute @e[tag=Target] ~ ~ ~ execute @e[rm=2^n,tag=Teleport] ~ ~ ~ tp ^ ^ ^2^(n-2)
#3
...
execute @e[tag=Target] ~ ~ ~ scoreboard players add @e[rm=2^0,tag=Teleport] distance 2^0
execute @e[tag=Target] ~ ~ ~ execute @e[rm=2^n,tag=Teleport] ~ ~ ~ tp ^ ^ ^2^0
#n
【分数转坐标详细教程】
准备过程:
见本专栏“二分/读取坐标(基础) 详细教程”的“准备过程”部分
正式过程:
语言说明:
1. 选择分数≧2^n的需要还原坐标的实体
2. 将这些实体向指定方向传送2^n格
3. 扣除这些实体在指定计分板中的分数,只扣除2^n
4. 选择分数≧2^(n-1)的需要还原坐标的实体
4. 将这些实体向指定方向传送2^(n-1)格
5. 扣除这些实体在指定计分板中的分数,只扣除2^(n-1)
6. 选择分数≧2^(n-2)的需要还原坐标的实体
7. 将这些实体向指定方向传送2^(n-2)格
8. 扣除这些实体在指定计分板中的分数,只扣除2^(n-2)
...
n. 选择分数≧2^0的需要还原坐标的实体
n+1. 将这些实体向指定方向传送2^0格
n+2. 扣除这些实体在指定计分板中的分数,只扣除2^0
命令范例(“#”表示注释,不属于指令;distance表示储存坐标的计分板):
execute @e[scores={distance=2^n..},tag=需要还原坐标] ~ ~ ~ tp ^ ^ ^-2^n
execute @e[scores={distance=2^n..},tag=需要还原坐标] ~ ~ ~ scoreboard players remove @s distance 2^n
#1
execute @e[scores={distance=2^(n-1)..},tag=需要还原坐标] ~ ~ ~ tp ^ ^ ^-2^(n-1)
execute @e[scores={distance=2^(n-1)..},tag=需要还原坐标] ~ ~ ~ scoreboard players remove @s distance 2^(n-1)
#2
execute @e[scores={distance=2^(n-2)..},tag=需要还原坐标] ~ ~ ~ tp ^ ^ ^-2^(n-2)
execute @e[scores={distance=2^(n-2)..},tag=需要还原坐标] ~ ~ ~ scoreboard players remove @s distance 2^(n-2)
#3
...
execute @e[scores={distance=2^0..},tag=需要还原坐标] ~ ~ ~ tp ^ ^ ^-2^0
execute @e[scores={distance=2^0..},tag=需要还原坐标] ~ ~ ~ scoreboard players remove @s distance 2^0
#n

【结束】
1. 感谢各位阅读花费宝贵的时间阅读本专栏,希望对各位有所帮助!
2. 值得一提的是,该方法除了原本的获取坐标外,还需要再还原坐标。这就间接的导致了命令量的上升,二分次数从原本的3次变为了6次
3. 读者我是白嫖党/读者我不想看专栏/读者我想要直接得到指令:请入QQ群 902923525 自取(文件位于群文件夹“指令包”中,文件名为pos.mcfunction,没有打包为行为包。带有标签getpos的实体会被视为需要取得坐标的对象,标签添加完成后执行命令function pos即可。该函数没有考虑多个实体A存在于多个维度的情况)