首頁 游戲

Minecraft指令手冊

第九十章 命名空間ID

Minecraft指令手冊 你好MC 1075 2020-03-15 21:14:02

 ?。ū菊乱延?022年7月25日修改)

  你該如何通過/give指令獲取到一顆鉆石?

  在Minecraft PC1.7.2(Java版1.7.2)之前的版本中,物品只有數(shù)字ID,加上目標選擇器沒有@s,所以你只能這樣子獲得鉆石:

  /give @p 264

  對于原版來說數(shù)字ID就夠了,但這對于模組來說就很不友好。舉個例子,工業(yè)時代2(Industrial Craft 2)模組添加了一個叫做『工業(yè)鉆石』的物品,它的數(shù)字ID為30135。為什么這個ID要跑到這么后面?答案很簡單:如果放在很前面的話,萬一原版添加了個新的物品,或者某個MOD也添加了ID一樣的物品,那游戲豈不是分分鐘崩掉?所以對于Minecraft1.7.2版本之前的模組來說,物品的ID就得弄成一個大數(shù)以降低沖突的風險,防止玩家的游戲因為ID沖突崩掉。

  但隨著Minecraft玩家群體的增大,模組數(shù)量的增多,原版那一丁點兒ID分配空間就顯得捉襟見肘了。Mojang官方估計也注意到了這一點,于是自1.7.2版本開始,Mojang開始嘗試放棄數(shù)字ID,轉為使用更加先進的:命名空間ID。

  什么是命名空間ID?這個名詞其實我們在第八章已經遇見過了,你也知道它大概長什么樣:

  xxxxxxxxx:xxxxxxxxx

  命名空間ID(Namespaced identifier),又稱資源路徑(Resource location)或命名空間字符串(Namespaced string),是Minecraft中一種為了正確識別到特定對象而盡量不產生歧義和沖突的一種方式。它普遍的格式如下:

  命名空間:名稱

  不難發(fā)現(xiàn),一個命名空間ID由左邊的命名空間和右邊的名稱ID組成,兩者使用英文半角冒號『:』分開。

  在Java版,命名空間和名稱只能含有阿拉伯數(shù)字『0123456789』、小寫字母(舊版本也能含有大寫字母)『abcdefghijklmnopqrstuvwxyz』、下劃線『_』、連字符『-』和點『.』,在名稱中還能夠使用正斜杠『/』。

  在基巖版,命名空間和名稱能夠含有除英文半角冒號『:』和正斜杠『/』以外的所有字符,但有一些特殊情況:在戰(zhàn)利品表和函數(shù)名稱中,正斜杠『/』也可以使用。

  『命名空間ID』中的『命名空間』是什么?有什么用呢?

  回到上面的鉆石例子。我們現(xiàn)在有一個數(shù)字ID為264的鉆石,但如果此時有另外一個模組也添加了一個相同ID的物品,也叫做『鉆石』,這時候264這個數(shù)字ID就代表著兩個物品:原版的鉆石和這個模組的鉆石。這時候游戲就會出現(xiàn)混亂,不出意外的話應該會崩掉。那么我們該如何解決這個問題呢?

  要解決這個問題,我們就要找到一種方式,能夠區(qū)分這兩個『鉆石』。區(qū)分的方式有很多,比如可以判斷兩個鉆石引用的材質文件,可以判斷兩個鉆石的代碼,但萬一材質也是同一個文件該怎么辦?代碼一模一樣怎么辦?我們必須找出一個最容易方便辨別的,也最不容易相同的,且兩個鉆石都具有的東西來判斷。

  這個東西究竟是什么呢?

  假如你在某個B 站上發(fā)表了這么一句話來表達你宏大的志向:

  『我是胡桃的狗!』

  問題來了,這個『胡桃』指的是哪個胡桃呢?是《原神》的胡桃,還是《胡桃日記》的胡桃,還是東方舊作的胡桃,還是《公主連結》的胡桃,甚至是屬于植物的胡桃?

  不難發(fā)現(xiàn),我們在描述不同的『胡桃』時,往往會在前面加上定語『XXX的』,其中XXX往往是某一個更高層面的東西,『的』用來區(qū)分兩者。等等,讓我們把『的』換成冒號,然后你就會發(fā)現(xiàn):

  原神:胡桃

  胡桃日記:胡桃

  東方Project舊作:胡桃

  公主連結:胡桃

  植物:胡桃

  雖然字符用的是中文,不符合Minecraft Java版的規(guī)范。但如果拋開這點來說,這完完全全不就是『命名空間ID』嗎?!其中『原神』、『胡桃日記』、『東方Project舊作』等就是『命名空間』。

  但是這還不足以解釋『命名空間』,讓我們再換一個例子。

  張三的電腦上有兩個文件夾A和B,兩個文件夾都具有一個叫做『music.mp3』的文件。由于這兩個文件在不同的文件夾下面,因此不會發(fā)生沖突,計算機能夠正常識別它們。如果它們是在同一個文件夾下面,那么計算機識別的時候就會發(fā)生混亂,可能會直接跳出那個眾所周知的藍色窗口。在這邊,文件夾『A』和『B』就代表命名空間。

  但是我們仍然不能夠清楚解釋『命名空間』究竟是什么。其實,『命名空間』本身也并沒有一個很準確的定義,它在不同的場合可能具有完全不同的意義,比如種類、游戲、公司、文件夾、數(shù)據(jù)庫、國家、學科等等等等。當然,如果你的抽象思維比較好的話,你當然可以把它想象成一個空間,至于這個空間究竟是什么你不用去管。同樣的名稱在不同的空間被賦予上不同的意義,并且不會和其他名稱發(fā)生沖突,因為兩個名稱雖然一樣,但處于不同的命名空間之中。

  回到最開始的鉆石例子,你應該已經想到如何區(qū)分原版和模組的鉆石吧?這兩個鉆石就算本身完全一樣,但它們所處的『空間』并不一樣。其中一個鉆石是『原版的鉆石』,另外一個鉆石是『模組的鉆石』。我們只需要對比兩個鉆石所處的『空間』,也就是對比擁有這兩個鉆石的兩個東西即可。Mojang和其他第三方模組開發(fā)者也是這么想,所以在Minecreaft Java1.7.2版本中引入的命名空間,就是這么干:

  minecraft:diamond

  \\我的世界的鉆石\\

  mod:diamond

  \\模組的鉆石\\

  如今,隨著版本的更迭,『命名空間ID』正在被用于越來越多的東西上。截止Minecraft Java1.19.1和基巖版1.19.10版本,在原版中,命名空間已經用于這些東西:

  方塊、方塊實體[JE]、液體[JE]、物品、實體種類、生物記憶[JE]、畫[JE]、村民職業(yè)[JE]、村民種類[JE]、狀態(tài)效果、藥水效果[JE]、魔咒、粒子種類、維度[JE]、生物群系、統(tǒng)計[JE]、配方種類[JE]、配方序列化器[JE]、聲音、戰(zhàn)利品表、函數(shù)、進度[JE]、謂詞[JE]、結構、配方[JE]、標簽[JE]、方塊狀態(tài)文件[BE]、模型[BE]、紋理[BE]、Boss欄[JE]、命令存儲[JE]、命令參數(shù)[JE]、戰(zhàn)利品表函數(shù)[JE]和戰(zhàn)利品表種類[JE]。

  這不列沒事,一列出來嚇一大跳,這么多。其實,一些第三方模組加載器早已為更多的東西加入了『命名空間ID』。比如在SPONGE FORGE海綿模組服務端中,為指令加上了『命名空間ID』。未來,隨著Mojang官方對數(shù)據(jù)包、行為包、附加包等『官方模組』的持續(xù)支持,原版游戲內必定會有更多的東西用上『命名空間ID』。

  所以,你現(xiàn)在清楚『命名空間ID』是什么了嗎?讓我們重新獲取一遍鉆石,加深一下你對這東西的理解:

  /give @s minecraft:diamond

  本章到此為止。

  附表①:『命名空間ID』歷史

  Java

  1.6.1——加入了『命名空間ID』和命名空間minecraft

  1.7.2——命令現(xiàn)在能夠使用『命名空間ID』

  1.8——幾乎所有命令現(xiàn)在不再接受數(shù)字ID

  1.11——命名空間ID現(xiàn)在不允許使用大寫字母,并加入了字符限制

  1.13——命名空間ID現(xiàn)在變?yōu)槲ㄒ豢梢员唤邮艿腎D形式,數(shù)字ID被完全移除

  1.14.4——客戶端資源包加入了realms命名空間

  1.16——實體的屬性現(xiàn)在也使用命名空間ID

  攜帶版/基巖版

  1.12.0——加入了命名空間和minecraft前綴,使得附加包能夠向游戲內添加新的東西

  附表②:Dinnerbone對命名空間ID的評論

  This isn't a new concept, but I thought I should reiterate what a “namespace“ is. Most things in the game has a namespace, so that if we add something and a mod (or map, or whatever) adds something, they're both different somethings. Whenever you're asked to name something, for example a loot table, you're expected to also provide what namespace that thing comes from. If you don't specify the namespace, we default to minecraft. This means that something and minecraft:something are the same thing.

  這不是一個新概念,但是我想我應重申一下什么是“命名空間”。游戲中的大多數(shù)東西都有一個命名空間,以便在我們加入了something的同時一個mod(或地圖,或其他)也加入了something時來區(qū)分它們兩個。當您要為某個東西命名時,例如一個戰(zhàn)利品表,您還需要指定這個東西所屬的命名空間。如果您不指定命名空間,我們默認它是minecraft。這意味著something和minecraft:something是一回事。

  ——原文來自『www.minecraft.net/zh-hans/article/minecraft-snapshot-17w43a』

  ——翻譯來自中文Minecraft Wiki

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