【mod制作教程】天明2.0版
饥荒mod吧
全部回复
仅看楼主
level 8
czfshine 楼主

制作一个一个mod ,然后有很多人用你做的mod,可以说是一件十分有意义的事[太开心]
但是对于新手来说,看着那些程序代码,他不认识你,你不认识他,想要学习mod,又没有一个mod制作教程, 现在我就满足大家的愿望,写一个有关mod制作与饥荒游戏代码的贴子。
-----------------------------------------------------------------------------
注:在没有end 前不要回复,不要在正文的楼中楼回复
如果不懂的给我发邮件(发qq可能收不到)
我的电子邮箱是 [email protected]
2013年06月06日 10点06分 1
level 8
czfshine 楼主

作mod 需要用到的工具
【1】一个完整的英文版饥荒(用来查看物品的英文)
【2】Textool (用来制作图片)
【3】 SciTE软件(用来修改代码 用记事本也行但是不方便)
【4】还有一些图片编辑软件 等等
【2】和【3】我已经加在mod附件里
mod附件下载地址
[有效] http://pan.baidu.com/share/link?shareid=3249133832&uk=3140382264
textool官网(会更新textool 目前最高1.3版)
http://www.dev-zilla.net/kleistudio/
国外mod教程
http://forums.kleientertainment.com/showthread.php?10817-TUTORIAL-Creating-a-Mod-using-the-Mod-System
http://forums.kleientertainment.com/showthread.php?18685-Tutorial-My-first-mod-creating-a-new-stat
在此感谢 @ 方城之癫
@还我意大利面
2013年06月06日 10点06分 2
level 8
czfshine 楼主
第一章 [惊讶] mod 入门
这一章主要是来讲mod 原理 和如何做一个简易mod
1.1 lua简单教学
想要做mod 要从lua语言学起,不用太精通,只要会一点点语法就行了
1.1.1 在lua里 所有的文字的都是变量(关键字除外)
Lua 里的关键字有
【and(和运算), break(终止) ,do(做) ,else(不然) ,
elseif(再 如果), end (结束),false(假) ,for(从) ,function(函数),
if(如果), in(在), local(局部) ,nil(空值) ,not(非运算) ,
or(或运算) , repeat(输出当until成立时), return(输出) ,
then(然后), true(真) ,until( 后接条件),while(当)】
这些字符在SciTe 里显示为蓝色
2013年06月06日 10点06分 3
level 8
czfshine 楼主

1.1.2 lua注释
在lua里注释分为一行注释 和 多行注释两种
一行注释 只需要在哪行代码前面加--(双横杆)
多行注释 在注释开头加- -[[ 结尾加]]- -
注释内容会被忽略掉,不会被运行(注释在scite里是绿色的)
2013年06月06日 10点06分 4
回复 czfshine :22版MOD怎么做= =
2013年11月06日 11点11分
回复@求生专家小林 :小林,你挖坟了,怎么处理[阴险]
2013年11月06日 11点11分
回复 龙王果实 :噗- -
2013年11月06日 12点11分
好吧,原来双杠是注释的意思…我刚修改还纳闷怎么不起效果……晚上回来继续试试
2015年02月10日 08点02分
level 8
czfshine 楼主

1.1.3基本语句
Print 语句是用来在控制台输出一段字符的,在饥荒里基本不会遇到 忽略掉
If 语句是用来表示条件的格式为
if 条件1 then 代码1 elseif 条件2 then 代码2 else 代码3end
【【如果条件1的结果为真,然后执行代码1 如果条件2的结果为真 然后执行代码2
如果前面的条件均为假,执行代码3】
在一个if语句里 可以有无数个elseif
------------------------------------------------------------
While 语句 跟if语句一样 只是没有elseif 而已
---------------------------------------------------------
Repeat 语句 跟if 一样 可是条件和代码要倒过来
格式【repeat 代码 until 条件】
------------------------------------------------------------------
For 语句 就是从什么到什么
格式【for 变量=初值, 终点值, 步进 do 代码 end】
如【for i = 1, 10, 2 do print(i) end】
注意一下,for的循环变量总是只作用于for的局部变量;当省略步进值时,for循环会使用1作为步进值,使用break可以用来中止一个循环
For 语句还有一个格式
【for 变量1, 变量2, ... 变量n in 表或枚举函数 do 代码end】
就是把变量一个一个代入代码里
2013年06月06日 10点06分 5
看不懂for的介绍。
2015年10月23日 13点10分
@小andT
2015年10月24日 13点10分
l don't look 吆西
2016年01月03日 04点01分
level 8
czfshine 楼主

