索引
概观
简介
1.12开始,成就(achievement,现在改叫advancement)已经从代码中分离出来,成为独立的json文件了。这让地图作者,modder和服主可以按照他们的喜好修改和添加advancement。
advancement有众多的选项,可以使用从玩家的物品栏到所在的生物群系的触发器。还可以设置达成后的奖励,例如解锁配方,获得物品或者经验。一个新指令/advancement也被加入来配合这些文件。
advancement使用json格式 http://json.org/ 在外部文件里保存advancement的信息。
JSON结构
以下是advancement文件里的所有可能键值(key)
{
"criteria": {
"custom_trigger_name": {
"trigger": "namespace:trigger_name",
"conditions": {
"slots": {
"occupied": 1,
"occupied": {"min":1,"max":1},
"full": 1,
"full": {"min":1,"max":1},
"empty": 1,
"empty": {"min":1,"max":1}
},
"items": [
{
"item": "minecraft:stone",
"count": 1,
"count": {"min":1,"max":1},
"data": 1,
"data": {"min":1,"max":1},
"potion": "minecraft:invisibility",
"enchantments": [
{
"enchantment": "minecraft:sharpness",
"levels": 1,
"levels": {"min":1,"max":1}
}
]
}
],
"item": {
"item": "minecraft:stone",
"count": 1,
"count": {"min":1,"max":1},
"data": 1,
"data": {"min":1,"max":1},
"potion": "minecraft:invisibility",
"enchantments": [
{
"enchantment": "minecraft:sharpness",
"levels": 1,
"levels": {"min":1,"max":1}
}
]
},
"levels": 1,
"levels": {"min":1,"max":1},
"recipe": "minecraft:chest",
"position": {
"x": 1,
"x": {"min":1,"max":1},
"y": 1,
"y": {"min":1,"max":1},
"z": 1,
"z": {"min":1,"max":1}
},
"biome": "minecraft:void",
"block": "minecraft:stone",
"state": {
"state_name": "state_value"
},
"entity": {
"type": "minecraft:creeper"
},
"distance": 1,
"distance": {"min":1,"max":1},
"parents": [
{
"type": "minecraft:creeper"
}
],
"child": {
"type": "minecraft:creeper"
},
"potion": "minecraft:invisibility",
"level": 1,
"level": {"min":1,"max":1}
}
}
},
"requirements": [["generic_trigger_name"]],
"parent": "namespace:path/to/parent_advancement",
"display": {
"icon": "minecraft:stone_pickaxe",
"title": "Display title",
"frame": "task",
"background": "minecraft:path/to/texture.png"
},
"rewards": {
"recipes": ["namespace:path/to/recipe"],
"loot": ["namespace:path/to/loot_table"],
"experience": 1
}
}
常见的类型:range
advancement大部分的特性都使用了"range"类型,这个类型会将数值(比如物品栏里有的物品数量)和指定的范围作比较。
指定数字
若要判断是否为一个制定的数,只需直接让range为那个数。以下是检查被比较的数是否恰好为3.
"occupied": 3
指定范围
若要判断是否介于两个数之间,range就应当为一格包含了"min" 和 "max"这两个数的object。以下是检查被比较的数是否在1和3之间。
注意: min和max是包含的,min <= X <= max
"occupied": {
"min": 1,
"max": 3
}
你也可单独指定上限或者下限,这将忽视对另一个界限的检测。比如这样可以检测是否有至少3个有东西的格子。玩家即使有7个有东西的格子也符合要求。
"occupied": {
"min": 3
}
相反,这样可以检测是否有至多2个有东西的格子。玩家的物品栏即使有0个有东西的格子也符合要求。
"occupied": {
"max": 2
}
常见的类型:item object
一个item object包括了几个数据来和输入的一堆叠(stack)物品作比较。无论在何地使用,item object的一切的选项都可以使用。
"item"
"item"这个字符串指定了一个物品id。这是检查物品是不是红石粉的方法。
"item_object": {
"item": "minecraft:redstone"
}
"data"
"data"这个range指定了物品的损害值/数据值(damage/data value)。这是检查物品是不是平滑的花岗岩(Polished Granite)。
"item_object": {
"item": "minecraft:stone",
"data": 2
}
"count"
"count"这个range指定了在单独的一个堆叠里的物品个数。这个不能用于检查物品栏中所有物品个数的总和。以下是检查某个堆叠里是否至少有16个物品。
"item_object": {
"count": {
"min": 16
}
}
"potion"
"potion"字符串可以检查物品的NBT中是否有它指定的游戏自带药水效果。也就是物品的Potion tag。wiki的这里 https://minecraft.gamepedia.com/Potion#Item_data 包含了这些id。
"item_object": {
"potion": "minecraft:invisibility"
}
物品不一定是药水。只需要有Potion这个NBTtag。比如这个物品也是符合的。
/give @p minecraft:stone 1 0 {Potion:"minecraft:invisibility"}
"enchantments"
"enchantments"这个list检查物品的附魔。(也就是除了书以外的物品的 ench 标签或者书的StoredEnchantments 标签)如果只指定了一个空object,就是检查玩家的物品栏里是否存在任何一个有附魔的东西。
"item_object": {
"enchantments": [
{
}
]
}
enchantments是附魔物件的列表(list of enchantment object)。以下将会介绍enchantment的标签属性:
enchantment
"enchantment"字符串指定了要检查的附魔id。这是检查锋利附魔的方法。
"item_object": {
"enchantments": [
{
"enchantment": "minecraft:sharpness"
}
]
}
levels
"levels"这个range指定了附魔等级的范围。以下是检查玩家是否有三级或以上的附魔物品的方法。
"item_object": {
"enchantments": [
{
"levels": {
"min": 3
}
}
]
}
也可以和ID组合,这就是检查有没有锋利5的方法。
"item_object": {
"enchantments": [
{
"enchantment": "minecraft:sharpness"
"levels": 5
}
]
}
常见的类型:entity object
一个entity object包含了一些用来和传入的实体比较的数据。只要是使用entity object,以下的选项都可用。
这一大段现在由于MC-115067 https://bugs.mojang.com/browse/MC-115067 统统用不了。
"type"
"type"字符串指定了要判断是不是它的实体id。比如以下是检查传入的是不是爬行者的方式。
"entity_object": {
"type": "minecraft:creeper"
}
修改advancements
Criteria
一个advancement必须通过"criteria"这个物件(object)来指定一组规则来激活advancement。每个物件要带有一个你起的名字,这将会用于 "requirements" 这个list或者 /advancement 指令。每当玩家符合了任何一个criteria,这件事就会被记录。使得玩家可以先后完成这些Criteria而不必同时完成。
每一个Criteria应当包含一个触发器,由"trigger"字符串指定。
如果没有"requirements" ,默认需要完成所有的criteria以获得advancement。
以下的advancement需要"custom_test_name"和 "take_damage" 这两个criteria都成功来获得。(名字可以是任何你喜欢的名字)玩家可以喂养动物,在这之后受伤来完成advancement(或者相反的顺序)。
鉴于没有"requirements",两个criteria必须都满足。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:bred_animals"
},
"take_damage": {
"trigger": "minecraft:player_damaged"
}
}
}
这些criteria的自定义名字只能在这个文件里被使用,而不能在其他的文件里被调用。
Triggers(Criteria的属性)
有些trigger使用更小一些的判据,这些由 "conditions"这个物件(object, Criteria的属性之一)指定。使用哪些conditions由trigger的种类决定,而且不是所有的trigger都有/必须有conditions。
以下是所有能用的trigger,和对应的额外数据。
bred_animals
brewed_potion
construct_beacon
enchanted_item
enter_block
impossible
inventory_changed
location
player_damaged
player_killed_entity
recipe_unlocked
summoned_entity
used_ender_eye
bred_animals
喂养动物
这个触发器在玩家成功喂了两个动物(让它们交配)后触发。比如说,以下是玩家喂了两个在一起的动物。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:bred_animals"
}
}
}
这个有两个condition:"parents" and "child"
parents
"parents"这个list允许你指定一list的entity objects用来和(动物的)父母比对。对每一个list中的object,父母双方都会和它比较,父母中任何一个匹配了都会让这一个object成功。
对于原版游戏,除了马和驴子以外,能够交配的必定具有同样的实体id。所以在这一里指定多个实体id在大多数时候会使得这个无法达成。
这个是检查父母中是否至少有一个是牛的方法。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:bred_animals",
"conditions": {
"parents": [
{
"type": "minecraft:cow"
}
]
}
}
}
}
这个是检查父母中是否有一个是牛,另一个是羊的方法。当然在原版你做不到这一点。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:bred_animals",
"conditions": {
"parents": [
{
"type": "minecraft:cow"
},
{
"type": "minecraft:sheep"
}
]
}
}
}
}
child
"child"这个entity object会和新生的小动物比对。
这个是检查小动物是不是牛的方法。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:bred_animals",
"conditions": {
"child": {
"type": "minecraft:cow"
}
}
}
}
}
你也可以同时指定父母和孩子。比如说,以下就是检查父母中是否有马和驴,而且孩子还要是骡。(虽然这样使得检查父母的工作没有意义了,因为骡子只能由马和驴杂交来出生)
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:bred_animals",
"conditions": {
"parents": [
{
"type": "minecraft:horse"
},
{
"type": "minecraft:donkey"
}
],
"child": {
"type": "minecraft:mule"
}
}
}
}
}
brewed_potion
这个触发器在玩家从酿造台输出栏中拿出任何物品时触发。注意:这不意味着玩家必须酿造过这瓶药水。把药水从随着药水一起出现的酿造台里拿出来(比如末地船里的那个)或者把药水放进输出栏再拿出来都能满足这个触发器。
比如说,这个示例将会在玩家从药水输出栏取出任何物品时激活。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:brewed_potion"
}
}
}
这只有一个condition:"potion"
potion
"potion"字符串可以检查取出的物品的NBT中是否有它指定的游戏自带药水效果。wiki的这里https://minecraft.gamepedia.com/Potion#Item_data 包含了这些id。
这个示例只会在玩家从酿造台输出栏取出一个长效隐形药水时触发。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:brewed_potion",
"conditions": {
"potion": "minecraft:long_invisibility"
}
}
}
}
construct_beacon
这个触发器每当玩家接收到一个来自于信标的药水效果更新触发,而不是在你修建金字塔时。信标不需要有任何的药水效果,但玩家必须在信标生效范围里。信标也不需要放在一个金字塔上!
比如说,接下来的这个示例将会在玩家离信标足够近时触发,不论信标是否提供效果或者有金字塔在下面。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:construct_beacon"
}
}
}
这只有一个condition:"level"。
level
"level"这个range指定了信标的层数,最高是4。比如说这个检查信标在玩家受到药水更新时是否至少有两层。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:construct_beacon",
"conditions": {
"level": {"min": 2}
}
}
}
}
而这个是检查在玩家受到信标的药水更新时信标下面是不是没有金字塔(没有金字塔就触发)。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:construct_beacon",
"conditions": {
"level": 0
}
}
}
}
enchanted_item
这个触发器在玩家再附魔台附魔物品时触发。玩家不需要把附好魔的物品拿走,因为它是在你选择附什么魔的时候触发的。这个就是检查玩家附魔的示例。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:enchanted_item"
}
}
}
此触发器有两个condition:"item" 和"levels"。
item
"item"这个item object用来和附魔的物品对比。注意这个检查是在附魔之前检查的,也就是说你无法用 (item object中的)"enchantments"来检查这次附了什么魔。以下的示例是检查附魔的物品是不是钻石镐。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:enchanted_item",
"conditions": {
"item": {
"item": "minecraft:diamond_pickaxe"
}
}
}
}
}
levels
"levels"这个range指定了在附魔时消耗的等级。比如说再有15个书架的情况下,第三个附魔选项需要30级但只消耗3级。这个condition(限制条件)检查的是消耗的3级。也就是说你无法知道在附魔之前玩家是不是30的等级,但你可以通过命令方块辅助你检查这一点。
这个示例将在你消耗3级附魔时触发。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:enchanted_item",
"conditions": {
"levels": 3
}
}
}
}
enter_block
这个触发器在你的碰撞箱和一个方块重叠时激活,包括空气。也就是说,下面这个永远是激活的,因为你总在方块里。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:enter_block"
}
}
}
这有两个condition: "block" 和 "state"。
"block"
"block"这个字符串指定了检查有没有玩家在里面的方块id。比如说,接下来的示例检查玩家是不是在"minecraft:tallgrass"方块里面。也就是草,蕨和两格高草。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:enter_block",
"conditions": {
"block": "minecraft:tallgrass"
}
}
}
}
state
"state"这个object包含了一列自定义的键值(Block state, 方块状态)。对于"minecraft:tallgrass",方块状态"type"决定了这个方块是哪种植物。使用这个 condition必须有"block"。接下来这个示例检查方块是不是蕨。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:enter_block",
"conditions": {
"block": "minecraft:tallgrass",
"state": {
"type": "fern"
}
}
}
}
}
impossible
这个触发器永远不会激活。在原版中激活它的唯一方法就是使用 /advancement指令。这个极大地补充了命令机制,因为它使得更复杂的要求可以通过命令做到。
比如,如下的advancement,假设他的文件位于"custom:missions":
{
"criteria": {
"mission1": {
"trigger": "minecraft:impossible"
},
"mission2": {
"trigger": "minecraft:impossible"
}
}
}
【此处影射电影《碟中谍》(Mission Impossible)】
那么就能用以下的指令分别地完成每一个指定的criteria,完成整个advancement,但只对于有"winner"的玩家。
/advancement grant @a[tag=winner] custom:missions mission1
/advancement grant @a[tag=winner] custom:missions mission2
这个trigger没有condition。
inventory_changed
这个触发器在玩家的物品栏更新时触发,比如增减物品栏里的东西。注意用右键或者左键拖动物品来分散物品将只被当作一次操作。下面这个将会触发任何物品栏里的东西的增减:
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:inventory_changed"
}
}
}
这个trigger有2个condition:"slots"和"items"。
slots
"slots"这个object包含了物品栏的普通信息。可以有三个range:"occupied"、"full"和 "empty"。护甲栏和副手参与检查。
举个例子,下面这个将会在玩家在物品栏更新时刚好有10个空物品栏的情况下激活。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"slots": {
"empty": 10
}
}
}
}
}
items
"items"这个由item object组成的list中的每一项都会在玩家物品栏里寻找和自己对应的格子。每一项都必须找到对应的格子才算达成。下面这个检查玩家是否在物品栏更新时拥有石头和泥土。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"item": "minecraft:stone",
"data": 0
},
{
"item": "minecraft:dirt"
}
]
}
}
}
}
location
这个触发器每秒(20游戏刻, game tick)检查一次。
尽管(格式上)不必指定conditions,然而某程度上也是必须写conditions的(不写conditions你检查啥啊)。
这个trigger有2个condition:"position"和"biome"。
position
positions物件有"x", "y"和"z" range来检查玩家的位置。
你不需要检查所有轴的坐标。比如只填写y, 则只检查y坐标的数值,而对x和z坐标没有限制。
以下这个例子会检查玩家是否在y=62或更低
{
"criteria": {
"below_sea_level": {
"trigger": "minecraft:location",
"conditions": {
"position": {
"y": {
"max": 62.0
}
}
}
}
}
}
biome
biome字串指定了玩家需要待在的生物群系(biome)。
生物群系id(id = 名称),填写时请在前面加上"minecraft:", 如"minecraft:desert_hills":
"ocean" = "Ocean"
"plains" = "Plains"
"desert" = "Desert"
"extreme_hills" = "Extreme Hills"
"forest" = "Forest"
"taiga" = "Taiga"
"swampland" = "Swampland"
"river" = "River"
"hell" = "Hell"
"sky" = "The End"
"frozen_ocean" = "FrozenOcean"
"frozen_river" = "FrozenRiver"
"ice_flats" = "Ice Plains"
"ice_mountains" = "Ice Mountains"
"mushroom_island" = "MushroomIsland"
"mushroom_island_shore" = "MushroomIslandShore"
"beaches" = "Beach"
"desert_hills" = "DesertHills"
"forest_hills" = "ForestHills"
"taiga_hills" = "TaigaHills"
"smaller_extreme_hills" = "Extreme Hills Edge"
"jungle" = "Jungle"
"jungle_hills" = "JungleHills"
"jungle_edge" = "JungleEdge"
"deep_ocean" = "Deep Ocean"
"stone_beach" = "Stone Beach"
"cold_beach" = "Cold Beach"
"birch_forest" = "Birch Forest"
"birch_forest_hills" = "Birch Forest Hills"
"roofed_forest" = "Roofed Forest"
"taiga_cold" = "Cold Taiga"
"taiga_cold_hills" = "Cold Taiga Hills"
"redwood_taiga" = "Mega Taiga"
"redwood_taiga_hills" = "Mega Taiga Hills"
"extreme_hills_with_trees" = "Extreme Hills+"
"savanna" = "Savanna"
"savanna_rock" = "Savanna Plateau"
"mesa" = "Mesa"
"mesa_rock" = "Mesa Plateau F"
"mesa_clear_rock" = "Mesa Plateau"
"void" = "The Void"
"mutated_plains" = "Sunflower Plains" ("plains")
"mutated_desert" = "Desert M" ("desert")
"mutated_extreme_hills" = "Extreme Hills M" ("extreme_hills")
"mutated_forest" = "Flower Forest" ("forest")
"mutated_taiga" = "Taiga M" ("taiga")
"mutated_swampland" = "Swampland M" ("swampland")
"mutated_ice_flats" = "Ice Plains Spikes" ("ice_flats")
"mutated_jungle" = "Jungle M" ("jungle")
"mutated_jungle_edge" = "JungleEdge M" ("jungle_edge")
"mutated_birch_forest" = "Birch Forest M" ("birch_forest")
"mutated_birch_forest_hills" = "Birch Forest Hills M" ("birch_forest_hills")
"mutated_roofed_forest" = "Roofed Forest M" ("roofed_forest")
"mutated_taiga_cold" = "Cold Taiga M" ("taiga_cold")
"mutated_redwood_taiga" = "Mega Spruce Taiga" ("redwood_taiga")
"mutated_redwood_taiga_hills" = "Redwood Taiga Hills M" ("redwood_taiga_hills")
"mutated_extreme_hills_with_trees" = "Extreme Hills+ M" ("extreme_hills_with_trees")
"mutated_savanna" = "Savanna M" ("savanna")
"mutated_savanna_rock" = "Savanna Plateau M" ("savanna_rock")
"mutated_mesa" = "Mesa (Bryce)" ("mesa")
"mutated_mesa_rock" = "Mesa Plateau F M" ("mesa_rock")
"mutated_mesa_clear_rock" = "Mesa Plateau M" ("mesa_clear_rock")
以下这个criteria会在玩家到沙漠和平原后被激活。
{
"criteria": {
"visit_desert": {
"trigger": "minecraft:location",
"conditions": {
"biome": "minecraft:desert"
}
},
"visit_plains": {
"trigger": "minecraft:location",
"conditions": {
"biome": "minecraft:plains"
}
}
}
}
player_damaged
当玩家受到指定数值的伤害(包括0, 也就是阻挡了伤害时)会被激活。
{
"criteria": {
"visit_desert": {
"trigger": "minecraft:player_damaged"
}
}
}
这触发器有11个conditions: "is_projectile", "is_explosion", "bypasses_armor", "bypasses_invulnerability", "bypasses_magic", "is_fire", "is_magic", "dealt", "taken", "blocked", 和 "source_entity"。能用这些条件筛选玩家受到的伤害(造成伤害的实体,伤害方法等)。
is_projectile
这个布尔值(boolean)检查伤害是否来自弹射物(projectile, 检查projectile标签)。弹射物包括: 烈焰使者火球,终界龙火球,地狱幽灵火球,羊驼的口水,箭(所有),射出的火焰弹,丢出的蛋,丢出的雪球,凋零怪之首。
以下这个例子检查玩家受到伤害不是来自弹射物
{
"criteria": {
"visit_desert": {
"trigger": "minecraft:player_damaged",
"conditions": {
"damage": {
"is_projectile": false
}
}
}
}
}
is_explosion
这个布尔值检查伤害是不是因为爆炸受到的(检查explosion标签)。伤害来源包括: 苦力怕,TNT,矿车TNT,地狱幽灵火球,床(在地狱睡时会爆炸),凋零,凋零怪之首。
以下这个例子检查伤害来源是否是爆炸,及是否因为TNT爆炸造成伤害。
{
"criteria": {
"visit_desert": {
"trigger": "minecraft:player_damaged",
"conditions": {
"damage": {
"is_explosion": true,
"source_entity": {
"type": "minecraft:tnt"
}
}
}
}
}
}
bypasses_armor
这个布尔值检查伤害能否被阻挡(检查unblockable标签)。伤害来源包括: 火焰,窒息(方块及世界边界),实体挤压(范围内太多实体),溺水,饥饿,掉落,撞墙(飞行时),虚空(掉落虚空及/kill命令),重新计算血量(比如超出了上限),魔法伤害,凋零伤害。
以下这个例子检查伤害是否不能被阻挡,伤害值是掉落虚空造成的伤害的值。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:player_damaged",
"conditions": {
"damage": {
"bypasses_armor": true,
"dealt": 4.0
}
}
}
}
}
bypasses_invulnerability
检查伤害是否能伤害无敌的玩家(创造模式)。伤害来源只有虚空伤害(包括掉落虚空及/kill命令)。
以下例子检查伤害是否不来自虚空或/kill命令。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:player_damaged",
"conditions": {
"damage": {
"bypasses_invulnerability": false
}
}
}
}
}
bypasses_magic
检查伤害是否绝对(猜测是不能被装备/效果削弱,然而不确定),即检查damageIsAbsolute标签。伤害来源只有饥饿。
以下这例子检查玩家是否受到饥饿伤害。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:player_damaged",
"conditions": {
"damage": {
"bypasses_magic": true
}
}
}
}
}
is_fire
检查伤害是否来自火焰(检查fire标签)。伤害来源包括: 站在火焰方块里,整个人着火,在熔岩里,在岩浆快上,地狱幽灵火球,烈焰使者火球。
以下这例子检查伤害是否不来自火焰
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:player_damaged",
"conditions": {
"damage": {
"is_fire": false
}
}
}
}
}
is_magic
检查伤害是否来自魔法(检查magicDamage标签)。伤害来源包括: 闪电,瞬间伤害,中毒,守卫者的部分射线伤害,唤魔者的尖牙攻击,凋零头颅(unowned wither skulls, 估计是会给予凋零效果的)
以下这例子会检查伤害是否来自"魔法伤害"
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:player_damaged",
"conditions": {
"damage": {
"is_magic": false
}
}
}
}
}
dealt
这个range检查原始伤害值(在计算装备/效果削减/盾牌阻挡的伤害量前)的量,也就是说和玩家的防护效果及装备对此没影响。
这例子会检查箭可以对玩家造成的伤害,即使实际伤害被削减了或被盾牌阻挡了也不会改变这个值。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:player_damaged",
"conditions": {
"damage": {
"dealt": {
"min": 4.0
},
"source_entity": {
"type": "minecraft:arrow"
}
}
}
}
}
}
taken
这个range检查实际伤害值,也就是玩家实际受到的伤害(在计算装备/效果削减/盾牌阻挡的伤害量后),故此可以和dealt的数值不同。
以下这例子会检查玩家是否受到5点或以上的伤害。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:player_damaged",
"conditions": {
"damage": {
"taken": {
"min": 5.0
}
}
}
}
}
}
blocked
这个布尔值检查伤害是否被完全阻挡(bypasses_armor及unblockable不会是true)。
以下这个例子检查玩家是否不能阻挡箭的伤害。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:player_damaged",
"conditions": {
"damage": {
"blocked": false,
"source_entity": {
"type": "minecraft:arrow"
}
}
}
}
}
}
source_entity
这个entity object检查对玩家造成伤害的实体。
以下这个例子检查玩家是否被僵尸伤害。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:player_damaged",
"conditions": {
"damage": {
"source_entity": {
"type": "minecraft:zombie"
}
}
}
}
}
}
player_killed_entity
当玩家击杀别的实体时会被触发(不包括玩家)。
这个trigger有1个condition: entity。
entity
这个entity object会检查被杀死的实体。
以下这个例子检查玩家是否击杀了一头牛
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:player_killed_entity",
"conditions": {
"entity": {
"type": "minecraft:cow"
}
}
}
}
}
recipe_unlocked
当玩家解锁指定合成配方(recipe, 不确定官方译名)时会被触发。
这trigger有一个必须的condition: recipe,指定该合成配方的文件位置。
注意这只会在收到合成配方时检查。如果玩家在这advancement存在前已经解锁了指定的合成配方,这advancement将不会理会该合成配方(也就是说那玩家无法得到这advancement)。因此你需要删除玩家解锁了的指定合成配方(使用/recipe命令)才能让该玩家能得到此advancement。
这例子会检查玩家是否解锁"minecraft:redstone"(红石)的合成配方(即使是作为另外一个advancement的奖励)。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:recipe_unlocked",
"conditions": {
"recipe": "minecraft:redstone"
}
}
}
}
summoned_entity
当玩家以指定方法生成指定实体时会被触发。方法包括: 生成凋灵(放置方块),生成雪傀儡(放置方块),生成铁傀儡(放置方块),重新生成末地龙(放置水晶)。生成末地龙时,所有能够看到末地龙的玩家都算作满足这条件。
以下这例子检查玩家有没有以以上方法生成实体
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:summoned_entity"
}
}
}
这trigger有1个condition: entity。
entity
这个entity object会检查生成的实体。
以下这例子会检查生成了的实体是否末地龙。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:summoned_entity",
"conditions": {
"entity": {
"type": "minecraft:ender_dragon"
}
}
}
}
}
used_ender_eye
当玩家使用末影之眼的时候触发。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:used_ender_eye"
}
}
}
这trigger有1个condition: distance。
distance
这个range检查最近的要塞(stronghold)的中心点与玩家的x坐标与z坐标距离,不理会y坐标距离。
计算公式为: √((player.x−stronghold.x)2+(player.Z−stronghold.Z)2)
比如玩家在(40, 64, 10),最近的要塞在(120, 25, 400),distance就是 sqrt((40-120)2+(10-400)2)=398
以下这例子检查玩家距离最近的要塞398格或以内使用末影之眼。
{
"criteria": {
"custom_test_name": {
"trigger": "minecraft:used_ender_eye",
"conditions": {
"distance": {
"max": 398
}
}
}
}
}
Requirements
Requirements是一个list,结构为析取範式(disjunctive normal form, DNF),来容许使用布尔逻辑(boolean logic)来决定是否给予指定advancement。这list里有list(list of list),内层list为criteria名称的list(list of string)。
里层的list为与(and),外层为或(or)。必须有两层list。
如果不指定requirements,则需要满足所有criteria。使用这个则可以使用或(or)。
以下这个advancement需要满足trigger_1及trigger_2才会获得此advancement。(trigger_1 and trigger_2)
{
"criteria": {
"trigger_1": {
"trigger": "minecraft:player_damaged"
},
"trigger_2": {
"trigger": "minecraft:used_ender_eye"
}
},
"requirements": [
["trigger_1", "trigger_2"]
]
}
以下这个advancement则当trigger_1或trigger_2满足时即可获得。(trigger_1 or trigger_2)
{
"criteria": {
"trigger_1": {
"trigger": "minecraft:player_damaged"
},
"trigger_2": {
"trigger": "minecraft:used_ender_eye"
}
},
"requirements": [
["trigger_1"],
["trigger_2"]
]
}
display
可选对象display控制显示在Advancements菜单里的信息。如果这个对象不存在,那么此advancement将会被隐藏。
当这个对象存在时,其中必须包含一个title字串和一个icon字串。icon作为图像显示在Advancements目录里,当鼠标移动到icon上时,title的内容会被显示。这里是个例子:
title字串可以为任何文字,但icon字串只能是一个物品ID。
如果这个json内没有parent字段(即为整个选项卡的root项目),那么可以提供一个可选字串background。这将作为所有icon的背景显示。它的值应为一个可被解析到的图片地址。例如这个advancement将会显示金块(来自其方块材质)于背景:
{
"display": {
"title": "Stew",
"icon": "minecraft:mushroom_stew",
"background": "minecraft:textures/blocks/gold_block.png"
},
"criteria": {
"trigger_1": {
"trigger": "minecraft:inventory_changed"
}
}
}
还有一个可选字串frame接受两个可能的值:task和challenge。如果没有被定义,那么默认的值为task。这将改变icon的外框的样式。以下的advancement将会使之使用challenge的外框:
{
"display": {
"title": "Stew",
"icon": "minecraft:mushroom_stew",
"background": "minecraft:textures/blocks/gold_block.png",
"frame": "challenge"
},
"criteria": {
"trigger_1": {
"trigger": "minecraft:inventory_changed"
}
}
}
parent
parent字串指定另一个advancement的文件路径,使之作为此advancement的前置项目存在。这决定了显示于Advancements目录里面的树状图结构。注意,前置advancement并不要求一定在它们的子advancement前完成。
为了让advancement显示在成就树中,display字串必须存在。
给出如下advancement:
{
"display": {
"title": "Take damage",
"icon": "minecraft:diamond_sword"
},
"parent": "minecraft:custom/root",
"criteria": {
"trigger_1": {
"trigger": "minecraft:player_damaged"
}
}
}
上述advancement直接属于"minecraft:custom/root"的分支。这里是实际的显示效果:
你也可以让多个advancement拥有共同的parent: