本帖最后由 719220502 于 2017-8-21 13:13 编辑

-------命令进阶-------
第七章 游戏数据文件

本文首发于命令进阶教程全集
使用CC BY-SA-NC 4.0协议,转载请注明本页面链接


近来的更新加入了不少游戏数据文件,如进度文件(Advancements)、战利品表(Loot table)等等,让我们能够更方便的做到一些特殊功能。

这一章将会探讨这些游戏数据文件的功能、大致用法,让读者在地图制作时能够使用这些文件,让系统更为强大、精简。
本部分不会详细探讨每个文件的格式细节,详情请自行寻找其他教程以及WIKI。

测试地图时可以通过 reload命令方便的重新加载游戏数据文件。(权限要求为4)
作为移植页面,格式可能会有偏差,请到教程全集中获得完整体验。
本页面可能随着版本推进而过期,内容以全集为准。

翻页请见本文开头的目录,直接点击对应章节的名称即可翻页。索引贴




资源包
资源包是游戏的重要部分,能够修改贴图、音效,甚至模型、语言等是它的一大特色。其强大的自由度能够为游戏增色不少。
本章节将会介绍资源包内各部分的用途,及其在地图创作中的作用。

本章中若无特殊说明,文件路径默认使用 正斜杠( / ) 分隔。默认从资源包中开始索引。


快速入门:体验制作一个资源包
第一步,找到你的资源包文件夹( .minecraft\resourcepacks ),并在其中新建一个文件夹,文件夹的名字即为资源包的名字。在这里,我们以 newPack 为例。


第二步,打开这个文件夹,然后新建一个文件,名为 pack.mcmeta 。注意,这个文件的扩展名是 .mcmeta 而不是 .txt (虽然也是一个纯文字档案),你可以在文件夹选项中选择展示文件的扩展名。


第三步,打开 pack.mcmeta 。你可以使用Windows自带的写字板,最好使用一些专业点的编辑器,比如Notepad++。然后,向其中添加一下文字:

  1. {
  2.    "pack": {
  3.       "pack_format": 3,
  4.       "description": "A Tutorial Resource Pack"
  5.    }
  6. }
复制代码
注意,除了 A Tutorial Resource Pack 作为资源包描述可以修改,其它各个字符都不能进行增减和替换。( pack_format 是1.12的时候为3,其他版本请见本文底部的pack.mcmeta格式)

添加之后记得保存。

第四步:创建一个.png图片文件,设置图片大小为128x128,并保存为 pack.png 。这个图片就是你的资源包图标。




第四步:在版本文件夹找到当前版本的jar,解压并找到 assets\minecraft\textures 。原版的所有材质都在这个文件夹内。选择一个你想要修改的材质,并按原路径复制到刚才的资源包文件夹内。






第五步:打开游戏,看看你的新资源包是否制作成功。


温馨提示:
这只是最最简单的入门,接下来会更进一步地介绍资源包制作以及其应用。


一些注意事项:
  • 资源包中图片必须是*.png格式,且扩展名使用小写。
  • 除资源包名外,资源包内的文件/文件夹名不能有中文。
  • (资源包名)的下级文件夹是 assets 文件夹,注意不要打包两次造成资源包无法读取。
  • (资源包名)的下的pack.mcmeta文件是必须的。
  • 配置文件里的所有 文件路径,都不需要写扩展名(如 .ogg ,  .json ),路径使用斜杠 / 而不是反斜杠 \ ,如应该是 test/a/b 而不是 test\a\b
  • 小心资源包错误!若出现紫黑色方块,则为资源包错误。可能由模型,状态文件,材质错误,材质不存在导致:


pack.mcmeta文件格式
  • (The root tag) (Compound)
    • pack :储存资源包信息(Compound)
      • pack_format :资源包版本号,必须同游戏版本匹配(游戏版本1.9之前设置为 1 ,1.9和1.10设置为 2 ,1.11和1.12设置为 3 )。(Int)
      • description :资源包的描述,在选择资源包时显示,中文需转unicode编码。(String)


本教程只会讲解资源包的作用,以及大致介绍资源包。如果需要详细研究,请参照该方面的教程以及wiki。

地图里可以加入资源包,方式为在地图的文件里 .minecraft/saves/(地图名)/ 里加入一个 resources.zip ,内容为(不是放在子文件内) pack.mcmetapack.pngassets 文件夹等。
也可以在服务器里指定资源包(但需要等待下载),方式为在 server.properties 里加入 resource-pack=<资源包zip的URL>

更多关于资源包的资料请参见 https://minecraft.gamepedia.com/Resource_pack





材质贴图
材质(Texture)是一个资源包的主体,优秀的材质能深刻地表现地图的主题,并能够同模型配合,达到许多令人惊奇的效果。本篇教程主要讲解材质的格式和一些注意事项。

材质文件保存在 (资源包名)/assets/minecraft/textures 中,其下包含这些文件夹:

  • blocks  储存方块材质。
  • colormap  储存绿色植物色谱。
  • effect  用途不明,可删除,可能同已移除的 Super Secret Settings 有关。
  • entity  储存实体材质。
  • environment  储存太阳、月亮、云雨雪等材质。
  • font  储存字体材质。
  • gui   储存GUI材质
  • items   储存物品材质。
  • map   储存地图及有关内容的材质。
  • misc   杂项。
  • models    储存盔甲材质。
  • painting  储存挂画材质。
  • particle  储存粒子材质。
推荐阅读:

WIKI: http://minecraft.gamepedia.com/Resource_pack/Folders  资源包文件格式。


方块和物品
方块和物品贴图是资源包中数量最多的部分,贴图可直接在原图用任意画图软件修改,保存为png格式。需要注意:


透明材质
多数的固体方块会把透明/半透明的部分用纯色填充(如石头,泥土)。游戏默认就有透明/半透明部分的方块(彩色玻璃)、实体(史莱姆)和所有的物品,都支持透明/半透明。
推荐阅读:



材质贴图的共用
材质共用是游戏中的一种普遍现象,是指一个方块/物品的材质的一部分使用另一个方块/物品的材质。常见的情况有:

  • 拉杆底座使用圆石材质;
  • 书架侧面使用橡木木板材质;
  • 药水瓶的材质是共用的 等。
修改这类方块/物品时应注意不同材质之间的衔接(eg:在红石比较器正确位置上开三个洞来放红石火把)
当然,材质贴图的共用不是游戏硬编码定死的,想要修改,请进一步阅读 方块模型 章节。


动态材质的绘制
动态材质在游戏中是很常见的,如水和岩浆的流动,钟的刻度变化等。本段将简单地介绍动态材质及其绘制方法,详细的教程和技巧请参看链接教程。


材质贴图的格式和绘制
观察 water_flow.png ,  lava_flow.png 贴图。

能够发现,动态材质的材质贴图文件是一帧一帧的材质贴图纵向拼接而成的。游戏程序读取这个文件时,会将它拆分成多个正方形贴图,然后再按照一定的顺序显示它们,这样,材质就显得“动”起来了。动态材质的长度必须是宽度的倍数。

推荐阅读:

教程 http://www.mcbbs.net/thread-271536-1-1.html   一些有用的技巧,能更快更好地完成动态材质贴图。
资源包 http://www.minecraftforum.net/forums/mapping-and-modding/resource-packs/1244476-hybrid-v17e-100-animations-blocksmith-hybrid   以原版材质为基础增加了许多动态材质,可供学习参考。

一个特例是,钟和指南针的材质不是简单的动态变化,它们每一帧的材质不需要拼接,详见 物品模型 章节。


.mcmeta规则文件的编写
观察 lava_still.png.mcmeta 文件,可用记事本直接打开。

  1. {
  2.   "animation": {
  3.     "frametime": 2,
  4.     "frames": [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
  5.     18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1
  6.     ]
  7.   }
  8. }
复制代码
animation 下有两个标签:

  • frametime :确定每一动画帧之间的间隔(单位为gametick)。此动画每帧之间的间隔为2 gt.(默认值为1)
  • frames :确定动画帧的播放顺序(从0开始)。最大值为19表明这个动画有20帧(20个拼接的16*16贴图)。值 [0,1, ... ,18,19,18, ... ,2,1] 表明:动画从第一帧播放到最后一帧,再从最后一帧播放回第一帧,来回往复。(默认为:从头到尾顺序播放,到最后一帧后跳回第一帧继续播放)
以上是两种常见的标签,若产生紫黑方块,则可能为mcmeta规则文件错误,需要进行检查。  

推荐阅读:



灰白的绿色植物贴图
一些绿色植物,如草方块顶部,树叶,草,蕨类的材质在 blocks 文件夹中是灰色的。它们的真实颜色由 colormap 文件夹下的文件决定。

详细的介绍,见 “色谱” 篇。


实体和盔甲
这两类物品分别储存在 entitymodels/armor 文件夹中。
实体和盔甲的各个部分被平铺在材质贴图上,需要逐一辨认和修改。

箱子和指示牌材质在 entity 文件夹中。

推荐阅读:

工具: https://www.planetminecraft.com/mod/mcskin3d/   MCSkin3D,能够把扁平的实体材质立体化,支持 entity 文件夹中所有实体模型(在软件右上角切换)。


GUI,字体,地图和画
  • GUI为游戏内的各种界面(背包界面,箱子界面,熔炉界面等),可直接在原图修改。注意材质修改仅会改变各种界面的外观,暂时无法在原版修改各种界面的行为
  • 字体文件直接以图片的形式保存( ascii.pngascii_sga.png (附魔文字)等),游戏默认只提供这两个字体文件(主要是英文字体),若要添加其它语言的字体,请使用下方的生成器生成,注意保存扩展名为小写的png。
  • 地图文件夹很显而易见, map_icons.png 右下方的蓝色部分只是官方卖萌,对游戏没有影响,可忽略。
  • 画也不必多说,材质文件中紫色的方块对游戏没有影响,可忽略。
推荐阅读

生成器: http://www.mcbbs.net/thread-229426-1-1.html   可生成中文字体。
资源包: https://pan.baidu.com/s/1mhtG2mc    使用了方正喵呜字体的资源包,可供参考。

因缺思厅:凭借汉语强大的字符数量,可以在字体文件里面将一些字改成图案,来丰富地图内容。


色谱
色谱储存在 colormap 文件夹中,由生物群系来为绿色植物着色。

游戏系统会通过算法,根据当前生物群系在色谱中选取颜色,并在灰色的绿色植物材质上覆盖此颜色,类似于HSB颜色法。
其中 grass.png 给草类(草方块,草,蕨类等)植物着色, foliage.png 给树叶着色(云杉树叶,桦木树叶除外)。

生物群系沼泽(Swampland),黑森林(Roofed forest),平顶山(Mesa)及其变种的颜色由硬编码规定,不可通过色谱材质修改。

色谱材质贴图像一个直角三角形,只有左下部分的那个三角有效( foliage.png 右上半部分没有作用)。

粗略的生物群系-色谱对应图:


推荐阅读:

WIKI: http://minecraft.gamepedia.com/Biome#Biome_colors   详细介绍色谱颜色的作用。  


粒子及杂项

粒子效果
粒子效果材质储存在 particle 文件夹中。其中的两个材质:

  • footprint.png :用途不明,可删除,从远古时代就存在。
  • particles.png :储存大量游戏中常见的粒子效果,
    粒子效果和材质文件的位置对应:


杂项
杂项储存在 misc 文件夹中,主要是游戏中的一些小细节,如附魔光效,南瓜头盔的视线遮挡,水下的视觉效果等,有以下文件:

  • enchanted_item_glint.png :附魔物品的光效。
  • forcefield.png :地图边界墙的材质。
  • pumpkinblur.png :戴上南瓜头盔时,显示在眼前的材质。
  • shadow.png :生物下方的阴影。
  • underwater.png :在水下时,显示在眼前的材质。
  • unknown_pack.png :资源包没有 pack.png 文件时,资源包预览图显示这个贴图。
  • unknown_server.png :服务器没有设置预览图时显示这个贴图。
  • vignette.png :进入比较黑暗的地方(洞穴等)时,显示在眼前的材质。(游戏会对这个贴图做反色处理)
同时,也有以下相对应的几个 *.mcmeta 文件:

  • enchanted_item_glint.png.mcmeta
  • pumpkinblur.png.mcmeta
  • shadow.png.mcmeta
  • vignette.png.mcmeta
注意,如果一个资源包misc文件夹中的mcmeta文件缺失,那么游戏会加载 默认的 mcmeta文件,而不是从下一个资源包中加载。
mcmeta文件详细的json格式,请见WIKI:http://minecraft.gamepedia.com/Resource_pack#Properties



模型
自定义模型(Models)是1.8版本加入的特性,它的加入极大地提高了游戏的自由度。通过模型的修改,玩家可以随意变换方块的形状,不同部分的贴图,甚至能添加新的物品外观。巧用模型能打破游戏中有限物品的限制,为地图制作取得更宽阔的创作空间。

  • 状态文件储存在 (资源包名)/assets/minecraft/blockstates 下,
  • 模型储存在 (资源包名)/assets/minecraft/models 下。
    这两个文件是相互配合的,下文会讲到。
本章节的大部分资料来自:

中文教程 http://www.mcbbs.net/thread-491597-1-1.html   详细介绍各种标签的作用并举例。
WIKI http://minecraft.gamepedia.com/Model


状态文件
状态文件(Block States)是方块模型文件和游戏系统交互的“中介”。当一个方块再游戏中被“看见”时,游戏系统就通过 文件名 来查找方块所对应的状态文件,然后根据状态文件内的内容,确定方块在当前状态时使用的模型。因此 游戏自带 的状态文件的文件名不能更改,但可以添加新的状态文件。


方块状态
相同的方块可能会有不同的状态,如:

  • 蛋糕的块数不同;
  • 草方块上是否有雪;
  • 火把的朝向不同,
    等等。
    可以在游戏中按 F3 ,在屏幕右侧中部查看所指向方块的方块状态。
    通过方块的状态文件,不同的方块状态会使用不同的模型。
可参考:

WIKI http://minecraft.gamepedia.com/Block_states   所有方块的状态一览。


