本篇教程由作者设定未经允许禁止转载。


[超能物质]自定义任务 - 基础篇-第1张图片


已知问题:添加自定义任务后再删除,如果玩家已有被删除的任务会导致进存档游戏崩溃

使用的模组版本:0.7.8(社区版和官方版理论上通用)

使用的游戏版本:1.12.2(很可惜,1.7.10不支持)


指令介绍

由于任务不能重复接受等问题导致测试比较困难,但好在作者提供了指令 /quest 方便测试。

/quest <行为> [参数] <任务名> [玩家]


<行为>

┣━━ add(直接在玩家任务列表中添加一个任务)

┣━━ remove(在玩家任务列表中移除任务)

┃        ┣━━ all(全部)

┃        ┣━━ active(进行中的任务)

┃        ┗━━ completed(已完成的任务)

┗━━ contract(给予玩家指定任务的任务卡)


如何创建自定义任务

推荐使用 VSCode 编辑,能帮你指出格式问题。如果你是大佬用记事本也是可以的

写中文只是为了方便理解,实际编写时请勿使用中文,中文物品名到游戏中会变成乱码。

[超能物质]自定义任务 - 基础篇-第2张图片截图自 VSCode

你不懂 json 格式?没关系,任务格式是固定的,有了这张图直接去“所有可用的任务类型”章节套模板就行~

比如现在我想让史蒂夫挖一组石头或泥土,然后奖励他一只被命名为炸鸡的烤鸡就可以这么写

{
    "slave_from_siberia": {
        "type": "generic",
        "logic": {
            "type": "mine",
            "mine_count_min": 64,
            "mine_count_max": 64,
            "xp": 1,
            "random": true,
            "blocks": [{
                "id": "stone"
            },{
                "id": "dirt"
            }]
        },
        "rewards": [{
            "type": "item",
            "id": "minecraft:cooked_chicken",
            "nbt": {
                "display": {
                    "Name": "Fried chicken"
                }
            }
        }]
    }
}

这样任务就写好了,现在只需要把文件命名为 custom_quests.json ,然后放进游戏主目录重启游戏就可以加载了!

在创造模式物品栏就可以找到添加的任务,或者使用指令 /quest contract slave_from_siberia 获取

[超能物质]自定义任务 - 基础篇-第3张图片


为你的任务添加文本

现在你肯定注意到了一个问题,那就是任务文本全部都是“空的”,不过这也不用担心,任务会自动指定词条,只需要在本地化文件中自己添加就可以了。

一个任务默认只有三句话,分别是标题、简介和任务,对应为词条:

quest.任务名.title=

quest.任务名.info=

quest.任务名.objective.0=

任务也会提供一些特殊字段,在游戏中会被替换为相应的文本,用来追踪任务进度。可用字段请查看“所有可用的任务类型”章节。

[超能物质]自定义任务 - 基础篇-第4张图片

那文本如何加载呢?大家应该都用过自动汉化更新模组,原理就是通过资源包加载语言文件,我们也可以做个资源包添加自定义任务的文本。

将你的文件保存为 zh_cn.lang ,保存到资源包路径 assets\matteroverdrive\lang ,如果你愿意的话也可以创建 en_us.lang 并翻译为英文。

加载上资源包看看效果这次不用重启游戏

[超能物质]自定义任务 - 基础篇-第5张图片女子


如何修改已有的任务

如果你开的是服务器,那么所有玩家都需要使用你修改过的版本,以及本教程不对修改模组出现的任何问题负责


如何获取任务文件

首先使用压缩软件打开模组文件,并按照这个路径打开:

assets\matteroverdrive\quests

此时你就能找到 quest.json 文件,保存只需覆盖进原路径即可。


将上一步获得的文件解压出来并打开

这个任务要求我们挖掘 1 个钻石矿,我们把它调多一些:

"mine_count_min": 1 → 110,
"mine_count_max": 1 → 510,

现在我们打开游戏试试效果:

[超能物质]自定义任务 - 基础篇-第6张图片Merry!我真的好喜欢你啊!为了你!我要挖331个钻石!

这样就成功修改了原版自带的任务。


所有可用的任务类型

  • kill_creature(杀死生物)

  • collect_item(收集物品)

  • craft(合成)

  • mine(挖掘)

  • event_trigger(触发事件)

  • teleport(传送)

  • place(放置)

  • scan(扫描)

  • interact_block(交互方块)

  • interact_item(交互物品)

  • conversation(对话)


