17w13a里,整个成就体系发生了巨大的改动……
/achievement命令被重做,新命令为/advancement。
- /advancement <grant|revoke|test> <player> <advancement> [criterion]
目前语言文件有错误,后两个的显示十分有毒。可能这次快照出的非常赶,很快就会发现酱猪蹄不止一处……
作用分别是给予/夺取/检测玩家是否有某个成就项。虽然现在叫它成就已经很不妥当,但是由于叫顺口了不想改了就先这么叫着吧23333
可选参数criterion会匹配某成就项下的某条准则。这些准则和它们的具体内容可以在成就文件中找到。
命令返回信息的语言文件存在同样的问题……
同时这个更改也宣告,过去版本通过检测achievement进行e键检测这个做法废了……真是个悲伤的故事。
加入了新命令/recipe,效果是给予/清除玩家的某个合成配方。
- /recipe <give|take> [player] <name|*>
虽然官方给出的格式如此,但是如果你省略玩家名/选择器就会出现“在执行此命令时出现了未知的错误”,所以我还是没搞懂为什么player是个可选参……
可以用*来指代全部合成配方。
加入了新gamerule:doLimitedCrafting,默认值为false。
当值为true时,玩家将只能合成自己已经有合成配方的物品,无论游戏模式。
加入了物品knowledge_book,目前只能用指令调出,不存在于创造物品栏中。右键使用,会消耗该物品,并使得玩家解锁其携带的配方(怀疑通过触发合成表解锁条件的has_the_recipe)。
可用标签Recipes指定其携带的合成配方,例如:
- /give @p minecraft:knowledge_book 1 0 {Recipes:["minecraft:torch","minecraft:redstone_torch"]}
将给予玩家一本使用后能解锁火把和红石火把合成表的姿势知识之书。
玩家可以自行定义新的成就/合成配方获取方式/合成表。
前两者的自定义文件保存在路径saves\xxxxx\data\advancements下,和loot table、structure一样都是跟着存档走的东西。合成表现在还没有开放比较正常的自定义方式,但文件可以在17w13a.jar\assets\minecraft\recipes下找到。
成就文件的格式如下:
- {
- "display": {
- "icon": "minecraft:glass_bottle", //显示时使用的图标
- "title": "Brew a Potion" //显示名
- },
- "parent": "minecraft:story/obtain_blaze_rod", //父成就(在成就树显示中所属于的成就)
- "criteria": {
- "potion": { //准则名,仅调取用
- "trigger": "minecraft:inventory_changed", //触发要求(种类)
- "conditions": { //触发要求具体内容
- "items": [
- {
- "item": "minecraft:potion"
- }
- ]
- }
- }
- }
- }
每个成就list存在一个root.json,作为整条成就树的根成就存在。只有当根成就被满足,成就树才会在选项/advancement里显示(?)。
定义根成就时不需指定父成就。
合成配方获取方式文件格式如下:
- {
- "rewards": { //获取的合成配方,怀疑能获得别的?
- "recipes": [
- "minecraft:wooden_pickaxe"
- ]
- },
- "criteria": {
- "has_stick": { //准则名
- "trigger": "minecraft:inventory_changed", //触发要求
- "conditions": { //触发要求的具体内容
- "items": [
- {
- "item": "minecraft:stick"
- }
- ]
- }
- },
- "has_the_recipe": {
- "trigger": "minecraft:recipe_unlocked",
- "conditions": {
- "recipe": "wooden_pickaxe"
- }
- }
- },
- "requirements": [ //需求满足的准则,同一个list内的准则需同时满足
- [
- "has_stick"
- ],
- [ //不同list之间并列,只要满足任意一个list即算满足条件
- "has_the_recipe"
- ]
- ]
- }
其中,目前扒出来的trigger有以下这些:
| 名称 | 匹配 | 具体要求 | 内容 |
| minecraft:impossible | 无法完成(?) | / | / |
| minecraft:inventory_changed | 物品栏改变(某种意义 上,获得过该物品) | items,slots:{occupied,full, empty} | item_format,range |
| minecraft:construct_beacon | 构造信标 | level | int |
| minecraft:player_damaged | 伤害相关信息 | damage:{blocked,is_projectile, is_explosion,bypasses_armor, bypasses_invulnerability, bypasses_magic,is_fire,is_magic, dealt(range),taken(range), source_entity(type)} | 没写单位的全是bool |
| minecraft:enchanted_item | 附魔物品 | item,levels | item_format,range |
| minecraft:enter_block | 进入方块 | block,state:{} | block ID,state |
| minecraft:used_ender_eye | 使用末影之眼 | distance(我没猜到具体指啥, 距离最终落点距离?) | range |
| minecraft:summoned_entity | 生成实体 | entity | type |
| minecraft:recipe_unlocked | 配方解锁 | recipe | recipe name |
| minecraft:location | 位置 | position:{x,y,z},biome | range,biome name |
| minecraft:player_killed_entity | 生物击杀 | entity | type |
| minecraft:bred_animals | 动物喂养(包括繁殖和 喂养小动物长大) | parents:[],child | type |
| minecraft:brewed_potion | 药水酿造 | potion | potion name |
| *其中item_format许可内容为{item(string), count(range), data(int), enchantments[{enchantment(string), levels(range)}...], potion(string)} | |||
这玩意儿我感觉和pe的Add-on的准则一个习性……官方写了的你知道可以这么用,然而并不知道到底有哪些用法。
期待后续有人拆了mc。
↑感谢梨子@andylizi 真的就把mc拆了……以其内容对上面的表格做了更新并再次十分感谢。然而就算说了方法我也不会拆23333
由于MC-115067的存在,其中不少项目尚不可用(可被定义,也能正常被显示,但是无法用正常方式完成)。据说下个版本修复。
合成表的定义方式很简洁明了……还是拿木镐做例子吧:
- {
- "type": "crafting_shaped", //是否为有序合成
- "pattern": [ //配方图
- "XXX",
- " # ",
- " # "
- ],
- "key": { //上图中key对应的value
- "#": {
- "item": "minecraft:stick"
- },
- "X": {
- "item": "minecraft:planks"
- }
- },
- "result": { //合成结果
- "item": "minecraft:wooden_pickaxe"
- }
- }
书本/地图的复制不由这种方法指定合成表。至少我找了半天也是没找到。
加了(?)的为存疑内容,困了不想试了果断还是先睡觉……
↑二更一发,后面发现了有趣的细节再继续补充吧↑
附带一个笑一年的mjsb:
来自群组: Command Block Logic
听说这个版本切换成gm2能够清理合成列表
还加了一个新的物品 绿色的书
能够往里面写合成列表 右键就能获得里面写的合成列表
我还找到了/补充以下trigger:(省略前缀minecraft:)
预定义类型 range,其结构为 {min(float), max(float)} 或 value(float)
预定义类型 item_format,其结构为 {item(string), count(range), data(int), enchantments[{enchantment(string), levels(range)}...], potion(string)}
预定义类型 entity,其结构为 {type(string)}
- impossible
无条件,顾名思义的不可能获得 - location
条件:{position{x(range), y(range), z(range)}, biome(string)} - player_killed_entity
条件:{entity(entity)} - bred_animals
条件:{parents[entity...], child(entity)} - brewed_potion
条件:{potion(string)} - inventory_changed
条件:{items[item_format...], slots{occupied(range), full(range), empty(range)}} - enchanted_item
条件:{item(item_format), levels(range)} - enter_block
条件:{block(string),state{}} - player_damaged
条件:{is_projectile, is_explosion, bypasses_armor, bypasses_invulnerability, bypasses_magic, is_fire, is_magic, dealt(range), taken(range), blocked, source_entity(entity)}
(没标明类型的全部为 boolean) - recipe_unlocked
条件:{recipe(string)}
查找方法:
edit:后来发现其实有个叫 m 的类里面集中了所有的trigger,所以其实完全不用一个个找的…………哭
andylizi 发表于 2017-3-31 12:55
我还找到了/补充以下trigger:(省略前缀minecraft:)
预定义类型 range,其结构为 {min(float), max(floa ...
谢谢!!!
你一定是拆了游戏吧!
andylizi 发表于 2017-3-31 12:55
我还找到了/补充以下trigger:(省略前缀minecraft:)
预定义类型 range,其结构为 {min(float), max(floa ...
那个 扔末影之眼有哪些?
chyx 发表于 2017-3-31 21:45
那个 扔末影之眼有哪些?
不清楚。末影之眼的trigger的“判定是否触发”的类(代码里称之为“CriterionInstance”)里,逻辑是这样的:传入一个double,然后判断:
- 如果 distance 的 min * min > 传入的参数,则返回 false
- 如果 distance 的 max * max < 传入的参数 ,则返回 false
- 否则返回 true
关键在于:传入的参数究竟是什么东西,而这个我没找到。。
另:我发现我在筛选250个使用了 md 的类时,漏掉了 recipe_unlocked,已经补进去了。
@langyo 我又发现了一个完全不笨的新查找方法→_→这下不麻烦了吧→_→新方法编辑进去了
话说mjsb是什么……
感谢教程,正在做生成器:

/recipe give Fred minecraft:book
就提示
commands.recipe.unknownrecipe
2656072228 发表于 2017-4-3 08:20
为什么我输入
/recipe give Fred minecraft:book
就提示
语言文件锅,没有在lang里找到对应条目就直接把索引扔给你了。
不过光看这个索引也就够了,book压根就没有合成表啊2333那肯定就unknown recipe了。