状态文件-JSON标签
限于篇幅,这里只简述状态文件中的核心部分:

  • (The root tag) (Compound)
    • variants :包含多种方块状态。(Compound)
      • (A variant) :储存一个方块状态(标签名为方块状态),及其对应的 单个 模型。(Compound)
        • modelassets/minecraft/models/blocks 下的模型文件路径(不包括扩展名)。(String)
        • ...其他标签
      • (A variant) :储存一个方块状态(标签名为方块状态),及其对应的 多个 模型。和上方的(A variant)标签不同的是,这是一个list,会从中根据权重随机抽取一个模型。(List)
        • (A model) :一种模型。(Compound)
          • modelassets/minecraft/models/blocks 下的模型文件路径(不包括扩展名)。(String)
          • weight :此模型被选中的权重。Int。
          • ...其他标签,和上方单个模型的内容相同。




例子们:
blockstates/torch.json
    比较基础的状态文件,一种方块状态只对应一种模型。

  1. {
  2.     "variants": {
  3.         "facing=up": { "model": "normal_torch" },
  4.         "facing=east": { "model": "normal_torch_wall" },
  5.         "facing=south": { "model": "normal_torch_wall", "y": 90 },
  6.         "facing=west": { "model": "normal_torch_wall", "y": 180 },
  7.         "facing=north": { "model": "normal_torch_wall", "y": 270 }
  8.     }
  9. }
复制代码
伪代码:

  1. {  
  2.    "所有方块状态": {  
  3.         当facing状态的值为up时(直立),调用 models/normal_torch.json 模型,  
  4.         当facing状态的值为east时(贴在墙上面朝东方),调用 models/normal_torch_wall.json 模型,  
  5.         当facing状态的值为south时,调用 models/normal_torch_wall.json 模型,并在y轴(纵轴)上旋转90°.  
  6.         west, north 同理.
  7.     }  
  8. }
复制代码



blockstates/grass.json
    出现一种方块状态对应多种模型的情况。每种模型(上文的 (A model) 标签)并列储存在一个list中。

  1. {
  2.     "variants": {
  3.         "snowy=false": [        //这种方块状态对应了四种模型。所以将这四种模型并列储存在list(方括号)中.
  4.             { "model": "grass_normal" },        //由于没有设置 weight 标签,每种模型都有25%的几率被选择。
  5.             { "model": "grass_normal", "y": 90 },
  6.             { "model": "grass_normal", "y": 180 },
  7.             { "model": "grass_normal", "y": 270 }
  8.         ],
  9.         "snowy=true":  { "model": "grass_snowed" }        //这种方块状态只对应一种模型,和上文torch.json类似.
  10.     }
  11. }
复制代码



注意:状态文件只调用模型文件,方块的 材质 在模型文件中确定。

当一个方块没有任何方块状态时, (A variant) 标签的名称为 "normal" .
如灵魂沙, blockstates/soul_sand.json :

  1. {
  2.     "variants": {
  3.         "normal": { "model": "soul_sand" }
  4.     }
  5. }
复制代码
推荐阅读:

WIKI http://minecraft.gamepedia.com/Model#Block_states   状态文件
工具 http://www.bejson.com/    JSON检查。


方块模型
方块模型(Block Models)确定一个方块的形状及各部分材质。方块模型文件的文件名可以更改,但要和状态文件中指定的模型吻合。
方块模型文件储存在 (资源包名)/assets/minecraft/models/block 中。


方块模型-JSON标签
限于篇幅,这里只简述方块模型中的核心部分。详细的讲解请见下文或文章开头的教程贴:

  • (The root tag)
    • parentassets/minecraft/models 下父模型的路径(不包括扩展名),详细用途见下。(String)
    • display :确定方块在不同地方的旋转和缩放(拿在手上时,在背包时,成为掉落物时...)(Compound)
      • ...
    • textures :确定方块模型的一些材质,或使用材质变量。(Compound)
      • (A texture variable) :定义一个材质变量,并为它赋值。标签名为材质变量名称(自定义),标签的值(材质变量的值)为 assets/minecraft/textures 下的材质文件(不包括扩展名)。(String)
    • elements :(List)
      • (An element) :单个元素。(Compound)
        • from :设置元素起点的坐标,格式为 [x, y, z] (List)
        • to :设置元素终点的坐标,格式为 [x, y, z] (List)
        • faces :确定一个元素六个面的材质。(Compound)
          • down, up, north, south, west, east :单个面。(Compound)
            • textureassets/minecraft/textures 下材质的路径(不包括扩展名)。从中读取材质。(String)
            • uv :从 texture 标签读取的材质png文件中,截取一部分作为当前面的材质,格式为[x1,y1,x2,y2].(List)






父模型
父模型的作用相当于“模板”,它将形状相同,但只有材质不同方块模型集中到一个模型文件中,并将材质( texture )部分作为一个材质变量留空,由子模型传递不同的材质。一个例子:

  • torch.json (父模型)
    • normal_torch (子模型1)
    • lit_redstone_torch.json (子模型2)
    • unlit_redstone_torch.json (子模型3)

可以知道,三个子模型(火把,红石火把,熄灭的红石火把)的形状是一样的(棍子),且只有材质上的不同。所以规定它们 形状 的模型就只需要一个( torch.json ,作为父模型)。而三个子模型需要定义一个名为 torch 的材质变量并为它赋不同的值,父模型则需引用这个名为 torch 的变量。因为所有火把的形状都集中在一个模型文件( torch.json )中,所以可以减少错误且便于维护。

详细的例子和代码分析,见文章开头的教程。


材质变量
材质变量在父模型中,通过 # + 变量名 引用,在子模型中通过 (A texture variable) 标签定义材质变量,并由父模型引用,简单的例子:

torch.json 局部(父模型)

  1. ...
  2. "down": { "uv": [ 7, 13, 9, 15 ], "texture": "#torch" },
  3. "up":   { "uv": [ 7,  6, 9,  8 ], "texture": "#torch" }
  4. ...
复制代码
normal_torch.json (子模型):

  1. {
  2.     "parent": "block/torch",
  3.     "textures": {
  4.         "torch": "blocks/torch_on"
  5.     }
  6. }
复制代码
在这里,父模型( torch.json )需要引用一个名为 torch 的变量,子模型( normal_torch.json )定义了一个叫 torch 的变量,并将它赋值为 "blocks/torch_on" ,然后指定父模型是 "block/torch.json" 。这样,父模型就引用了 torch 变量的值。此时,父模型就相当于:

  1. ...
  2. "down": { "uv": [ 7, 13, 9, 15 ], "texture": "blocks/torch_on" },
  3. "up":   { "uv": [ 7,  6, 9,  8 ], "texture": "blocks/torch_on"}
  4. ...
复制代码

from, to, uv
from, to 通过两个三维坐标,确定一个长方体元素的大小和位置(一个方块由单个或多个元素组成)。类似于服务器的圈地插件和fill命令的方式,通过两个三维坐标确定一个长方体范围。
uv 标签是在 texture 标签取得的材质中,截取一部分作为元素某个面的材质。因为某些元素的某些面不会被单独准备材质,所以需要从其它材质中截取部分来使用(例如火把的顶部和底部是没有单独的png材质文件的)。
如,火把的顶部和底部,通过uv截取,使用的是以下部分的材质:


这三个标签的单位都是 像素 。from, to标签是在161616像素(默认)的一个正方体方块中取得一部分空间。uv是在16*16像素(默认)的材质贴图中截取一部分贴图。

推荐阅读:

WIKI http://minecraft.gamepedia.com/Model#Block_models  方块模型
编辑器 https://pan.baidu.com/s/1dFKRV0X    免费
编辑器 https://cubik.studio/get    付费
资源包 http://www.mcbbs.net/thread-464655-1-1.html  3D原版资源包,可供参考


物品模型
物品模型确定物品在不同位置时(拿在手上、在背包中、在地上时)的旋转和缩放。也能根据当前物品状态的不同,使用不同的模型或材质。游戏自带的物品模型文件的文件名不能更改,但可以添加自定义物品模型。

物品模型文件储存在 (资源包名)/assets/minecraft/models/item 中。


物品模型-JSON标签
物品模型的大部分标签和方块模型的相似,这里只介绍部分核心内容,详细的讲解请见文章开头的教程:

  • (The root tag)
    • parentassets/minecraft/models 下父模型的路径(不包括扩展名),详细用途见上。(String)
    • textures :确定物品模型的一些材质,其下的标签从 assets/minecraft/textures 开始加载材质(不包括扩展名)。(Compound)
      • layer<#># 是一个从0开始的整数,如 layer0 ,规定物品(狭义的物品,不能被放置的那一种,如木棍、玻璃瓶)的材质。有些物品不止有一个layer(刷怪蛋,药水瓶)。layer的数量是由硬编码规定的,不能修改。(String)
      • (A texture variable) :定义一个材质变量,并为它赋值。标签名为材质变量名称(自定义)。(String)
    • overrides :使用物品标签(Item Tags)确定不同物品状态下物品的模型。(List)
      • (A case) :一个标签。(Compound)
        • predicate :储存多个物品标签。(Compound)
          • (A case) :单个物品标签,此标签的名称为物品标签的名称。物品标签详细列表见下。(String)
        • modelassets/minecraft/models 下的模型路径(不包括扩展名)。从中调用模型。(String)




物品标签(Item Tags)
物品标签的作用类似于方块的状态文件,不是所有的物品都需要物品标签,所有的物品标签:

  • angle :用于指南针。当前指南针的角度,值在0和1之间。
  • blocking :用于盾。玩家用盾格挡时值为1,反之为0.
  • broken :用于鞘翅。当鞘翅损坏(耐久度只剩下1)后,值为1,反之为0.
  • cast :用于鱼竿。若鱼竿抛出钓线,值为1.
  • cooldown :末影珍珠或紫颂果的剩余冷却时间,值在0和1之间。
  • damage :用于有耐久度的物品。物品用掉的耐久,值为 1 - (当前耐久/总耐久) ,值在0和1之间。
  • damaged :用于有耐久度的物品。当物品的耐久度不是100%时,值为1。若该物品的 Unbreakable 标签值为 1 ,damaged标签的值始终为0.
  • lefthanded :当主手设置为左手时,值为1.*
  • pull :用于弓,表示弓的蓄力程度,值在0和1之间。
  • pulling :用于弓。如果正在拉弓,值为1.
  • time :用于时钟。表示当前的时间,值在0和1之间。
注意事项

  • lefthanded 标签:
lefthanded标签判断的依据是主手的设置(默认是右手),而不是当前持有物品的手
例如,游戏设置中将主手设置为左手,此时将一个物品放在副手(右手)上。那么这个物品在右手上使用的模型,仍然是 "lefthanded":1 设置的模型。
假定有以下物品模型 example.json

  1. ...
  2. "overrides": [
  3.                  {"predicate":  {"lefthanded": 0 },"model":"item/right"},
  4.                  {"predicate":  {"lefthanded": 1 },"model":"item/left"}
  5.               ]
  6. ...
复制代码
当主手设置为 右手(默认) 时:双手手持,掉落物,GUI中,展示框上使用的模型都是 right.json ,这是正常的现象。
当主手设置为 左手 时,双手手持,GUI中的模型使用 left.json 。掉落物,展示框上的模型使用 right.json 。这可能是一个BUG,将来也许会修复,测试版本1.12。




  • 相同的物品标签使用不同值时,值 从小到大 排列。
    例子, example.json
  1. ...
  2. "overrides": [
  3.                  {"predicate":  {"damage": 0.1 },"model":"item/sample1"},
  4.                  {"predicate":  {"damage": 0.15 },"model":"item/sample2"},
  5.                  {"predicate":  {"damage": 0.233 },"model":"item/sample3"}
  6.               ]
  7. ...
复制代码
  • 一些用途:
    • 可以通过damage标签,配合游戏中的耐久度,用同一个物品显示多种模型/材质。
    • 根据拉弓的不同程度,改变弓的模型或材质。
    • 更精确地控制钟的时间显示。
    • ......

推荐阅读:

WIKI http://minecraft.gamepedia.com/Model#Item_models   物品模型
WIKI http://minecraft.gamepedia.com/Model#Item_tags   物品标签
编辑器 https://cubik.studio/get    英文,付费
编辑器 http://server.zofenia.de/blockbench/    英文,免费





音效
音效(Sounds)文件储存在 (资源包名)/assets/minecraft/sounds 中。如果你没有找到这个文件夹,你可以自己创建。

音效文件以 *.ogg 的格式储存。需要用转换软件(网上很多)对其它格式的音效进行转换。

同时,可以使用 playsound 命令来播放任意音效,来增进游戏气氛,达到特殊效果(枪声,拾取音效等)。


原版音效

替换原版音效
若要替换原版的音效,请参照以下网址,按照树状图创建文件夹或命名ogg文件。
sounds 文件夹顺序:http://minecraft.gamepedia.com/Resource_pack/Folders  

原版sounds文件夹下载。可直接放入资源包中,替换需要的音效文件。(感谢 pca006132 的提供)
http://pan.baidu.com/s/1pLNpgPd  


提取原版音效
原版的音效文件存放在 (游戏目录)/.minecraft/assets

  • indexes 文件夹储存音效文件的索引。
  • objects 文件夹储存音效文件。
