游客你好,登录后能编辑wiki哦!

全站通知:

MOD制作教学“从无知到装哔”你会是下一个大佬吗?

阅读

    

2020-04-02更新

    

最新编辑:逗比的马老师

阅读:

  

更新日期:2020-04-02

  

最新编辑:逗比的马老师

来自异星工厂WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索
页面贡献者 :
逗比的马老师
No-building-material-icon.png
本文章为 (123855714) 原创,未经作者允许,请勿擅自修改,转载请注明出处并附带 本页链接
Signal each.png
,请注意文章时效!

摘要:

此教程为本萌新接触工厂后五个月开始编写

那么,这里分享一下自己的学习成果以及尽量的讲解多个全新的mod的制作过程。

由于学习的知识比较零碎,只能想到什么讲解什么。

因为涉及各种工具的使用,因此工具的使用方法请自行百度,本文只提供工具名称。

本萌新学习时间不长,难免会有疏漏和错误,请各位大佬指正。

  • 本帖所使用各种注解符号:
    • ◆重点,必要、必须、强制
    • ◇次要点,非必要、非必须、非强制,包含建议
    • ★必要必填字段
    • ☆必要但不是必填字段
    • 其它为非必要字段
    • 〖1〗〖2〗〖3〗……〖99〗〖100〗〖101〗……索引标签
    • 【1】【2】【3】……【99】【100】【101】……解答对应索引标签

◆mod中,注意区分“大小写”

各种mod制作、创作、构思交流

欢迎进群讨论:208715008


制作准备

制作mod前,我们先要准备好制作环境和一些工具。

游戏本体

  • 首先是游戏本体,我使用的是官方 alpha windows 64位 zip版本
  • 版本支持 Windows 7, 8, 10, Vista(Mac请绕道)
  • ◆而此版本官方下载渠道必须正版权限。
    • (虽然Steam版本或其它版本游戏本体也可以,但可能无法看到调试信息)
  • 下载连接请访问官方网站download页面,找到以下关键字点击下载即可
    • MS Windows (64 bit zip package)
    • compatible with Windows 7, 8, 10, Vista

文本编辑器

Notepad++

  • 免费的文本编辑器
  • Sublime Text 等其它支持utf-8无BOM格式的文本编辑器均可
  • ◆windows自带记事本不支持无BOM格式

图像处理软件

画图

  • 系统自带的图像处理软件
  • PS 等只要能做png图片的各种图像处理软件均可
  • ◆要注意的是画图不支持透明色

Blender

  • Steam上免费使用的3d建模软件
  • 3dsMax 等其它各种3d建模软件均可
  • ◇前期教程均不涉及,此为进阶教程使用

WinRAR

  • 共享软件,网上能找到破解版本
  • 或 免费的7-Zip 等其它各种支持zip格式的压缩软件均可

了解mod

工具准备好后,先了解一下mod的整体构造

整体构造

  • mod是一个以zip格式储存内容的压缩包。
    • 也可以不打包以文件夹形式存放使用
  • ◇但游戏加载以zip格式mod优先
  • 一个完整的mod分为两大部分:外壳和内容。
    • 外壳包括mod本体文件夹和mod基础信息文件。
  • ◆此为mod的核心,两者缺一不可

mod本体

  • mod本体文件夹是以“mod核心名称加下划线加版本号”命名的文件夹
  • mod名称分为“核心名称”和“显示名称”〖1〗
  • 示例:
    • MyMods_0.1.0
    • Demo_1.0.0
    • test_ship_1.2.34
    • Iron-Man_4.5.678

