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