打开indexes文件夹中 (版本号).json

  1. {
  2.   "objects": {
  3.     "minecraft/sounds/mob/stray/death2.ogg": {
  4.       "hash": "d48940aeab2d4068bd157e6810406c882503a813",
  5.       "size": 18817
  6.     },
  7.     "minecraft/sounds/mob/husk/step4.ogg": {
  8.       "hash": "70a1c99c314a134027988106a3b61b15389d5f2f",
  9.       "size": 9398
  10.     },
  11. ...
复制代码
稍作分析可以得知,

音效文件路径: (资源包名)/assets/minecraft/sounds/mob/stray/death2.ogg
hash 值: d48940aeab2d4068bd157e6810406c882503a813
文件大小: 18817 B

知道这些信息后,我们就可以在objects文件夹中寻找音效文件了。

  • 1.取 hash 值的前两位作为objects文件夹的二级目录。(如 sounds/mob/stray/death2.ogg 的hash值前两位是 d4 ,那么音效文件就在 objects/d4 中)
  • 2.找到以hash值命名的文件,修改扩展名为ogg则为音效文件。
同理, sounds/mob/husk/step4.ogg 则是 objects/70/70a1c99c314a134027988106a3b61b15389d5f2f 文件。


添加自定义的音效
自定义的音效存放在 (资源包名)/assets/minecraft/sounds 中,以*.ogg格式保存,文件名随意,但要和 sounds.json 文件对应。


sounds.json 文件
sounds.json 文件储存 (资源包名)/assets/minecraft 下。如果有自定义音效,就需要自己创建此文件。

主要JSON格式:

  • (The root object) (Compound)
    • (A sound event) :单个音效事件,标签名称为音效时间名称。确定音效事件(Sound Event)名。通常为 储存路径.文件名 。详见WIKI.(Compound)
      • category :规定音效文件的种类,以便在游戏中使用。(String) *
      • sounds :确定此音效事件使用的音效文件,触发音效事件后随机选取一个音效播放。(List)
        • (A sound file) :单个音效文件。(Compound)
          • nameassets/minecraft/sounds 下的音效文件路径(不包括扩展名)。(String)
          • stream :值为  true/false ,确定音效是否以流(Stream)的形式从文件中读取。推荐设置为true防止音效卡顿。默认为false.(String)




注意, category 标签只允许以下几个值:

  • ambient
  • weather
  • player
  • neutral
  • hostile
  • block
  • record
  • music
  • master
  • voice
推荐阅读:



playsound 命令
主要格式:

  1. playsound <sound> <source> <player> [x] [y] [z] [volume] [pitch] [minimumVolume]
复制代码
其中, <sound> 是音效事件名,即上文 (A sound event) 标签的名称,
<source> 则是音效种类,即上文 category 标签的值。

简单的例子:
现在在 (资源包名)/assets/minecraft/sounds 下存有一 自定义的 音效文件 european.ogg
我们想让它在游戏中播放,作为中奖音效。那么 assets/minecraft 下的 sounds.json 可以这样写:

  1. {
  2.     "getprize": {
  3.         "category": "record",
  4.         "sounds": [
  5.             {
  6.                 "name": "european",
  7.                 "stream": true
  8.             }
  9.         ]
  10.     }
  11. }
复制代码
然后在游戏中,使用 playsound 命令向玩家 Steve 播放:

  1. playsound getprize record Steve
复制代码
这样玩家 Steve 就能听到中奖后的音效了。playsound命令其它部分参数的作用可详见WIKI.

推荐阅读:


同样,也可使用 stopsound 命令关闭音效:

  1. stopsound <player> [source] [sound]
复制代码
其中的 [source] , [sound] 必须和 playsound 命令中(或sounds.json中)的一致。



Loot table
战利品表(Loot table),是一个对地图制作非常有用的功能。
它能够随机物品,作为生物掉落、箱子随机生成以及进度奖励。
最重要的地方在于Loot table拥有很多的函数(Function),可以随机一些NBT属性,如附魔、Attributes等。这些如果需要命令来给予的话会非常的繁复。

战利品表可以自定义,只需要根据下文指出的架构编写JSON文件并将JSON文件放于 (地图)/data/loot_tables/(命名空间)/路径 里,这方式和命令函数类似。

如果把战利品放在命名空间为 minecraft ,路径和原版相同名称的战利品表一样的地方,则会覆盖该原版战利品表。

这文件需要使用JSON格式


结构
  • (Loot table根标签)
    • pools : 随机池列表。使用此战利品表的时候每个随机池都会执行一次
      • 一个随机池(见下)


调用战利品表生成物品时,游戏会尝试逐个随机池执行。


随机池
  • (一个随机池)
    • conditions : 一堆使用此随机池的条件。必须全部符合才会执行本池。List。
      • 一个condition(见下)
    • rolls : 指定会在entries里随机抽取多少次。(每次只会抽取符合条件的entry。)整数。
    • rolls : 在下方范围内选择一个随机数,决定会在entries里随机抽取多少次。
      • min : 随机数的下限,也就是说随机数不会小于这个数(但可以等于)。整数。
      • max : 随机数的上限,也就是说随机数不会大于这个数(但可以等于)。整数。
    • bonus_rolls : 每点幸运值增加roll的次数,向下取整数。浮点数。默认为0。可以为负数。
    • bonus_rolls : 在下方范围内选择一个随机数,决定每点幸运值增加roll的次数,向下取整数。浮点数。可以为负数。
      • min : 随机数的下限。浮点数。
      • max : 随机数的上限。浮点数。
    • entries : 随机项目列表。
      • 一个entry。


逐个随机池执行时,游戏会首先看看是否符合此随机池指定的所有条件,如果符合则继续,不符合则继续下一个随机池(或完成执行,如果已经没有其他随机池)。

游戏会根据指定玩家的幸运值计算出额外的rolls( bonus_rolls*luck ),然后随机执行 roll + bonus_rolls*luck 次选择合适的随机项目(不会选择到不符合条件的随机项目,可以重复选择)。


随机项目
  • (一个随机项目)
    • conditions : 一堆使用此随机项目的条件。必须全部符合才会选择本项目。List。
    • type : 指定此随机项目的类型。字串。可能数值有:
      • loot_table : 调用别的战利品表。(把该战利品表随机出来的物品当此项目的奖励)
      • item : 随机物品。最常用的类型。
      • empty : 就是抽到空箱子了,不给任何奖励。这个看似无用,实际上可以用此来做到加权的随机rolls数量。
    • name :
      • 如果 typeitem ,则填写给予的物品id,如 minecraft:stone 。默认物品数量为1。
      • 如果 typeloot_table ,则填写调用的战利品表名称。 (命名空间):路径 。请看战利品表名称部分,
    • functions : 如果 typeitem ,则对给予的物品执行特定函数,随机附魔、attributes、数量等等。注意函数的次序非常重要,游戏会顺序执行函数,所以一些修改物品数据的函数应该在如 set_count 函数后执行,否则便会出错。
      • 一个函数(见下)
    • weight : 此随机项目的权重。随机项目被选择的几率= 此项目权重/整个随机池的所有随机项目权重的加总 。整数。
    • quality : 每点幸运值对该项目的权重增值,加完后向下取整数。整数。


条件(Condition)
  • (一个条件)
    • condition : 条件的名称,如 entity_properties
    • ...: 其他条件的标签。

比如有一个条件叫作 entity_scores 。其描述是这样的:

  • entity_scores  - 检测一个实体的记分板分数。
    • entity : 需要检测的实体。 this 为这个死掉的实体(如果这是生物掉落的战利品表), killer 为检测杀死该实体的实体, killer_player 为检测杀死该实体的玩家。
        如果指定了 killerkiller_player 但不存在这实体,则此条件不满足。
    • scores : 需要检测的分数。所有分数都需要满足才算满足此条件。如果指定变量不存在的话则算作不满足。
      • <记分板变量名称> : 标签名称为记分板变量名称。指定实体的分数必须为此分数才算满足此条件。整数
      • <记分板变量名称> : 标签名称为记分板变量名称。指定实体的分数必须在此范围才算满足此条件。
        • min : 最小分数。
        • max : 最大分数。



里面的 entity 以及 scores 就是条件的其他标签。

假设我们要检测杀死生物的玩家的分数 test 为30-40, test2 为1分,我们可以这么写:(只写出一个condition)

  1. {
  2.     "condition": "entity_scores",
  3.     "entity": "killer_player",
  4.     "scores": {
  5.         "test": {
  6.             "max": 40,
  7.             "min": 30
  8.         },
  9.         "test2": 1
  10.     }
  11. }
复制代码
那些条件的详细列表还请参照 https://minecraft.gamepedia.com/Loot_table#Conditions


函数(Function)
  • 一个函数
    • function : 函数名称。
    • conditions : 使用此函数的条件列表。
      • 一个condition。
    • ...其他的函数标签。

举个例子。

  • enchant_randomly : 随机选择一个附魔,如果该附魔拥有多个等级(玩家能够附魔的等级)则随机选择一个等级。
    • enchantments : 可供选择的附魔名称。如果被忽略,则从所有附魔中随机附魔。

其中的 enchantments 就是其他的函数标签。

假设我们需要随机附魔保护或火焰保护,我们可以这么写:(只写出一个函数)

  1. {
  2.     "function": "enchant_randomly",
  3.     "enchantments": [
  4.         "protection",
  5.         "fire_protection"
  6.     ]
  7. }
复制代码
那些函数的详细列表还请参照: https://minecraft.gamepedia.com/Loot_table#Functions


战利品表名称
战利品表的名称为 (命名空间):路径 ,路径不包括文件扩展名。与命令函数类似。

比如路径在 data/loot_tables/test/test1.json 的战利品表,调用时其名称为 test:test1


使用
生物掉落可以设置 DeathLootTable ,数值为战利品表名称。这样生物死亡时就会掉落指定战利品表的奖品。

箱子和箱子矿车可以设置 LootTable ,数值为战利品表名称。这样箱子打开时就会生成指定战利品表的物品(物品会被随机放置在不同格子内),取代原先的物品

注意: 箱子和箱子矿车被打开时,战利品表会被设置为无,如果这时候被重新设置战利品表的话就会马上刷新箱子内容。高频的话甚至会造成以下情况:




参见
本章不是一个详细讲解战利品表的章节,因为目前已经有很详细的教程覆盖了战利品表的各种使用。

请参见2b的教程: http://www.mcbbs.net/thread-619468-1-1.html




进度
进度(Advancements)是Minecraft在1.12加入的新系统,替代了旧有的成就(Achievement)系统。
进度除了能引导玩家进行游戏外,有以下特别的地方:

  • 能够自定义。玩家能够自定义进度,只需要根据下文指出的架构编写JSON文件并将JSON文件放于 (地图)/data/advancements/(命名空间)/路径 里,这方式和命令函数类似。自定义的功能也非常强大,详见下方的介绍。
  • 更为精美的界面。进度有一个独立的界面,里面有不同的选项卡(Tab),显示进度树(Tree),每个进度都有图标、标题、描述,选项卡的背景也能自定义。
  • 完成奖励。能够定义完成进度时获得的奖励。
进度虽然是以树(Tree)形式显示的,大部分进度也有其父进度,然而不需要先达成父进度也能达成之后的子进度。换句话说,玩家能以任何次序获得进度。
每个玩家的每个进度只能获得一次,除非被人使用命令删除了该玩家的该进度。
进度的判据(Criteria)不在乎完成时间,只要完成的判据符合要求(Requirements),就可以完成该进度。

如果把进度放在命名空间为 minecraft ,路径和原版相同名称的进度一样的地方,则会覆盖该原版进度。

地图制作中,我们除了利用进度引导玩家游戏以外,我们也会使用进度当作检测方法,检测玩家行为

常见类型
本章节的JSON格式将会以列表方式列出,类型会在描述里说明(compound除外)。

温馨提示:别直接使用浮点数检查数值,如果那是一个浮点数,请使用其范围(浮点数)版本。


范围
  • key name (标签名称)
    • max : 最大数值,类型为(类型)。
    • min : 最小数值,类型为(类型)。

(类型)代表了视乎引用时怎么写。比如 类型为 范围(整数) ,则类型为整数; 类型为 范围(浮点数) ,则类型为浮点数。


实体格式(Entity)
  • Entity
    • distance
      • absolute : 绝对距离,即  距离^2 = x^2 + y^2 + z^2 ,其中 ^ 代表次方,x y z 代表相应轴上的距离。类型为 范围(整数)。
      • horizontal : 平面距离,即  距离^2 = x^2 + z^2 。类型为 范围(整数)。
      • x : x轴上的距离。类型为 范围(整数)。
      • y : y轴上的距离。类型为 范围(整数)。
      • z : z轴上的距离。类型为 范围(整数)。
    • effects
      • <minecraft:效果名称> ,一个效果,以其效果名称为标签名称。(需要 minecraft: 前缀)
        • amplifier : 效果倍率,整数int。(如果需要检测范围请使用下一个标签)
        • amplifier : 效果倍率。类型为 范围(整数)。
        • duration : 时间(秒数),整数int。
        • duration : 时间(秒数)。类型为 范围(整数)。

    • location : 检测实体位置相关信息。类型为 位置。
    • nbt : 检测实体NBT,类型为字串。(NBT的格式就是命令里的检测格式,Base tag为 entity ,如 "{CustomName:\"test\"}"
    • type : 实体ID,需要 minecraft: 前缀,类型为字串。


物品格式(Item)
  • Item
    • count : 物品数量。整数int。
    • count : 物品数量。范围(整数)。
    • data : 物品数据值。整数int。
    • durability : 物品耐久度。整数int。
    • durability : 物品耐久度。范围(整数)。
    • enchantments : 附魔列表。子标签为compound。
      • (一个附魔)
        • enchantment : 附魔id(需要加上 minecraft: 前缀)。字串。
        • level : 附魔等级。整数int。
        • level : 附魔等级。范围(整数)。

    • item : 物品ID。(需要加上 minecraft: 前缀)。字串。
    • nbt : 物品NBT。Base tag为 tag ,如 "{display:{Name:\"distilled water\"}"} 。字串。
    • potion : 药水ID。参见https://minecraft.gamepedia.com/Potion#Item_data。字串。


位置格式(Location)
  • location
    • biome : 实体在于的生态群系ID。类型为字串。
    • dimension : 实体在于的世界。类型为字串。
        只接受  overworld ,  the_end  及  the_nether。
    • feature : 实体在于的结构。类型为字串。
        只接受 EndCity ,  Fortress ,  Mansion ,  Mineshaft ,  Monument ,  Stronghold ,  Temple  及  Village。
    • position
      • x : 实体的x坐标。类型为浮点数。
      • x : 实体的x坐标。类型为 范围(浮点数)。
      • y : 实体的y坐标。类型为浮点数。
      • y : 实体的y坐标。类型为 范围(浮点数)。
      • z : 实体的z坐标。类型为浮点数。
      • z : 实体的z坐标。类型为 范围(浮点数)。



伤害类型(Damage type)
  • damage type
    • bypasses_armor : 伤害是否不能被阻挡。类型为布尔值(True/False)。
        伤害来源包括: 火焰,窒息(方块及世界边界),实体挤压(范围内太多实体),溺水,饥饿,掉落,撞墙(飞行时),虚空(掉落虚空及/kill命令),重新计算血量(比如超出了上限),魔法伤害,凋零伤害。
    • bypasses_invulnerability : 伤害是否能伤害无敌的玩家(创造模式)。类型为布尔值。
        伤害来源只有虚空伤害(包括掉落虚空及 kill 命令)。
    • bypasses_magic : 伤害是否来自饥饿。类型为布尔值。
    • direct_entity : 直接伤害来源(实体,如 箭、火球等,不在乎是谁射出的)。类型为 实体。
    • is_explosion : 检查伤害是否来自爆炸。类型为布尔值。
        伤害来源包括: 爬行者,TNT,矿车TNT,地狱幽灵火球,床(在地狱睡时会爆炸),凋灵,凋灵之首。
    • is_fire : 检查伤害是否来自火焰。类型为布尔值。
        伤害来源包括: 站在火焰方块里,整个人着火,在熔岩里,在岩浆块上,恶魂火球,烈焰人火球。
    • is_magic : 检查伤害是否来自魔法。类型为布尔值。
        伤害来源包括: 闪电,瞬间伤害,中毒,守卫者的部分射线伤害(部分算作生物伤害),唤魔者的尖牙攻击,无主的凋灵之首(unowned wither skulls, 通过 summon 命令生成的, 因为凋灵发射的凋灵之首算作生物伤害)
    • is_projectile : 检查伤害是否来自投射物。类型为布尔值。
        投射物包括: 烈焰人火球 ,末影龙火球,恶魂火球,羊驼的口水,箭(所有),射出的火焰弹,丢出的蛋,丢出的雪球,凋灵之首。
    • source_entity : 伤害来源(实体)。类型为 实体。
        如果是投射物的伤害,则需要视乎该投射物有没有"主人",也就是射出此投射物的实体。如果有,则算作该主人造成的伤害,否则则算作该投射物的伤害。
        如果是中毒这类伤害,则不会被算作是实体造成的伤害(即使是由女巫扔出的药水)。


伤害(Damage)
  • damage
    • blocked : 检查伤害有没有被成功阻挡。类型为布尔值。
    • dealt : 检查原始伤害数值(不计算伤害减免)。类型为浮点数。
    • dealt : 检查原始伤害数值(不计算伤害减免)。类型为范围(浮点数)。
    • direct_entity : 直接伤害来源(实体,如 箭、火球等,不在乎是谁射出的)。类型为 实体。
    • source_entity : 伤害来源(实体)。类型为 实体。
        如果是投射物的伤害,则需要视乎该投射物有没有"主人",也就是射出此投射物的实体。如果有,则算作该主人造成的伤害,否则则算作该投射物的伤害。
        如果是中毒这类伤害,则不会被算作是实体造成的伤害(即使是由女巫扔出的药水)。
    • taken : 检查实际受到的伤害(计算伤害减免后)。类型为浮点数。
    • taken : 检查实际受到的伤害(计算伤害减免后)。类型为范围(浮点数)。
    • type : 检查伤害的类型。类型为 伤害类型。


criteria及requirements
Advancement 里也使用criteria及trigger,翻译也和记分板变量里的一样,然而这些并不是记分板的元素。


criteria格式
criteria(判据)格式:

  • (Advancement根标签)
    • criteria : 一堆判据,类型为compound。
      • <criteria name> : 一个判据。标签名称为自定义判据名称(命令里及requirements可能需要使用,建议使用有意义的名称),类型为compound。
        • trigger : 判据的触发器,指定这判据会检查什么。类型为字串
        • conditions : 判据的详细条件。不同触发器会有不同条件,此处就不详细列出。类型为compound。
            不一定存在。比如 minecraft:impossible 这个trigger并没有conditions。



触发器及其详细条件可以在 https://minecraft.gamepedia.com/Advancements#List_of_triggers 找到。
Conditions里可能使用上述常见格式,如 Damage tags 代表伤害, Tags common to all items 代表物品格式等。
阅读wiki的JSON架构和阅读NBT类似,标签左边都会有个图标表示标签类型,如果分不清则可以把鼠标悬浮在该图标上,这样会显示该标签类型。

我们以以下两个触发器为例子:



比方说第一个我们希望检查吃了一个名字为 毒苹果 的苹果。
我们会这样写(假设判据名称为 ate_poison_apple ):

  1. {
  2.     "criteria": {
  3.         "ate_poison_apple": {
  4.             "trigger": "minecraft:consume_item",
  5.             "conditions": {
  6.                 "item": "minecraft:apple",
  7.                 "nbt": "{display:{Name:"毒苹果"}}"
  8.             }
  9.         }
  10.     }
  11. }
复制代码



然后如果我们只想让命令能够给予这进度,我们会使用 minecraft:impossible 这触发器。

  1. {
  2.     "criteria": {
  3.         "impossible": {
  4.             "trigger": "minecraft:impossible"
  5.         }
  6.     }
  7. }
复制代码

requirements
如果我们想做复杂一些的判断,比如说有多个选项,每个选项需要达成一堆条件,那么我们应该怎么做呢?
方法就是使用requirements。(不过如果是全部判据都需要达成的话就不需要写requirements)。

  • (Advancement根标签)
    • requirements : (所有 子列表都要符合要求才算完成)
      • (一个列表)。(任何 一个子标签符合就算整个列表符合要求)
        • 一个判据名称,字串。



其实requirements是一个 合取范式,也就是一堆or的and。
比如说

  1. (a or b) and (c or d or e)
复制代码
这就是一个合取范式了。
写成requirements就是

  1. {
  2.     "requirements": [
  3.         ["a", "b"],
  4.         ["c", "d", "e"]
  5.     ]
  6. }
复制代码
这样,我们只需要达成a或b其中一个判据,以及c或d或e其中一个判据,就能获得该进度。
如我们达成了a和c就能获得该进度。然而获得a和b就无法获得该进度。




注意,我们写 a and (b or c) 这种式子的时候,a是得放进独立的一个列表里的,即使式子里并没有任何括号

  1. {
  2.     "requirements": [
  3.         ["a"],
  4.         ["b", "c"]
  5.     ]
  6. }
复制代码
理论上所有逻辑式子都能写成合取范式,然而我们有两个主要限制:

  • Advancements没有not
  • 写出来的合取范式多长就不知道了
所以建议如果那逻辑比较复杂,发现很难写成合取范式甚至里面就有not的运算,那么就可以试试使用命令检查条件然后手动添加进度。


显示相关
显示格式

  • (advancement根标签)
    • display (可选,不存在则该进度不会以任何方式显示)
        注意,如果填写了display,里面的标签除非有默认数值或特别指明可选,否则都必须填写。
      • icon : 进度的图标,在弹出提示及进度界面里显示。(其实就是个物品贴图)
        • item : 物品ID,需要有 minecraft: 前缀。字串。
        • data : 物品数据值。整数。
      • title : 进度的标题。字串。(如果需要使用样式请使用下一个类型)
      • title : 进度的标题。CompoundJSON文本)。
          可以使用样式及点击事件。(点击事件只会在聊天栏公布玩家获得进度时点击生效)
      • description : 进度的描述。字串。(如果需要使用样式请使用下一个类型)
      • description : 进度的描述。CompoundJSON文本)。
          可以使用样式,但不能使用点击事件。
      • frame : 进度图标的外框,默认为 task 。外框将会在下文详细列出。
      • background : 指定此进度选项卡背景的路径。只对根进度有效(即无parent标签)。将会在下文讲解。字串。
      • show_toast : 是否在完成此进度后在屏幕右上方显示提示信息。默认为显示(True)。布尔值。
      • announce_to_chat : 是否在完成此进度后在聊天栏广播信息。默认为显示(True)。布尔值。
      • hidden : 是否在进度选项卡里隐藏此进度及之后的子进度(直至完成此进度才会被显示)。对根进度无效。默认为False。布尔值。
    • parent : 指定进度的父进度名称(只对显示有作用)。字串。可选。