mod基础信息

  • mod基础信息文件是一个 info.json 文件
  • 储存格式为JSON(JavaScript Object Notation, JS 对象标记)是一种轻量级的数据交换格式。
  • 它基于ECMAScript(w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
  • 文件编码为 utf-8 无 BOM 格式 编码。
  • 文件储存内容包括:
  • ★mod核心名称:name 【1】
    • 核心名称可由英文、数字、横杠、下划线、空格等组成。
    • 但只能以英文、数字、下划线开头,不能以横杠或空格开头,不能以横杠、下划线或空格结尾。
    • 核心名称区分大小写,并且确保是唯一的。〖2〗
    • 核心名称在游戏中并不显示
    • ◆必须跟文件夹的名称一致
    • ◇强烈不建议使用横杠或空格,请用下划线代替
  • ☆mod显示名称:title 〖3〗
  • 此为菜单中模组列表显示的标题名称
  • 也是游戏中以黄色字体标注在物品中部的名称
  • ★mod版本号:version
  • 版本号格式为GNU风格版本号格式
  • 由主版本号、子版本号和修正版本号三个部分组成,所有定义的部分都必须是大于或等于 0 的整数。
  • 示例:
    • 0.1.2
    • 0.1.234
    • 1.23.456
    • 12.34.567
  • ◆必须跟文件夹的版本号一致
  • mod描述:description 〖4〗
  • 描述mod简介及用途
  • ☆mod作者:author
  • 填上你的名字,让别人知道这是谁制作的。
  • 作者联系方式:contact
  • 可填写邮箱、QQ、Blog等等……
  • mod主页:homepage
  • 一般为mod全面介绍及使用方法的网页页面连接。
  • 如论坛、贴吧、视频等……
  • 当然你填上自己的QQ空间连接也是没有问题的……
  • ★游戏版本号:factorio_version
  • 此处填写能使用此mod游戏版本号,如0.18
  • mod依赖关系:dependencies 〖5〗
  • 默认为base,即官方基础包(官方的mod)
  • 如果你的mod使用了其它mod的物品、图片、音乐或任何东西,
  • 请把依赖的mod名称填上,更建议把mod的版本号指定(也可不填版本号),
  • 依据版本号,可向上兼容依赖关系,但不能向下兼容。
  • 某些建议依赖,但不是必须的,可以在mod名称前加问号。
  • 可填写多个依赖mod名称。
  • 示例:
    • "dependencies": ["base"]
    • "dependencies": ["base >= 0.15"]
    • "dependencies": ["base >= 0.15.31"]
    • "dependencies": ["base >= 0.15", "artsCore >= 0.1.3"]
    • "dependencies": ["base", "? EvoGUI"]
    • "dependencies": ["btsCrazyBlood", "EvoGUI", "? Waterfill_v15 >= 0.1.2"]

mod内容

  • 内容包括各种数据文件、脚本文件、配置文件、语言文件、图像文件、音乐文件、其它文件。
  • ◇内容不是必须全部都有,可选择性添加

数据文件

  • 数据文件均为lua格式 〖6〗
    • data.lua
    • data-updates.lua
    • data-final-fixes.lua
  • 以及在以上三个文件中使用require引用的文件
  • 以上三个文件内容格式并无差异,不同文件名只是加载顺序不同

脚本文件

  • 脚本文件也是lua格式 〖7〗
    • control.lua
  • 以及在文件中使用require引用的文件

配置文件

  • 配置文件同样是lua格式 〖8〗
    • settings.lua
    • settings-updates.lua
    • settings-final-fixes.lua
  • 以及在以上三个文件中使用require引用的文件
  • 以上三个文件内容格式并无差异,不同文件名只是加载顺序不同

语言文件

  • 语言文件是cfg格式 〖9〗
  • 文件路径为 mod本体文件夹\locale\①\②.cfg
    • ①填写语言缩写(如enzh-CN 等等)
    • ②填写文件名称(可任意英文名称)
  • 语言文件必须存放到对应目录下才生效
  • ◇语言文件格式为ini文件格式
    • ini文件是一种常见的配置文件。它以简单的文字与简单的结构组成。
    • ini文件在不同的使用方式上,可用不同的扩展名,如ini、cfg等。
  • 而这里mod使用的,便是以cfg为扩展名
  • ◆mod仅支持cfg扩展名的语言文件

图像文件

  • 图像文件是png格式 〖10〗
    • *.png
    • 填写文件名称(可任意名称)
  • ◆mod仅支持png格式图片

音乐文件

  • 音乐文件是ogg格式
    • *.ogg
    • 填写文件名称(可任意名称)
  • ◆mod仅支持ogg格式音频文件

其它文件

  • 其它文件如txt、log、md等等……
  • ◆此类文件非mod文件,仅作为说明、日志、协议等用途
  • ◇并不建议添加此类文件

物品及建筑

知道了mod结构,现在来说一下游戏中的物品及建筑

  • 游戏中的物品,可以分为三大类型:物体实体流体

物体

  • 物体可细分为两个小类型:非功能性物体(配方)和功能性物体(装备、插件、科技包等)。

非功能性物体

  • 铁板、电路板、塑料、处理器、卫星等…
  • 一个非功能性物体一般由两段代码组成:
    • 物品属性 type = "item"
    • 物品配方 type = "recipe"

功能性物体

  • 铁斧镐、手枪、速度插件、机器人、胶囊、固体燃料、夜视镜、火箭等…
  • 一个功能性物体一般由三段代码组成:
    • 物品属性 type = "item"
    • 物品配方 type = "recipe"
    • 物体功能 type = "mining-tool""gun""ammo""armor" 等……

实体

  • 实体也可细分为两个小类型:非建筑物(资源、汽车、生物等)和建筑物(电线杆、混凝土、铁轨等)。

非建筑物

  • 矿、水域、油井、树、汽车、坦克、火车、鱼、虫子、(没错,就是你…)
  • 矿、油等资源一般由三段代码组成:
    • 物品属性 type = "item"
    • 资源属性 type = "resource"
    • 资源生成控制 type = "autoplace-control"

建筑物

  • 铁箱子、研究中心、机枪塔、蓄电器、雷达、炼油厂、管道、机械臂、发射井等…
  • 一个建筑物一般由三段代码组成:属性、配方和实体
    • 物品属性 type = "item"
    • 物品配方 type = "recipe"
    • 实体功能 type = "car""fish""player""lab""rocket""pipe" 等……

流体

  • 各种能通过管道运输的液体、气体…
  • 一般流体由两段代码组成:
    • 流体属性 type = "fluid"
    • 流体配方 type = "recipe"

看到这里估计会有些人看得一脸蒙蔽…

不过没关系,看着下面的实例再回来这里复习,就会非常清晰了

实例一:大容量木质箱子

首先,需要做一个基础计划

  1. 我们用原版的“木制箱”代码,来修改出“大容量木质箱子
  2. 箱子堆叠每组100个(原版50)
  3. 箱子容量为30(原版16)
  4. 箱子配方为:木板8个(原版4个)
  5. 箱子燃烧热值8MJ(原版4MJ)

计划完毕,然后开始制作了…

第一步:建立mod目录结构文件

  • 新建一个文件夹,名称为 TeachsBigWoodChest_0.1.0
  • 打开 TeachsBigWoodChest_0.1.0 文件夹
  • 建立两个文件
    • info.json
    • data.lua
  • 再建立两个文件夹
    • prototypes
    • locale
      • 打开 prototypes 文件夹
  • 建立三个文件
    • entity.lua标识
    • item.lua标识
    • recipe.lua
  • 返回上一层目录,再打开 locale 文件夹
  • 建立文件夹
    • zh-CN
  • 打开 zh-CN 文件夹
  • 建立文件
    • locale.cfg

至此目录结构已经建立完毕

  • 以下为结构树形目录展示
90d12a58d109b3deba07291ec7bf6c81810a4ca8.jpg
+TeachsBigWoodChest_0.1.0
|+locale
||+zh-CN
|||-locale.cfg
|+prototypes
||-entity.lua
||-item.lua
||-recipe.lua
|-data.lua
|-info.json

第二步:编写代码

info.json

51b46c0735fae6cd1819661704b30f2443a70fb3.jpg
{
    "name": "TeachsBigwoodenchest",
    "version": "0.1.0",
    "title": "Teach's Big wooden chest",
    "author": "aspd199",
    "contact": "admin@art8620.com",
    "homepage": "https://mods.factorio.com/mods/aspd199",
    "description": "Create a Big wooden chest",
    "factorio_version": "0.15",
    "dependencies": ["base >= 0.15"]
}

◇注意json格式,非结尾行,行尾需要“逗号”,结尾行,行尾不需要“逗号”

data.lua

9d2a71ea15ce36d30d1c4f4631f33a87e850b1c9.jpg
  • 【6】
  • 格式为 require("文件夹.文件名")
require("prototypes.entity")
require("prototypes.item")
require("prototypes.recipe")
  • 例如本例三个文件路径为:
TeachsBigwoodenchest_0.1.0\prototypes\entity.lua
TeachsBigwoodenchest_0.1.0\prototypes\item.lua
TeachsBigwoodenchest_0.1.0\prototypes\recipe.lua

item.lua

4acb2ceef01f3a2938ca19b89225bc315d607ce2.jpg
data:extend({
{
    type = "item", --类型为物品属性
    name = "Big-wooden-chest", --物体内部名称〖11〗
    icon = "__base__/graphics/icons/wooden-chest.png", --物体在背包显示的图标
    flags = {"goes-to-quickbar"}, --物体标识〖12〗
    fuel_category = "chemical", --燃料类型
        --由于燃烧属于化学反应,因此这里类型填写 chemical
    fuel_value = "8MJ", --燃料热值
        --可在游戏中进行能量转化,如发电、汽车驱动等
    subgroup = "storage", --物品分组〖13〗
    order = "a[items]-a[Big-wooden-chest]", --物品在分组中排列顺序〖14〗
    place_result = "Big-wooden-chest", --放置物(一般填物体内部名称)〖15〗
    stack_size = 100 --每格堆叠数量
}
})

recipe.lua

Ff8d0b1bb051f8190c41cf3cd1b44aed2f73e785.jpg
data:extend({
{
    type = "recipe", --类型为物品配方
    name = "Big-wooden-chest", --配方内部名称,一般为物体内部名称〖11〗
    ingredients = {{"wood", 8}}, --配方需求原料〖16〗(原料名称,数量,多种原料格式参考json)
    result = "Big-wooden-chest" --成品物体内部名称
}
})

entity.lua

5670cec6a7efce1b917404bca451f3deb58f658d.jpg
data:extend({
{
    type = "container", --这里实体功能的类型为容器箱子
    name = "Big-wooden-chest", --物体内部名称
    icon = "__base__/graphics/icons/wooden-chest.png", --物体在背包显示的图标
    flags = {"placeable-neutral", "player-creation"}, --物体标识〖12〗
    minable = {mining_time = 1, result = "Big-wooden-chest"}, --拆除回收建筑物的时间和回收后的物体内部名称
        --例如拆除箱子后回收得到的是木板,这里就可以写 result = "wood"
    max_health = 100, --箱子血量
    corpse = "small-remnants", --损坏后的残骸量
    collision_box = {{-0.35, -0.35}, {0.35, 0.35}}, --建筑碰撞面积
        --这里使用的是“平面直角坐标系统”,数值为第三象限x,y,和第一象限x,y,和第一象限x
        --游戏中每一格位置在坐标系统中为0.5跨度,所以箱子占地一格,大小就是 0.5 x 0.5
    fast_replaceable_group = "container", --快速替换分组
        --相同实体功能类型的物品,能快速放置替换,而无需拆除后才能放置
    selection_box = {{-0.5, -0.5}, {0.5, 0.5}}, --鼠标移到建筑上的选择框大小
    inventory_size = 30, --箱子容量
    open_sound = { filename = "__base__/sound/wooden-chest-open.ogg" }, --打开箱子的声音
    close_sound = { filename = "__base__/sound/wooden-chest-close.ogg" }, --关闭箱子的声音
    vehicle_impact_sound = { filename = "__base__/sound/car-wood-impact.ogg", volume = 1.0 }, --被汽车撞的声音
    picture = --建筑图片素材
    {
        filename = "__base__/graphics/entity/wooden-chest/wooden-chest.png",
        priority = "extra-high", --图片优先级
        width = 46, --图片素材宽度
        height = 33, --图片素材高度
        shift = {0.25, 0.015625} --建筑图片素材在游戏中偏移量(这里数值为百分比)
    },
    circuit_wire_connection_point = --电路连接点
    {
        shadow = --红绿线阴影基于坐标系统中心原点偏移量
        {
            red = {0.734375, 0.453125},
            green = {0.609375, 0.515625},
        },
        wire = --红绿线连接点基于坐标系统中心原点偏移量
        {
            red = {0.40625, 0.21875},
            green = {0.40625, 0.375},
        }
    },
    circuit_connector_sprites = get_circuit_connector_sprites({0.1875, 0.15625}, nil, 18), --电路连接器
        --电路连接器基于坐标系统中心原点偏移量
        --这里的 18 是电路连接器样式〖17〗
    circuit_wire_max_distance = 9 --红绿线最大连接距离格数
}
})

locale.cfg

6bf165c451da81cb610d4fbb5966d01608243179.jpg
[entity-name]
Big-wooden-chest=大容量木质箱子

[mod-name]
TeachsBigwoodenchest=教程实例一:大容量木质箱子

[mod-description]
TeachsBigwoodenchest=创建一个大容量木质箱子

◆这里entity-name使用的是“物体内部名称”【11】

  • 格式为:
[entity-name]
物体内部名称=物体显示名称
  • 物体显示名称即游戏中能看到的名称…
  • 汉化也是通过修改此字段以达到更改名称显示语言
  • 如果换成其它国家文字则游戏中显示其它国家文字

◆而mod-name和moddescription使用的是“mod核心名称”【1】

  • 格式为:
[mod-name]
mod核心名称=mod显示名称

[mod-description]
mod核心名称=mod描述介绍

第三步:打包

7464fb166d224f4a97e9bc6502f790529922d1f1.jpg
  • 把整个 TeachsBigwoodenchest_0.1.0文件夹打包成 TeachsBigwoodenchest_0.1.0.zip压缩包
  • ◆注意打包时必须是把整个文件夹打包,而不只是文件夹里面的文件
  • ◆打包压缩文件必须为zip格式
  • ◇最后把mod压缩包放置到 %appdata%\factorio\mods 目录中
Ca48292397dda14447efa3c4b9b7d0a20df48607.jpg

启动游戏测试效果!

89d598a4462309f72c016064790e0cf3d6cad6ff.jpg

完成!

实例二:增加小型电线杆连接距离及覆盖范围

点击查看:MOD制作教学 - 大范围小型电线杆


番外篇:如何汉化MOD

点击查看:MOD汉化教学