制作一个一个mod ,然后有很多人用你做的mod,可以说是一件十分有意义的事,
但是对于新手来说,看着那些程序代码,他不认识你,你不认识他,想要学习mod,又没有一个mod制作教程, 现在我就满足大家的愿望,写一个有关mod制作与饥荒游戏代码的贴子。
-----------------------------------------------------------------------------
工具/原料
<p>【1】一个完整的英文版饥荒(用来查看物品的英文) </p>
<p> <br>【2】Textool (用来制作图片) <br></p>
<p>【3】 SciTE软件(用来修改代码 用记事本也行但是不方便) </p>
<p><br>【4】还有一些图片编辑软件 等等</p>
第一章,mod
1
第一章 mod 入门
这一章主要是来讲mod 原理 和如何做一个简易mod
2
饥荒mod的原理
注:此原理只适用于饥荒 这个游戏 别的游戏不知道
饥荒mod主要的原理有三种类型
【1】 直接在modmain.lua 文件里调用全局函数(表) 并进行修改
【2】 在替换路径相同的同名文件 (把某mod文件夹看做饥荒里的data 文件夹 路径相同且同名的 就会被替换{源文件还在 只是饥荒把新的文件看做旧的来运行})
这样做的方式跟直接修改代码的一样,但是源文件不会被损坏,如果出现错误把mod卸掉就行
【3】 新增一些文件,与饥荒里的文件不同名的 或者路径不相同的
3
如何新建一个mod
【1】任意一个地方 新建一个文件夹,这个文件夹的名称就是你新mod的名称
( 我这里用 czf为例 )
【2】在文件夹czf里 新建一个名为modmain.Lua 的文本档案 ,一个mod的雏形就这样诞生了 。
注:这时czf文件夹就相当于你饥荒里的data文件夹 而modmain就是用来调用全局函数(表)的文件,用lua语言在里面调用就行了
【3】一些物品属性是局部变量的,不能在这个文件里调用与改变,我们就要用替换法来修改
【4】Modmain.Lua文件还可以用来写注释,说明这个mod是谁做的 用来做什么的 什么时候做的等等
4
修改一些简单代码
制作一个mod,要功能齐全是一件很不容易的事,最好有一个团队来合作
我就以修改人物生命上限为例【找生命上限的方法可以用来寻找别的属性】
---------------------------------------------------------------------------
【1】首先我们要知道要修改的代码在哪里,我们知道人物生命上限是150
我们打开饥荒文件夹 搜索150 一共找到33个文件
既然是代码 我们把lua文件外的文件不理他们
【2】还剩下21个 既然是人物生命上限 不关地图什么事,把路径里有map(地图)的也忽略
【3】还剩下12个 生命的英文是health 我们在这12个文件里一个一个搜索health 如果没有就忽略掉(这里有一个简单的方法,用SciTE软件同时打开12个再用find all(搜索全部)不用十几秒12个文件就搜索完了)
【4】还剩下4个 因为 生命上限是150 所以我们就看看在health附近有没有150
最终找到了在tuning 文件里的表TUNING 里的WILSON_HEALTH 数值为150
我们就确定了WILSON_HEALTH为人物生命代码
而且在定义表TUNING={}前面没有加local 说明这是一个全局的表
【【【总结】】】】
以上这个方法虽然很繁琐 但是最有效果 当然我们可以用对比法 这个方法以后再说
5
制作一个简简单单的mod(重点)
打开1.3所制作的czf 文件夹 打开里面的modmain.lua
在里面输入
【【【【
--修改人物生命mod
--夜尽天明制作于2013.06.05
TUNING.WILSON_HEALTH=10000】】】
改完后 记得save(保存)
好了 这时的czf 文件夹已经不再是一个普通的文件夹了
他是一个mod 一个你自己制作的mod
END
第二章
1
替换法是一种比较常用到的方法,因为他可以修改局部变量,在饥荒里 局部变量可比全局变量多得多,原理见1.2 里
2.1先来一个容易的
【【做一个mod之前要想好是做什么的 才会有地方下手】】】
我以修改树木掉落为例,用饥荒英文版可以知道 树木英文是evergreens
我们打开...datascriptsprefabsevergreens.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)scriptsprefabsevergreens.lua
之后 修改mod里的evergreens.lua 文件 好了之后记得save
【【见附件里的 砍树掉落木头翻三倍 mod】
2
2.2再来一个简单的
【【【【【【【方法教程-----对比法】】】】】】
我以 light (点燃) 为例
[1]先找到可以点燃物品的工具的lua(以下简称 *)
如火杖(firestaff.lua) 火把(torch.lua)等等
不可以点燃物品的工具的lua(以下简称 +)
如 斧子(axe.lua) 锄头(pickaxe.lua)等等
[2]用scite 打开 这四个文件对比
把* 和+ 代码相同的删掉(不保存 没事)
把*里不相同的删掉
把+里不相同的删掉
【【【特别说明一下
anim:SetBank("pickaxe")
anim:SetBuild("pickaxe")
anim:PlayAnimation("idle")
在每个物品里都会出现这三行 我就认为他们是相同的)】】】】
[3]到最后 也许会剩下几行,那就关闭一个(不保存)重开 删 掉刚才剩下的一部分 保存(记得备份)进入游戏看看,是不是想要的
最后剩下inst:AddComponent("lighter") 这就是 light 代码了
(其实直接看英文就知道了hehe ~~~~)
[4]开始修改了,在axe.Lua 或你想的工具 在fn 函数里 添加
inst:AddComponent("lighter")
这个工具就有light 功能了 噢耶!
[5]先不急,我们是在做mod,备份axe.lua 到一个用1.3 新建的mod里
路径就是D:your mod name(你的mod)scriptsprefabsaxe.lua
之后 修改mod里的axe.lua 文件 好了之后记得save
3
2.3从一行变两行
2.2里最终的结果是一行代码 接下来的结果将会是两行代码
我们要修改物品叠加上限,利用对比法
可以轻松找到(轻松???)物品叠加的代码是
【【【【【【【inst:AddComponent("stackable")
inst.components.stackable.maxsize = TUNING.STACK_SIZE_SMALLITEM
】】】】】】
在不可叠加物品里写上这段代码 物品就可以叠加了
【见附件里的 狗牙陷阱叠加.rar】
END
第三章 我的小物品
1
在饥荒里 我们可以随意添加一个个物品 或者动物(只要你做的出模型而且会ui)
一个物品分成
【1】 图片部分(tex)
【2】 主代码部分
【3】 附属代码
【4】注册码部分(在6月5日后已经放在附属码里)
2
tex 图片制作
Tex 图片是饥荒里的图片格式 你在游戏里见到的所有东东(包括菜单)都是用一张张tex图片拼成的
在饥荒里 我认为的图片分成两部分 一是tex图片 还有就是 人物模型(anim)
tex图片 可以用textool 导入和导出 注意导入格式而已
-----------------------------------------------------------------------------------------
怎样知道图片格式呢 打开一张tex 图片(饥荒里的) 看窗口的最下面一行 如图:
格式就是DXT5 大小64*64 是1D的 MIPMAPS 为1
---------------------------------------------------------------------------------------------
打开TEXCreator.exe 出现如下界面
1.黑色的是你图片要导入图片的路径
2.深绿色是你新tex图片的保存路径
3.红色的选择DXT5
4.黄色的选择 1D
5.绿色的选第一个
6.蓝色的不要点
7.粉红色的也不要点
8.深蓝色的是开始导入依照上面的方法,如果进入游戏出错,可以更换图片格式
3
人物模型制作
用上面的方法导入一张人物模型
人物模型格式见anim文件夹里的压缩文件
(导出 anim 里的某个人物模型tex图片 用图形编辑软件修改(背景要透明))
【【【【注意图片大小 【【【注意大小 【【大小【】】】】】】】】】】
之后导入成一个新的tex 文件
---------------------------------------------------------------------------------------------------
关键来了 注意看
备份一个anim 里的压缩文件(就是你要修改的那个人物模型)
打开备份好的压缩文件(注意 是用 winrar 打开 不是解压)
把上面更改好tex 文件改名为atlas-0.tex
【【【【【关键 关键关键关键关键关键】】】】】
把这个tex 拖入刚才打开的压缩文件的窗口里 弹出一个窗口 你选择替换文件
终于好了 一个新的人物模型就这样诞生了0.0
4
主代码部分
这个你可以选择一个与你新物品相似的 物品的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)
也要改
--------------------------------------------------------------------------------------------
这些改好之后,可以再新增一些代码进去,用上面所说的两种找代码的方法
主代码基本就好了
5
附属代码部分
他来自哪里
一个物品的来源有
【1】掉落(树啊 怪物啊)
【2】制作(界面边上的建造栏)
【3】天上掉的(15版的地震会掉石头 不过我不知道怎么修改,忽略掉)
-------------------------------------------------------------------------------------------
物品掉落可以修改那个怪物 或者植物的lua 文件 见2.1
制作物品可以用Recipe 函数来弄 就会在下面详解
天上掉的方法忽略掉
6
他要去哪里
【1】 工具(…有无限耐久)
【2】可以吃
【【【【inst:AddComponent("perishable")
inst.components.perishable:SetPerishTime(TUNING.PERISH_SUPERSLOW)
inst.components.perishable:StartPerishing()
inst.components.perishable.onperishreplacement = "spoiled_food"】】
【3】 可以烧(【【inst:AddComponent("fuel")
inst.components.fuel.fuelvalue = TUNING.MED_FUEL】】】】】
【4】可以制作东西(【【【Recipe】】】
【5】可以给别的动物(这个我不会 等以后更新)
只想到这么多了 以后再补充
7
你到底叫什么东东
更改人物语言文件 从而使物品有一个名字
【【【【strings.lua文件】】
8
在6.5 日 版之后 注册码会包含在附属码里
注册码
注册码就像一个名单一样 如果你没有在里面登记 你的物品就会被饥荒忽略掉
修改方法如下
【1】在你的新mod 文件夹里 创建一个名为prefabs.xml 的文本档案
复制下面的代码进去(或者自己去饥荒data文件夹里的prefabs.xml 里看格式)
<Prefabs>
<Defs>
<Prefab name='物品名称' pathname='common/inventory/物称' file='.modsscriptsprefabs物品名称.lua' desc=''>
<Assets>
<Asset type='ANIM' file='mods/Strong Sword/anim/物品模型(地上).zip' flags='0' />
<Asset type='ANIM' file='mods/Strong Sword/anim/物品模型(手上).zip' flags='0' />
<Asset type='IMAGE' file='mods/Strong Sword/inventoryimages/物品图片.tex' flags='0' />
</Assets>
<Deps>
</Deps>
</Prefab>
</Defs>
<Files>
<File name='prefabs/物品主代码.lua'/>
</Files>
</Prefabs>
如果有多个 格式详见饥荒原版prefabs.xml
(注意语法要符合 xml 语法)
9
整理一下下
【1】新建一个mod
【2】把人物模型的压缩包放在
【3】你的mod名称anim 里
【4】把 图片放在… inventoryimages里
【5】把主代码放在(和掉落代码一起)放在 …… scripts prefabs里
【6】把prefabs.xml 放在你的mod文件夹里
好了 一个历经千辛万苦的mod 就这样好了
END
第四章饥荒函数
1
.1 recipes 函数
外国教程见附件内的配方函数文件夹,用百度翻译看看就行了
格式【(self, name, ingredients, tab, level, placer, min_spacing)】
self 不用定义 (不知道为什么)
name 是你想制造物品的代码(注意不是名称,有些物品的代码与名称不一样)
ingredients 【{中文} 材料】
tad 在那一行建造 (工具,光照) 等等
level 科技等级(0~3)
placer 外形 (就像猪屋在建造时的绿色部分)
-------------------------------------------------------
min_spacing 是最小间距的意思
(可以在builder.lua spiderqueenbrain.lua deployable.lua pinecone.lua plantables.lua turfs.lua walls.lua 这些文件里改变 walls的间距是0)
-----------------------------------------------------
而且这是一个全局变量 可以在modmain 里直接调用 格式如下
【STRINGS = GLOBAL.STRINGS
RECIPETABS = GLOBAL.RECIPETABS
Recipe = GLOBAL.Recipe
Ingredient = GLOBAL.Ingredient
--把这里的局部变量换成全局的
STRINGS.RECIPE_DESC.GEARS = "for czf shine"
Recipe("marble", {Ingredient("rocks", 20)}, RECIPETABS.REFINE, 3)】
---------------------------------------------------------------------------
2
4.2 叠加上限
【见附件里的狗牙】
【inst:AddComponent("stackable")
inst.components.stackable.maxsize = TUNING.STACK_SIZE_SMALLITEM】
在不能叠加的物品lua里的fn 函数里的任意位置加上上面的带码 就行了
【 调用addcomponent库里的 stackable(中文可叠起堆放的,易叠起堆放的)
定义参数 maxsize(最大值)为TUNING.STACK_SIZE_SMALLITEM(可以直接写成一个你的叠加上限的数值如9999999999)】
这种函数类型还有很多,你可以打开随便一个物品的lua 查看。直接把代码用百度翻译你你就知道什么意思了。
3
增加几率
我们可以用math.random 来产生随机数,有三种调用方式:
第一:不带参数,将产生 [0,1)范围内的随机数.
第二:带一个参数n,将产生1 <= x <= n范围内的随机数x.
第三:带两个参数a和b,将产生a <= x <= b范围内的随机数x
【local czf1={}
local czf=math.random(100)
if czf <= 20 then
czf1[1]="log"
elseif czf <=50 then
czf1[1]="log"
czf1[2]="log"
else
czf1[1]="log"
czf1[2]="log"
czf1[3]="log"
end】
在evergreen是文件里加上上面代码(不能在fn函数里)
之后把
【sparse = {
file="evergreen_new_2",
prefab_name="evergreen_sparse",
normal_loot = {"log","log"},
short_loot = {"log"},
tall_loot = {"log", "log","log"},
drop_pinecones=false,
leif="leif_sparse",】
改成【sparse = {
file="evergreen_new_2",
prefab_name="evergreen_sparse",
normal_loot = czf,
short_loot = czf,
tall_loot = czf,
drop_pinecones=false,
leif="leif_sparse",】
注 以上代码有可能不成功{}
END
注意事项
附件下载地址
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
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。