进度提示信息
获得进度时,如果 show_toasttrue ,则会在窗口右上方显示一条信息,很快便会消失。





而如果 announce_to_chattrue ,则会在聊天栏显示信息。有颜色的部分为进度的标题,颜色因 frame 的不同而改变,把鼠标悬浮在进度标题上能显示进度描述,点击能触发 titleclickEvent



进度界面

这是进度的界面。最大的部分展示的是选择了的进度选项卡(Tab)。
每个根进度都会有其独立选项卡。
选项卡界面上方有一个个按钮,其图标就是该选项卡根进度的图标,悬浮会显示其标题,点击即能切换选项卡。选项卡名称为根进度的 title


背景
选项卡的背景能够被根进度自定义,会使用指定路径的图片把背景重复填满整个背景。
路径为: namespace:path ,如果无指定namespace则默认 minecraft
Namespace,即命名空间,为资源包 assets 下的文件夹名称,一般情况下为 minecraft 。不过其实是可以加入别的命名空间的。
而path即资源包 assets/(namespace)/ 后的路径,包括文件扩展名(如 .png 等)。
如果我们不指定命名空间,或使用 minecraft 命名空间,我们可以使用游戏原有资源作为背景图片,如物品材质。

如background为 test:1.png ,而地图文件里有一个 resources.zip 的内容为

  1. + resources.zip
  2.     + pack.mcmeta
  3.     + assets
  4.         + test
  5.             + 1.png
