第七十二章 存儲(chǔ)子命令
?。ū菊乱延?022年7月16日重寫)
現(xiàn)在,我們只剩下了一個(gè)存儲(chǔ)子命令,即store。
這個(gè)store可不是商店,而是一個(gè)動(dòng)詞,意為『儲(chǔ)存』。
和if子命令一樣,store子命令也有許多子命令。截止1.19版本,store子命令一共有5個(gè)子命令,但在這我們只能講一個(gè)。
為什么?你仔細(xì)看看這五個(gè)子命令,斟酌一下你的水平,然后你就會(huì)發(fā)現(xiàn)在這里我們的確也只能講一個(gè)。
這五個(gè)子命令分別是:
block ——將值存儲(chǔ)到方塊實(shí)體(方塊NBT)中
bossbar ——將值存儲(chǔ)到BOSS欄中
entity ——將值存儲(chǔ)到實(shí)體NBT中
score ——將值存儲(chǔ)到計(jì)分板中
storage ——將值存儲(chǔ)到硬盤中
額,其實(shí)storage子命令我們也可以稍微講一下......
在開講之前,讓我們先回顧一下第六十一章的內(nèi)容。在那一章,我們了解到指令的返回結(jié)果有五種類型:
?、僦噶顖?zhí)行成功的次數(shù)(SuccessCount)
②指令的查詢結(jié)果(QueryResult)
③受到該指令影響的物品數(shù)量(AffectedItems)
?、苁艿皆撝噶钣绊懙膶?shí)體數(shù)量(AffectedEntities)
⑤受到該指令影響的方塊數(shù)量(AffectedBlocks)
但Mojang可能覺得這五種太多了,而且2、3、4、5分得那么細(xì)也沒啥用。于是,在Java1.13版本中,后四類合并成了一類,加上原先『指令執(zhí)行成功的次數(shù)』,就變成了兩大類型:
?、僦噶顖?zhí)行成功的次數(shù)(success)
②指令返回的結(jié)果(result)
其中,前者可以被我們的比較器探測(cè)到并輸出為紅石信號(hào)強(qiáng)度。
回到store子命令上。雖然現(xiàn)在指令執(zhí)行的結(jié)果只剩下兩大類型,但也是有分類的嘛。所以說,store子命令的格式如下:
... store <返回類型>(block|bossbar|entity|score|storage)...
比如:
... store result block ...
這將會(huì)指定將指令執(zhí)行所返回的結(jié)果(一般是run子命令執(zhí)行的結(jié)果)存儲(chǔ)到方塊實(shí)體(方塊NBT)中。
考慮到我們尚未真正開始學(xué)習(xí)NBT,因此這里我們就不講block、bossbar和entity了,就仔細(xì)學(xué)習(xí)一下score,并稍微講一下storage即可。
store的score子命令,其格式如下:
... store <返回類型> score <分?jǐn)?shù)持有者><計(jì)分項(xiàng)>...
很簡(jiǎn)單吧?至少比/stats指令要簡(jiǎn)單許多。我們只需要指定返回類型,然后指定要存儲(chǔ)到誰(shuí)在哪個(gè)計(jì)分項(xiàng)上的分?jǐn)?shù)即可。我們不需要考慮會(huì)不會(huì)受到其他指令的影響,也不需要考慮要在開始存儲(chǔ)之后停止存儲(chǔ),甚至不需要考慮指定的分?jǐn)?shù)持有者是否在被指定的計(jì)分項(xiàng)追蹤。
舉個(gè)簡(jiǎn)單的例子:
/execute as @a store result score @s ore_count run clear @s #forge:ores 0
在裝了Forge模組加載器的情況下,運(yùn)行上述指令將會(huì)將所有玩家背包內(nèi)的礦石數(shù)量?jī)?chǔ)存到每名玩家的ore_count計(jì)分項(xiàng)上。假設(shè)在線玩家張三(id:Zhang_San)背包內(nèi)有25個(gè)鐵礦石、17個(gè)深層鐵礦石、45個(gè)工業(yè)時(shí)代2的錫礦石,那么運(yùn)行上述指令后,張三在ore_count計(jì)分項(xiàng)上的分?jǐn)?shù)會(huì)更改為87(25+17+45)。
這是store子命令比較常見的用法。
但在上一章講條件子命令時(shí),我曾經(jīng)說過這么一句話:
『因?yàn)闂l件子命令也可以看做是一個(gè)具有功能的,能夠返回東西的指令(畢竟原來就是由幾條單獨(dú)指令結(jié)合在一起的嘛)?!?p> 所以,store子命令是否可以存儲(chǔ)條件子命令所返回的結(jié)果呢?
答案是可以的。比如下面這一條:
/execute store result score slime_count counter if entity @e[type=minecraft:slime]
這將會(huì)統(tǒng)計(jì)出當(dāng)前所有已加載維度的已加載區(qū)塊的史萊姆數(shù)量,并將其以分?jǐn)?shù)的形式儲(chǔ)存到虛假玩家slime_count于計(jì)分項(xiàng)counter上的值。
需要注意的是,你不能這么寫:
/execute if entity @e[type=minecraft:slime] store result score slime_count counter
雖然這么寫也能執(zhí)行指令,但是將會(huì)沒有任何效果。
下面我們?cè)賮砜磧蓚€(gè)例子:
①/execute store result score item_count counter if entity @e[type=minecraft:item] store result score cow_count counter if entity @e[type=cow]
?、?execute store result score item_count susu if entity @e[type=minecraft:item] store result score cow_count susu if entity @e[type=cow] store result score player_count susu run execute if entity @e[type=player]
第一個(gè)例子中有兩組store+if。第二個(gè)例子中,在第一個(gè)例子的基礎(chǔ)上,又加上了第三個(gè)store和一個(gè)run子命令來運(yùn)行『execute if entity @e[type=player]』。
我們先來看看第一個(gè)例子。假設(shè)現(xiàn)在有2個(gè)掉落物,3頭牛,請(qǐng)你猜一猜,運(yùn)行這條指令會(huì)發(fā)生什么?
A.出現(xiàn)錯(cuò)誤。
B.item_count的分?jǐn)?shù)變成2,cow_count的分?jǐn)?shù)變?yōu)?。
C.item_count的分?jǐn)?shù)變?yōu)?,cow_count的分?jǐn)?shù)變?yōu)?。
D.item_count的分?jǐn)?shù)變成2,cow_count的分?jǐn)?shù)變?yōu)?。
請(qǐng)你將公屏,打在你的答案上。
?。ㄟ@哪有公屏,這只有評(píng)論?。?p> 讓我們等五秒鐘,看看答案是什么。
五
四
三
二
一
答案是:
C!
當(dāng)一個(gè)不帶有run子命令的execute指令中含有多個(gè)store和條件子命令時(shí),除了在最后一個(gè)條件子命令后面的store子命令收不到數(shù)據(jù)以外,其他的store子命令將會(huì)獲取到最后一個(gè)條件子命令的數(shù)據(jù)。
但需要注意,雖然store子命令只能獲取到最后一個(gè)條件子命令的數(shù)據(jù),但是這不代表其他條件子命令沒有作用。如果前面的條件子命令發(fā)現(xiàn)條件不符合的話,那么store就會(huì)無(wú)法獲取到任何數(shù)據(jù)而不更改分?jǐn)?shù)。
我們?cè)賮砜纯吹诙€(gè)例子。假設(shè)現(xiàn)在還是有2個(gè)掉落物,3頭牛,1個(gè)玩家,請(qǐng)你猜一猜,運(yùn)行第二個(gè)例子會(huì)發(fā)生什么?
答案是:item_count、cow_count和player_count的分?jǐn)?shù)均會(huì)變?yōu)?
當(dāng)一個(gè)帶有run子命令的execute指令中含有多個(gè)store和條件子命令時(shí),store子命令僅僅只會(huì)獲取到run子命令運(yùn)行的數(shù)據(jù),并不會(huì)獲取到其他條件子命令的數(shù)據(jù)。
你聽懂了嗎?
在本章的最后,我們來稍微了解一下store的這個(gè)storage子命令。
storage子命令(store)和predicate子命令(if|unless)都是在Java1.15版本中被添加的,并不是Java1.13一開始就有的。有趣的是,這兩個(gè)東西都和數(shù)據(jù)包有較大關(guān)系。謂詞我們已經(jīng)知道了,那這個(gè)storage子命令又是什么呢?
正如我對(duì)這條子命令的描述一樣,這條子命令可以將返回的值存儲(chǔ)到硬盤上。更確切地說,是存儲(chǔ)到指定的存儲(chǔ)容器中(這是Minecraft Wiki的說法)。
硬盤?存儲(chǔ)容器?都是什么鬼!
待會(huì)你就知道是什么鬼了。讓我們先來看看這東西的格式:
... store <返回類型> storage <目標(biāo)存儲(chǔ)容器ID><NBT路徑><數(shù)據(jù)類型><倍率>...
舉個(gè)簡(jiǎn)單的例子:
/execute store result storage minecraft:distance To_the_nearest_village double 1.0 run locate structure #minecraft:village
這條指令適用于Java1.19及以上版本,效果是:將執(zhí)行地點(diǎn)與最近村莊的距離以double雙精度浮點(diǎn)數(shù)類型存儲(chǔ)到名為『minecraft:distance』容器內(nèi)的To_the_nearest_village標(biāo)簽。
如果你的存檔是個(gè)全新的,那么你在運(yùn)行上述指令后,首先游戲?qū)?huì)給你創(chuàng)建一個(gè)叫做『minecraft:distance』的存儲(chǔ)容器,這個(gè)存儲(chǔ)容器以NBT樹狀結(jié)構(gòu)存儲(chǔ)數(shù)據(jù),并放置于你的存檔目錄下的data文件夾內(nèi)的command_storage_minecraft.dat文件中,具體路徑如下:
存檔根目錄/data/command_storage_minecraft.dat.data.contents.distance
其中,前面的『存檔根目錄/data/command_storage_minecraft.dat』是文件路徑,后面的『data.contents.distance』是NBT路徑。
如果你看不懂也沒關(guān)系,你只需要了解一件事情:計(jì)分板數(shù)據(jù)也是差不多這樣子存儲(chǔ)的——計(jì)分板存儲(chǔ)在data文件夾下面的另外一個(gè)叫做scoreboard.dat的文件中。
然后,游戲會(huì)在這個(gè)叫做『minecraft:distance』的存儲(chǔ)容器內(nèi)部,在NBT根目錄創(chuàng)建一個(gè)To_the_nearest_village標(biāo)簽,并以double的形式寫上取得的數(shù)據(jù)。
這樣子,你通過execute指令獲得的數(shù)據(jù)就存儲(chǔ)在了硬盤上,而且你可以隨時(shí)調(diào)用。
怎么個(gè)調(diào)用法?使用/data指令獲?。?p> /data get storage minecraft:distance
如果先前你運(yùn)行指令時(shí),執(zhí)行地點(diǎn)與最近村莊的距離世362格,那么這將會(huì)返回:
存儲(chǔ)minecraft:distance含有以下內(nèi)容:{To_the_nearest_village:362.0d}
雖然使用起來十分容易,但由于涉及到較多的NBT知識(shí),以及我們尚未講過的/data指令(這玩意可比execute更加復(fù)雜),所以這邊就不細(xì)講了。
你只需要知道四點(diǎn):
?、龠@玩意可方便了
?、谌萜髅Q只要符合規(guī)范,隨便寫(如hentai:Photos、I_am_a_shuabi:things)
?、蹣?biāo)簽名稱只要符合規(guī)范,也隨便寫(如a_photo、what_up)
?、軘?shù)據(jù)類型一般用int即可
那么本章就到此結(jié)束了。