第八十九章 ride-騎乘
(該章節(jié)已于2022年7月25日重寫,原章節(jié)為『戰(zhàn)利品表(戰(zhàn)利品表下)(/loot 下)』)
我們知道,在Minecraft中,玩家可以騎上馬,骷髏可以騎上蜘蛛,僵尸可以騎上雞......但不管怎樣,我們都很難使用指令來控制實體的騎乘狀態(tài)。在Java版這尚且可以通過NBT做到,但在基巖版呢?基巖版可用不了NBT。
好消息是,基巖版雖然用不了NBT,但Mojang卻給了我們一條指令:
/ride
作用:控制實體騎乘
存在版本:基巖版1.16.100-今
需要權(quán)限等級:基巖版-1
需要作弊:是
格式:
/ride <騎手實體>...
... start_riding <坐騎實體>[傳送模式][騎乘建立要求]
\\使得指定的騎手騎在指定的坐騎上\\
... stop_riding
\\使得指定的騎手停止騎乘\\
... summon_ride <實體ID>[召喚要求][生成事件][實體名稱]
\\給騎手召喚一個坐騎,讓騎手騎上去\\
/ride <坐騎實體>...
... evict_riders
\\使得指定的坐騎逐出它們的騎手\\
... summon_rider <實體ID>[生成事件][實體名稱]
\\給坐騎召喚一個騎手,讓召喚出來的騎手騎在坐騎上\\
通過/ride指令,你可以指定實體騎或被騎在某些實體身上。讓我們來試一試:
/ride @s start_riding @r[type=horse]
這條指令將會使你隨機騎在某一匹馬的身上。等等,@r不是用來隨機選擇玩家的嗎,怎么能夠拿來隨機選擇馬?
@r確實是用來隨機選擇玩家的,但在除了Java1.13及以上版本之外,其他版本的@r都可以通過指定type參數(shù)來具體隨機指定種類的實體。在上面的例子中,由于我們指定了type參數(shù)為馬,所以@r[type=horse]在這邊就是隨機選擇一匹馬。
運行上述指令后,你雖然騎在了馬身上,但同時也被傳送了,畢竟游戲總不可能讓你隔空騎馬吧?但有時候可能你并不想被傳走,而是想讓那匹馬自己過來,這時候該怎么辦?
指定『傳送模式』參數(shù)。這個參數(shù)可以填寫兩個值:
teleport_ride——將坐騎傳送至騎手
teleport_rider——將騎手傳送至坐騎(默認)
舉個例子:
/ride @s start_riding @r[type=horse] teleport_ride
這條指令將會隨機一匹馬傳送到你下面,然后讓你騎在它的身上。
『騎乘建立要求』這個參數(shù)適用于當你指定多個騎手時的情況,它可以填寫兩個值:
if_group_fits——當所有騎手都滿足騎乘要求時才會建立騎乘關系
until_full——給每一個滿足騎乘要求的騎手建立騎乘關系(默認)
舉個例子:
/ride @e start_riding @r[type=chicken] teleport_rider if_group_fits
/ride @e start_riding @r[type=chicken] teleport_rider until_full
假設現(xiàn)在有三個實體:你自己、一只成年僵尸、一只雞。運行第一條指令,將不會發(fā)生什么,因為你不可能騎在雞上面,雞也不能騎在自己上面,@e選中的三個騎手中有兩個不滿足要求,自然僵尸也不會騎上去。運行第二條指令,僵尸就會騎到雞的上面,因為雖然你和雞都不滿足要求,但僵尸滿足了要求,自然就和雞建立起了騎乘關系。(你干嘛~哎喲)
這個僵尸還有用,讓我們把它從雞上弄下來:
/ride @e[type=zombie] stop_riding
summon_ride子命令可以直接生成一個實體作為坐騎,當然,如果騎手不符合被生成實體的騎乘要求,那么實體即使被召喚出來也不會被騎乘,僅僅只會單純生成出來。還是以剛才的條件,舉個例子:
/ride @e[type=zombie] summon_ride minecraft:boat
這將會給那位僵尸生成一艘船,然后讓它坐進去。
『召喚要求』參數(shù)可以填寫三個值:
skip_riders ——僅僅為沒有坐騎的騎手召喚坐騎
no_ride_change ——僅僅為沒有坐騎且也沒有被騎乘的騎手召喚坐騎
reassign_rides——為所有騎手召喚坐騎(默認)
舉些例子:
/ride @e summon_ride minecraft:boat skip_riders
/ride @e summon_ride minecraft:boat no_ride_change
/ride @e summon_ride minecraft:boat reassign_rides
還是以上面的情況為條件。如果我們運行了第一條指令,游戲?qū)L試給玩家(你自己)、雞和船召喚坐騎,僵尸由于已經(jīng)有一個船作為坐騎所以不會嘗試召喚。
如果我們運行第二條指令,游戲?qū)H給玩家和雞召喚船作為坐騎。僵尸由于已經(jīng)有坐騎、船由于被僵尸騎乘,所以兩者都不會嘗試召喚坐騎。
如果我們運行第三條指令,游戲?qū)o所有實體都嘗試召喚坐騎。
當然,不管你運行的是上面哪條指令,最終結(jié)果都是你和雞會坐上船,僵尸和僵尸的船不會發(fā)生變化。因為僵尸已經(jīng)有一個船作為坐騎,再召喚的話,僵尸的新坐騎必定會插入到僵尸和船之間,騎著船也被僵尸騎,也就是得滿足兩個實體的騎乘要求。而船肯定不會被船騎乘,也不會騎著一個船,所以僵尸和船都不會發(fā)生變化。
evict_riders子命令可以使坐騎趕走自己的騎手:
/ride @e evict_riders
這將會使得所有實體趕走自己的騎手,也就是讓你、雞和僵尸都從船上下來。然后你就可以把船回收一下。
summon_rider子命令可以為一個坐騎生成騎手,舉個例子:
/ride @e[type=zombie] summon_rider minecraft:zombie
仍然以上面的情況為條件,這條指令將會給那只僵尸生成一只新的僵尸,然后讓新的僵尸騎在老的僵尸上面。
值得注意的是,由于成年僵尸也可以像幼年僵尸一樣騎在成年僵尸上,這就給了我們一條途徑在基巖版弄疊羅漢:
/ride @e[type =zombie] summon_rider zombie minecraft:as_adult
這將會給讓所有僵尸嘗試生成一個新的成年僵尸作為自己的騎手,然后.......你重復運行下試試?
這就是/ride指令的基本用法,也就是本章的全部內(nèi)容。
附表:/ride歷史
基巖版
1.16.100——加入了/ride
......
......
......
......
......
......
......
......
......
自然生成的僵尸,有5%的概率生成出一只幼年僵尸。幼年僵尸不可被成年僵尸騎乘,因此當指令『/ride @e[type=zombie] summon_ride zombie』在目標選擇器『@e[type=zombie]』只選擇到一個僵尸的情況下生成出一只幼年僵尸時,指令將執(zhí)行失敗,返回的成功次數(shù)為0。
也就是說,上述指令有5%的概率執(zhí)行失敗。我們可以造一個命令模塊驗證一下這5%的概率:
?。ㄖ噶畎姹荆夯鶐r版1.19,未開啟實驗性功能)
A→B→C→D→E→F→G→
A[重][無][紅]······ride @e[type=zombie,name=a] summon_ride zombie reassign_rides minecraft:entity_spawned
B[鏈][限][始]······scoreboard players add count test 1
C[鏈][無][始]······ride @e[type=zombie,name=a] stop_riding
D[鏈][無][始]······execute @e[type=zombie,name=a]~~~ kill @e[type=zombie,r=6,name=!a]
E[鏈][無][始]·······execute @e[type=zombie,name=a]~~~ kill @e[type=item]
F[鏈][無][始]·······scoreboard players add times test 1
G[鏈][無][始]······tp @e[type=zombie,name=a]-16 -60 0
\\圖例\\
[重]重復;[無]無條件;[紅]需要紅石;[脈]脈沖;[限]有條件的;[始]始終活動;[鏈]連鎖
\\使用到的計分項\\
test
\\使用到的變量\\
count(指令成功次數(shù))、times(指令執(zhí)行次數(shù))
上面的模塊會不斷重復執(zhí)行『ride @e[type=zombie,name=a] summon_ride zombie reassign_rides minecraft:entity_spawned』這條指令,并計算出指令的成功次數(shù)和執(zhí)行次數(shù)。經(jīng)過運行,加上一點兒人工計算,就可以得到以下數(shù)據(jù):
執(zhí)行1784次,成功1699次,差值85,失敗概率約4.76%
執(zhí)行10000次,成功9488次,差值512,失敗概率約5.12%
可見,概率差不多就是5%。
為什么我要提這東西呢?
/ride作為一個使得玩家能夠控制實體騎乘的指令,竟然能夠因為這個特性而用于概率計算中,挺令人驚訝的是不是?但其實,不管是對于指令還是隔壁紅石來說,能夠巧妙運用游戲本身的特性,就是進階玩家的基本要求。/ride只是一個例子,像這樣的例子還有很多。特別是在基巖版,由于指令自由度沒有Java版高,這迫使得許多基巖版的指令玩家大顯神通,通過許多看起來十分取巧的方法實現(xiàn)許多看似不可能實現(xiàn)的功能,這邊舉幾個例子:
?、偻ㄟ^玩家攻擊隱形盔甲架來實現(xiàn)點擊牌子、點擊村民NPC的效果
?、谕ㄟ^tell指令能夠使用目標選擇器的特性,在tell指令中塞入大量的@e目標選擇器并發(fā)送給指定玩家,來使得指定玩家游戲卡死以實現(xiàn)封禁的效果
③在Java1.13版本前,由于沒有能夠讀取NBT數(shù)據(jù)的指令,因此當時普遍的方法是通過選取具有特定NBT標簽值的實體并給予指定標簽或分數(shù),并使用窮舉的方法來實現(xiàn)讀取NBT數(shù)據(jù)的功能
?、芡ㄟ^testforblocks指令比較命令方塊,來實現(xiàn)檢測物品和玩家名是否一致
所以,有時候當你想實現(xiàn)一個功能時卻不知道怎么實現(xiàn),不妨放開腦洞,想一想一些指令的特性,或許你就有了思路!
本章到此完全為止。