kill_creature(杀死生物)

顾名思义,这个类型的任务要求玩家杀死指定数量的生物。

介绍过的不会再重复介绍,标可选的都可以省去。

已经发现的问题写在备注里了,请谨慎使用。

一些条件可能会冲突

"kill_creature": {                        任务名称
    "type": "generic",                任务模板
    "logic": {                                任务逻辑
        "type": "kill_creature",        任务类型填写在这里
        "regex": "",                        正则表达式?(可选)
        "kill_item": {                    需要使用指定物品杀死生物(可选)(注1)
            "id": "minecraft:apple",
            "count": 1,                    指定物品的数量,默认为 1
            "damage": 0,                指定物品的损伤值,默认为 0
            "nbt": {                        指定物品的 NBT,默认为无
                "display": {
                    "Name": "Pear"
                }
            }
        },
        "explosion_only": false,        需要炸死生物,默认为false(可选)(注2)
        "burn_only": false,                需要烧死生物,默认为false(可选)(注3)
        "shoot_only": false,                需要使用弓箭或枪械杀死生物,默认为false(可选)(注4)
        "children_only": false,            需要杀死该生物的幼崽形态,默认为false(可选)
        "kill_count_min": 1,                任务需求最小值
        "kill_count_max": 2,                任务需求最大值,会在这两个数之间随机选择(注5)
        "xp": 1,                            每个需求的物品完成后给予的经验值,例如这里经验为 180,假设需求的数量是 100
                                            那么完成后可以获得总计 18000 经验值
        "auto_complete": true,            是否自动提交任务并领取奖励,默认为 false(可选)
        "creatures": ["pig", "cow"]        需要杀死的生物(注6)
    },
    "rewards": [{                                    任务奖励(可选)
        "type": "item",                            奖励类型
        "id": "matteroverdrive:rogue_android_part"    物品 ID
    }],
    "contract_market": 100    任务在赏金工会刷新的权重,默认为 0(可选)(注7)
}

备注:

  1. 玩家必须严格按照指定的物品数量和损耗值杀死生物,由于损耗有默认值所以不推荐任务使用有耐久的物品,NBT 同理。

  2. 只有用安装了衰变聚爆矩阵(末日型)升级并调整到 3 档以上的相位能量整流器杀死生物才能检测,其他安装相同升级的枪械以及 TNT 的爆炸无效。

  3. 截止至 0.7.8 版本依然无法被检测。

  4. 用枪械杀死生物时不能安装高能燃烧弹爆裂电磁炮以及衰变聚爆矩阵(末日型)升级。

  5. 0.7.7 及以下版本杀戮任务需求始终是最大值,0.7.8 版本修复。

  6. 杀死生物的列表只会被算在一个任务内!如果你需要玩家分别杀死不同数量的生物请参考进阶教程。

  7. 权重为 0 的任务不会刷新在赏金公会中。

特殊字段:

  • $killCount——已击杀的生物数

  • $maxKillCount——需要击杀的生物数

  • $itemStack——任务中用来击杀生物的物品名,未指定时无效


collect_item(收集物品)

这个类型的任务需要玩家收集指定数量的物品:

"collect_item": {
    "type": "generic",
    "logic": {
        "type": "collect_item",
        "dimension": 0,                    需要在指定维度获取物品,默认为无(可选)(注1)
        "destroy_pickup": false,        拾取时销毁任务指定的物品,默认为 false(可选)(注2)
        "item_count_min": 1,
        "item_count_max": 1,
        "xp": 1,                                默认为 0(可选)(注3)
        "random": false,                随机选择一个物品,默认为 false(可选)
        "any": false,                        列表中的物品都能被检测,默认为 false(可选)
        "auto_complete": true,    (注4)
        "items": [{
            "id": "minecraft:apple"
        }, {
            "id": "minecraft:bread"    random 为 true 时会随机选择一个作为任务目标,否则只会选择最后一个(可选)
        }]
    }
}

备注:

  1. destroy_pickup 为 false 时维度检测失效。

  2. destroy_pickup 为 true 时由于 bug 不会销毁拾取物,并且只会检测收集了多少次物品,而不是多少个。

  3. 某些任务里经验值是可选的。经验都不给?你也太黑了吧

  4. destroy_pickup 为 false 时不会自动提交,且手动提交会消耗物品 。

