第四十九章 目標選擇器中的記分板
網(wǎng)易我的世界手機版中,有一個租貸服在循環(huán)發(fā)布的服務器公告上寫著如下信息:
你知道嗎,在XXX服中,花費金幣總量超過一定數(shù)額可以解鎖更多特權!
花費金幣總量超過5000,開放資源區(qū)②區(qū)
花費金幣總量超過2萬,開放跑酷地圖-大日御輿
花費金幣總量超過5萬,開放主城-雙料高級商店
......
更多相關信息請到主城大廳處查看
從指令方面研究這個信息,我們可以想到至少兩種判定玩家是否擁有指定特權的方法:
?、賱?chuàng)建一個專門記錄消費的計分項,每次玩家成功消費均增加該玩家在這個計分項上的分數(shù)。判定玩家是否擁有權限時都使用test子命令。
?、趧?chuàng)建一個專門記錄消費的計分項,每次玩家成功消費均增加該玩家在這個計分項上的分數(shù)。準備一個重復執(zhí)行的命令方塊,每隔一段時間(或是在玩家消費完后檢測一遍)給達到條件者添加特殊的tag標簽。判定玩家是否擁有權限時,就根據(jù)該玩家是否擁有指定的標簽來判定。
不管是第一種還是第二種方法,我們都是使用test子命令來判斷玩家的分數(shù)是否達到了范圍內。這樣做明顯效率會比較低下,而且不適用于Java1.13更新后的版本。
而且,在第二種方法中,我們該如何判斷一個玩家是否擁有指定標簽呢?難不成用remove試著刪除一下,看看能否成功并輸出紅石信號激活接下來的命令方塊?
這兩個技術問題其實很好解決:使用目標選擇器中的記分板相關參數(shù)。
在目標選擇器中,檢測目標在指定計分項上的分數(shù)是否滿足條件的參數(shù)是score(Java1.13更新之前)和scores(Java1.13更新后和基巖版)。
雖然兩者僅僅差一個“s”,但用法大徑相庭。
先來說說Java1.13更新之前的score參數(shù)。這個score參數(shù)的用法如下:
score_<計分項名稱>=<最大值>
score_<計分項名稱>_min=<最小值>
和許多其他Java1.13更新前的參數(shù)類似(如r和rm,范圍最大值和范圍最小值),score參數(shù)也被分成了max和min兩個細分參數(shù)。舉個簡單的例子:
/give @a[score_coin=20,score_coin_min=15] diamond
這條指令的意思是:給予所有在coin計分項上的分數(shù)滿足大于等于15并小于等于20的在線玩家一顆鉆石。如果運行這條指令時,當前服務器有五個在線玩家:老張(coin為1)、老李(coin為15)、老黃(coin為18)、老劉(coin為20)和老鄧(coin為27)。那么在運行這條指令之后,老李、老黃還有老劉將會得到一顆鉆石,但是老鄧和老張不會得到。
現(xiàn)在你明白如何使用score參數(shù)了吧?
再來說說scores參數(shù)。該參數(shù)和Java1.13更新后的許多參數(shù)類似(如distance,采用典型的“兩點區(qū)間法”以確定值范圍)。其格式如下:
scores={計分項A=值或范圍,計分項B=值或范圍......}
其中的“值或范圍”,我們已經很熟悉了:
0..——大于等于5
..2 ——小于等于2
0..2 ——大于等于5且小于等于2
1 ——等于1
舉個例子:
/tag @a[scores={gamepoint=150..,killnumber=20..,dienumber=0..3}] add gold
這條指令的作用是:尋找gamepoint分數(shù)大于等于150,killnumber分數(shù)大于等于20且dienumber的分數(shù)大于等于0且小于等于3的所有玩家,給他們添加“gold”標簽。
現(xiàn)在你也會用scores參數(shù)了吧?是不是很簡單?
當然,目標選擇器中的記分板相關參數(shù)不止這兩個,還有另外兩個參數(shù):
team(隊伍)和tag(標簽)。
這兩個的使用就更簡單了。和type還有name參數(shù)類似,它們的格式是:
team=<隊伍名>——選取屬于指定隊伍的目標
team=!<隊伍名>——選取不屬于指定隊伍的目標
tag=<標簽>——選取擁有指定標簽的目標
tag=!<標簽>——選取沒有擁有指定標簽的目標
舉個例子:
/tp @a[team=yellow,tag=skywarplayer]@e[type=armor_stand,name=yellowplace,limit=1,sort=nearest]
這條指令的作用是:尋找屬于隊伍yellow且持有skywarplayer標簽的所有玩家,并將他們傳送到距離執(zhí)行地點最近的叫做yellowplace的盔甲架處。
需要注意一點。在一個目標選擇器中,只能有一個“team=指定隊伍”。原因相信你是知道的:一個玩家或非玩家在同一時間同一存檔的情況下最多只能在一個隊伍中。因此,Minecraft中是不會出現(xiàn)一個玩家同時在兩個隊伍中的情況。如果出現(xiàn)了,那就是Bug(特性)!
team、tag兩個參數(shù)和type、name兩個參數(shù)類似,但是也只是類似。由于隊伍功能和標簽功能的特殊性,并不是所有實體和玩家必須要屬于一個隊伍或掛著一個標簽。那么如何選取那些不屬于任何隊伍或者是沒有任何標簽的玩家、實體呢?更進一步的話,如何選取所有有隊伍歸屬或者是有標簽的玩家、實體呢?
其實很簡單。team和tag參數(shù)還有兩個特殊格式:
team=——選取所有無隊伍歸屬的目標
team=!——選取所有有隊伍歸屬的目標
tag=——選取所有沒有標簽的目標
tag=!——選取所有有任意標簽的目標
是不是很特殊?我們來嘗試用一用:
/spawnpoint @a[team=]~~~
這條指令的作用是:選取所有無隊伍歸屬的玩家,并將他們的出生點設置在指令執(zhí)行處。
這就是記分板的所有基礎內容了。本卷也到此結束。