(本章已于2022年7月25日修改)
你该如何通过/give指令获取到一颗钻石?
在Minecraft PC1.7.2(Java版1.7.2)之前的版本中,物品只有数字ID,加上目标选择器没有@s,所以你只能这样子获得钻石:
/give @p 264
对于原版来说数字ID就够了,但这对于模组来说就很不友好。举个例子,工业时代2(Industrial Craft 2)模组添加了一个叫做『工业钻石』的物品,它的数字ID为。为什么这个ID要跑到这么后面?答案很简单:如果放在很前面的话,万一原版添加了个新的物品,或者某个MOD也添加了ID一样的物品,那游戏岂不是分分钟崩掉?所以对于Minecraft1.7.2版本之前的模组来说,物品的ID就得弄成一个大数以降低冲突的风险,防止玩家的游戏因为ID冲突崩掉。
但随着Minecraft玩家群体的增大,模组数量的增多,原版那一丁点儿ID分配空间就显得捉襟见肘了。Mojang官方估计也注意到了这一点,于是自1.7.2版本开始,Mojang开始尝试放弃数字ID,转为使用更加先进的:命名空间ID。
什么是命名空间ID?这个名词其实我们在第八章已经遇见过了,你也知道它大概长什么样:
xxxxxxxxx:xxxxxxxxx
命名空间ID(Namespaced identifier),又称资源路径(Resource location)或命名空间字符串(Namespaced string),是Minecraft中一种为了正确识别到特定对象而尽量不产生歧义和冲突的一种方式。它普遍的格式如下:
命名空间:名称
不难发现,一个命名空间ID由左边的命名空间和右边的名称ID组成,两者使用英文半角冒号『:』分开。
在Java版,命名空间和名称只能含有阿拉伯数字『0』、小写字母(旧版本也能含有大写字母)『abcdefghijklmnopqrstuvwxyz』、下划线『_』、连字符『-』和点『.』,在名称中还能够使用正斜杠『/』。
在基岩版,命名空间和名称能够含有除英文半角冒号『:』和正斜杠『/』以外的所有字符,但有一些特殊情况:在战利品表和函数名称中,正斜杠『/』也可以使用。
『命名空间ID』中的『命名空间』是什么?有什么用呢?
回到上面的钻石例子。我们现在有一个数字ID为264的钻石,但如果此时有另外一个模组也添加了一个相同ID的物品,也叫做『钻石』,这时候264这个数字ID就代表着两个物品:原版的钻石和这个模组的钻石。这时候游戏就会出现混乱,不出意外的话应该会崩掉。那么我们该如何解决这个问题呢?
要解决这个问题,我们就要找到一种方式,能够区分这两个『钻石』。区分的方式有很多,比如可以判断两个钻石引用的材质文件,可以判断两个钻石的代码,但万一材质也是同一个文件该怎么办?代码一模一样怎么办?我们必须找出一个最容易方便辨别的,也最不容易相同的,且两个钻石都具有的东西来判断。
这个东西究竟是什么呢?
假如你在某个B 站上发表了这么一句话来表达你宏大的志向:
『我是胡桃的狗!』
问题来了,这个『胡桃』指的是哪个胡桃呢?是《原神》的胡桃,还是《胡桃日记》的胡桃,还是东方旧作的胡桃,还是《公主连结》的胡桃,甚至是属于植物的胡桃?