第四十二章 players——管理變量(分?jǐn)?shù))
在上一章,我們了解了如何管理一個(gè)計(jì)分項(xiàng)。在一個(gè)計(jì)分項(xiàng)中存在有多個(gè)玩家(或非玩家),每個(gè)玩家(或非玩家)都有一個(gè)屬于自己的變量(分?jǐn)?shù))。那么我們?cè)撊绾喂芾磉@些變量(分?jǐn)?shù))呢?
這就需要用到scoreboard的players子命令,即/scoreboard players ...
/scoreboard players
作用:控制記分板上計(jì)分項(xiàng)的變量(分?jǐn)?shù))
格式:
/scoreboard players ...
... add <目標(biāo)選擇器><計(jì)分項(xiàng)><增加的分?jǐn)?shù)>[NBT(僅Java1.13之前)]——將所選玩家(或非玩家)在指定計(jì)分項(xiàng)中的分?jǐn)?shù)增加指定值
... remove <目標(biāo)選擇器><計(jì)分項(xiàng)><減少的分?jǐn)?shù)>[NBT(僅Java1.13之前)]——將所選玩家(或非玩家)在指定計(jì)分項(xiàng)中的分?jǐn)?shù)減少指定值
... set <目標(biāo)選擇器><計(jì)分項(xiàng)><分?jǐn)?shù)>[NBT(僅Java1.13之前))]——將所選玩家(或非玩家)在指定計(jì)分項(xiàng)中的分?jǐn)?shù)設(shè)置為指定值
... reset <目標(biāo)選擇器>[計(jì)分項(xiàng)]——將所選玩家(或非玩家)在記分板上的全部數(shù)據(jù)(或指定計(jì)分項(xiàng)上的數(shù)據(jù))完全清除(注意不是清零,而是清除)。目標(biāo)選擇器可用*代指所有玩家和非玩家。
... list [目標(biāo)選擇器]——列出所有正在被記分板追蹤的玩家(或非玩家)。如果指定了玩家(或非玩家),那么將會(huì)列出選取的玩家(或非玩家)們?cè)谟浄职迳系乃袛?shù)據(jù)。
... get <目標(biāo)選擇器><計(jì)分項(xiàng)>——[僅Java1.13及以上版本]獲取指定單個(gè)玩家(或非玩家)在指定計(jì)分項(xiàng)上的分?jǐn)?shù)
... test <目標(biāo)選擇器><計(jì)分項(xiàng)><最小值>[<最大值>]——[僅Java1.12.2及之前和基巖版]檢測(cè)所選玩家(或非玩家)在指定計(jì)分項(xiàng)的分?jǐn)?shù)是否大于等于最小值并且小于等于最大值。最小值和最大值均可使用*來(lái)代指-2147483648(最小值使用*)或2147483647(最大值使用*或不填)。
... operation <目標(biāo)選擇器1><運(yùn)算計(jì)分項(xiàng)1><操作><目標(biāo)選擇器2><運(yùn)算計(jì)分項(xiàng)2>——將目標(biāo)選擇器1參數(shù)中所選玩家(或非玩家)的指定計(jì)分項(xiàng)的分?jǐn)?shù)與目標(biāo)選擇器2參數(shù)中所選玩家(或非玩家)的指定計(jì)分項(xiàng)的分?jǐn)?shù)進(jìn)行一些操作
... enable <目標(biāo)選擇器><觸發(fā)器類計(jì)分項(xiàng)>——[僅Java版]允許所選玩家(或非玩家)對(duì)指定觸發(fā)器類計(jì)分項(xiàng)使用一次/trigger指令。
... random <目標(biāo)選擇器><計(jì)分項(xiàng)><最小值><最大值>——[僅基巖版]將所選玩家(或非玩家)的指定計(jì)分項(xiàng)分?jǐn)?shù)隨機(jī)設(shè)置為設(shè)定范圍內(nèi)的任何整數(shù)值。
通過(guò)players子命令,我們可以set(設(shè)置)、add(添加)、remove(刪除)、list(列出)、get(獲?。?、reset(重置)、operation(操作)、test(檢測(cè))、random(隨機(jī))和enable(觸發(fā)器)。這些東西的內(nèi)容很多,我們今天就只研究基本的,也就是上面我們提出的問(wèn)題:如何管理變量(分?jǐn)?shù))。
管理變量,就得先有變量,不然管理啥呢?我們知道,一個(gè)玩家(或非玩家)被一個(gè)計(jì)分項(xiàng)計(jì)入后最多只能有一個(gè)屬于自己的變量(分?jǐn)?shù))。而一個(gè)計(jì)分項(xiàng)創(chuàng)建之初是什么也沒有計(jì)入的,也就是說(shuō)這個(gè)計(jì)分項(xiàng)沒有一個(gè)變量,空空如也。
為了給這個(gè)計(jì)分項(xiàng)添加一個(gè)變量,也就是計(jì)入一個(gè)玩家(或非玩家),我們就需要用到add這個(gè)子命令:
... add <目標(biāo)選擇器><計(jì)分項(xiàng)><增加的分?jǐn)?shù)>[NBT(僅Java1.13之前)]
增加的分?jǐn)?shù)至少為0。當(dāng)然,就算為0,這也算是計(jì)入該計(jì)分項(xiàng)了。
實(shí)際上,使用remove、operation和set也可以達(dá)到同樣的計(jì)入效果。
比如,你要把你自己計(jì)入到“金錢”計(jì)分項(xiàng)中,就需要:
/scoreboard players add/remove/set @s 金錢 0
如果你將一個(gè)還未計(jì)入“金錢”計(jì)分項(xiàng)的玩家的分?jǐn)?shù)增加5會(huì)怎樣?
其實(shí)不會(huì)怎么樣。正如正常人的一般思維,剛剛計(jì)入計(jì)分項(xiàng)的玩家(或非玩家)其分?jǐn)?shù)是從0開始算起。也就是說(shuō),給那名玩家添加5金錢實(shí)際上會(huì)先讓他計(jì)入該計(jì)分項(xiàng),此時(shí)他的分?jǐn)?shù)為0,然后再將他的分?jǐn)?shù)+5變成5。
這里的“金錢”計(jì)分項(xiàng)是作者自己編的,你想要運(yùn)行上面的例子就得先自己創(chuàng)建一個(gè)叫金錢的計(jì)分項(xiàng)。
計(jì)入之后,我們?cè)撊绾螠p少分?jǐn)?shù)呢?這就要用到remove(刪除):
... remove <目標(biāo)選擇器><計(jì)分項(xiàng)><減少的分?jǐn)?shù)>[NBT(僅Java1.13之前)]
比如我想要將玩家“張三666”在“金錢”計(jì)分項(xiàng)中的分?jǐn)?shù)減少10,這就需要執(zhí)行:
/scoreboard players remove 張三666 金錢 10
假設(shè)他原本的分?jǐn)?shù)是3。執(zhí)行該指令過(guò)后,他的分?jǐn)?shù)就變?yōu)榱?7。
需要注意。記分板的分?jǐn)?shù)其值是個(gè)Int整形類變量,也就是其值的范圍只能是-2147483648~2147483647。如果一個(gè)玩家的分?jǐn)?shù)已經(jīng)是-2147483648,你再減去個(gè)1,他的分?jǐn)?shù)就會(huì)變?yōu)?147483647。關(guān)于為什么會(huì)這樣,以及Int整形究竟是個(gè)什么,你以后就會(huì)了解到。
如果你對(duì)此很感興趣,那么你可以跳到后面135~140章嘗試你是否能夠理解。
分?jǐn)?shù)可以增加和減少,當(dāng)然也可以快速設(shè)定為指定的值。這時(shí)候就要用到set:
... set <目標(biāo)選擇器><計(jì)分項(xiàng)><分?jǐn)?shù)>[NBT(僅Java1.13之前)]
設(shè)置成功后,該變量的數(shù)將會(huì)變成設(shè)置的分?jǐn)?shù)。比如我想要將“張三666”的“金錢”設(shè)為2,就可以:
/scoreboard players set 張三666 金錢 2
你可能注意到了,在本章開頭列出的格式中,還有一個(gè)reset(重置)。這個(gè)reset可和set沒多大關(guān)系,因?yàn)閞eset是重置(更準(zhǔn)確的說(shuō)是清除數(shù)據(jù))。其格式如下:
... reset <目標(biāo)選擇器>[計(jì)分項(xiàng)]
舉個(gè)例子,假設(shè)我們運(yùn)行了下面的指令:
/scoreboard players reset 張三666
你就會(huì)驚奇地發(fā)現(xiàn)“張三666”的名字從右邊側(cè)欄的“金錢排行榜”中消失了。這并不是說(shuō)他被擠出了該排行榜,或是他的分?jǐn)?shù)被重置為了0,而是他的所有在記分板上的數(shù)據(jù)全部沒掉并且記分板也不再跟蹤他,直到他重新計(jì)入到某個(gè)計(jì)分項(xiàng)中。
這哪里是reset啊,這簡(jiǎn)直是clear啊!
如果你不信,你可以試試/scoreboard list 張三666(列出張三666在記分板上的數(shù)據(jù))或/scoreboard get 張三666(獲取張三666的分?jǐn)?shù)),看看你能不能再次找到他的數(shù)據(jù)。
這確實(shí)太狠了。如果你只想clear掉他在“金錢”計(jì)分項(xiàng)中的數(shù)據(jù),在“張三666”后面加上“金錢”即可,即:/scoreboard players reset 張三666 金錢
?。▽?shí)際上還可以更狠。目標(biāo)選擇器使用*可以代指所有正在被追蹤的目標(biāo),也就是說(shuō)/scoreboard players reset *可以完全清除整個(gè)記分板上所有玩家和非玩家的數(shù)據(jù))
你現(xiàn)在可以嘗試弄一個(gè)你自己的虛擬貨幣用于服務(wù)器中。
這個(gè)貨幣的名稱自己想。作者想的是:$。
沒錯(cuò),名字允許你填$等符號(hào)。我們就以這個(gè)符號(hào)為名字舉例子,輸入并運(yùn)行下面的指令:
/scoreboard objectives add $ dummy §a$
(Java版:
/scoreboard objectives add $ dummy {“text“:“$“,“color“:“yellow“})
你就成功創(chuàng)建了一個(gè)叫做$的虛擬貨幣!
作者現(xiàn)在沒錢,所以作者我要給自己錢:
/scoreboard players add @s $ 1000000
OK,現(xiàn)在作者有100萬(wàn)美元了?。ó?dāng)然是游戲里)。
現(xiàn)在你可以嘗試做一個(gè)記分板商店。我們運(yùn)用clear指令和scoreboard指令結(jié)合即可建成一個(gè)收購(gòu)商店(使用物品換取虛擬幣)。而使用scoreboard和give指令可以建成一個(gè)用虛擬幣購(gòu)買實(shí)物的商店。
但是,計(jì)分項(xiàng)的分?jǐn)?shù)可以是負(fù)數(shù)!我們既然要搞虛擬貨幣,就要防止這種負(fù)數(shù)欠賬的事情發(fā)生。
此時(shí),test子命令就派上用場(chǎng)了!