> 教程 > MOD制作教学“从无知到装哔”你会是下一个大佬吗?短•刷•阅•编•历本文章为 (123855714) 原创,未经作者允许,请勿擅自修改,转载请注明出处并附带 本页链接。×
MediaWiki:Timer12020/04/02 19:11:0本文上次更新
,请注意文章时效!×
摘要:
此教程为本萌新接触工厂后五个月开始编写
那么,这里分享一下自己的学习成果以及尽量的讲解多个全新的mod的制作过程。
由于学习的知识比较零碎,只能想到什么讲解什么。
因为涉及各种工具的使用,因此工具的使用方法请自行百度,本文只提供工具名称。
本萌新学习时间不长,难免会有疏漏和错误,请各位大佬指正。
本帖所使用各种注解符号:
◆重点,必要、必须、强制
◇次要点,非必要、非必须、非强制,包含建议
★必要必填字段
☆必要但不是必填字段
其它为非必要字段
〖1〗〖2〗〖3〗……〖99〗〖100〗〖101〗……索引标签
【1】【2】【3】……【99】【100】【101】……解答对应索引标签
◆mod中,注意区分“大小写”
各种mod制作、创作、构思交流
欢迎进群讨论:208715008
目录
1 制作准备
1.1 游戏本体
1.2 文本编辑器
1.2.1 Notepad++
1.3 图像处理软件
1.3.1 画图
1.3.2 Blender
1.3.3 WinRAR
2 了解mod
2.1 整体构造
2.2 mod本体
2.3 mod基础信息
2.4 mod内容
2.4.1 数据文件
2.4.2 脚本文件
2.4.3 配置文件
2.4.4 语言文件
2.4.5 图像文件
2.4.6 音乐文件
2.4.7 其它文件
3 物品及建筑
3.1 物体
3.1.1 非功能性物体
3.1.2 功能性物体
3.2 实体
3.2.1 非建筑物
3.2.2 建筑物
3.3 流体
4 实例一:大容量木质箱子
4.1 第一步:建立mod目录结构文件
4.2 第二步:编写代码
4.2.1 info.json
4.2.2 data.lua
4.2.3 item.lua
4.2.4 recipe.lua
4.2.5 entity.lua
4.2.6 locale.cfg
4.3 第三步:打包
5 实例二:增加小型电线杆连接距离及覆盖范围
6 番外篇:如何汉化MOD
制作准备
制作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
①填写语言缩写(如en、zh-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"
看到这里估计会有些人看得一脸蒙蔽…
不过没关系,看着下面的实例再回来这里复习,就会非常清晰了
实例一:大容量木质箱子
首先,需要做一个基础计划
我们用原版的“木制箱”代码,来修改出“大容量木质箱子”
箱子堆叠每组100个(原版50)
箱子容量为30(原版16)
箱子配方为:木板8个(原版4个)
箱子燃烧热值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
至此目录结构已经建立完毕
以下为结构树形目录展示
+TeachsBigWoodChest_0.1.0
|+locale
||+zh-CN
|||-locale.cfg
|+prototypes
||-entity.lua
||-item.lua
||-recipe.lua
|-data.lua
|-info.json
第二步:编写代码
info.json
{
"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
【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
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
data:extend({
{
type = "recipe", --类型为物品配方
name = "Big-wooden-chest", --配方内部名称,一般为物体内部名称〖11〗
ingredients = {{"wood", 8}}, --配方需求原料〖16〗(原料名称,数量,多种原料格式参考json)
result = "Big-wooden-chest" --成品物体内部名称
}
})
entity.lua
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
【9】
[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描述介绍
第三步:打包
把整个 TeachsBigwoodenchest_0.1.0文件夹打包成 TeachsBigwoodenchest_0.1.0.zip压缩包
◆注意打包时必须是把整个文件夹打包,而不只是文件夹里面的文件
◆打包压缩文件必须为zip格式
◇最后把mod压缩包放置到 %appdata%\factorio\mods 目录中
启动游戏测试效果!
完成!
实例二:增加小型电线杆连接距离及覆盖范围
点击查看:MOD制作教学 - 大范围小型电线杆
番外篇:如何汉化MOD
点击查看:MOD汉化教学