第六十四章 tp和teleport-深入地了解傳送指令
我們?cè)诘诰耪轮袑W(xué)習(xí)了tp指令的用法,讓我們來復(fù)習(xí)一下:
『/tp
作用:將一個(gè)實(shí)體傳送到另一個(gè)實(shí)體或者是坐標(biāo)。
需要權(quán)限等級(jí):Java-2,基巖-1
需要作弊:是
格式:
/tp [傳送目標(biāo):目標(biāo)選擇器]<目的地實(shí)體:目標(biāo)選擇器>
這可以將選定的目標(biāo)傳送到另一個(gè)實(shí)體的位置,比如把張三傳送到李四的位置。注意,目的地實(shí)體不能為多個(gè),即你并不能將張三傳送到李四和王五的位置(就算張三不止一個(gè)也不能這樣干)。如果將傳送目標(biāo)省略,那么將會(huì)傳送執(zhí)行者自己(一般是你自己)。
/tp [傳送目標(biāo):目標(biāo)選擇器]<一個(gè)地點(diǎn):坐標(biāo)>[<水平旋轉(zhuǎn)角度><垂直旋轉(zhuǎn)角度>]
這可以將選定的目標(biāo)傳送到一個(gè)指定的地點(diǎn)。』
看起來絲毫沒有問題,游戲中也能用對(duì)吧?
但其實(shí),tp并沒有這么簡(jiǎn)單。正如我在第九章開頭所說的:『這條指令深究起來很復(fù)雜』?,F(xiàn)在,深究的時(shí)候到了。
在Minecraft中,傳送指令并不只有tp,還有一個(gè)teleport。這個(gè)teleport雖然是tp的全稱,但這兩個(gè)指令在Minecraft Java 1.13版本更新之前有很大區(qū)別,直到1.13版本更新中兩者才被統(tǒng)一,tp才正式作為指令teleport的簡(jiǎn)寫指令。
接下來,我們將會(huì)分兩步走:先探究指令tp與teleport在Minecraft1.13版本前的差異,然后再研究1.13版本賦予了這兩者什么樣的新內(nèi)容。
——第一步:tp與teleport在Minecraft Java1.13版本更新前的差異
相比tp指令,/teleport指令雖然比tp更早加入,但很快就被tp取代,直到Minecraft1.10版本才被重新加入。在當(dāng)時(shí),看起來這個(gè)/teleport的單詞更長(zhǎng),更厲害,但實(shí)際上相比tp,這個(gè)玩意兒可以說是十分雞肋。
怎么個(gè)雞肋法呢?來看看/teleport的介紹,你就知道了。
/teleport(JE1.13更新前)
作用:同/tp,傳送實(shí)體至一個(gè)指定的地點(diǎn)
需要權(quán)限等級(jí):JE-2 BE-1
需要作弊:是
格式:
/teleport <傳送目標(biāo):目標(biāo)選擇器><目的地:坐標(biāo)>[<水平旋轉(zhuǎn)角度><垂直旋轉(zhuǎn)角度>]
你對(duì)比對(duì)比一下樓上的tp指令,就會(huì)發(fā)現(xiàn)teleport的功能比tp還要少,僅僅只能將目標(biāo)傳送到一個(gè)指定的位置。而且這樣的格式tp也有一模一樣的,根本就不需要teleport啊!
所以這就是tp與teleport的區(qū)別,我們下一章再見。
……
……
……
……
……
……
你以為Mojang真的這么傻嗎,添加一個(gè)完全可以被替代的指令,而且用起來還比那個(gè)指令還要麻煩?
其實(shí),teleport看起來簡(jiǎn)單,但實(shí)際上這只是它的冰山一角而已。
我們先不管teleport。來回顧回顧我們當(dāng)時(shí)學(xué)坐標(biāo)的時(shí)候,我在章末寫了如下內(nèi)容:
『相對(duì)坐標(biāo)的原點(diǎn)實(shí)際是因指令而異的,在大部分情況下原點(diǎn)即是指令執(zhí)行的位置,但也有特殊的情況,如Java1.13版本之前的/tp指令?!?p> 唉,這個(gè)/tp怎么就特殊了呢?
我在第九章有舉一個(gè)例子:/tp @p ~~~ 90 0
當(dāng)時(shí),我舉這個(gè)例子是用來說明旋轉(zhuǎn)角度的使用,并給出了如下解釋:
『這將會(huì)使最近的玩家朝向正西而不改變其位置。』
重點(diǎn)來了!如果tp的相對(duì)坐標(biāo)是采用指令執(zhí)行的位置作為原點(diǎn),那么當(dāng)這條指令在命令方塊里運(yùn)行的時(shí)候,應(yīng)該是會(huì)把這名玩家傳送到命令方塊的位置并讓其朝向正西方向,而不是讓他留在原地。而事實(shí)是他留在了原地,并沒有被傳過來。
這說明了什么?
這說明了,tp指令的相對(duì)坐標(biāo)采用的是傳送目標(biāo)的位置作為原點(diǎn),而非指令執(zhí)行的位置。
那如果我們把tp換成teleport呢?
運(yùn)行/teleport @p ~~~ 90 0,然后你就會(huì)驚喜的發(fā)現(xiàn),那名玩家不僅僅再次朝向了正西,還跑到了命令方塊那里!
這就是teleport與tp最大的區(qū)別。當(dāng)然,在現(xiàn)在的基巖版和最新的Java版中,tp也已經(jīng)變成以指令執(zhí)行的位置作為相對(duì)坐標(biāo)的原點(diǎn)了,所以如果你在基巖版或最新的Java版運(yùn)行上述兩個(gè)指令,將會(huì)得到一模一樣的結(jié)果。
但別忘了,除了相對(duì)坐標(biāo),還有相對(duì)旋轉(zhuǎn)角度呢!讓我們來看看我在第九章舉的另一個(gè)例子:
『/tp @p ~~~~-30 ~1
假設(shè)這@p選中的還是上面那位被迫朝向正西的玩家,那么這條指令將會(huì)使他朝向南偏西60°,頭微微朝下1°。』
不難發(fā)現(xiàn),tp的相對(duì)旋轉(zhuǎn)角度也是基于傳送目標(biāo)的相對(duì)角度。那么teleport呢?
假設(shè)這里有一只豬,我們對(duì)它使用如下指令:
/teleport @e[c=1,type=pig]~~~~-90 ~90
然后開啟第三人稱,運(yùn)行這條指令。仔細(xì)觀察這頭豬,你就會(huì)發(fā)現(xiàn)這頭豬在傳送到你身上那一刻,身子和你成了90°角。
這說明了什么?這說明了,teleport的相對(duì)旋轉(zhuǎn)角度也是基于命令執(zhí)行者的旋轉(zhuǎn)角度,而不是基于傳送目標(biāo)的。
?。ǖ沁@頭豬的頭并沒有朝下看啊)
?。ㄒ?yàn)樨i的AI強(qiáng)迫它向前看,所以它在正常情況下無法朝下,只要你實(shí)驗(yàn)過就會(huì)發(fā)現(xiàn)這個(gè)問題)
現(xiàn)在我們來總結(jié)一下:
在JE1.13版本更新前,/tp和/teleport的區(qū)別不僅僅是在格式上,還有相對(duì)坐標(biāo)和相對(duì)旋轉(zhuǎn)角度的區(qū)別。tp的相對(duì)坐標(biāo)和相對(duì)旋轉(zhuǎn)角度基于傳送目標(biāo),而teleport是基于命令執(zhí)行者的。
所以JE1.13版本前的tp和teleport算是徹底搞清楚了,接下來我們將看看新版的tp和teleport究竟做了怎樣的更新吧!
——第二步:新版本的tp與teleport
正如在前面說的,JE1.13將tp和teleport指令做了統(tǒng)一,tp成為了teleport的別稱。也就是說,在新版本,兩者是完全一樣的,而且相對(duì)坐標(biāo)和相對(duì)旋轉(zhuǎn)角度都統(tǒng)一成以指令執(zhí)行地點(diǎn)和執(zhí)行者的旋轉(zhuǎn)角度為基準(zhǔn)。
所以格式呢?如下:
/tp和/teleport
作用:你知我知天下知。
需要權(quán)限等級(jí):Java-2基巖-1
需要作弊:是
格式(teleport可替換為tp):
——Java版1.13及之后
/teleport [傳送目標(biāo)]<一個(gè)實(shí)體>——將選中的目標(biāo)或執(zhí)行者傳送至指定實(shí)體的位置
/teleport <一個(gè)位置>——將執(zhí)行者傳送至指定位置
/teleport <傳送目標(biāo)><一個(gè)位置>[<水平旋轉(zhuǎn)角度><垂直旋轉(zhuǎn)角度>]——將選中的目標(biāo)或執(zhí)行者傳送至指定位置
/teleport <傳送目標(biāo)><一個(gè)位置> facing <朝向坐標(biāo)>——將選中的目標(biāo)傳送至指定位置,并讓其朝向另一個(gè)位置
/teleport <傳送目標(biāo)><一個(gè)位置> facing entity <朝向?qū)嶓w>[朝向部位]——將選中的目標(biāo)傳送至指定的位置,并讓其朝向一個(gè)實(shí)體
——基巖版
/teleport [傳送目標(biāo)]<一個(gè)實(shí)體>[安全檢查:布爾值]——將選中的目標(biāo)或執(zhí)行者傳送至指定實(shí)體的位置
/teleport [傳送目標(biāo)]<一個(gè)位置>[安全檢查:布爾值]——將選中的目標(biāo)或執(zhí)行者傳送至指定位置
/teleport [傳送目標(biāo)]<一個(gè)位置>[<水平旋轉(zhuǎn)角度><垂直旋轉(zhuǎn)角度>][安全檢查:布爾值]——將選中的目標(biāo)或執(zhí)行者自己傳送至指定位置
/teleport [傳送目標(biāo)]<一個(gè)位置> facing <朝向坐標(biāo)>[安全檢查:布爾值]——將選中的目標(biāo)或執(zhí)行者自己傳送至指定位置,并讓其朝向另一個(gè)位置
/teleport [傳送目標(biāo)]<一個(gè)位置> facing <朝向?qū)嶓w>[安全檢查:布爾值]——將選中的目標(biāo)或執(zhí)行者自己傳送至指定位置,并讓其朝向一個(gè)實(shí)體
看起來格式非常的多,但其實(shí)仔細(xì)看的話,相比我們之前學(xué)的,Mojang無非就添加了三個(gè)新功能:
①可以指定朝向的坐標(biāo)或?qū)嶓w
?、诳梢詸z查傳送目的地的安全性(僅基巖版)
③未指定傳送目標(biāo),也就是傳送執(zhí)行者自己到一個(gè)指定位置的時(shí)候,也可以更改旋轉(zhuǎn)角度了(僅基巖版)。
其中,我們要講解的是前兩個(gè)。
首先,可以指定朝向的坐標(biāo)或?qū)嶓w是一個(gè)非常重磅的功能,因?yàn)樗钟杏谩T诒菊碌姆庵?,作者就利用了這個(gè)功能制造出了『我在這兒』的宇宙廣播功能,只不過這個(gè)番外馬上就要撤掉了,因?yàn)橛行┬聳|西要講。
那么這個(gè)功能怎么用呢?
不很簡(jiǎn)單嗎?你看了上面的作用簡(jiǎn)介估計(jì)就懂了一半了,所以我們直接上例子:
/tp @p ~~~ facing ~~1 ~
這條指令相當(dāng)于/tp @p ~~~ 0 -90,最終都會(huì)讓這名玩家朝天上看,但前者是讓玩家直接朝著命令執(zhí)行地點(diǎn)的上方看,后者則是通過修改這名玩家的垂直旋轉(zhuǎn)角度使其向天上看。
還有一個(gè)例子:
/tp @p ~~~ facing entity @e[limit=1,type=villager,sort=nearest]——Java
/tp @p ~~~ facing @e[c=1,type=villager]——基巖
這條指令將會(huì)把最近的玩家傳送至指令執(zhí)行地點(diǎn),并使其朝向最近的一名村民。
有趣的是,如果你運(yùn)行/tp @s ~~~ facing entity @s,即讓你朝向你自己,你將會(huì)發(fā)現(xiàn)不管你傳送前的姿勢(shì)多么奇怪,傳送后你總會(huì)水平地朝向正東方向(JAVA)或正南方向(基巖版)。
相信你在看完上面兩個(gè)例子已經(jīng)會(huì)用facing了吧?基巖版中facing就這么個(gè)用法,但在Java版中還有一個(gè)參數(shù):朝向部位
這個(gè)參數(shù)你可以填寫兩個(gè)東西:eyes或feet
填eyes,代表你要讓傳送目標(biāo)完成傳送后面朝對(duì)方的眼睛,填feet,則代表面朝對(duì)方的腳。默認(rèn)是朝向?qū)Ψ降难劬?,但你也可以改成看腳。
比如:
/tp @s ~~~ facing entity @r feet
這將會(huì)讓你隨機(jī)看向某一個(gè)玩家的腳。
很簡(jiǎn)單吧。等等,不對(duì),有些問題。
如果你確實(shí)按照上面的指令來,你就會(huì)發(fā)現(xiàn)你看到的并不是這位玩家的腳,而是和這位玩家的眼睛平視。
為什么?
如果你嘗試將feet改成eyes,你就會(huì)發(fā)現(xiàn)你的視角竟然看向了這位玩家上方。
唉Mojang,你這是不是BUG?。吭O(shè)置為看腳,卻看向眼睛;設(shè)置為看眼睛,卻看向眼睛的上方。
其實(shí)這不是BUG,而是跟這個(gè)tp指令有關(guān)。
tp指令,說是『將一個(gè)實(shí)體傳送到另一個(gè)實(shí)體或者是坐標(biāo)』。其實(shí)更加確切地說,是這樣的:
將一個(gè)實(shí)體的腳部傳送到另一個(gè)實(shí)體的腳部或者是一個(gè)指定的位置。
也就是說,tp指令在傳送實(shí)體時(shí),其實(shí)是傳送這個(gè)實(shí)體的腳部。
為什么呢?想想,如果tp是傳送你的眼睛,那么你傳送過去,身體是不是要埋半截在土里???如果tp是將你的腳傳送到另外一個(gè)實(shí)體的眼睛,那么你傳過去,你的腳是不是要踩在那個(gè)實(shí)體頭上?。?p> 所以Mojang為了使傳送能夠符合我們?nèi)说闹庇X,就將默認(rèn)傳送的部位設(shè)定為了腳。
因此,當(dāng)tp的facing計(jì)算朝向的時(shí)候,也是以傳送目標(biāo)的腳的坐標(biāo)(也就是你腳的坐標(biāo))來計(jì)算的。而如果你從你的腳看向?qū)Ψ降哪_,是不是就是平視?看向?qū)Ψ降难劬?,是不是就要仰頭?
并且,不管是基于眼睛還是基于腳來計(jì)算朝向,最終都會(huì)體現(xiàn)在玩家以及其他實(shí)體的頭部(因?yàn)閷?duì)于有人形的實(shí)體來說,頭部的朝向決定了該實(shí)體的水平旋轉(zhuǎn)角度和垂直旋轉(zhuǎn)角度,而不是身體決定),所以就造成了上面奇怪的結(jié)果。
懂了吧?
第二個(gè)『安全檢查』就更加簡(jiǎn)單了,你只需要選擇是否開啟即可(true或false)
如果開啟安全檢查,會(huì)發(fā)生什么呢?
其實(shí)這個(gè)安全檢查很雞肋,僅僅會(huì)檢查傳送目的地是否有足夠的空間以防止你窒息,如果不會(huì)才會(huì)傳送,但這并不能防止你掉進(jìn)巖漿或摔死。
這些內(nèi)容就是現(xiàn)在版本的tp和teleport,簡(jiǎn)單吧?
那我們下一章再見。
………
………
………
………
雖說全部?jī)?nèi)容已經(jīng)完了,但是還是有一些疑問以及一些注意事項(xiàng)。
上面說到過,在新版中,相對(duì)坐標(biāo)和相對(duì)旋轉(zhuǎn)角度都統(tǒng)一成以指令執(zhí)行地點(diǎn)和執(zhí)行者的旋轉(zhuǎn)角度為基準(zhǔn)。但是這句話并不嚴(yán)謹(jǐn),因?yàn)樵诨鶐r版中,相對(duì)旋轉(zhuǎn)角度還是以傳送目標(biāo)的原先旋轉(zhuǎn)角度為基準(zhǔn)來計(jì)算的。
有點(diǎn)亂啊,理一理:
JE1.13前,tp的相對(duì)坐標(biāo)和相對(duì)旋轉(zhuǎn)角度都以傳送目標(biāo)的為基準(zhǔn),而teleport則反之。
JE1.13之后,tp和teleport均采用指令執(zhí)行地點(diǎn)和執(zhí)行者為基準(zhǔn)。
基巖版中,tp和teleport的相對(duì)坐標(biāo)均采用以指令執(zhí)行地點(diǎn)為原點(diǎn),但相對(duì)旋轉(zhuǎn)角度卻是以傳送目標(biāo)為基準(zhǔn)。
理一理之后確實(shí)清楚了許多,但由此就有了一個(gè)新的問題:
當(dāng)相對(duì)旋轉(zhuǎn)角度以執(zhí)行者的為基準(zhǔn)時(shí),如果執(zhí)行者不是個(gè)實(shí)體而是方塊該怎么辦,比如命令方塊?
其實(shí)部分方塊也有朝向,但最多也就六個(gè)方向,東西南北上下而已。難不成當(dāng)方塊運(yùn)行tp時(shí),相對(duì)旋轉(zhuǎn)角度會(huì)采用方塊的朝向作為基準(zhǔn)朝向?
想得太多了,方塊雖然有朝向,但方塊又不是實(shí)體。當(dāng)諸如命令方塊之類的方塊運(yùn)行指令時(shí),甚至是函數(shù)這種連實(shí)體都沒有的東西運(yùn)行指令時(shí),指令執(zhí)行地點(diǎn)和朝向都是默認(rèn)值,即(0,0,0)和水平朝向正南。
那么本章也就到此正式,真的結(jié)束了。