首頁(yè) 游戲

Minecraft指令手冊(cè)

第七十二章 存儲(chǔ)子命令

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

 ?。ū菊乱延?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é)束了。

按 “鍵盤左鍵←” 返回上一章  按 “鍵盤右鍵→” 進(jìn)入下一章  按 “空格鍵” 向下滾動(dòng)
目錄
目錄
設(shè)置
設(shè)置
書架
加入書架
書頁(yè)
返回書頁(yè)
指南