本篇教程由作者设定使用 CC BY-NC-SA 协议。

起源的附属模组之所以这么多,很大程度上是因为起源自己提供了一套API,便于任何人来创建或修改起源(比如起源++有足足几十个起源)。不过原模组的开发文档是全英文,而且很长,并不利于国内玩家开发。基于此,我决定动笔写一份比较通俗易懂的入门教程,希望能够帮助大家了解创建一个起源的流程。

如果语言能力允许,更推荐大家去阅读起源的开发文档,会更加有帮助:Origins Documentation。同时,在阅读本篇教程之前,也希望你已经理解了数据包的结构及JSON文件的写法。如果还没有,可以先阅读一下中文Minecraft wiki的相关内容。

零、前置准备

由于创建起源需要我们大量创建并修改JSON文件,我强烈推荐大家使用微软开发的VS Code,并在扩展商店中搜索并下载Origins Mod Helper,可以有效提高开发效率,减少查wiki的时间。本文也正基于这种开发环境来讲解。如果你不会使用VS Code,推荐搜索相关教程,本文不再赘述。如何创建一个你自己的起源-第1张图片


一、创建一个数据包

正如前文所说,起源的API是基于数据包的。如果我们想要创建一些独属于自己的起源,首先要创建一个数据包。第一步,创建一个名字只有英文大小写字母、数字和下划线的文件夹,随后在其中创建一个data文件夹和一个pack.mcmeta文件,详见教程:制作数据包 - Minecraft Wiki

现在假定你已经创建了一个名为example的文件夹,并在其中创建了一个data文件夹并正确填写了pack.mcmeta。在data文件夹中,再创建一个名为origins的文件夹,和一个名字任取(不包括汉字)的文件夹,后者将是你数据包的主体,在游戏中也表现为你起源的命名空间ID将是这个名字(假定为foo)。

两个文件夹都会被用到,不过现在我们先点开foo文件夹(也就是名字任取的那个文件夹),在其中分别创建名为origins和名为powers的文件夹。顾名思义,前者用于设定起源,后者用于设定起源所对应的能力。


二、创建一个起源

在完成了上述步骤后,我们就可以着手开始创建一个属于自己的起源了。在origins文件夹中创建一个名字任取(不包括汉字)的文本文件,将其命名为<起源名>.json。注意,该文件的扩展名应该是.json,文件类型属于JSON文件。假定我们想要创建一个名为bar的起源,那么我们就应该将其命名为bar.json

现在打开这个JSON文件,其中当然什么也没有。先输入一对大括号,随后按照下图的方式为你的起源设定名字(name)、图标(icon)、影响值(impact)及能力列表(powers)。图中的upgrades为可选项,如果你希望这个起源能在达成进度后变成另外一个起源,你才会用到upgrades这个键。

需要注意,item的值是游戏中已存在的物品。impact仅接受0-3的整数。由于现在我们还没有创建任何一个能力,所以你可以暂时把powers的列表空着,等完成能力创建之后,再来填写powers

如何创建一个你自己的起源-第2张图片

三、创建能力

创建能力是起源附属开发的最重量级的部分。由于本人精力所限,这一部分并不会讲解能力类型,大部分的能力类型需要大家自己看开发文档,或者是依照别的附属模组的方式来模仿着写出一个能力。

powers文件夹中,创建一个<能力名>.json文件。随后打开这个文件,并以一对大括号起手,随后输入"type"来设定能力类型,输入"name"来设定能力名字,输入"description"来设定能力的描述。下图是一个比较简单的能力实现。其作用是当玩家杀死生物时,给予玩家2格饱食度和2格饥饿值,冷却为1刻(其实就是没有冷却)。其中origins:self_action_on_kill就是指会在玩家杀死生物时触发的能力。

如何创建一个你自己的起源-第3张图片

对大部分能力来说,复杂的部分在于填写entity_action(对玩家的作用), bientity_action(对另一交互实体的作用)和condition(能力触发的额外条件)。下图就是一个比较复杂的示例。该能力的作用是:

当能力ignisian:ignisian_wrath_toggle激活时(condition),

每1刻(interval

都对玩家附近1格以内(entity_action:type,radius)

活着的生物(bientity_condition)

造成(bientity_action)

5点(amount)

无视护甲、类型为怪物攻击(source)

的伤害。

如何创建一个你自己的起源-第4张图片需要说明,上面那个图之所以看起来不像一个单独的能力,是因为这个能力属于一个更大的能力当中,这个更大的能力的能力类型是multiple。multiple能力类型允许我们在一个JSON文件内创建多个单独能力,并以<命名空间ID>:<大能力名>_<小能力名>的形式被调用。同时,这其中的所有能力也可以以<命名空间ID>:<大能力名>的形式被同时调用。例如,上图当中的能力在游戏中可以以ignisian:ignisian_wrath_damage的形式被调用,也可以与其他能力一起,作为ignisian:ignisian_wrath能力被调用。

换句话说,你可以将multiple能力理解为一个能力的集合。集合中的元素可以被单独调用,也可以与其他元素一起,作为一个集合被调用。


四、注册起源

在创建完能力、填写完起源的能力列表之后,我们还有一步需要完成,就是注册起源。打开<数据包>/data/origins文件夹,创建一个名为origin_layers的文件夹,再创建一个origins.json文件,随后输入:

{
    "replace":false,
    "allow_random":true,
    "origins":[]
}

并在中括号中填入你刚刚创建的起源的名称,比如foo:bar等等。你也可以使用逗号分隔并添加多个起源。

顺便讲解一下起源层的概念:

如果你安装了起源:职业模组,你会发现在你选择完起源之后,还可以选择对应的职业。前者是原模组就有的origins层,而后者则是起源:职业所创建的另一个起源层。如果存在多个起源层,那么玩家可以选择多个起源,并拥有这些起源的所有能力。

如果你希望实现大类套小类的效果,那么你可以另外创建一个起源层。如果你希望你的起源与原版的起源互斥,那么就使用origin层即可。


replace即代表你所创建的这个起源层是否会替换同名的起源层。如果你在上文的origin.json中把replace设为true,那么进入游戏后你只能看到自己创建的起源,而看不到原版提供的起源。

allow_random就是指你创建的这些起源是否放到随机起源池当中。


五、总结

本篇教程粗略地为大家讲解了创建一个起源的总体流程。由于本人精力所限,本篇教程主要以示例为主,没有特别详细地介绍各个键值对的作用及写法。我推荐大家参考起源++模组当中的起源和能力,写出一个独属于自己的起源。