首頁 游戲

Minecraft指令手冊

第七十二章 存儲子命令

Minecraft指令手冊 你好MC 1402 2020-02-10 17:08:14

  (本章已于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即可

  那么本章就到此結束了。

按 “鍵盤左鍵←” 返回上一章  按 “鍵盤右鍵→” 進入下一章  按 “空格鍵” 向下滾動
目錄
目錄
設置
設置
書架
加入書架
書頁
返回書頁
指南