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