1.1.5变量类型【下面是复制粘贴的 亲】[太开心]
【1】Nil 空值,所有没有使用过的变量,都是nil。nil既是值,又是类型。
请注意 nil 一定要小写
【2】Boolean 布尔值,只有两个有效值:true和false
布尔值通常是用在进行条件判断的时候。布尔值有两种:true 和 false。在Lua中,只有false和nil才被计算为false,而所有任何其它类型的值,都是true。比如0,空串等等,都是true。不要被 C语言的习惯所误导,0在Lua中的的确确是true。你也可以直接给一个变量赋以Boolean类型的值,如:
    theBoolean = true
【3】Number 数值,在Lua里,数值相当于C语言的double
【4】String 字符串,如果你愿意的话,字符串是可以包含"\0"字符的(这和C语言总是以"\0"结尾是不一样的)
\a bell
    \b back space
    \f form feed
    \n newline
    \r carriage return
    \t horizontal tab
    \v vertical tab
    \\ backslash
    \" double quote
    \" single quote
    \[ left square bracket
    \] right square bracket
【5】Table 关系表类型,这个类型功能比较强大,请参考后面的内容。
【6】Function 函数类型,不要怀疑,函数也是一种类型,也就是说,所有的函数,它本身就是一个变量。
【7】Userdata 嗯,这个类型专门用来和Lua的宿主打交道的。宿主通常是用C和C++来编写的,在这种情况下,Userdata可以是宿主的任意数据类型,常用的有Struct和指针。
Thread 线程类型,在Lua中没有真正的线程。Lua中可以将一个函数分成几部份运行。如果感兴趣的话,可以去看看Lua的文档。
也跟遍历函数(Iterator函数)有点象。
如:
function range(n)
local i = 0
while(i < n) do
coroutine.yield( i )
i = i + 1
end
end
要继续运行,需要coroutine.resume函数。
【复制粘贴完了】
2013年06月06日 10点06分 7
level 8
czfshine 楼主

1.1.7函数
函数是用来说明一种计算方法的
格式【 function add(a,b) -- add 是函数名字,a和b是参数名字
     return a+b -- return 用来返回函数的运行结果
    end 】
这时【add(5,6)=11】
更可贵的是,它可以同时返回多个结果,比如:
    【function s()
      return 1,2,3,4
    end
    a,b,c,d = s() -- 此时,a = 1, b = 2, c = 3, d = 4 】
参数可以定义为 .... 是可变变量
如 【function czf(a,b,..)
      return a,b,...
    end】
【这时 czf(5,8,4,5,8) 会输出 {5,8,...={4,5,8}}】
2013年06月06日 10点06分 9
level 8
czfshine 楼主

1.1.8 表与函数的混用
【czf={cnm=1, function add(a,b)
     return a+b
    end }
这时【czf.cnm=1,czf:(冒号)add(5.5)=10】
lua就说到这里,有问题 找吧主
2013年06月06日 10点06分 10
level 8
czfshine 楼主

1.2饥荒mod的原理 [钱]
注:此原理只适用于饥荒 这个游戏 别的游戏不知道
饥荒mod主要的原理有三种类型
【1】 直接在modmain.lua 文件里调用全局函数(表) 并进行修改
【2】 在替换路径相同的同名文件 (把某mod文件夹看做饥荒里的data 文件夹 路径相同且同名的 就会被替换{源文件还在 只是饥荒把新的文件看做旧的来运行})
这样做的方式跟直接修改代码的一样,但是源文件不会被损坏,如果出现错误把mod卸掉就行
【3】 新增一些文件,与饥荒里的文件不同名的 或者路径不相同的
2013年06月06日 10点06分 11
level 8
czfshine 楼主

1.3 如何新建一个mod
任意一个地方 新建一个文件夹,这个文件夹的名称就是你新mod的名称 我这里用 czf为例
在文件夹czf里 新建一个名为modmain.Lua 的文本档案
一个mod的雏形就这样诞生了
这时czf文件夹就相当于你饥荒里的data文件夹 而modmain就是用来调用全局函数(表)的文件,用lua语言在里面调用就行了
一些物品属性是局部变量的,不能在这个文件里调用与改变,我们就要用替换法来修改
Modmain.Lua文件还可以用来写注释,说明这个mod是谁做的 用来做什么的 什么时候做的等等
2013年06月06日 10点06分 12
level 8
czfshine 楼主

