我的世界1.19.2及以上均衡饮食(Diet)数据包编辑教程(施工完毕)
1 introduction
本篇教程与其说是一篇教程,其实更像一篇制作数据包时候的踩坑记录。如果有任何问题请随时指出,我会及时修正。
本篇教程仅适用于1.19.2及以上版本(对应mod版本号2.x.x),并不适用1.18.2及以下版本,也不排除未来作者又大更新导致教程作废的可能性,内容仅供参考,一切以作者wiki和issue为准。
在阅读本教程下面的内容之前,请确保:
(1).阅读过如何制作数据包和资源包的教程,最起码要知道数据包的文件目录框架和.mcmeta文件的编写。
(2).对JSON文件和JSON语法有一定的了解,最起码要知道JSON文件的格式和标准JSON规则
(3).要是会写java就更好了。
2 综述
2.1 数据包能自定义什么内容?
对于2.x.x版本的模组,现在数据包可以做到:
(1).自定义食物组。
(2).指定某些食物的食物组或者将某些食物从食物组中移除。
(3).自定义食物组满足某些条件之后给予玩家的增益或者减益。
(4).(或许还有别的但是我没发现,欢迎补充)
“食物组”是模组内的group的直接翻译,你可以把它理解为一个类别名称(比如蔬菜,水果,谷物等等),同一个食物可以被同时添加到不同的食物组(如果你乐意的话,面包可以同时分配给谷物,蔬菜,肉类等等食物组)
3 自定义食物组教程
首先我们需要创建一个数据包,关于如何创建数据包和如何编写pack.mcmeta文件,请参阅官方的数据包教程。本教程不做解释。
现在假设你的数据包的名字叫做data_pack_for_diet,其下面包括一个目录data和一个pack.mcmeta文件,如下所示。
现在我们将在data目录下创建一个目录,目录的名字没有什么要求,我们假设目录的名字为diet。
接下来在diet目录下创建一个diet目录和一个tags目录。diet目录下面创建groups和suites目录,在tags目录下面创建items目录。
最后整体的目录树如下所示:
其中tags/items下面将放置你定义的食物组所包含的食物id的文件,groups下面放置的是你的食物组定义文件,suites下面放置的是你的食物组的增益文件。由于现在我们只需要考虑食物组,因此可以暂时忽略tags/items文件夹,后面再用。
下面在groups文件下创建一个食物组信息文件xxx.json,其中xxx为你的食物组的id名称,该id名称唯一确定了一个食物组,因此请确保在编辑食物组完毕后不要轻易修改文件名,否则文件名对不上会出现bug。如果你想要修改原版的五个食物组信息,你只需要把文件名改成对应的食物组id就行,模组文件会使用你的数据包里面的内容进行覆盖,原版的五个食物组的文件名如下截图所示
现在假设我们创建了一个食物组文件eggs.json。eggs.json内部的json文件内容如下:
{
"icon": "minecraft:egg",
"color": "#d41c53",
"order": 7,
"default_value": 0,
"gain_multiplier": 1.0,
"decay_multiplier": 1.0,
"beneficial": true
}
上述展示的就是定义一个食物组所需要的所有信息。虽然作者贴心给每一项都设置了默认值,但是不推荐这种为了方便而缺斤少两的行为。
各个字段的含义如下:
icon:图标,该图标指的是游戏内均衡饮食的gui界面里面的每一行食物组信息的最左边的那个图片。icon的值为mc的物品id,比如minecraft:apple,
farmersdelight:wild_rice等等,这个信息可以通过在游戏中按F3+H就可以看到,如果你发现出现了特别多的文字(其实都是nbt和tag)的话,你只需要在创造模式中找到原版苹果,把鼠标放上去,找到minecraft:apple出现的位置(也就是正常显示名称的下面)你就能找到对应的模组的物品的id了。
color:指的是游戏内均衡饮食的gui界面里面右边显示条和文字的颜色。color的值是String字符串,并且字符串的格式为 “#”+16进制表示的RGB颜色值,如果你对这种格式不熟悉或者不知道这代表了什么颜色,或者不知道自己喜欢的颜色的最接近的16进制RGB颜色值是什么,请善用互联网上的在线工具和颜色表格。
order:指的是排序的权重,也就是游戏内均衡饮食的gui界面里面谁排在上面谁排在下面。order的值为整数Integer,越小的整数意味着排的越靠上。
default_value:指的是玩家刚进入游戏时食物组的初始值,值为0.0-1.0之间的小数,提醒既然是小数那么就要写1.0和0.0,而不是1和0.
gain_multiplier:指的是当玩家吃下对应食物组的食物的时候,食物组信息增加的乘法因子,值为小数默认1.0。经过我的测试这个值跟食物的饱食度共同决定每次吃下某个食物时增加的值。(似乎是如果这个值为1.0,并且食物的饱食度为1.0的时候,最后增加的值为1.0*1.0 = 1.0)
decay_multiplier:指的是食物组随着饱食度随时间下降时,食物组信息减少的乘法因子,值为小数默认1.0。这个我没测试过,不确定具体的关系。
beneficial:指的是食物组是否允许增益或者减益。由于作者自己的原版文件里面这几项都是true,没有false的情况,因此我也不知道值为false之后会出现什么。
以上就是所有的必要信息了。不同食物组配置信息可以相同,但是食物组id一定不同(因为你无法创建两个文件名完全一致的文件)
但是如果你仅仅只是编辑了这个信息,然后兴奋的打开游戏想看看成果。那恭喜你你在GUI界面上什么也看不到。但是你应该能在diet的命令上看到你的食物组参数,如果没有看到那就是你的食物组文件出错了,好好检查拼写。
如果你想看到食物组出现在gui上面,那么就需要编辑食物组的增益文件了,不过目前我们不需要编辑具体的增益方式。
在suites文件夹下面创建builtin.json文件(因为原版的增益文件就叫做builtin.json,因此建议直接使用这个文件名在完成对原版文件的覆盖)
bultin.json文件内的内容如下:
{
"replace": true,
"groups": [
"drinks",
"eggs",
"fishes",
"fruits",
"grains",
"honeys",
"milks",
"mushrooms",
"nuts",
"proteins",
"salt",
"sugars",
"vegetables",
"wines"
],
"effects": [
]
}
replace为是否替换json内容,false是追加json内容,true是替换json内容。(我不是很确定是不是)
groups为食物组名称,是一个数组,里面是你自定义的食物组id的名称(也就是不包括后缀的文件名)
effects为增益内容,这一部分比较复杂,参考wiki即可
(其实就是我还没开始写增益,我才刚开始写食物分组,整整两千多个食物啊,手动分配啊,累死我算了)
现在你应该能看到gui界面上出现你的食物组了。
但是你会发现现实的内容应该是类似于groups.diet.xxx.name之类的信息,这说明我们没有添加翻译文件。
那么现在我们又需要一个资源包,参考资源包教程进行创建,创建完毕后在assets\diet\lang下创建zh_ch.json文件。
内容格式为:
{
"groups.diet.drinks.name": "饮料",
"groups.diet.eggs.name": "蛋类",
}
你只需要把倒数第二个的值改成你的食物组名称(也就是食物组文件的不带后缀的文件名),然后修改翻译内容,就可以在简体中文模式下看到了。
4 食物组分组教程
假如我们现在想要在上面的eggs.json对应的eggs食物组中添加食物信息。
首先在tags\items下面创建eggs.json文件。这里的文件名和groups下定义的食物组的文件名,以及suites下增益信息里面的group里面的数组值三位一体,要完全一致。
然后接下来:
如果你想要完全重写整个食物分配名单,那么eggs.json内的格式如下:
{
"replace":true,
"values":[
"adorn:hot_chocolate",
"adorn:sweet_berry_juice",
"adorn:glow_berry_tea",
"adorn:nether_wart_coffee"
]
}
其中replace在这种情况下肯定是true,values内部是物品的id名称,在F3+H模式下可以看到每个物品对应的id。
重磅提醒!!!!
如果采用这种格式的话,只要mod发现文件里面有一个食物的id是错误的,那么整个文件内容都会失效,因此一定要严格查看
原版文件中给出的替代方案是:
"values": [
"minecraft:melon_slice",
"minecraft:sweet_berries",
{
"id": "alexsmobs:banana",
"required": false
},
{
"id": "alexsmobs:banana_peel",
"required": false
}
]
如果你只是打算单纯的修改模组自带的食物分配机制,那么你首先需要创建一个原版食物组名称的文件(如vegetable.json)然后设置其中的replace值为false,那么在values下面添加的东西就是你新增的食物,如果你想删除掉某个食物,那么:
{
"replace": "false",
"values": ["examplemod:bacon", "examplemod:cheese"],
"remove": ["examplemod:fish"]
}
在remove数组里面的内容就是你要移除的食物id。
接下来介绍两个非常特殊的tags,这俩tags文件并不存在对应的食物组,但是他们的作用不可小觑。
首先是diet:ingredients,对应的文件为ingredients.json。这个tags的作用是锁定推断。
举个例子,假设我设置wheat(小麦)的食物组为grain,并且开启允许自动推断食物组信息,那么即使我不给面包定制食物组信息,面包也会被自动推断为属于grain食物组,并且根据grain食物组的定义计算出自己的增加值。如果你此时将wheat添加到ingredients.json文件的values中,那么自动推断就会忽略wheat的食物组信息。
其次是diet:special_food,对应的文件为special_food.json。这个tags的作用是辅助推断。
对于蛋糕一类的食物,这类食物本身并没有饱食度,但是你在右键使用的时候会增加你的饱食度。如果你将蛋糕添加到了文件中,那么食物组信息也会随着你的右键根据饱食度传递给你。相当于此时使用蛋糕就会增加食物组的值。
(以下是我自己推测的原因,可能不准确,欢迎任何人提出质疑或者找到能产生推断的方式,正好我顺便把自己的数据包改了)
对于农夫乐事里面有些跟蛋糕类似,但是需要拿一个碗去点击,最后会生成一个碗装食物的可放置食物方块,即使你添加到special_food.json文件中,食物组信息并不会传递到那个碗装食物里面,而自动推断也不会识别出来。因为自动推断的方法是根据合成表,包括熔炉,工作台,篝火或者其他类似的能用jei识别出来的合成方式进行推断,但是恰好这种使用方式不包括在内,以及最新的给食物加盐的那个模组(好像是salt)是通过nbt标签进行操作的也没法自动推断。
顺便提醒!!!!!在自动推断的时候有可能会莫名其妙的增加一堆不相干的食物组,这些食物组信息往往是通过刀,碗,桶等等物品传递过来的,并且经常发生在某些应该标定为食物的数据(比如forge:fruit,forge:grain里面的)没有信息导致的,补充完整之后就应该会正常了。
不正常的话问题也不是很大,目前我发现的有问题的推断基本都是金苹果之类的需要矿石的东西
5 增益教程
还记得之前准备的bultin.json文件嘛,现在我们需要添加食物组的增益信息了。
diet模组能提供两大类增益,attribute和effects。
attribute指的是使用命令 /attribute 找到的属性,其中这些属性必须是玩家所有。forge自带的玩家属性和mc原版自带的属性请自行查阅相关wiki。其他模组也有类似的玩家属性
effects指的是使用命令/effect 能give给玩家实体的效果,也可以粗浅理解为药水效果。原版自带的药水效果请自行查阅wiki,mod的药水效果可以自行使用命令体验。
不过鉴于大部分mod属性和mod效果基本都是给别的实体上debuff的,所以基本上也用不到。
下面介绍一下一个完整的自定义增益buff的json结构
{
"attributes":[
{
"name":"generic.movement_speed",
"operation":"multiply_base",
"amount":1.5
}
],
"status_effects": [
{
"name": "minecraft:speed",
"power": 1
}
],
"conditions":[
{
"groups":["eggs","fishes","grains","proteins"],
"match":"every",
"above":0.2,
"below":1.0
},
{
"groups":["vegetables","fruits"],
"match":"every",
"above":0.2,
"below":1.0
}
]
},
下面详细介绍各个要素
attributes:指的是修改哪一个attributes,其中name指的是attribute的名字。opeation指的是计算方法,支持add(加),multiply_base(基础数据*amount),multiply_total(最终数据*amount)
status_effects:指的是添加哪一个效果,其中name指的是effects的名字,power指的是级别(力量1,力量2,锋利1,锋利2这种)
conditions:指的是要想触发增益需要满足的条件。其中groups指的是需要哪些食物组的数据。match指的是匹配方法,支持all(全部食物组满足),any(任何一个食物组满足),every(每有一个食物组满足,power+1),vaerage(所有食物组的平均值),none(没有任何一个食物组满足)。above指的是目标区间的下界,below指的是目标区间的上界,数学语言就是当计算数据∈[above,below]的时候,condition通过。如果有多个condition,按照数组顺序依次全部通过整个condition才算通过。