复制代码
假设 1.png 为黑人问号,我们会有以下结果:


图片在进度背景里会被缩小并且重复填满整个背景,所以请小心使用,建议使用一些简单点的背景。


图标外框
图标名称
task
goal
challenge
未完成则灰色,完成则咖啡色


父进度
进度可以指定父进度。
父进度在进度选项卡里会放在子进度的左边,并以线连着子进度。
多个子进度可以有同一父进度,换句话说就是一个父进度可以有很多个子进度。
不过一个子进度不可以有很多个父进度。

当我们说一个进度的进度,我们是说该进度的父进度。当我们说前的所有进度,我们是说该进度的父进度、父进度的父进度,如此类推,但不包括前方进度的其他子进度。简单点来说就是前方一条直线直至根进度(没有父进度的进度)。

从钻石剑图示的进度开始,其所有前方的进度。可见是不会有分支的。


而我们说之后的所有进度,就代表从此进度出发,此进度的子进度、子进度的子进度,如此类推。当中是包括分支的。而之后第n层进度就代表我们看多少次子进度。比如说之后的两层进度,就包括此进度的子进度,以及子进度的子进度。

从铁锭图示开始,之后的所有进度。假如是之后的两层进度,则只包括6个进度(到了图示为盾牌、黑曜石及钻石的进度即停止)。