收集物品没有特殊字段,无法获取任务进度,因此不建议设置随机。


craft(合成)

这个类型的任务需要玩家合成指定物品:

    "craft": {
        "type": "generic",
        "logic": {
            "type": "craft",
            "craft_count_min": 1,
            "craft_count_max": 1,
            "random": false,    (可选)
            "any": false,    (可选)
            "xp": 1,
            "items": [{
            "id": "minecraft:apple"
        }]
    }

特殊字段:

  • $craftItem——已合成的物品数

  • $craftMaxAmount——需要合成的物品数

  • $craftItem——需要合成的物品


mine(挖掘)

这个类型的任务需要玩家挖掘指定数量的方块:

"mine": {
    "type": "generic",
    "logic": {
        "type": "mine",
        "random": true,    为 true 时会随机选择一个作为任务目标,否则只会选择最后一个,默认为 false(可选)
        "destroy_drops",    销毁掉落物,默认为 false(可选)
        "mine_count_min": 1,
        "mine_count_max": 1,
        "xp": 1,
        "blocks": [{
            "id": "stone"
        },{
            "id": "grass"    (可选)
        }]
    }
}

特殊字段:

$mineAmount——已挖掘方块数

$maxMineAmount——需要挖掘的方块数

$mineBlock——需要挖掘的方块


event_trigger(触发事件)

可能需要一些模组开发经验,想要了解的请自行查看官方任务:野兽之腹 等我研究完再放进进阶教程


teleport(传送)

这个类型的任务需要玩家使用传送仪传送:

"teleport": {
    "type": "generic",
    "logic": {
        "type": "teleport",
        "distance_min": 1,
        "distance_max": 10,    这两个数值没有意义,玩家只需要进行传送就能完成任务,默认为 0(可选)
    },
    "xp": 1
}


place(放置)

这个类型的任务要求玩家在指定的坐标(附近)放置方块:

"place": {
    "type": "generic",
    "logic": {
        "type": "place",
        "radius": 4,            检测半径,默认为 0(可选)
        "place_count_min": 1,
        "place_count_max": 10,
        "item": {
            "id": "minecraft:stone"
        },
    },
    "xp": 1
}

特殊字段:

  • $distance——以 X blocks 显示目标的距离

这个任务需要在任务卡的 NBT 中指定坐标才能被完成,你可以使用 NBTExplore 等软件编辑物品的 NBT:

[超能物质]自定义任务 - 基础篇-第7张图片添加长度为3的数组,分别对应XYZ轴坐标

scan(扫描)

这个类型的任务需要玩家使用物质扫描仪扫描指定数量的方块:

"scan": {
    "type": "generic",
    "auto_complete": true,
    "xp": 1,
    "logic": {
        "type": "scan",
        "only_destroyable": false,    没发现有什么作用,默认为 false(可选)
        "scan_count_min": 1,
        "scan_count_max": 10,
        "block": {
            "id": "stone"
        }
    }
}

物质扫描仪需要绑定有电的模式保存仪。绑定之后机器有没有剩余容量甚至绑定的机器还在不在都不重要了,只要有扫描动画就行

特殊字段:

  • $scanAmount——已扫描方块数

  • $maxScanAmount——需要扫描的方块数


interact_block(交互方块)

这个类型的任务要求玩家和指定的容器交互:

"interact_block": {
    "type": "generic",
    "xp": 1,
    "logic": {
        "type": "interact_block",
        "intractable": false,    玩家交互的方块必须为容器,默认为 false(注1)
        "destory": false,    交互后破坏方块,默认为 false(注2)
    }
}

备注:

  1. 如果为 false 只需右键或破坏方块就能完成任务,而且不会检测坐标

  2. 截止至 0.7.8 版本,即使为 true 也不会破坏方块

和放置类任务一样,这种类型的任务需要在 NBT 中指定坐标


interact_item(交互物品)

这个类型的任务需要玩家使用指定的物品

"interact_item": {
    "type": "generic",
    "xp": 1,
    "logic": {
        "type": "interact_item",
        "consume": true,            使用时消耗物品,默认为 false(可选)
        "items": [{
            "id": "minecraft:apple"
        }]
    }
}

特殊字段:

  • $itemName——需要交互的物品


conversation(对话)

自定义对话还未完成,只能等社区版进度了