一旦官方名称揭晓,相关名称可能会随时改变。
命名空间ID(Namespaced identifier,或译为命名空间标识符)、资源路径(Resource location)[1]、资源标识符(Resource identifier)[2]或命名空间字符串(Namespaced string)[3]是用来指明和识别游戏中特定对象而又能避免潜在的歧义和冲突的一种方式。
用法[]
命名空间ID用作普通字符串来指明游戏中的方块、物品、实体类型、配方、函数、进度、标签等对象。特别地,方块状态不使用命名空间ID。
有效的命名空间ID的格式为命名空间:名称
,其中只能使用合法字符。
以下对象可以使用命名空间ID:
- 游戏内置:
- 方块
- 方块实体
[仅Java版] - 液体
[仅Java版] - 物品
- 实体种类
- 生物记忆
[仅Java版] - 画的名字
[仅Java版] - 村民的职业
[仅Java版] - 村民的种类
[仅Java版] - 状态效果
- 药水效果
[仅Java版] - 魔咒
- 粒子的种类
- 维度
- 生物群系
- 统计
[仅Java版] - 配方的种类
[仅Java版] - 配方的序列化器
[仅Java版] - 声音事件
- 战利品表
- 函数
- 其他可修改的
[仅Java版]
- Boss栏
- 命令存储
- 其他不可修改的(不通过mod)
- 战利品表的函数
- 战利品表的条件
- 战利品表的种类
- 命令参数的种类
合法字符[]
Java版[]
命名空间和名称只能包含以下字符:
0123456789
数字abcdefghijklmnopqrstuvwxyz
小写字母_
下划线-
连字符号.
点
以下字符在命名空间中是非法的,但在名称中可以接受:
/
斜杠- 用于划分目录。
命名空间和名称的最好命名方法是小写单词加下划线(snake case)。
基岩版[]
ID的命名空间和名称可以包含任何符号,斜杠“/
”和冒号“:
”除外。
以下字符在命名空间中是非法的,但在战利品表和函数的名称中是可接受的。
/
斜杠- 用于划分目录。
命名空间和名称的最好命名方法是小写单词加下划线(snake case)。
转换为字符串[]
通过将命名空间和名称使用:
进行连接,将转换得到一个字符串形式的命名空间ID。
例子:
命名空间 | 名称 | 字符串表示 |
---|---|---|
minecraft |
diamond |
minecraft:diamond
|
foo |
bar.baz |
foo:bar.baz
|
foo |
bar/baz |
foo:bar/baz
|
从字符串识别[]
游戏可以识别用户输入的命名空间ID字符串,错误的字符串无法正确识别为命名空间ID。
一些限制:
- 字符串最多只能有一个
:
(冒号)。 - 字符串的命名空间和名称部分必须符合#合法字符的限制。
- 如果有
:
,:
前面不能有/
或.
。
当存在:
时,其前面的部分将被识别为命名空间,其后面的部分则是名称。
当不存在:
时,minecraft
将被作为命名空间,整个字符串则是名称。
建议使用时始终包含命名空间和:
。
- 例子:
字符串 | 识别的命名空间 | 识别的名称 | 游戏再输出为字符串 |
---|---|---|---|
bar:code |
bar |
code |
bar:code
|
minecraft:zombie |
minecraft |
zombie |
minecraft:zombie
|
diamond |
minecraft 无 |
diamond |
minecraft:diamond diamond |
foo/bar:coal |
无效字符/ |
||
minecraft/villager |
minecraft 无 |
minecraft/villager |
minecraft:minecraft/villager minecraft/villager |
mypack_recipe |
minecraft 无 |
mypack_recipe |
minecraft:mypack_recipe mypack_recipe |
mymap:schrödingers_var |
mymap |
无效字符ö schrödingers_var |
mymap:schrödingers_var |
custom_pack:Capital |
custom_pack |
无效字符C Capital |
custom_pack:Capital |
实际文件路径[]
通常,资源包和数据包中文件的路径是包类型/命名空间/对象类型/名称.后缀名
,就有相应的形如 命名空间:名称
的命名空间ID。所有的/
(可能在对象类型
或名称
中)都是用来划分文件目录的。
对象的类型与包类型
、对象类型
和后缀名
变量的相互转换
对象的类型 | 包的类型 | 包类型 的值 |
对象类型 的值 |
后缀名 的值
|
---|---|---|---|---|
方块状态 | 资源包 | assets |
blockstates |
json
|
模型 | models |
json
| ||
粒子 | particles |
json
| ||
纹理 | textures |
png
| ||
进度 | 数据包 | data |
advancements |
json
|
函数 | functions |
mcfunction
| ||
战利品表 | loot_tables |
json
| ||
配方 | recipes |
json
| ||
结构 | structures |
nbt
| ||
方块标签 | tags/blocks |
json
| ||
实体种类标签 | tags/entity_types |
json
| ||
物品标签 | tags/items |
json
| ||
液体标签 | tags/fluids |
json
| ||
函数标签 | tags/functions |
json
|
注意:资源包中的某些元素不一定依靠具有命名空间ID的对象(如GUI纹理)。
在知道实际文件路径后,我们就可以通过它知道命名空间ID。同样的,在知道命名空间ID指定的对象的类型后,我们就可以通过它找到实际文件路径。
一些例子
命名空间ID | 对象的类型 | 包类型 |
对象类型 |
后缀名 |
文件路径 |
---|---|---|---|---|---|
my_texture_pack:diamonds |
纹理 | assets |
textures |
png |
assets/my_texture_pack/textures/diamonds.png
|
abc:run_game |
函数 | data |
functions |
mcfunction |
data/abc/functions/run_game.mcfunction
|
block/torch (相当于 minecraft:block/torch ) |
模型 | assets |
models |
json |
assets/minecraft/models/block/torch.json
|
load (相当于 minecraft:load ) |
函数标签 | data |
tags/functions |
json |
data/minecraft/tags/functions/load.json
|
rocket_pack:industry/start_of_story |
进度 | data |
advancements |
json |
data/rocket_pack/advancements/industry/start_of_story.json
|
命名空间[]
这不是一个新概念,但是我想我应重申一下什么是“命名空间”。游戏中的大多数东西都有一个命名空间,以便在我们加入了something
的同时一个mod(或地图,或其他)也加入了something
时来区分它们两个。当你要为某个东西命名时,例如一个战利品表,你还需要指定这个东西所属的命名空间。如果你不指定命名空间,我们默认它是minecraft
。这意味着something
和minecraft:something
是一回事。
命名空间是内容的区界。它是为了防止潜在的内容冲突或无意中覆盖了相同名称的对象。
例如,两个数据包里都有一个名为start
的函数。向游戏加入这两个数据包,如果没有命名空间,这两个函数就会发生冲突。当它们具有one
和two
两个不同的命名空间时,则函数将变为one:start
和two:start
,不再冲突。
minecraft
命名空间[]
游戏本身使用minecraft
命名空间。当没有指定命名空间时,将默认为minecraft
minecraft
命名空间。比如在minecraft:load
函数标签中加入函数。
自定义命名空间[]
不同的项目或内容创作(例如数据包、资源包、mod等),命名空间应该是不同的,仅当需要覆盖其他项目,或是追加标签的时候,才使用与其他项目相同的命名空间。
为了防止潜在的冲突,命名空间应该尽可能的特殊。
- 避免使用一堆字母的组合。例如,一个名为“nuclear craft”的项目不应该使用命名空间
nc
,因为太简单了。 - 避免使用过于模糊的词语。
battle_royale
也不能提供便于查找的信息,不过player_name_battle_royale
会更好些。
这些不当的命名空间都会减少项目的适应程度,并在将多个项目加入到游戏时给调试带来困难。
其他内置的命名空间[]
虽然本地化键名并不使用命名空间ID,但游戏的默认资源包声明了realms
命名空间来储存面向Realms的语言文件(位于assets/realms/lang/<语言代码>.json
),而minecraft
命名空间储存与游戏相关的语言文件。Realm的jar文件本身也在realms
命名空间中声明了它的en_us.json
语言文件及各种纹理。
在命令参数类型中,还有一个brigadier
命名空间存在于brigadier中。[5]
历史[]
Java版 | |||||
---|---|---|---|---|---|
1.6.1 | 13w21a | 加入了命名空间ID和minecraft 前缀。 | |||
1.7.2 | 13w37a | 命令现在在接受数字ID的同时也可以接受名称ID了。 | |||
1.8 | 14w03b | 命令现在不再接受数字ID。 | |||
1.11 | 16w32a | 命名空间ID有了一个字符限制。 | |||
命名空间ID中不允许使用大写字母。 | |||||
1.13 | 17w47a | 在扁平化之后,命名空间ID是唯一可接受的ID形式,不再接受数字ID。 | |||
pre4 | 名称空间ID现在用于标识插件消息通道。[6] | ||||
1.14.4 | pre1 | 在Client.jar的内置资源包中加入了命名空间realms 。 | |||
1.16 | 20w14a | 属性现在是命名空间化的ID。 | |||
携带版Alpha | |||||
0.16.0 | build 1 | 加入了命令,支持字符串ID,但这些ID没有命名空间。 | |||
基岩版 | |||||
1.12.0 | 1.12.0.2 | 加入了命名空间ID和minecraft 前缀,以支持通过附加包加入自定义物品。 |
参见[]
参考[]
- ↑ Minecraft Java Edition 1.13 changes – GitHub Gist
- ↑ "Minecraft Snapshot 19w39a" – Minecraft.net,2019年9月27日
- ↑ DataFixerUpper/NamespacedStringType.java at 8b5f82ab78b30ff5813b3a7f3906cd3f4f732acf · Mojang/DataFixerUpper – GitHub
- ↑ "Minecraft Snapshot 17w43a" – Minecraft.net
- ↑ Minecraft Java Edition 1.13 changes – GitHub Gist
- ↑ Protocol History – wiki.vg
外部链接[]
- 命名空间的解释"Minecraft Snapshot 17w43a" – Minecraft.net。
版本 | |||||||
---|---|---|---|---|---|---|---|
开发周期 |
| ||||||
技术 |
| ||||||
多人游戏 | |||||||
游戏订制 |
版本 |
| ||||||
---|---|---|---|---|---|---|---|
开发 |
| ||||||
技术性 | |||||||
多人游戏 | |||||||
特色功能 |
语言