1.4 修改一些简单代码
制作一个mod,要功能齐全是一件很不容易的事,最好有一个团队来合作
我就以修改人物生命上限为例【找生命上限的方法可以用来寻找别的属性】
---------------------------------------------------------------------------
首先我们要知道要修改的代码在哪里,我们知道人物生命上限是150
我们打开饥荒文件夹 搜索150 一共找到33个文件
既然是代码 我们把lua文件外的文件不理他们[墙角]
还剩下21个 既然是人物生命上限 不关地图什么事,把路径里有map(地图)的也河蟹掉
还剩下12个 生命的英文是health 我们在这12个文件里一个一个搜索health 如果没有就河蟹掉(这里有一个简单的方法,用SciTE软件同时打开12个再用find all(搜索全部)不用十几秒12个文件就搜索完了)
还剩下4个 因为 生命上限是150 所以我们就看看在health附近有没有150
最终找到了在tuning 文件里的表TUNING 里的WILSON_HEALTH 数值为150
我们就确定了WILSON_HEALTH为人物生命代码
而且在定义表TUNING={}前面没有加local 说明这是一个全局的表
【【【总结】】】】
以上这个方法虽然很繁琐 但是最有效果 当然我们可以用对比法 这个方法以后再说
2013年06月06日 10点06分 13
level 8
czfshine 楼主

1.5 制作一个简简单单的mod[惊讶](重点)
打开1.3所制作的czf 文件夹 打开里面的modmain.lua
在里面输入
【【【【
--修改人物生命mod
--夜尽天明制作于2013.06.05
TUNING.WILSON_HEALTH=10000】】】
改完后 记得save(保存)
好了 这时的czf 文件夹已经不再是一个普通的文件夹了
他是一个mod 一个你自己制作的mod [哭着跑]
2013年06月06日 10点06分 14
level 8
czfshine 楼主

第二章 详解替换法做 mod
替换法是一种比较常用到的方法,因为他可以修改局部变量,在饥荒里 局部变量可比全局变量多得多,原理见1.2 里
2.1先来一个容易的
【【做一个mod之前要想好是做什么的 才会有地方下手】】】
我以修改树木掉落为例,用饥荒英文版可以知道 树木英文是evergreens
我们打开...\data\scripts\prefabs\evergreens.lua
(当然你搜索evergreens也行)
树木的掉落物木头的英文是log 我们就sind all log
总共用三处地方有log
再有 松果的英文是pinecone 这下很明白了
树木掉落就在evergreens.lua文件里的
【【【【【
ocal builds =
{
normal = {
file="evergreen_new",
prefab_name="evergreen",
normal_loot = {"log", "log", ""},
short_loot = {"log"},
tall_loot = {"log", "log", "log", "pinecone", "pinecone"},
drop_pinecones=true,
leif="leif",
},
】】】】】】】
先不急,我们是在做mod,备份evergreens.lua 到一个用1.3 新建的mod里
路径就是D:\your mod name(你的mod)\scripts\prefabs\evergreens.lua
之后 修改mod里的evergreens.lua 文件 好了之后记得save
【【见附件里的 砍树掉落木头翻三倍 mod】
2013年06月06日 10点06分 15
level 8
czfshine 楼主

2.2再来一个简单的[吃花]
【【【【【【【方法教程-----对比法】】】】】】
我以 light (点燃) 为例
先找到可以点燃物品的工具的lua(以下简称 *)
如火杖(firestaff.lua) 火把(torch.lua)等等
不可以点燃物品的工具的lua(以下简称 +)
如 斧子(axe.lua) 锄头(pickaxe.lua)等等
用scite 打开 这四个文件对比
把* 和+ 代码相同的删掉(不保存 没事)
把*里不相同的删掉
把+里不相同的删掉
【【【特别说明一下
anim:SetBank("pickaxe")
anim:SetBuild("pickaxe")
anim:PlayAnimation("idle")
在每个物品里都会出现这三行 我就认为他们是相同的)】】】】
到最后 也许会剩下几行,那就关闭一个(不保存)重开 删 掉刚才剩下的一部分 保存(记得备份)进入游戏看看,是不是想要的
最后剩下inst:AddComponent("lighter") 这就是 light 代码了
(其实直接看英文就知道了hehe ~~~~)
开始修改了,在axe.Lua 或你想的工具 在fn 函数里 添加
inst:AddComponent("lighter")
这个工具就有light 功能了 噢耶![顶]
先不急,我们是在做mod,备份axe.lua 到一个用1.3 新建的mod里
路径就是D:\your mod name(你的mod)\scripts\prefabs\axe.lua
之后 修改mod里的axe.lua 文件 好了之后记得save
2013年06月06日 11点06分 16
楼主大大我想请教下scite 怎么对比两个文件。。。
2015年06月19日 05点06分
回复
������
:自己写 = =
2015年06月21日 09点06分
@czfshine 我没有让你帮我写的意思,我不知道该怎么同时对比几个文件
2015年06月22日 03点06分
吧主怎么可以同时用替换发和对比法????
2016年02月22日 12点02分
level 8
czfshine 楼主

