【MCBE/命令教程】1Tick獲取所有實體坐標(biāo)(1鏈?zhǔn)桨姹?適用于網(wǎng)易BE租賃服)

【前言/專欄閱讀須知】
1.?本專欄取材于 入戲DL
2. 具體效果可見站內(nèi)視頻?[mcbe]純命令1gt獲取多實體坐標(biāo) - 入戲DL
3. 專欄編寫不易,請讀者根據(jù)實際情況點贊、收藏、投幣和關(guān)注
4. 若需要轉(zhuǎn)載本專欄則需要注明來源
5. 本專欄不會涉及太多的命令(命令一般以范例的形式出現(xiàn)),因此若需要直接取得命令函數(shù),請前往本專欄文尾獲取
6. 本專欄所講述的方法相比初始方法的“execute @e ~ ~ ~ function”更加耗費設(shè)備性能。函數(shù)玩家應(yīng)當(dāng)酌情選擇本方法

【教程】
部分用語規(guī)定:
每個需要取得坐標(biāo)的實體都被稱為實體A
準(zhǔn)備過程:
1. 確定所有實體A所在的維度(對于租賃服可使用rm法快捷確定)
2. 在相應(yīng)維度的原點處[坐標(biāo)(0.0,0.0,0.0)]處生成1實體(下稱實體Target;可以選擇先在加載區(qū)域生成完成后再傳送到該位置)
3. 在每個需要取得實體的位置處生成1實體
*說明:單個Tick內(nèi)生物可能仍會有所移動。如果需要減少誤差,建議在每個實體A處生成1實體B用于代替每個實體A。
正式過程:
X軸
1. 以所有Teleport實體的(~,0.0,0.0)位置作為執(zhí)行點并將其傳送傳送到執(zhí)行點位置(命令范例:execute @e[tag=Teleport] ~ 0.0 0.0 tp ~ ~ ~)
2. 若有Teleport實體在X軸的負半軸,則將其轉(zhuǎn)入到正半軸區(qū)間內(nèi)并對其進行標(biāo)記(若求取X軸坐標(biāo)的范圍為-1024~1024,則將該實體的X軸坐標(biāo)向X軸正方向偏移1024格方塊;標(biāo)記可用標(biāo)簽<tag>來完成)
3. 讓所有Teleport實體朝向當(dāng)個維度內(nèi)的Target實體
*說明:此時每個實體A對應(yīng)的實體Teleport都朝向了當(dāng)個維度內(nèi)的Target實體,情況大致如圖例1所示:

4. 讓所有Teleport實體朝著Target實體二分,直到到達Target實體的位置。二分結(jié)束后,Teleport實體會有其X軸坐標(biāo)的分數(shù)(若不會二分,請見下文的“【二分/讀取坐標(biāo)(基礎(chǔ)) 詳細教程】”)
*說明:二分結(jié)束后,所有的Teleport實體應(yīng)當(dāng)都在實體Target的1格內(nèi),情況大致如圖例2所示:

5. 讓所有Teleport備份其剛剛得到的X軸坐標(biāo)的分數(shù)并通過還原該分數(shù)以回到原位置(即完成步驟2時的情況,示例圖可見圖例1;若不會還原坐標(biāo),請見下文的“【分數(shù)轉(zhuǎn)坐標(biāo)詳細教程】”)
6. 如果在二分前有實體Teleport由X軸的負半軸轉(zhuǎn)入了正半軸,則現(xiàn)在需要轉(zhuǎn)回負半軸
7. 以每個實體A的(~,0.0,0.0)位置作為執(zhí)行點,將該位置最近的Teleport實體得到的X軸坐標(biāo)分數(shù)同步給實體A(命令范例:execute @e[tag=a] ~ 0.0 0.0 scoreboard players operation @s posx = @e[c=1,tag=Teleport] posx_save)
*說明:因為步驟5~6已經(jīng)讓所有Teleport實體回到了完成步驟1時的情況,即每個Teleport實體的坐標(biāo)可以用每個實體A坐標(biāo)(~,0.0,0.0)來表示。通過c=1這一參數(shù)即可限定分數(shù)同步條件,確定實體A最終得到的分數(shù)是來源于正確的Teleport實體
8. 清理實體Teleport、實體Target、整個X軸坐標(biāo)的求取宣告結(jié)束
【同理可得Y軸、Z軸坐標(biāo),本專欄將不再贅述方法】
【二分/讀取坐標(biāo)(基礎(chǔ))?詳細教程】
準(zhǔn)備過程:
已知任意一個正整數(shù)可以被拆分為多個2^n之和的形式,同時每個已經(jīng)使用過的2^n不會被再次使用。以下是2^n的一部分例子(下稱為2^n集合表):
2^0 2^1 2^2 2^3 2^4 2^5 2^6 2^7 2^8 ... 對應(yīng) 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
用語規(guī)定:此處稱 127 , 233 , 337 為目標(biāo)數(shù)
解析:通過 拆分范例 可知,我們從給出的2^n集合表的最大數(shù)字開始向較小的數(shù)字依次選擇,直到選擇到的數(shù)≦目標(biāo)數(shù)。當(dāng)滿足“選擇到的數(shù)≦目標(biāo)數(shù)”時,將目標(biāo)數(shù)減去選擇到的數(shù),完成首次拆分并繼續(xù)向較小數(shù)選擇,直到目標(biāo)數(shù)被減為0
拆分過程范例:
以目標(biāo)數(shù)為127為例,2^n集合表保持不變:256≧127,不滿足,向較小數(shù) 128 選擇。128≧127,不滿足,向較小數(shù) 64 選擇。64≦127,滿足,作差,得目標(biāo)數(shù)為 127-64=63 ,63≠0,需要繼續(xù)選擇較小數(shù) 32 。32≦63 ,滿足,作差,得目標(biāo)數(shù)為 63-32=31 ,31≠0 ,需要繼續(xù)選擇較小數(shù) 16 。16≦31,滿足,作差,得目標(biāo)數(shù)為 31-16=15 ,15≠0 ,需要繼續(xù)選擇較小數(shù)?8?。8≦15,滿足,作差,得目標(biāo)數(shù)為 15-8=7?,7≠0?,需要繼續(xù)選擇較小數(shù) 4?。4≦7,滿足,作差,得目標(biāo)數(shù)為 7-4=3?,3≠0?,需要繼續(xù)選擇較小數(shù) 2?。2≦3,滿足,作差,得目標(biāo)數(shù)為?3-2=1?,1≠0?,需要繼續(xù)選擇較小數(shù) 1?。1≦1,滿足,作差,得目標(biāo)數(shù)為 1-1=0?,0=0?,拆分結(jié)束。其中滿足條件是2^n數(shù)分別有:63,32,16,8,4,2,1,固127可被拆分為63+32+16+8+4+2+1.
正式過程:
語言說明:
1. 讓實體Target選中距離大于2^n(此處的n根據(jù)坐標(biāo)求取范圍而定)的Teleport實體
2. 將選到的這些實體在計分板上變動分數(shù)
3. 將選到的這些實體向Target實體的方向傳送2^n格
4. 讓實體Target選中距離大于2^(n-1)的Teleport實體
5.?將選到的這些實體在計分板上變動分數(shù)
6.?將選到的這些實體向Target實體的方向傳送2^(n-1)格
7.?讓實體Target選中距離大于2^(n-2)的Teleport實體
8.?將選到的這些實體在計分板上變動分數(shù)
9.?將選到的這些實體向Target實體的方向傳送2^(n-2)格
...
n. 讓實體Target選中距離大于2^0的Teleport實體
n+1.?將選到的這些實體在計分板上變動分數(shù)
n+2.?將選到的這些實體向Target實體的方向傳送2^0格
命令范例(“#”表示注釋,不屬于指令;distance表示儲存坐標(biāo)的計分板):
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
【分數(shù)轉(zhuǎn)坐標(biāo)詳細教程】
準(zhǔn)備過程:
見本專欄“二分/讀取坐標(biāo)(基礎(chǔ))?詳細教程”的“準(zhǔn)備過程”部分
正式過程:
語言說明:
1. 選擇分數(shù)≧2^n的需要還原坐標(biāo)的實體
2. 將這些實體向指定方向傳送2^n格
3. 扣除這些實體在指定計分板中的分數(shù),只扣除2^n
4.?選擇分數(shù)≧2^(n-1)的需要還原坐標(biāo)的實體
4. 將這些實體向指定方向傳送2^(n-1)格
5. 扣除這些實體在指定計分板中的分數(shù),只扣除2^(n-1)
6.?選擇分數(shù)≧2^(n-2)的需要還原坐標(biāo)的實體
7.?將這些實體向指定方向傳送2^(n-2)格
8. 扣除這些實體在指定計分板中的分數(shù),只扣除2^(n-2)
...
n.?選擇分數(shù)≧2^0的需要還原坐標(biāo)的實體
n+1.?將這些實體向指定方向傳送2^0格
n+2. 扣除這些實體在指定計分板中的分數(shù),只扣除2^0
命令范例(“#”表示注釋,不屬于指令;distance表示儲存坐標(biāo)的計分板):
execute @e[scores={distance=2^n..},tag=需要還原坐標(biāo)] ~ ~ ~ tp ^ ^ ^-2^n
execute @e[scores={distance=2^n..},tag=需要還原坐標(biāo)] ~ ~ ~ scoreboard players remove @s distance 2^n
#1
execute @e[scores={distance=2^(n-1)..},tag=需要還原坐標(biāo)] ~ ~ ~?tp ^ ^ ^-2^(n-1)
execute @e[scores={distance=2^(n-1)..},tag=需要還原坐標(biāo)] ~ ~ ~ scoreboard players remove @s distance 2^(n-1)
#2
execute @e[scores={distance=2^(n-2)..},tag=需要還原坐標(biāo)] ~ ~ ~?tp ^ ^ ^-2^(n-2)
execute @e[scores={distance=2^(n-2)..},tag=需要還原坐標(biāo)] ~ ~ ~ scoreboard players remove @s distance 2^(n-2)
#3
...
execute @e[scores={distance=2^0..},tag=需要還原坐標(biāo)] ~ ~ ~?tp ^ ^ ^-2^0
execute @e[scores={distance=2^0..},tag=需要還原坐標(biāo)] ~ ~ ~ scoreboard players remove @s distance 2^0
#n

【結(jié)束】
1. 感謝各位閱讀花費寶貴的時間閱讀本專欄,希望對各位有所幫助!
2. 值得一提的是,該方法除了原本的獲取坐標(biāo)外,還需要再還原坐標(biāo)。這就間接的導(dǎo)致了命令量的上升,二分次數(shù)從原本的3次變?yōu)榱?次
3. 讀者我是白嫖黨/讀者我不想看專欄/讀者我想要直接得到指令:請入QQ群?902923525?自?。ㄎ募挥谌何募A“指令包”中,文件名為pos.mcfunction,沒有打包為行為包。帶有標(biāo)簽getpos的實體會被視為需要取得坐標(biāo)的對象,標(biāo)簽添加完成后執(zhí)行命令function pos即可。該函數(shù)沒有考慮多個實體A存在于多個維度的情況)