Minecraft(我的世界)中文论坛

标题: [ CBL | 命令进阶 ]第七章 游戏文件的使用

作者: 719_Lokii    时间: 2017-8-16 19:07
标题: [ CBL | 命令进阶 ]第七章 游戏文件的使用
本帖最后由 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 。原版的所有材质都在这个文件夹内。选择一个你想要修改的材质,并按原路径复制到刚才的资源包文件夹内。






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


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


一些注意事项:

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

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

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





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

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

推荐阅读:

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


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


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

WIKI http://minecraft.gamepedia.com/Resource_pack#Textures


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

修改这类方块/物品时应注意不同材质之间的衔接(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 下有两个标签:

以上是两种常见的标签,若产生紫黑方块,则可能为mcmeta规则文件错误,需要进行检查。  

推荐阅读:

WIKI: http://minecraft.gamepedia.com/Resource_pack#Animation
以及上面的资源包


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

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


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

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

推荐阅读:

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


GUI,字体,地图和画
推荐阅读

生成器: 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 文件夹中。其中的两个材质:


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

同时,也有以下相对应的几个 *.mcmeta 文件:

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



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

本章节的大部分资料来自:

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


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


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

可参考:

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


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

例子们:
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标签
限于篇幅,这里只简述方块模型中的核心部分。详细的讲解请见下文或文章开头的教程贴:


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

可以知道,三个子模型(火把,红石火把,熄灭的红石火把)的形状是一样的(棍子),且只有材质上的不同。所以规定它们 形状 的模型就只需要一个( 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标签
物品模型的大部分标签和方块模型的相似,这里只介绍部分核心内容,详细的讲解请见文章开头的教程:


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

注意事项

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。




  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. ...
复制代码
推荐阅读:

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文件夹中 (版本号).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文件夹中寻找音效文件了。

同理, sounds/mob/husk/step4.ogg 则是 objects/70/70a1c99c314a134027988106a3b61b15389d5f2f 文件。


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


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

主要JSON格式:

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

推荐阅读:

WIKI http://minecraft.gamepedia.com/Sounds.json


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.

推荐阅读:

WIKI http://minecraft.gamepedia.com/Commands#playsound   playsound命令

同样,也可使用 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格式


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


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

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


随机项目

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

里面的 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)
举个例子。

其中的 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)系统。
进度除了能引导玩家进行游戏外,有以下特别的地方:

进度虽然是以树(Tree)形式显示的,大部分进度也有其父进度,然而不需要先达成父进度也能达成之后的子进度。换句话说,玩家能以任何次序获得进度。
每个玩家的每个进度只能获得一次,除非被人使用命令删除了该玩家的该进度。
进度的判据(Criteria)不在乎完成时间,只要完成的判据符合要求(Requirements),就可以完成该进度。

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

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

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

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


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


实体格式(Entity)

物品格式(Item)

位置格式(Location)

伤害类型(Damage type)

伤害(Damage)

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


criteria格式
criteria(判据)格式:

触发器及其详细条件可以在 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)。

其实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. }
复制代码
理论上所有逻辑式子都能写成合取范式,然而我们有两个主要限制:

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


显示相关
显示格式


进度提示信息
获得进度时,如果 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
进度奖励格式


命令
  1. advancement <grant|revoke> <玩家> <only|until|from|through> <进度名称> [判据]
复制代码



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




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



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




作者: langyo_v3    时间: 2017-8-16 19:11
不简单,pca准备带头屠版
作者: brooke_zb    时间: 2017-8-16 19:51
719突然诈尸
我一看,啊哈,材质,模型,声音,这么全#滑稽
喜感的logo
作者: :spgbigfan:    时间: 2017-8-16 20:47
langyo_v3 发表于 2017-8-16 19:11
不简单,pca准备带头屠版

这个就是移植了gitbook嘛,也不是新东西了
作者: xiaosange    时间: 2017-8-22 15:46
唔,不得不佩服这位大佬