跳转到内容

导 言

Mindustry S. mods只是资产目录. 使用modding API有很多方法,取决于你到底想做什么,以及你愿意做多少.

您可以重新定价已有的游戏内容, 您可以用更简单的 Json API( 这是此文档的主要焦点) 创建新的游戏内容, 您可以添加自定义声音( 或者重复使用已有的声音) 。 可以将地图添加到竞选模式,将脚本添加到程序特殊行为到您的mod,比如自定义效果.

共享您的 Mod 和给某人您的项目目录一样简单; Mods 也是任何支持它们的平台的交叉平台. 你会想用 GitHub 图像 (单位:千美元)或类似服务)用于托管您的源代码。 任何一台有文本编辑器的计算机 都会成为你真正需要的

目录结构

您的项目目录应该看起来像这样:

project
├── mod.hjson
├── content
│   ├── items
│   ├── blocks
│   ├── liquids
│   └── units
├── maps
├── bundles
├── sounds
├── schematics
├── scripts
├── sprites-override
└── sprites
  • mod.hjson (需要) 元数据文件用于您的 Mod,
  • content/* 游戏目录 内容, (中文(简体) ).
  • maps/ 游戏中地图目录,
  • bundles/ 目录 套装, (中文(简体) ).
  • sounds/ 目录 声音 文档,
  • schematics/ 目录 形状 文档,
  • scripts/ 目录 脚本, (中文(简体) ).
  • sprites-override/ 种子 压倒一切的游戏内容目录,
  • sprites/ 种子 内容目录,

每个平台都有一个不同的用户应用程序数据目录,这就是您的模式应该放在的地方:

  • Linux: S: ~/.local/share/Mindustry/mods/
  • Steam: S: steam/steamapps/common/Mindustry/saves/mods/
  • Windows: S克活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活 %appdata%/Mindustry/mods/
  • 马可斯: ~/Library/Application Support/Mindustry/mods/

注意您的文件名应该小写并隔开:

  • 正确无误: my-custom-block.json
  • 错误 : My Custom Block.json

贾森

Mindustry S. 用途 贾森对于任何认识Json的人来说, 这不过是非常受欢迎的连载语言的超级集 贾森。 。 - 。 。 这意味着任何有效的Json都会工作, 但你得到额外的有用的东西:

# single line comment

// single line comment

/* multiline
comment */

key1: single line string

key2:
'''
multiline
string
'''

key3: [ value 1
        value 2
        value 3 ]

key4: { key1: string
        key2: 0 }

如果你不知道这些话 串行语言,只是一种为程序编码信息的语言, 编码 将举报人从一种形式翻译为另一种形式,在此情况下,将文本翻译为: SKIP_fe574d0d7d743d7b73c2802351153cc (英语). 数据结构。

mod.hjson

在您的工程目录的根部, 您必须有一个 mod.json 定义您工程的基本元数据。 此文件也可以( 可选择的) 命名 mod.hjson 帮助文本编辑器选择更好的语法突出。

name: "mod-name"
displayName: "This isn't a mod."
author: Yourself
description: "Bbfashbjhcbabfhsbafbhajbf"
version: "1.0"
minGameVersion: "149"
dependencies: [ ]
hidden: false
  • name 将用来引用您的模式, 所以仔细命名它。 应该是 kebab- case( 无大写字母, 空格会填入" -" ) , 并且不应该有任何颜色格式 。
  • displayName 这将用作 UI 的显示名称, 您可以用它来将格式添加到该名称中 。
  • description 在游戏模式管理器中将实现该模式,所以要缩短并达到目的。
  • dependencies 可选的,如果你想了解更多,请到 依赖关系 节。
  • minGameVersion 是游戏的最小构建版本。 这是 所需经费 数字大于105。
  • hidden 是这个模式对于多人是否至关重要,默认是虚假的。 纹理包,JS插件等应用时,应避免分别与服务器和客户端发生冲突. 以拇指为例,如果你的mod创造内容,它不应该被隐藏.

内容

在您的工程目录的根部, 您可以有一个 content/ 目录,所有Json/Hjson数据都在这里。 内部 content/ 您有各种内容的子目录,这些是当前常见的:

  • content/items/ 页:1 项目一样 coppersurge-alloy· ;
  • content/blocks/ 页:1 如炮塔和地板;
  • content/liquids/ 页:1 液体一样 waterslag· ;
  • content/units/ 飞行或地面 单位一样 eclipsedagger· ;

注意,这些子目录的每一个都需要一个特定的内容类型. 这些文件的文件名很重要, 因为您路径的干名 (没有扩展名的文件名) 用于参考。

