(该章节已于2022年7月25日重写,原章节为『战利品表(战利品表下)(\/loot 下)』)
我们知道,在minecraft中,玩家可以骑上马,骷髅可以骑上蜘蛛,僵尸可以骑上鸡......但不管怎样,我们都很难使用指令来控制实体的骑乘状态。在java版这尚且可以通过nbt做到,但在基岩版呢?基岩版可用不了nbt。
好消息是,基岩版虽然用不了nbt,但mojang却给了我们一条指令:
\/ride
作用:控制实体骑乘
存在版本:基岩版1.16.100-今
需要权限等级:基岩版-1
需要作弊:是
格式:
\/ride <骑手实体>...
... start_riding <坐骑实体>[传送模式][骑乘建立要求]
\\\\使得指定的骑手骑在指定的坐骑上\\\\
... stop_riding
\\\\使得指定的骑手停止骑乘\\\\
... summon_ride <实体id>[召唤要求][生成事件][实体名称]
\\\\给骑手召唤一个坐骑,让骑手骑上去\\\\
\/ride <坐骑实体>...
... evict_riders
\\\\使得指定的坐骑逐出它们的骑手\\\\
... summon_rider <实体id>[生成事件][实体名称]
\\\\给坐骑召唤一个骑手,让召唤出来的骑手骑在坐骑上\\\\
通过\/ride指令,你可以指定实体骑或被骑在某些实体身上。让我们来试一试:
\/ride start_riding [type=horse]zuqi.org 葡萄小说网
这条指令将会使你随机骑在某一匹马的身上。等等,不是用来随机选择玩家的吗,怎么能够拿来随机选择马?
确实是用来随机选择玩家的,但在除了及以上版本之外,其他版本的都可以通过指定type参数来具体随机指定种类的实体。在上面的例子中,由于我们指定了type参数为马,所以[type=horse]在这边就是随机选择一匹马。
运行上述指令后,你虽然骑在了马身上,但同时也被传送了,毕竟游戏总不可能让你隔空骑马吧?但有时候可能你并不想被传走,而是想让那匹马自己过来,这时候该怎么办?
指定『传送模式』参数。这个参数可以填写两个值:
teleport_ride——将坐骑传送至骑手
teleport_rider——将骑手传送至坐骑(默认)
举个例子:
\/ride start_riding [type=horse] teleport_ride
这条指令将会随机一匹马传送到你下面,然后让你骑在它的身上。
『骑乘建立要求』这个参数适用于当你指定多个骑手时的情况,它可以填写两个值:
if_group_fits——当所有骑手都满足骑乘要求时才会建立骑乘关系
until_full——给每一个满足骑乘要求的骑手建立骑乘关系(默认)
举个例子:
\/ride start_riding [type=chicken] teleport_rider if_group_fits
\/ride start_riding [type=chicken] teleport_rider until_full
假设现在有三个实体:你自己、一只成年僵尸、一只鸡。运行第一条指令,将不会发生什么,因为你不可能骑在鸡上面,鸡也不能骑在自己上面,选中的三个骑手中有两个不满足要求,自然僵尸也不会骑上去。运行第二条指令,僵尸就会骑到鸡的上面,因为虽然你和鸡都不满足要求,但僵尸满足了要求,自然就和鸡建立起了骑乘关系。(你干嘛~哎哟)
这个僵尸还有用,让我们把它从鸡上弄下来:
\/ride [type=zombie] stop_riding
summon_ride子命令可以直接生成一个实体作为坐骑,当然,如果骑手不符合被生成实体的骑乘要求,那么实体即使被召唤出来也不会被骑乘,仅仅只会单纯生成出来。还是以刚才的条件,举个例子:
\/ride [type=zombie] summon_ride minecraft:boat
这将会给那位僵尸生成一艘船,然后让它坐进去。
『召唤要求』参数可以填写三个值:
skip_riders ——仅仅为没有坐骑的骑手召唤坐骑
no_ride_change ——仅仅为没有坐骑且也没有被骑乘的骑手召唤坐骑
reassign_rides——为所有骑手召唤坐骑(默认)
举些例子:
\/ride summon_ride minecraft:boat skip_riders
\/ride summon_ride minecraft:boat no_ride_change
\/ride summon_ride minecraft:boat reassign_rides
还是以上面的情况为条件。如果我们运行了第一条指令,游戏将会尝试给玩家(你自己)、鸡和船召唤坐骑,僵尸由于已经有一个船作为坐骑所以不会尝试召唤。
如果我们运行第二条指令,游戏将会仅给玩家和鸡召唤船作为坐骑。僵尸由于已经有坐骑、船由于被僵尸骑乘,所以两者都不会尝试召唤坐骑。
如果我们运行第三条指令,游戏将会给所有实体都尝试召唤坐骑。
当然,不管你运行的是上面哪条指令,最终结果都是你和鸡会坐上船,僵尸和僵尸的船不会发生变化。因为僵尸已经有一个船作为坐骑,再召唤的话,僵尸的新坐骑必定会插入到僵尸和船之间,骑着船也被僵尸骑,也就是得满足两个实体的骑乘要求。而船肯定不会被船骑乘,也不会骑着一个船,所以僵尸和船都不会发生变化。
evict_riders子命令可以使坐骑赶走自己的骑手:
\/ride evict_riders
这将会使得所有实体赶走自己的骑手,也就是让你、鸡和僵尸都从船上下来。然后你就可以把船回收一下。
summon_rider子命令可以为一个坐骑生成骑手,举个例子:
\/ride [type=zombie] summon_rider minecraft:zombie
仍然以上面的情况为条件,这条指令将会给那只僵尸生成一只新的僵尸,然后让新的僵尸骑在老的僵尸上面。
值得注意的是,由于成年僵尸也可以像幼年僵尸一样骑在成年僵尸上,这就给了我们一条途径在基岩版弄叠罗汉:
\/ride [type =zombie] summon_rider zombie minecraft:as_adult
这将会给让所有僵尸尝试生成一个新的成年僵尸作为自己的骑手,然后.......你重复运行下试试?
这就是\/ride指令的基本用法,也就是本章的全部内容。
附表:\/ride历史
基岩版
1.16.100——加入了\/ride
......
......
......
......
......
......
......
......
......
自然生成的僵尸,有5%的概率生成出一只幼年僵尸。幼年僵尸不可被成年僵尸骑乘,因此当指令『\/ride [type=zombie] summon_ride zombie』在目标选择器『[type=zombie]』只选择到一个僵尸的情况下生成出一只幼年僵尸时,指令将执行失败,返回的成功次数为0。
也就是说,上述指令有5%的概率执行失败。我们可以造一个命令模块验证一下这5%的概率:
(指令版本:基岩版1.19,未开启实验性功能)
a→b→c→d→e→f→g→
a[重][无][红]······ride [type=zombie,name=a] summon_ride zombie reassign_rides minecraft:entity_spawned
b[链][限][始]······scoreboard yers add count test 1
c[链][无][始]······ride [type=zombie,name=a] stop_riding
d[链][无][始]······execute [type=zombie,name=a]~~~ kill [type=zombie,r=6,name=!a]
e[链][无][始]·······execute [type=zombie,name=a]~~~ kill [type=item]
f[链][无][始]·······scoreboard yers add times test 1
g[链][无][始]······tp [type=zombie,name=a]-16 -60 0
\\\\图例\\\\
[重]重复;[无]无条件;[红]需要红石;[脉]脉冲;[限]有条件的;[始]始终活动;[链]连锁
\\\\使用到的计分项\\\\
test
\\\\使用到的变量\\\\
count(指令成功次数)、times(指令执行次数)
上面的模块会不断重复执行『ride [type=zombie,name=a] summon_ride zombie reassign_rides minecraft:entity_spawned』这条指令,并计算出指令的成功次数和执行次数。经过运行,加上一点儿人工计算,就可以得到以下数据:
执行1784次,成功1699次,差值85,失败概率约4.76%
执行次,成功9488次,差值512,失败概率约5.12%
可见,概率差不多就是5%。
为什么我要提这东西呢?
\/ride作为一个使得玩家能够控制实体骑乘的指令,竟然能够因为这个特性而用于概率计算中,挺令人惊讶的是不是?但其实,不管是对于指令还是隔壁红石来说,能够巧妙运用游戏本身的特性,就是进阶玩家的基本要求。\/ride只是一个例子,像这样的例子还有很多。特别是在基岩版,由于指令自由度没有java版高,这迫使得许多基岩版的指令玩家大显神通,通过许多看起来十分取巧的方法实现许多看似不可能实现的功能,这边举几个例子:
1通过玩家攻击隐形盔甲架来实现点击牌子、点击村民npc的效果
2通过tell指令能够使用目标选择器的特性,在tell指令中塞入大量的目标选择器并发送给指定玩家,来使得指定玩家游戏卡死以实现封禁的效果
3在版本前,由于没有能够读取nbt数据的指令,因此当时普遍的方法是通过选取具有特定nbt标签值的实体并给予指定标签或分数,并使用穷举的方法来实现读取nbt数据的功能
4通过testforblocks指令比较命令方块,来实现检测物品和玩家名是否一致
所以,有时候当你想实现一个功能时却不知道怎么实现,不妨放开脑洞,想一想一些指令的特性,或许你就有了思路!
本章到此完全为止。