# 坐標(Coordinate)
坐標為三個數字,定義了物件在**當前世界**內的位置。該三數值分別為x、y、z數值,分別代表物件在x、y、z軸上離參照點(Reference point)的距離,單位為米,即一般方塊的長、闊、高的數值。
+ x軸為東(+)西(-)。
+ y軸為上(+)下(-)。
+ z軸為南(+)北(-)。
本文會以(x, y, z)表達坐標。
## 絕對坐標(Absolute coordinate)
絕對坐標的參照點為游戲的原點,即(0,0,0)。
一般不特別指明的情況下都為絕對坐標、主世界。
游戲內點擊F3后出現的調試界面會顯示玩家當前的絕對坐標(注意是腳的坐標)、朝向等資料,對地圖制作十分有用。
一般地圖內大多用絕對坐標,因為我們清楚所有東西的坐標,使用相對坐標則需要新的參照點并且需要一些計算,比較麻煩。(y坐標除外,因為y坐標在對方塊使用的情況下的范圍不大,只是0-255)
然而能夠在多個地圖內使用的模塊則甚少使用絕對坐標,因為我們不清楚當前坐標的絕對坐標(命令沒法輕易獲得此數值)。在這情況下,我們會以某個實體為參照點,使用相對坐標。
## 相對坐標(Relative coordinate)
相對坐標就是相對于某個點的坐標。表達相對坐標的符號為`~`(如`~3`就是+3,`~`就是沒有變化)。比如(~5 ~ ~-3)就是某個點的(x+5, y, z-3)的位置。
相對坐標可以與絕對坐標一起使用, 比如原點為(5,5,5),坐標(~5 20 ~-3)換為絕對坐標就是(10 20 2)
相對坐標在大部分命令都充當著一個很重要的角色, 因為很多時候我們會希望對目標相對位置進行操作, 比如在玩家上方放置方塊。
> **知多一點點**:相對坐標的原點=執行點?
> (對于執行點的概念請參見章節1.4:命令執行)
>
> 在大多數使用相對坐標的情況下,是的。很大部分相對坐標是相對于執行坐標的。
> 然而有兩個例外: `tp`命令及`execute`命令。
> `tp`命令的其中一個格式: tp <被傳送實體> <x> <y> <z>,中的(x, y, z),原點為**被傳送實體**的當前坐標,而不是執行點。
> `execute`命令的格式: execute <實體> <x1> <y1> <z1> <command>及execute <實體> <x1> <y1> <z1> detect <x2> <y2> <z2> <block> <data value|block state> <command>,中的(x1, y1, z1)以**選擇到的實體的坐標**為原點,(x2, y2, z2)以 **(x1, y1, z1)** 的坐標為原點。
> 不過,在實際的使用情況上,除非是`tp`或`execute`命令,否則都是相對于執行坐標了。
# 朝向(Facing)
Minecraft里的朝向都是以角度為單位。可以填寫負數角度。
朝向分為兩個: rx, ry。
rx即平面上的轉軸,垂直于當前玩家的朝向。也就是說這角度決定了玩家看向上、看向前還是看向下的。
-90就是向上,0就是看向正前方,90就是向下。
ry即垂直的轉軸,這決定了平面的朝向。這比較難以描述,還是直接上圖就好。

> 值得一提的是,MC**無法直接取得前方**的坐標,如果要做到這功能的話只能靠一些黑科技或枚舉(窮舉,enumerating)
# 區塊(Chunk)
區塊是Minecraft世界的組成部分。每個區塊的大小為16\*256\*16,長16格,寬16格,高256格(y=0到y=255)
當你所在坐標的 **x或z mod16=0或15**(mod為取余),你就是在區塊的邊緣上了。
除了這個方法以外, 你還可以按下F3 + G, 這會顯示區塊邊緣, 再按一次F3 + G就能關閉。
## 出生區塊(Spawn chunk)
出生區塊大部分情況下也會被加載。如果那區塊的中心距離世界出生點距離小于等于128格,那么它就會被加載。所以一般加載范圍是16\*16個區塊,也有可能是17\*17(較少出現)
可以透過/setworldspawn指令來更改世界出生點,以更改出生區塊。然而需要知道的是,那個出生區塊更改出生區塊后需要玩家經過至少一次才會開始加載。
## 區塊加載、卸下(load, unload)
除了出生區塊以外,預設玩家附近21\*21的區塊會被加載(10個區塊的內圓半徑),然而這可以調整,內圓半徑可以從3(附近7\*7的區塊會被加載)到15(附近31\*31的區塊會被加載)。其他世界的區塊在沒有玩家存在時是不會被加載的。
當區塊不被加載,就不能在那個區塊放置方塊,那個區塊的一切都是處于暫停的狀態,并且那個區塊的實體會不存在,直至該區塊被加載(tp到那里的實體會等待一段時間才會被卸下)。
當區塊不符合加載的條件,它會等一段時間之后才會不被加載(卸下),而不是即時的,然而那時間也不是固定的,大概是幾秒左右,所以大約幾秒就需要用特殊的方法來加載區塊一次來避免它里面的東西不能正常使用。
### 常用區塊加載方法
+ `spreadplayers`命令
當需要加載目的區塊的時候就向該區塊中的一個坐標/spreadplayer,這樣便可以把目的區塊加載一段短時間。
這也是最常用的方法,因為這個并不需要先前讓那個區塊被加載才能使用,而且是最有彈性的,不會被坐標什么的局限。
然而如果需要長時間加載區塊,那么就不建議使用這個,因為可能會不穩定。(無論任何情況也不建議需要長久加載非出生區塊的區塊)
這個方法不需要得知目的地的絕對坐標, 然而目的地必須有方塊讓傳送的實體到達, 不然就會失敗。
+ 結構方塊
結構方塊放置結構時會短暫加載目標區塊一段時間,只需要弄一個非常大的結構文件放置一大堆空氣,然后放置到目標區塊,但設置"結構完整性"(integrity)為0.0,這樣就不會放置任何方塊,但也會加載目標區塊。
問題是這個方式需要在加載中的區塊使用(因為不能在被卸下的區塊放置方塊),與目標區域之間的距離難以確定,因此不常使用。