当一个父进度被完成时,进度面板中就会显示该父进度前的所有进度(除了 hidden 的)及后两层的进度。

如果父进度设置了 hidden:true ,自己以及之后所有子进度都会从界面中隐藏,直至父进度被完成,或子进度被完成(会显示前方没 hidden 的进度以及出现一条线跨越父进度的位置,只有父进度仍然会被隐藏)。假如一个父进度没有 display 标签,表现则和 hidden 类似,只是父进度永远也不可能被显示。

没有父进度的进度就是根进度。会自己拥有一个选项卡。
选项卡只有当玩家拥有根进度的时候才会被显示,不论是否 hidden
如果根进度没有 display 标签,则整个选项卡都不会被显示,换句话说就是我们不能看到其子进度在进度的面板出现。


rewards
进度奖励格式

  • (进度根标签)
    • rewards
      • recipes : 一列表的合成配方名称。类型为字串列表。
          即为玩家解锁指定列表的所有合成配方。
      • loot : 一列表的loot table名称。类型为字串列表。
          即执行loot table,抽取奖励。
      • experience : 给予玩家一定数量(固定不是随机)的经验。类型为整数。
      • function : 命令函数名称。字串。
          即以获得进度的玩家为执行者,在当前坐标执行命令函数。
          除了可以用作给予奖励,还可以当作事件使用。



命令
  1. advancement <grant|revoke> <玩家> <only|until|from|through> <进度名称> [判据]
复制代码
  • <grant|revoke>
    • grant 就是给予进度/判据。
    • revoke 就是移除进度/判据。
  • <玩家> : 需要给予/移除进度/判据的玩家。
  • <only|until|from|through>
    • only : 只给予相应的进度/判据。
    • until : 给予指定进度及之前的所有进度,也就是所有左边连着此进度的进度。
        顺序为: 进度的父进度,进度的父进度的父进度...根进度,此进度。
    • from : 给予指定进度及之后的所有进度。
        顺序为: 指定进度,进度的子进度,进度的子进度的子进度...
        然而由于一个进度可以有多个子进度,而子进度间的顺序在不同作业系统所有不同,所以顺序不能被确定。
    • through : 给予制定进度之前及之后的所有进度。类似分别执行 untilfrom 。次序为先执行 until ,然后执行 from
  • <进度名称> : 指定的进度(用途看上方参数)。
      和命令函数的命名方法类似, (命名空间):(路径) ,路径不需要写上文件扩展名。如 minecraft:adventure/adventuring_time
  • [判据] : 可选。如果指定则只给予/移除指定进度的指定判据。否则则直接给予/移除指定进度。



  1. advancement <grant|revoke> <玩家> everything
复制代码
这个就不用多说了,给予或移除指定玩家的所有进度,不论命名空间。




  1. advancement test <玩家> <进度名称> [判据]
复制代码
检测指定玩家有没有获得指定进度。如果指定了判据则只检测玩家有没有达成指定判据(如果获得了进度则肯定达成了指定判据)。
当玩家获得了指定进度/判据时成功,没有则失败。



由于页面有特殊效果,请查阅原页面
点击这里