【MCBE/命令教程】1Tick获取所有实体坐标(1链式版本/适用于网易BE租赁服) | 您所在的位置:网站首页 › 1122显示坐标指令 › 【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格方块;标记可用标签来完成) 3. 让所有Teleport实体朝向当个维度内的Target实体 *说明:此时每个实体A对应的实体Teleport都朝向了当个维度内的Target实体,情况大致如图例1所示: 图例14. 让所有Teleport实体朝着Target实体二分,直到到达Target实体的位置。二分结束后,Teleport实体会有其X轴坐标的分数(若不会二分,请见下文的“【二分/读取坐标(基础) 详细教程】”) *说明:二分结束后,所有的Teleport实体应当都在实体Target的1格内,情况大致如图例2所示: 图例25. 让所有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 实验室设备网 版权所有 |