【MCBE/命令教程】1Tick获取所有实体坐标(1链式版本/适用于网易BE租赁服) 您所在的位置:网站首页 1122显示坐标指令 【MCBE/命令教程】1Tick获取所有实体坐标(1链式版本/适用于网易BE租赁服)

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

2023-08-09 00:17| 来源: 网络整理| 查看: 265

【前言/专栏阅读须知】

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格方块;标记可用标签来完成)

3. 让所有Teleport实体朝向当个维度内的Target实体

*说明:此时每个实体A对应的实体Teleport都朝向了当个维度内的Target实体,情况大致如图例1所示:

图例1

4. 让所有Teleport实体朝着Target实体二分,直到到达Target实体的位置。二分结束后,Teleport实体会有其X轴坐标的分数(若不会二分,请见下文的“【二分/读取坐标(基础) 详细教程】”)

*说明:二分结束后,所有的Teleport实体应当都在实体Target的1格内,情况大致如图例2所示:

图例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存在于多个维度的情况)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有