UU看書

第七十二章 儲存子命令

天才一秒記住【UU看書】地址:www.uukanshu.co

(本章已於2022年7月16日重寫)

現在,我們只剩下了一個儲存子命令,即store。

這個store可不是商店,而是一個動詞,意為『儲存』。

和if子命令一樣,store子命令也有許多子命令。截止119版本,store子命令一共有5個子命令,但在這我們只能講一個。

為什麼?你仔細看看這五個子命令,斟酌一下你的水平,然後你就會發現在這裡我們的確也只能講一個。

這五個子命令分別是:

block——將值儲存到方塊實體(方塊NBT)中

bossbar——將值儲存到BOSS欄中

entity——將值儲存到實體NBT中

score——將值儲存到計分板中

storage——將值儲存到硬碟中

額,其實storage子命令我們也可以稍微講一下

在開講之前,讓我們先回顧一下第六十一章的內容。在那一章,我們瞭解到指令的返回結果有五種型別:

①指令執行成功的次數(SuccessCount)

②指令的查詢結果(QueryResult)

③受到該指令影響的物品數量(AffectedItems)

④受到該指令影響的實體數量(AffectedEntities)

⑤受到該指令影響的方塊數量(AffectedBlocks)

但Mojang可能覺得這五種太多了,而且2、3、4、5分得那麼細也沒啥用。於是,在Java113版本中,後四類合併成了一類,加上原先『指令執行成功的次數』,就變成了兩大型別:

①指令執行成功的次數(success)

②指令返回的結果(result)

其中,前者可以被我們的比較器探測到並輸出為紅石訊號強度。

回到store子命令上。雖然現在指令執行的結果只剩下兩大型別,但也是有分類的嘛。所以說,store子命令的格式如下:

storelt返回型別gtblockbossbarentityscorestorage

比如:

storeresultblock

這將會指定將指令執行所返回的結果(一般是run子命令執行的結果)儲存到方塊實體(方塊NBT)中。

考慮到我們尚未真正開始學習NBT,因此這裡我們就不講block、bossbar和entity了,就仔細學習一下score,並稍微講一下storage即可。

store的score子命令,其格式如下:

storelt返回型別gtscorelt分數持有者gtlt計分項gt

很簡單吧?至少比stats指令要簡單許多。我們只需要指定返回型別,然後指定要儲存到誰在哪個計分項上的分數即可。我們不需要考慮會不會受到其他指令的影響,也不需要考慮要在開始儲存之後停止儲存,甚至不需要考慮指定的分數持有者是否在被指定的計分項追蹤。

舉個簡單的例子:

executeasastoreresultscoresorecountrunclearsforgeores0