此外,这些文件中还有: content/<content-type>/* 目录可以任意地嵌入任何名称的其他子目录,以帮助您进一步组织它们,例如:

  • content/items/metals/iron.hjson,将分别创建一个命名为 iron。 。 。 。

这些文件的内容往往看起来是这样:

type: TypeOfThing
name: Name Of Thing
description: Description of thing.
# ... more fields here ...
字段 类型 说明
类型 字符串 此对象的内容类型 。
名称 字符串 显示内容名称 。
说明 字符串 显示内容描述 。

包含的其他字段将是该类型本身的字段.

副笔记 namedescription 不需要在json结构中。 您可以用( Bundles) [# bundles] 来定义任何语言 。 但是,如果两者均不在场,则其名称将是: 。 。 。 。- 说吧. 名称和空描述。

类型

类型有很多领域,但重要的是 type;这是内容解析器使用的特殊字段,它会改变您对象的键。 A级 Router 类型不能是一个 Turret 类型因为他们完全不同

类型 扩展 彼此,所以如果 MissileBulletType 扩展 BasicBulletType你会进入所有领域 BasicBulletType 内部 MissileBulletType 喜欢 damage, (中文(简体) ). lifetimespeed。 。 。 。 字段对大小写敏感: hitSize =/= hitsize。 。 。 。

你可以期望一个字段能达到特定的类型,有些类型绝对不会用它们的字段做任何事情,而工作大多是作为基类型会从. 其中一个类型是 Block。 。 。 。

在这个单位示例中,该单位的类型是: flying。 。 。 。 类型 bullet 实值 BulletType,这样你就可以使用 MissileBulletType,因为 MissileBulletType 扩展 BulletType。 。 。 。

一个也可以用 mech, (中文(简体) ). legs, (中文(简体) ). naval 或者说 payload 作为单位类型在这里。

type: flying
weapons: [
  {
    bullet: {
      type: MissileBulletType
      damage: 9000
    }
  }
]

建筑 125.1,类型也可以是 完全合格的类名 SKIP_fe574d0d7d743d7b73c2802351153cc 导弹发射系统 课。

例如,将块指定为 MendProjector你可以写 type: mindustry.world.blocks.defense.MendProjector 改为 type: MendProjector。 。 。 。

虽然对香草型并不特别有用,但可用于装入块型 其他人员 SKIP_fe574d0d7d743d7b73c2802351153cc (英语). 模式 作为依赖。

技术树

很喜欢 type 还有另一个神奇的球场 research 它可以在任何块物体的根部放入技术树.

research: duo

这会把你的块之后 duo 在技术树, 并把它放在你的 自己的mods块后 你会写你的 <block-name>,只有当您正在使用来自另一个 mod 的内容时,才需要一个 mod 名称前缀 。

研究费用:

类型 费用 说明
requirements ^ 1.1 * 20 * researchCostMultiplier researchCostMultiplier 是一个可以设置在块上的数据
单位 requirements ^ 1.1 * 50 -- -- . . .

费用再四舍五入到最近的10、100、1克、10克或100克,这取决于费用有多高。

requirements 是块或单元的成本。 单位使用其积分成本/升级成本进行计算.

如果您想要设置自定义研究要求, 请使用此对象来代替一个名称 :

research: {
  parent: duo
  requirements: [
    copper/100
  ]
}

这可以用来抵消块或单位成本,或使资源需要研究,而不只是生产。

种子

你只需要制作一个支持透明化的图像编辑器 (aka:不是颜料). 块状元素应该是 32 * size,所以一个 2x2 块需要 64x64 图像。 图像必须是带有32位RGBA像素格式的PNG文件. 任何其他像素格式,如16位RGBA,都可能导致 Mindustry 以“位图解码错误”崩溃。 您可以使用命令行工具 file 以打印您的图示信息 :

file sprites/**.png

如果其中的任何一个没有32位RGBA格式化,请固定.

种子可以简单地丢入 sprites/ 子目录. 内容解析器会反复查看 。 图像被打包成"阿特拉斯"来高效地渲染. 第一个目录在 sprites/,比如说. sprites/blocks,确定此地图集中用于图示的页面。 将块的宝石放入 units 页面很可能会造成许多滞后;因此,你应当尝试组织类似如何安排 香草游戏确实如此。 。 。 。

内容将寻找相对于它自己名称的图示. content/blocks/my-hail.json 名称 my-hail 同样, sprites/my-hail.png 名称 my-hail因此,它会被这个内容使用.

内容可能要寻找多个图案 。 my-hail 可能是一个炮塔, 它可以寻找后缀 <name>-heat 而这意味着它会寻找 my-hail-heat。 。 。 。

你可以在这里找到所有的香草丝绸:

另一种关于"宝石"的知识是,其中一些被游戏所修改. 涡轮专门加了一个黑色的边框,所以你必须为此负责,同时制造出你的宝石,在炮塔周围留下透明的空间,例如: 连线

要覆盖游戏内容图案, 您可以简单地放入 sprites-override/。 。 。 。 此删除 <modname>- 前缀于他们的id, 这使得他们可以覆盖来自香草甚至其他mods的图示. 您也可以使用它来创建有精美短名的图案 cat 方便使用脚本,只需注意名称与其他mod相撞。

声音

自定义声音可以通过 Modding 系统通过将声音放入 sounds/ 子目录. 之后你把它们放哪儿不重要 支持两种格式: oggmp3。 。 。 。 请注意: mp3 文件无法无缝循环, 所以尝试使用 ogg 只要可能,就给

就像其他资产一样,你用文件的干来参考它们,所以 pewpew.oggpewpew.mp3 可用 pewpew 从类型字段 Sound。 。 。 。

以下是内置声音列表:

artillery back bang beam bigshot bioLoop blaster bolt boom breaks build buttonClick cannon chatMessage click combustion conveyor corexplode cutter door drill drillCharge drillImpact dullExplosion electricHum explosion explosionbig extractLoop fire flame flame2 flux glow grinding hum largeCannon largeExplosion laser laserbeam laserbig laserblast lasercharge lasercharge2 lasershoot machine malignShoot mediumCannon message mineDeploy minebeam missile missileLarge missileLaunch missileSmall missileTrail mud noammo pew place plantBreak plasmaboom plasmadrop press pulse pulseBlast railgun rain release respawn respawning rockBreak sap shield shockBlast shoot shootAlt shootAltLong shootBig shootSmite shootSnap shotgun smelter spark spellLoop splash spray steam swish techloop thruster titanExplosion torch tractorbeam unlock wave wind wind2 wind3 windhowl none

依赖关系

您可以在您的模式中简单添加其他模式名称,从而添加依赖性 mod.json数字 :

dependencies: [
  other-mod-name
  not-a-mod
]

依赖性的名称大小写并替换为 - 例如连字符 Other MOD NamE 变成 other-mod-name。 。 。 。

要引用其他 Mods 资产, 您必须用其他 mods 名称前缀该资产 :

  • other-mod-name-not-copper 将参考 not-copperother-mod-name
  • other-mod-name-angry-dagger 将参考 angry-daggerother-mod-name
  • not-a-mod-angry-dagger 将参考 angry-daggernot-a-mod

套装

在您的 Mod 中可选择的添加称为捆绑. 捆绑的主要用途是给出你内容的翻译,但是你没有理由不能用英语. 这些是进入 bundles/ 子目录,它们应该 命名类似的东西 bundle_ru.properties (俄语).

此文件的内容非常简单 :

block.example-mod-silver-wall.name = Серебряная Стена
block.example-mod-silver-wall.description = Стена из серебра.

如果你读过这本指南的前几节,你马上会发现:

  • <content type>.<mod name>-<content name>.name
  • <content type>.<mod name>-<content name>.description

在脚本中使用的自定义捆绑行,您可以任意使用您喜欢的密钥:

  • message.egg = Eat your eggs
  • randomline = Random Line

注释:

  • mod/content名称被小写并分离出连字符.

内容类型列表 :

item block bullet liquid status unit weather sector error planet team unitCommand unitStance

相对于语言的捆绑后缀列表 :

en be bg ca cs da de es et eu fi fil fr hu id_ID it ja ko lt nl nl_BE pl pt_BR pt_PT ro ru sr sv th tk tr uk_UA vi zh_CN zh_TW

GitHub 图像

一旦你有了某种模式,你就会想 真正分享它,你甚至可能想 与其他人一起工作 在它上,做你可以使用 GitHub 图像。 。 。 。 如果你根本不知道Git(或GitHub)是什么,那么你应该调查一下 GitHub 桌面,否则只需使用您最喜欢的命令行工具或文本编辑器插件。

您只需要知道如何在 GitHub 上打开寄存器, 在您的本地寄存器中设置并执行更改, 并将更改推向 GitHub 寄存器 。 一旦您的项目在 GitHub 上, 有三种方式分享它:

  • 带有终点,例如 Anuken/MindustryJavaModTemplate,然后可以在 Ingame GitHub 界面中输入,然后下载;
  • 带zip文件,例如 https://github.com/Anuken/MindustryJavaModTemplate/archive/master.zip,它将作为zip文件下载寄存器,并放入mod目录(不需要解密);
  • 添加主题/标签 mindustry-mod 在您的仓库中,它应该添加到主题搜索和 Mod 刮纸机。 。 。 。

财务问题

  • time 在游戏中通过 ticks· ;
  • ticks 有时叫 frames, (中文(简体) ). 假设为第1/60分秒;
  • tilesize 内部为8个单位;
  • 计算区域 lifetimespeed 你可以做到这一点 lifetime * speed = range· ;
  • 摘要 这是什么 abstract? 吗? 你只需要了解抽象类型,就是它们不能被自己即时/初始化. 如果你这样做,你会得到一个 "初始化例外" 某种类型;
  • 何谓为一. NullPointerException? 吗? 这是一个错误消息,表示一个字段是无效的,不应该是无效的,意味着需要的字段之一可能缺失;
  • 血缘 这是什么 bleeding-edge? 吗? 此为Mindustry的开发者版本,特指SKIP_fb0c672eed774eebe9046773e4261b7a8. 师子分行. 在出血的尖端上的变化通常会使它在下一份发行时被制成Mindustry.