v7 json模组制作教程
mindustry吧
全部回复
仅看楼主
level 11
yingfenglehui 楼主
mod,即附加内容,是为了扩充或修改原有游戏内容的一种方式。mod的自定义度很高,尤其是对于
Mindustry
这个游戏来说,玩家只需要掌握一点点编程语言知识和绘图技能就能描摹出自己的想法。
原版模组可以使用的语言多的一批,有json/js/java,c也可以。选择他们就成了一件难事,下面这些是对你的建议:
java开发必须要电脑,没电脑不行;
json功能很弱,原版没有的东西不用想,原版有的也有一些写不出来;
json/js就是100%的暴露源码,无论用哪一种语言都必须以GPL协议开源;
由于js我也不会,java已有制作,所以本教程以json为教学语言,再次声明,json功能很弱。
2022年04月28日 04点04分 1
level 11
yingfenglehui 楼主
json,全称JavaScript Object Notation,即js对象简谱。这一句不重要,而且在游戏里json和js也没有半毛钱关系。
在编写mod之前,我们首先需要了解json的语法。游戏内实际是Hjson+自己扩充的语法,但是Hjson完全兼容Json,而且两者有根本上的差别。
如果前面两段把你绕晕了,不管他,本教程将使用游戏全新的语法。
json格式就是一对大括号和其中的键值对构成的,而键值对是由键名和键值构成的。看起来就像这样:
{
值1:"字符串值",
值2:114514,
值3:ture/flase,
值4:{嵌套值1:1919,嵌套值2:"810"},
值5:[
田所,
浩,

]
#这是个单行注释
//这也是
/*这是
多行
注释*/
}
键值对形如“键名:键值”,我们把冒号前面的叫键名,冒号后面的叫键值。每两个键值对之间需要用逗号分隔。
2022年04月28日 04点04分 3
吧务
level 14
所以内容呢[怒]
2022年04月28日 04点04分 4
level 11
表面上的我:ohhhhhhh,先膜拜大佬
实际上:还不发是吧[怒]又一鸽子
2022年04月28日 05点04分 6
level 11
yingfenglehui 楼主
在发了在发了,都被吞了
2022年04月28日 05点04分 7
level 11
yingfenglehui 楼主
编程基本概念
场上有两个塑钢压缩机,我们很清晰地就能看出这两个塑钢压缩机本质上并没有什么不同,实际上,他们都是由一个对象而复制出来的。
一个方块怎样工作,取决于它的对象的参数。一个对象有许多的参数,我们把这些参数称为对象的属性,每一个参数变量称为字段。这类似于函数,给定一个自变量,就可以得出一个结果。对象设置一些字段,就可以得出一类方块。
请务必把上面两段好好读读!
对于一个对象一无所有的对象,我们这么表示:
{}
可以看出,目前他还没有任何的属性,自然无法定义出任何事物。
那么我们现在切入模组主题,如果我们想创造一个东西,我们应该怎样做:
首先,我们先要知道自己要做的东西是什么类型:可能是方块、单位、液体等等,而方块又根据其工作方式而细分成许多类型。为了让游戏知道我们要添加的内容是哪一种类型,我们需要添加上一个叫 type 的字段。
type,中文翻译为类型,它的键值就是物品的类型。对于物品,它应该是 resource (注意大小写!),对于液体来说, 它应该是 Liquid ,而对于发射物品的炮塔应该是 ItemTurret ,制造工厂则是 GenericCrafter。
除此之外,一个内容总应该有名字和简介的,我们使用 name 和 description 来给出:
{
type:resource,
name:冰红茶,
description:拿针管抽出来往里放那个冰红茶滴水
#注意此处键值对之间用逗号隔开
}
但如果你直接把它拿到游戏里运行(如何运行下一帖讲)就会报错NullPointer,这是因为有不该为空的字段没有被赋值过,注意,有一些字段有初始值,例如可燃性和爆炸性,默认值即是0。但是有一个必要的字段 color 没有默认值,我们必须给出。
color,颜色,在计算机领域中,颜色通常用RGB六位色或八位色表示,关于此处可以百度RGB,这里简要说明就是通过混入比例的红绿蓝三色来显示颜色的方法,如果是八位则最后两位是透明度,不写就是ff,即256/256的透明度。
经过修改物品的样子如下:
{
type:resource,
name:冰红茶,
description:拿针管抽出来往里放那个冰红茶滴水,
#注意此处键值对之间用逗号隔开
color:114514
}
物品还有更多的字段,我们将在第四贴介绍。
2022年04月30日 02点04分 11
level 11
yingfenglehui 楼主
模组文件结构
我们在上一贴中学会了如何创造一个文件,那么接下来我们就要把它送到游戏里面供游戏读取,游戏能够读取的文件格式固定,下面我们来学习这种打包方式。
Mindustry的模组使用zip打包,即把模组文件夹压缩而得到模组文件,首先我们需要在一个风水宝地建立一个文件夹,把文件夹重命名为你的模组名(这一步不是必须却是必要的),接下来在内部建立 sprites content两个文件夹和一个叫做 mod.hjson 的纯文本文件(必须叫这个名字,mod.json也可但是不推荐)。
content文件夹内部通过子目录嵌套读取的方式存放json文件,具体方式如下:在其内部有数个文件夹,它们分别是items liquids blocks units,分别存放物品、液体、方块和单位的json文件,也就是说,一个工厂(例如塑钢压缩机)的json文件应当存放在content/blocks/ 里,而塑钢就应该放在 content/items/ 里。另外,在子目录里继续套文件夹不影响读取,所以推荐使用文件夹组织json文件。
sprites文件夹与content相同,但理论上可以不嵌套子目录,直接在sprites/下放置贴图是可以的,但另有理论说此举会造成卡顿。贴图与内容之间的对应依靠于相同的文件名,此外,有一些类型会要求多个贴图,这些都会在下面讲到。贴图不是必须的,但是必要的!
mod.json是唯一一个必要的文件,也是判断文件是否为模组的唯一标准,游戏只会在压缩文件的第一层检测此文件,因此如果游戏报错找不到这个文件可以看看是不是套娃压缩了,以此来决定是否换一个文件管理器和压缩软件。
他的内容如下:
{
name:binghongcha, #必需字段,mod名,用于源代码,理论可以使用中文,实际建议纯英文
displayName:东北往事, #仅供显示,字符随意使用
author:dog, #必需字段,作者
description:你让我选入疯狂, #描述,多行直接在这里跨,为避免歧义带上双撇号也可
minGameVersion:135, #极其必需字段,务必要大于105,直接填写135即可
hidden:false, #默认值为false,如果为true就可以带入服务器,但是mod方块依然不能在服务器上建造,多用于仅客户端的辅助、材质包或语言包
}
接下来,我们就可以新建一个文件夹,再新建 content/items/ ,在其内部建立名为“冰红茶.hjson”的文件,把上一贴我们写出来的东西填上去,再把整个文件夹压缩,把zip模组文件导入到游戏内,你就可以在物品源里放出来冰红茶了!
2022年05月01日 01点05分 12
补充一下,如果在mod.json里将hidden设置为true,那么游戏就会忽略 content 文件夹,不加载其中内容自然就无所谓建造mod方块,但是script/bundle/sprite-override会照常运行,所以辅助、语言包及材质包照常运行
2022年05月02日 09点05分
另外,item和items都是可以的,但是status的复数应该加es但是这样就不识别,所以大多数的拼法还是items/liquids/blocks/units/status/weather/,但是item/liquid/block/unit/statuss/weathers也可以被识别
2022年05月02日 09点05分
经大佬点拨,只有方块/单位/天气,由于有许多细分类型而会去读取type字段,其余直接忽视
2022年05月06日 04点05分
level 11
yingfenglehui 楼主
物品的模版
经过了上三个贴的理论铺垫,我想看懂我接下来说的话应该不费劲,那我们就直接开始。
首先我们来理解 Java 中的一个重要概念:继承。在json编程中,由于我们只能操控字段,所以继承粗浅的定义就是:一个类型拥有他继承的类型的所有字段,看不明白?举个例子:
比如我们有 animal 这个类,他有一个叫做name的字段,然后我们令dog和cat类继承animal类,那么dog和cat类就都拥有了name这个字段。
原版中也是如此,实际上原版中的继承树如下:
( Content->MappableContent->UnlockableContent )->Item/Liquid/Block
括号内的是抽象类,抽象类就是指不能用来创造对象的类,即你不能给他填到type字段里。在原版中,所有的内容都得有 name 字段,它是由 UnlockableContent 给出的,也可以选择不给出name,而使用bundle文件给出名称也是可行的。
在json中,只有blocks必须要求一个细分的type,其余items/liquids/status/units均不要求给出type,当然给出并不会导致崩溃,而且可以随便给。
下面是items最全面准确的模版:
{
"type":"Item", //完全没有用到的无用字段,可以不给出
"name": "冰红茶", //要么使用bundle文件,要么直接在此给出,更推荐前者
"description": "拿那个针管抽出来", //非必需字段,如果此处没有就去寻找bundle,如果bundle也没有就直接不显示
"detail”: "神的力量", //同description,但是如果战役没有解锁默认不在自定义模式不显示
"alwaysUnlocked": false, //在战役研究树默认解锁,默认值为false
"hideDetails": true, //如果战役没有解锁默认不在自定义模式不显示detail,默认值为true
#以上为UnlockableContent给出,对于一切内容都有效,以下为item的独占内容
"color": "114514",//上方已经介绍,必要字段
"explosiveness": 1,//爆炸性,在原版影响坠落伤害,注意1=100%
"flammability": 1,//燃烧性,影响火力发电机和涡轮发电机的发电量,一般来说是1比60比360
"radioactivity": 1,//放射性,影响RTG发电机的发电量,一般来说是1比180
"charge": 1,//放电性,影响坠落时放的电弧大小
"hardness":4,//仅当这个物品有对应矿物时有用,物品矿物的硬度,沙子、废料为0,铜铅1,煤2,钛3,钍4,对于采矿者而言,(阿尔法、贝塔、独影)1,(恒星、幻形、机械钻头)2,(耀星、巨像、气动钻头)3,激光钻头4,爆炸钻头5
"cost":1, //不要望文生义!原版没有一处地方声明了建筑的建造时间,cost的意思实际是:1 cost = 1 tick added to build time(每一个cost就为建筑的建造时间增加1tick)例如,铜墙需要六个铜,铜的cost是0.5,而墙的建造时间倍率是6,所以铜墙就需要18tick也就是0.3秒
"lowPriority": false //仅当这个物品有对应矿物时有用,如果钻头处有其他任何矿物,都不采集这种,类似原版的沙子
}
2022年05月02日 02点05分 13
补充,gamma采矿等级为2
2022年05月02日 12点05分
level 11
yingfenglehui 楼主
别问我为什么鸽了。
anuken预计在一周内将v7开源,预计mod方面有大改,本教程坚定不移地跟进最新特性!
2022年05月05日 01点05分 14
level 11
yingfenglehui 楼主
即将public,现在已经对BetaMindy作出适配,初步发现更改数个字段,主要对java模组做出了一些变化
2022年05月07日 00点05分 15
level 11
yingfenglehui 楼主
item和mod.json都更新太多了,本帖废弃
2022年05月07日 08点05分 16
1