在裝了Forge模組載入器的情況下,執行上述指令將會將所有玩家揹包內的礦石數量儲存到每名玩家的orecount計分項上。假設線上玩家張三(idZhangSan揹包內有25個鐵礦石、17個深層鐵礦石、45個工業時代2的錫礦石,那麼執行上述指令後,張三在orecount計分項上的分數會更改為87(251745)。

這是store子命令比較常見的用法。

但在上一章講條件子命令時,我曾經說過這麼一句話:

『因為條件子命令也可以看做是一個具有功能的,能夠返回東西的指令(畢竟原來就是由幾條單獨指令結合在一起的嘛)。』

所以,store子命令是否可以儲存條件子命令所返回的結果呢?

答案是可以的。比如下面這一條:

executestoreresultscoreslimecountcounterifentityetypeminecraftslime

這將會統計出當前所有已載入維度的已載入區塊的史萊姆數量,並將其以分數的形式儲存到虛假玩家slimecount於計分項counter上的值。

需要注意的是,你不能這麼寫:

executeifentityetypeminecraftslimestoreresultscoreslimecountcounter

雖然這麼寫也能執行指令,但是將會沒有任何效果。

下面我們再來看兩個例子:

①executestoreresultscoreitemcountcounterifentityetypeminecraftitemstoreresultscorecowcountcounterifentityetypecow

②executestoreresultscoreitemcountsusuifentityetypeminecraftitemstoreresultscorecowcountsusuifentityetypecowstoreresultscoreplayercountsusurunexecuteifentityetypeplayer

第一個例子中有兩組storeif。第二個例子中,在第一個例子的基礎上,又加上了第三個store和一個run子命令來執行『executeifentityetypeplayer』。

我們先來看看第一個例子。假設現在有2個掉落物,3頭牛,請你猜一猜,執行這條指令會發生什麼?

A出現錯誤。

Bitemcount的分數變成2,cowcount的分數變為3。

Citemcount的分數變為3,cowcount的分數變為3。

Ditemcount的分數變成2,cowcount的分數變為2。

請你將公屏,打在你的答案上。

(這哪有公屏,這隻有評論啊)

讓我們等五秒鐘,看看答案是什麼。

答案是:

C!

當一個不帶有run子命令的execute指令中含有多個store和條件子命令時,除了在最後一個條件子命令後面的store子命令收不到資料以外,其他的store子命令將會獲取到最後一個條件子命令的資料。

但需要注意,雖然store子命令只能獲取到最後一個條件子命令的資料,但是這不代表其他條件子命令沒有作用。如果前面的條件子命令發現條件不符合的話,那麼store就會無法獲取到任何資料而不更改分數。

我們再來看看第二個例子。假設現在還是有2個掉落物,3頭牛,1個玩家,請你猜一猜,執行第二個例子會發生什麼?

答案是:itemcount、cowcount和playercount的分數均會變為1

當一個帶有run子命令的execute指令中含有多個store和條件子命令時,store子命令僅僅只會獲取到run子命令執行的資料,並不會獲取到其他條件子命令的資料。

你聽懂了嗎?

在本章的最後,我們來稍微瞭解一下store的這個storage子命令。

storage子命令(store)和predicate子命令(ifunless)都是在Java115版本中被新增的,並不是Java113一開始就有的。有趣的是,這兩個東西都和資料包有較大關係。謂詞我們已經知道了,那這個storage子命令又是什麼呢?

正如我對這條子命令的描述一樣,這條子命令可以將返回的值儲存到硬碟上。更確切地說,是儲存到指定的儲存容器中(這是MinecraftWiki的說法)。

硬碟?儲存容器?都是什麼鬼!

待會你就知道是什麼鬼了。讓我們先來看看這東西的格式:

storelt返回型別gtstoragelt目標儲存容器IDgtltNBT路徑gtlt資料型別gtlt倍率gt

舉個簡單的例子:

executestoreresultstorageminecraftdistanceTothenearestvillagedouble10runlocatestructureminecraftvillage

這條指令適用於Java119及以上版本,效果是:將執行地點與最近村莊的距離以double雙精度浮點數型別儲存到名為『minecraftdistance』容器內的Tothenearestvillage標籤。

如果你的存檔是個全新的,那麼你在執行上述指令後,首先遊戲將會給你建立一個叫做『minecraftdistance』的儲存容器,這個儲存容器以NBT樹狀結構儲存資料,並放置於你的存檔目錄下的data資料夾內的commandstorageminecraftdat檔案中,具體路徑如下:

存檔根目錄datacommandstorageminecraftdatdatacontentsdistance

其中,前面的『存檔根目錄datacommandstorageminecraftdat』是檔案路徑,後面的『datacontentsdistance』是NBT路徑。

如果你看不懂也沒關係,你只需要瞭解一件事情:計分板資料也是差不多這樣子儲存的——計分板儲存在data資料夾下面的另外一個叫做scoreboarddat的檔案中。

然後,遊戲會在這個叫做『minecraftdistance』的儲存容器內部,在NBT根目錄建立一個Tothenearestvillage標籤,並以double的形式寫上取得的資料。

這樣子,你透過execute指令獲得的資料就儲存在了硬碟上,而且你可以隨時呼叫。

怎麼個呼叫法?使用data指令獲取:

datagetstorageminecraftdistance

如果先前你執行指令時,執行地點與最近村莊的距離世362格,那麼這將會返回:

儲存minecraftdistance含有以下內容:Tothenearestvillage3620d

雖然使用起來十分容易,但由於涉及到較多的NBT知識,以及我們尚未講過的data指令(這玩意可比execute更加複雜),所以這邊就不細講了。

你只需要知道四點:

①這玩意可方便了

②容器名稱只要符合規範,隨便寫(如hentaiPhotos、Iamashuabithings)

③標籤名稱只要符合規範,也隨便寫(如aphoto、whatup)

④資料型別一般用int即可

那麼本章就到此結束了。

如遇章節錯誤,請點選報錯(無需登陸)

新書推薦

詭異降臨,我能無限回檔 國象小子 死靈法師能有什麼壞心思 天賦拉滿的我,下次還填非常簡單 網遊之對決巔峰 江湖籃球 我的世界之天譚歷險記