第六十四章 tp和teleport-深入地了解传送指令
我们在第九章中学习了tbr /指令的用法,让我们来复习一下:
『/tbr /
作用:将一个实体传送到另一个实体或者是坐标。
需要权限等级:Java-2,基岩-1
需要作弊:是
格式:
/tbr / [传送目标:目标选择器]<目的地实体:目标选择器>
这可以将选定的目标传送到另一个实体的位置,比如把张三传送到李四的位置。注意,目的地实体不能为多个,即你并不能将张三传送到李四和王五的位置(就算张三不止一个也不能这样干)。如果将传送目标省略,那么将会传送执行者自己(一般是你自己)。
/tbr / [传送目标:目标选择器]<一个地点:坐标>[<水平旋转角度><垂直旋转角度>]
这可以将选定的目标传送到一个指定的地点。』
看起来丝毫没有问题,游戏中也能用对吧?
但其实,tbr /并没有这么简单。正如我在第九章开头所说的:『这条指令深究起来很复杂』。现在,深究的时候到了。
在Minecraft中,传送指令并不只有tbr /,还有一个telebr /ort。这个telebr /ort虽然是tbr /的全称,但这两个指令在Minecraft Java 1.13版本更新之前有很大区别,直到1.13版本更新中两者才被统一,tbr /才正式作为指令telebr /ort的简写指令。
接下来,我们将会分两步走:先探究指令tbr /与telebr /ort在Minecraft1.13版本前的差异,然后再研究1.13版本赋予了这两者什么样的新内容。
——第一步:tbr /与telebr /ort在Minecraft Java1.13版本更新前的差异
相比tbr /指令,/telebr /ort指令虽然比tbr /更早加入,但很快就被tbr /取代,直到Minecraft1.10版本才被重新加入。在当时,看起来这个/telebr /ort的单词更长,更厉害,但实际上相比tbr /,这个玩意儿可以说是十分鸡肋。
怎么个鸡肋法呢?来看看/telebr /ort的介绍,你就知道了。
/telebr /ort(JE1.13更新前)
作用:同/tbr /,传送实体至一个指定的地点
需要权限等级:JE-2 BE-1
需要作弊:是
格式:
/telebr /ort <传送目标:目标选择器><目的地:坐标>[<水平旋转角度><垂直旋转角度>]
你对比对比一下楼上的tbr /指令,就会发现telebr /ort的功能比tbr /还要少,仅仅只能将目标传送到一个指定的位置。而且这样的格式tbr /也有一模一样的,根本就不需要telebr /ort啊!
所以这就是tbr /与telebr /ort的区别,我们下一章再见。
……
……
……
……
……
……
你以为Mojang真的这么傻吗,添加一个完全可以被替代的指令,而且用起来还比那个指令还要麻烦?
其实,telebr /ort看起来简单,但实际上这只是它的冰山一角而已。
我们先不管telebr /ort。来回顾回顾我们当时学坐标的时候,我在章末写了如下内容:
『相对坐标的原点实际是因指令而异的,在大部分情况下原点即是指令执行的位置,但也有特殊的情况,如Java1.13版本之前的/tbr /指令。』
唉,这个/tbr /怎么就特殊了呢?
我在第九章有举一个例子:/tbr / @br / ~~~ 90 0
当时,我举这个例子是用来说明旋转角度的使用,并给出了如下解释:
『这将会使最近的玩家朝向正西而不改变其位置。』
重点来了!如果tbr /的相对坐标是采用指令执行的位置作为原点,那么当这条指令在命令方块里运行的时候,应该是会把这名玩家传送到命令方块的位置并让其朝向正西方向,而不是让他留在原地。而事实是他留在了原地,并没有被传过来。
这说明了什么?
这说明了,tbr /指令的相对坐标采用的是传送目标的位置作为原点,而非指令执行的位置。
那如果我们把tbr /换成telebr /ort呢?
运行/telebr /ort @br / ~~~ 90 0,然后你就会惊喜的发现,那名玩家不仅仅再次朝向了正西,还跑到了命令方块那里!
这就是telebr /ort与tbr /最大的区别。当然,在现在的基岩版和最新的Java版中,tbr /也已经变成以指令执行的位置作为相对坐标的原点了,所以如果你在基岩版或最新的Java版运行上述两个指令,将会得到一模一样的结果。
但别忘了,除了相对坐标,还有相对旋转角度呢!让我们来看看我在第九章举的另一个例子:
『/tbr / @br / ~~~~-30 ~1
假设这@br /选中的还是上面那位被迫朝向正西的玩家,那么这条指令将会使他朝向南偏西60°,头微微朝下1°。』
不难发现,tbr /的相对旋转角度也是基于传送目标的相对角度。那么telebr /ort呢?
假设这里有一只猪,我们对它使用如下指令:
/telebr /ort @e[c=1,tybr /e=br /ig]~~~~-90 ~90
然后开启第三人称,运行这条指令。仔细观察这头猪,你就会发现这头猪在传送到你身上那一刻,身子和你成了90°角。
这说明了什么?这说明了,telebr /ort的相对旋转角度也是基于命令执行者的旋转角度,而不是基于传送目标的。
(但是这头猪的头并没有朝下看啊)
(因为猪的AI强迫它向前看,所以它在正常情况下无法朝下,只要你实验过就会发现这个问题)
现在我们来总结一下:
在JE1.13版本更新前,/tbr /和/telebr /ort的区别不仅仅是在格式上,还有相对坐标和相对旋转角度的区别。tbr /的相对坐标和相对旋转角度基于传送目标,而telebr /ort是基于命令执行者的。
所以JE1.13版本前的tbr /和telebr /ort算是彻底搞清楚了,接下来我们将看看新版的tbr /和telebr /ort究竟做了怎样的更新吧!
——第二步:新版本的tbr /与telebr /ort
正如在前面说的,JE1.13将tbr /和telebr /ort指令做了统一,tbr /成为了telebr /ort的别称。也就是说,在新版本,两者是完全一样的,而且相对坐标和相对旋转角度都统一成以指令执行地点和执行者的旋转角度为基准。
所以格式呢?如下:
/tbr /和/telebr /ort
作用:你知我知天下知。
需要权限等级:Java-2基岩-1
需要作弊:是
格式(telebr /ort可替换为tbr /):
——Java版1.13及之后
/telebr /ort [传送目标]<一个实体>——将选中的目标或执行者传送至指定实体的位置
/telebr /ort <一个位置>——将执行者传送至指定位置
/telebr /ort <传送目标><一个位置>[<水平旋转角度><垂直旋转角度>]——将选中的目标或执行者传送至指定位置
/telebr /ort <传送目标><一个位置> facing <朝向坐标>——将选中的目标传送至指定位置,并让其朝向另一个位置
/telebr /ort <传送目标><一个位置> facing entity <朝向实体>[朝向部位]——将选中的目标传送至指定的位置,并让其朝向一个实体
——基岩版
/telebr /ort [传送目标]<一个实体>[安全检查:布尔值]——将选中的目标或执行者传送至指定实体的位置
/telebr /ort [传送目标]<一个位置>[安全检查:布尔值]——将选中的目标或执行者传送至指定位置
/telebr /ort [传送目标]<一个位置>[<水平旋转角度><垂直旋转角度>][安全检查:布尔值]——将选中的目标或执行者自己传送至指定位置
/telebr /ort [传送目标]<一个位置> facing <朝向坐标>[安全检查:布尔值]——将选中的目标或执行者自己传送至指定位置,并让其朝向另一个位置
/telebr /ort [传送目标]<一个位置> facing <朝向实体>[安全检查:布尔值]——将选中的目标或执行者自己传送至指定位置,并让其朝向一个实体
看起来格式非常的多,但其实仔细看的话,相比我们之前学的,Mojang无非就添加了三个新功能:
①可以指定朝向的坐标或实体
②可以检查传送目的地的安全性(仅基岩版)
③未指定传送目标,也就是传送执行者自己到一个指定位置的时候,也可以更改旋转角度了(仅基岩版)。
其中,我们要讲解的是前两个。
首先,可以指定朝向的坐标或实体是一个非常重磅的功能,因为它十分有用。在本章的番外中,作者就利用了这个功能制造出了『我在这儿』的宇宙广播功能,只不过这个番外马上就要撤掉了,因为有些新东西要讲。
那么这个功能怎么用呢?
不很简单吗?你看了上面的作用简介估计就懂了一半了,所以我们直接上例子:
/tbr / @br / ~~~ facing ~~1 ~
这条指令相当于/tbr / @br / ~~~ 0 -90,最终都会让这名玩家朝天上看,但前者是让玩家直接朝着命令执行地点的上方看,后者则是通过修改这名玩家的垂直旋转角度使其向天上看。
还有一个例子:
/tbr / @br / ~~~ facing entity @e[limit=1,tybr /e=villager,sort=nearest]——Java
/tbr / @br / ~~~ facing @e[c=1,tybr /e=villager]——基岩
这条指令将会把最近的玩家传送至指令执行地点,并使其朝向最近的一名村民。
有趣的是,如果你运行/tbr / @s ~~~ facing entity @s,即让你朝向你自己,你将会发现不管你传送前的姿势多么奇怪,传送后你总会水平地朝向正东方向(JAVA)或正南方向(基岩版)。
相信你在看完上面两个例子已经会用facing了吧?基岩版中facing就这么个用法,但在Java版中还有一个参数:朝向部位
这个参数你可以填写两个东西:eyes或feet
填eyes,代表你要让传送目标完成传送后面朝对方的眼睛,填feet,则代表面朝对方的脚。默认是朝向对方的眼睛,但你也可以改成看脚。
比如:
/tbr / @s ~~~ facing entity @r feet
这将会让你随机看向某一个玩家的脚。
很简单吧。等等,不对,有些问题。
如果你确实按照上面的指令来,你就会发现你看到的并不是这位玩家的脚,而是和这位玩家的眼睛平视。
为什么?
如果你尝试将feet改成eyes,你就会发现你的视角竟然看向了这位玩家上方。
唉Mojang,你这是不是BUG啊?设置为看脚,却看向眼睛;设置为看眼睛,却看向眼睛的上方。
其实这不是BUG,而是跟这个tbr /指令有关。
tbr /指令,说是『将一个实体传送到另一个实体或者是坐标』。其实更加确切地说,是这样的:
将一个实体的脚部传送到另一个实体的脚部或者是一个指定的位置。
也就是说,tbr /指令在传送实体时,其实是传送这个实体的脚部。
为什么呢?想想,如果tbr /是传送你的眼睛,那么你传送过去,身体是不是要埋半截在土里啊?如果tbr /是将你的脚传送到另外一个实体的眼睛,那么你传过去,你的脚是不是要踩在那个实体头上啊?
所以Mojang为了使传送能够符合我们人的直觉,就将默认传送的部位设定为了脚。
因此,当tbr /的facing计算朝向的时候,也是以传送目标的脚的坐标(也就是你脚的坐标)来计算的。而如果你从你的脚看向对方的脚,是不是就是平视?看向对方的眼睛,是不是就要仰头?
并且,不管是基于眼睛还是基于脚来计算朝向,最终都会体现在玩家以及其他实体的头部(因为对于有人形的实体来说,头部的朝向决定了该实体的水平旋转角度和垂直旋转角度,而不是身体决定),所以就造成了上面奇怪的结果。
懂了吧?
第二个『安全检查』就更加简单了,你只需要选择是否开启即可(true或false)
如果开启安全检查,会发生什么呢?
其实这个安全检查很鸡肋,仅仅会检查传送目的地是否有足够的空间以防止你窒息,如果不会才会传送,但这并不能防止你掉进岩浆或摔死。
这些内容就是现在版本的tbr /和telebr /ort,简单吧?
那我们下一章再见。
………
………
………
………
虽说全部内容已经完了,但是还是有一些疑问以及一些注意事项。
上面说到过,在新版中,相对坐标和相对旋转角度都统一成以指令执行地点和执行者的旋转角度为基准。但是这句话并不严谨,因为在基岩版中,相对旋转角度还是以传送目标的原先旋转角度为基准来计算的。
有点乱啊,理一理:
JE1.13前,tbr /的相对坐标和相对旋转角度都以传送目标的为基准,而telebr /ort则反之。
JE1.13之后,tbr /和telebr /ort均采用指令执行地点和执行者为基准。
基岩版中,tbr /和telebr /ort的相对坐标均采用以指令执行地点为原点,但相对旋转角度却是以传送目标为基准。
理一理之后确实清楚了许多,但由此就有了一个新的问题:
当相对旋转角度以执行者的为基准时,如果执行者不是个实体而是方块该怎么办,比如命令方块?
其实部分方块也有朝向,但最多也就六个方向,东西南北上下而已。难不成当方块运行tbr /时,相对旋转角度会采用方块的朝向作为基准朝向?
想得太多了,方块虽然有朝向,但方块又不是实体。当诸如命令方块之类的方块运行指令时,甚至是函数这种连实体都没有的东西运行指令时,指令执行地点和朝向都是默认值,即(0,0,0)和水平朝向正南。
那么本章也就到此正式,真的结束了。