2.3从一行变两行
2.2里最终的结果是一行代码 接下来的结果将会是两行代码
我们要修改物品叠加上限,利用对比法
可以轻松找到(轻松???)物品叠加的代码是
【【【【【【【inst:AddComponent("stackable")
inst.components.stackable.maxsize = TUNING.STACK_SIZE_SMALLITEM
】】】】】】
在不可叠加物品里写上这段代码 物品就可以叠加了
【见附件里的 狗牙陷阱叠加.rar】
2013年06月06日 11点06分 17
level 8
czfshine 楼主

第三章我的小物品【见附件里的Strong Sword.zip】
在饥荒里 我们可以随意添加一个个物品 或者动物(只要你做的出模型而且会ui)
一个物品分成
【1】 图片部分(tex)
【2】 主代码部分
【3】 附属代码
【4】注册码部分(在6月5日后已经放在附属码里)
2013年06月06日 11点06分 18
level 8
czfshine 楼主

3.1 tex 图片制作
Tex 图片是饥荒里的图片格式 你在游戏里见到的所有东东(包括菜单)都是用一张张tex图片拼成的
在饥荒里 我认为的图片分成两部分 一是tex图片 还有就是 人物模型(anim)
3.1.1 tex图片 可以用textool 导入和导出 注意导入格式而已
怎样知道图片格式呢 打开一张tex 图片(饥荒里的) 看窗口的最下面一行 如图:
格式就是DXT5 大小64*64 是1D的 MIPMAPS 为1
打开TEXCreator.exe 出现如下界面
黑色的是你图片要导入图片的路径
深绿色是你新tex图片的保存路径
红色的选择DXT5
黄色的选择 1D
绿色的选第一个
蓝色的不要点
粉红色的也不要点
深蓝色的是开始导入依照上面的方法,如果进入游戏出错,可以更换图片格式
2013年06月06日 11点06分 19
冒昧的问下:我现在还没搞懂tex图片和人物模型怎么整
2016年03月21日 04点03分
level 8
czfshine 楼主

3.1.2 人物模型制作
用上面的方法导入一张人物模型
人物模型格式见anim文件夹里的压缩文件
(导出 anim 里的某个人物模型tex图片 用图形编辑软件修改(背景要透明)
【【【【注意图片大小 【【【注意大小 【【大小【】】】】】】】】】】
之后导入成一个新的tex 文件
【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【【
关键来了 注意看
备份一个anim 里的压缩文件(就是你要修改的那个人物模型)
打开备份好的压缩文件(注意 是用 winrar 打开 不是解压)
把上面更改好tex 文件改名为atlas-0.tex
【【【【【关键 关键关键关键关键关键】】】】】
把这个tex 拖入刚才打开的压缩文件的窗口里 弹出一个窗口 你选择替换文件
终于好了 一个新的人物模型就这样诞生了0.0
2013年06月06日 11点06分 20
就算挖坟我也要问…我尝试着改了一下人物贴图,因为原版MOD太丑,然后我发现如果更换的贴图超出原来的大小,比如头发加长之类的,就会让多出来的部分被切掉,然后我估计是在同压缩包的两个bin文件里面有坐标信息,尝试用记事本打开结果是乱码,找攻略期间看到这篇帖,求修改坐标的方法
2015年08月08日 10点08分
@ad50144124 去看我的博客或知乎
2015年08月16日 05点08分
level 8
czfshine 楼主

3.2 主代码部分
这个你可以选择一个与你新物品相似的 物品的lua文件 作为模板
可是要更改一些东西
我以log.lua为例
第一行的
local assets=
{
Asset("ANIM", "data/anim/log.zip"),
Asset("IMAGE", "data/inventoryimages/log.tex"),
}
这些要改成你的新物品的
14 15行的
inst.AnimState:SetBank("log")
inst.AnimState:SetBuild("log")
也要改
最后一行的return Prefab( "common/inventory/log", fn, assets)
也要改
这些改好之后,可以再新增一些代码进去,用上面所说的两种找代码的方法
主代码基本就好了
2013年06月06日 11点06分 21
level 8
czfshine 楼主

3.3 附属代码部分
3.3.1 他来自哪里
一个物品的来源有
【1】掉落(树啊 怪物啊)
【2】制作(界面边上的建造栏)
【3】天上掉的(15版的地震会掉石头 不过我不知道怎么修改,忽略掉)
物品掉落可以修改那个怪物 或者植物的lua 文件 见2.1
制作物品可以用Recipe 函数来弄 就会在下面详解
天上掉的方法忽略掉
2013年06月06日 11点06分 22
1 2 3 尾页