本篇教程由作者设定未经允许禁止转载。
已知问题:添加自定义任务后再删除,如果玩家已有被删除的任务会导致进存档游戏崩溃
使用的模组版本:0.7.8(社区版和官方版理论上通用)
使用的游戏版本:1.12.2(很可惜,1.7.10不支持)
指令介绍
由于任务不能重复接受等问题导致测试比较困难,但好在作者提供了指令 /quest 方便测试。
/quest <行为> [参数] <任务名> [玩家]
<行为>
┣━━ add(直接在玩家任务列表中添加一个任务)
┣━━ remove(在玩家任务列表中移除任务)
┃ ┣━━ all(全部)
┃ ┣━━ active(进行中的任务)
┃ ┗━━ completed(已完成的任务)
┗━━ contract(给予玩家指定任务的任务卡)
如何创建自定义任务
推荐使用 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 获取
为你的任务添加文本
现在你肯定注意到了一个问题,那就是任务文本全部都是“空的”,不过这也不用担心,任务会自动指定词条,只需要在本地化文件中自己添加就可以了。
一个任务默认只有三句话,分别是标题、简介和任务,对应为词条:
quest.任务名.title=
quest.任务名.info=
quest.任务名.objective.0=
任务也会提供一些特殊字段,在游戏中会被替换为相应的文本,用来追踪任务进度。可用字段请查看“所有可用的任务类型”章节。
那文本如何加载呢?大家应该都用过自动汉化更新模组,原理就是通过资源包加载语言文件,我们也可以做个资源包添加自定义任务的文本。
将你的文件保存为 zh_cn.lang ,保存到资源包路径 assets\matteroverdrive\lang ,如果你愿意的话也可以创建 en_us.lang 并翻译为英文。
加载上资源包看看效果这次不用重启游戏
如何修改已有的任务
如果你开的是服务器,那么所有玩家都需要使用你修改过的版本,以及本教程不对修改模组出现的任何问题负责
如何获取任务文件
首先使用压缩软件打开模组文件,并按照这个路径打开:
assets\matteroverdrive\quests
此时你就能找到 quest.json 文件,保存只需覆盖进原路径即可。
将上一步获得的文件解压出来并打开
这个任务要求我们挖掘 1 个钻石矿,我们把它调多一些:
"mine_count_min": 1 → 110,
"mine_count_max": 1 → 510,
现在我们打开游戏试试效果:
这样就成功修改了原版自带的任务。
所有可用的任务类型
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)
}
备注:
玩家必须严格按照指定的物品数量和损耗值杀死生物,由于损耗有默认值所以不推荐任务使用有耐久的物品,NBT 同理。
只有用安装了衰变聚爆矩阵(末日型)升级并调整到 3 档以上的相位能量整流器杀死生物才能检测,其他安装相同升级的枪械以及 TNT 的爆炸无效。
截止至 0.7.8 版本依然无法被检测。
用枪械杀死生物时不能安装高能燃烧弹、爆裂电磁炮以及衰变聚爆矩阵(末日型)升级。
0.7.7 及以下版本杀戮任务需求始终是最大值,0.7.8 版本修复。
杀死生物的列表只会被算在一个任务内!如果你需要玩家分别杀死不同数量的生物请参考进阶教程。
权重为 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 时会随机选择一个作为任务目标,否则只会选择最后一个(可选)
}]
}
}
备注:
destroy_pickup 为 false 时维度检测失效。
destroy_pickup 为 true 时由于 bug 不会销毁拾取物,并且只会检测收集了多少次物品,而不是多少个。
某些任务里经验值是可选的。经验都不给?你也太黑了吧
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:
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)
}
}
备注:
如果为 false 只需右键或破坏方块就能完成任务,而且不会检测坐标
截止至 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(对话)
自定义对话还未完成,只能等社区版进度了