饥荒mod制作初学笔记

时间:2024-03-22 22:38:26

使用工具:暂时使用sublime_text作为lua语言的运行环境

mod成分部分--------------------------------------------------------------------------------------------------------------------------

首先,做mod肯定要明白mod的成分,由于是初学,所以只了解了部分文件和文件夹

饥荒mod制作初学笔记

随便打开一个mod,你会看到许许多多的东西(当然有的mod不一定有上面的所有文件)
anim:动画部分,里面一般放格式为zip的动画文件

关于动画暂且不了解,知道是放动画的就行了

bigportraits:大贴图,一般放选人物界面的大图

images:一般放图片(格式为tex,比如做一个人物mod,可能会用到很多装备和建筑物的图片)

saveslot_portraits:开始游戏那里的人物头像,以及死亡记录里的人物头像

selectscreen_portraits:选人物界面人物带火环的图片,包含人物剪影

levels:地皮贴图文件,这个这里不细讲

scripts:主代码文件

内含:

饥荒mod制作初学笔记

brains:生物大脑
components:功能组件
map:游戏地图相关
prefabs:物品相关
scenarios:箱子内容物设置,陷阱设置相关(比如一打开夏季陷阱的箱子,游戏季节就变成夏天)
screens:界面(比如游戏主界面的设置,还有T键刷物按t出来的界面等)
stategraphs:生物状态图,简称SG。控制比如生物的攻击,死亡动画及相关事件。
widgets:小部件(内容很广,文字,动画,图片都可以,比如玩家的三围动画)
还有一些似乎不符合规范的东西。。。

饥荒mod制作初学笔记

后面讲接上文....
sound:音乐文件,怎么做以后学
modicon.tex:mod图标,当然可以叫其他名字
modicon.xml:xml,裁剪,命名tex,与modicon.tex对应
modinfo.lua:mod的信息,包括作者,mod介绍,在较新的巨人DLC以后,里面可以加入MOD预设
modmain.lua:功能强大,几乎大部分内容都可以用API控制,当然不一定必须有
modworldgenmain.lua:mod地图,世界相关

API部分(这里只是暂时学到的,以后还会有很多)-----------------------------------------------------------------------------------------------------

local function AddMove(inst) --局部函数,函数名为 AddMove,变量为inst
local function OnDeploy (inst, pt) ---局部函数,函数名为 OnDeploy,变量为inst和pt
GLOBAL.SpawnPrefab("flower").Transform:SetPosition(pt.x, pt.y, pt.z) --生成物品
inst.components.stackable:Get():Remove() --手里的这个物品(花瓣)消失一个
end --结束
inst:AddComponent("deployable") --可种植组建
inst.components.deployable.ondeploy = OnDeploy --种植组建设置,种植时的函数
end --结束


AddPrefabPostInit("petals", AddMove) --格式:AddPrefabPostInit("物品代码名", 添加的函数)
AddPrefabPostInit是在物品代码读取后执行增加的内容,变量只有inst,表示这个物品

这个API只能修改prefabs文件,其他的就不行了
类似的,相似功能的组件还有

AddClassPostConstruct(package, postfn) --普通class修改
AddGlobalClassPostConstruct(package, classname, postfn) --全局的class修改
AddComponentPostInit(package, postfn) --components(组建)修改
AddStategraphPostInit(package, postfn) --SG修改

等等还有很多,可以打开dont_starve\data\scripts\modutil.lua 查看更多

在饥荒联机版中,并不能直接找到modutil.lua文件,这个文件在游戏安装目录下

\data\databundles里面的scripts.zip中,可以解压查看

 

使用API无法修改目标文件的局部函数,局部定义

Tag 标签
饥荒里常用又实用的功能
相关代码:
目标:AddTag("balabala") --给目标加上balabala 标签
目标:HasTag("balabala") --判断目标是否有 balabala 标签,并输出返回值(true or false)
目标:RemoveTag("balabala") --目标删除 balabala 标签。即使目标没有相关标签,使用这条代码也不会崩溃

用法:
设a为饥荒内存在的可执行目标
a:AddTag("iloveyou")
而在其他lua内,这时来判定
local function b(a)
if a:HasTag("iloveyou") then
print "Me too"
else
print "555"
end
end
如果目标a有iloveyou标签,则打印出 Me too
如果在a中使用RemoveTag删除相关标签,这时如果再调用 b(a) 就会打印出 555 
这样就可以用tag来区别物品种类,标记进度

实例:
webber饰淦髦物,大家都知道,那怎么让游戏知道他饰淦髦物呢?
在webber的代码里,有这条代码 inst:AddTag("monster")
添加monster (怪物) 标签
而在猪人代码里,设置主动攻击目标是带有monster标签,于是猪人就会主动攻击webber。
爪机上打的,代码全凭记忆,可能有错误。。。

-----------------------------------------------表(Table)?
这东西我在这里只简单讲一下...
这东西很厉害,已知饥荒内物品可能大概也许似乎就是表。
例1:
local a = {}
这就是一个表了,只不过是空的,就叫空表好了饥荒mod制作初学笔记
local 局部定义
a 为表名
{} 花括号是表的一个重要特征
例2:
local a = { 
"iloveyou", --表你可以当做数学上的集合.里面的东西可以当做元素.每个元素之间用","隔开. 如果听不懂也没关系。
"doyouloveme?",
"dontforgetme", --这里多加了一个逗号也没关系
}

如何检查表中内容?
for 语句
for k,v in pairs(a) do --这里的k和v可以换成其他字母。k表示索引,v代表表中内容
print v --打印
end
输出结果为:
"iloveyou"
"doyouloveme?"
"dontforgetme"
当然根据这语句可以写出其他很多判断,我爪机打字,实在太蛋疼→_→,这里就不细说了

指定获取表中数据?
a[num] --num为数字,a[num]输出的就是表中第num个元素,如果输入的数字对应的元素不存在,则输出为 nil(空值)
例:
print a --打印出来 iloveyou

输出表中元素个数?
#a --没错,就这样。这里输出的是 3

随机获取表中数据?
a[math.random(#a)]

另,表还有这样的类型:
local b = {
k = "我 是 滑 稽", --这是字符串
v = 3, --这是数值
i = function() print "hello!" end, --这是一个名字为 i的函数(function)
}
调用表中元素:
b.k 输出的就是"我 是 滑 稽"
b.v 输出 3
b:i() 调用表中函数,输出 hello!
调用表中函数可以用 :  或者  . 

math库

饥荒mod制作初学笔记

 

做一个长矛

转自丰益.猪猪
local assets=
{
Asset("ANIM", "anim/spear.zip"),--加载长矛 放在地面状态的 动画
Asset("ANIM", "anim/swap_spear.zip"),--加载长矛 拿在手上的动画
}


local function onfinished(inst)
inst:Remove()--耐久用完后,移除长矛这个物体
end


local function onequip(inst, owner) 
owner.AnimState:OverrideSymbol("swap_object", "swap_spear", "swap_spear")--装备长矛后,持有者的状态 加上长矛的状态,第一个参数是对应持有武器的手部件的动画名,第二个参数是动画的build名称,第三个参数是动画的bank名称 (重新覆盖玩家"swap_object"这个动画部件为长矛样子)
owner.AnimState:Show("ARM_carry") --装备长矛后,持有者 持有之手 显示出来
owner.AnimState:Hide("ARM_normal") --装备长矛后,持有者 空闲之手 隐藏 (在动画里,持有手 和 空闲手 是 在一起的,根据不同的情况 来选择 谁隐藏 谁显示)
end


local function onunequip(inst, owner) 
owner.AnimState:Hide("ARM_carry") --卸下长矛后,持有者 持有之手 隐藏
owner.AnimState:Show("ARM_normal") ----卸下长矛后,持有者 空闲之手 显示(原理同上)
end




local function fn(Sim)
local inst = CreateEntity()--定义inst这个变量,初始化,创造这个物体,变量名为inst
local trans = inst.entity:AddTransform()--为inst这个实体 增加 Transform 标准组件,Transform负责的是 实体的大小,位置,形状等等。
local anim = inst.entity:AddAnimState()--为inst这个实体 增加 AnimState 标准组件, AnimState负责 实体 的 动画效果,颜色滤镜等等。
MakeInventoryPhysics(inst)--这个定义的是inst这个实体 的 物理系统, 这个标准组建参考 scripts/standardcomponents.lua,里面有队友各个Make啥啥啥Physics函数的定义

anim:SetBank("spear")--动画效果 的 bank名称,bank就是 动画模板的 轮廓,控制的是 动画中 所有对应像素 的范围和边界(我只能理解到这一步)
anim:SetBuild("spear")--动画效果 的 build名称,build就是 动画 的模型,比如长矛的 具体像素分布,即长矛长啥样 (注意,这句话和前一句话指的是 长矛放在地面的状态,拿在手上的状态看前面 装备长矛后 的注释)
anim:PlayAnimation("idle")--动画效果初始化,比如长矛出现时 第一眼是什么动画, 就是"idle"这个静止状态,关于动画的话,在data/anim文件夹内有 各种zip文件,需要用ktools转换成spriter可以查看的scml文件,从scml文件的动画列表里就有各种动画状态,比如“idle”就是之一

inst:AddTag("sharp")--这个是增加“sharp”标签Tag,关于Tag的应用,是方便其他文件或组件进行不同情况的筛选 的作用。在此"sharp"这个Tag目前 我还不知道是什么作用 (这个Tag是这个武器打东西时有特殊音效,不过声音很小)


inst:AddComponent("weapon")--增加 武器 组件,长矛是武器嘛
inst.components.weapon:SetDamage(TUNING.SPEAR_DAMAGE)--设置武器攻击力,里面的TUNING是指 在scripts/tuning.lua里定义了 SPEAR_DAMAGE这个常量的数值。

-------

inst:AddComponent("finiteuses")--增加 有限耐久 组件,长矛作为武器 是有耐久的嘛
inst.components.finiteuses:SetMaxUses(TUNING.SPEAR_USES)--设置 最大耐久
inst.components.finiteuses:SetUses(TUNING.SPEAR_USES)--设置 当前耐久,一般情况下,崭新的长矛的 当前耐久=它的最大耐久, 在有些情况 比如彩蛋里或迷宫里的箱子,不一定是满的耐久

inst.components.finiteuses:SetOnFinished( onfinished ) --设置 长矛用完的时候该怎么办,看看前面定义的 onfinished函数,就是移除长矛。 很多道具耐久用完就 删除本身,但是 矿工帽和 提灯 就不会,就是因为这个函数定义的不同咯。


inst:AddComponent("inspectable")--增加 检阅组件,就是 玩家 检查/查看 长矛,会说对应的 话 (这个物品能被检查)

inst:AddComponent("inventoryitem") --增加 物品栏物品 组件, 长矛当然可以放在 物品栏或容器里 啦

inst:AddComponent("equippable")--增加 可装备 组件,长矛 当然 装备后才能战斗嘛。
inst.components.equippable:SetOnEquip( onequip ) --装备 长矛后,调用onequip函数,前面有定义
inst.components.equippable:SetOnUnequip( onunequip ) -- 卸下长矛后,调用onunequip函数

return inst --刚开始 local inst = CreateEntity() 这句话只是创建长矛这个物体的开始,通过后面的代码逐渐完善, 直到这句 return inst 就正式说明 长矛这个物体定义完成了!!!
end


return Prefab( "common/inventory/spear", fn, assets) -- return inst 之后 并不能 把定义好的 长矛 归为 游戏正规的物品啊,那么 这句话 return Prefab 就是把长矛这个物体 加载完成,fn是定义长矛的主函数,assets是长矛的材质
 

MOD图标部分----------------------------------------------------------------------------------------------------------------------------------------------

这里可以看到有的mod有图标,有的没有(如果没设置的话系统默认设置为空方块)
饥荒mod制作初学笔记

 

具体怎么设置呢?
mod目录下要有,当然一定非要是这个名字,改其他的也可以
这两个文件可以随便找一个mod复制一下作为样本
饥荒mod制作初学笔记

在modinfo里加入
饥荒mod制作初学笔记

名称要与你的文件对应
饥荒mod制作初学笔记

要注意的是,用记事本打开.xml文件,把红框里的文件名改成你的.tex文件名,两个都要改。。。
饥荒mod制作初学笔记

做好的图片用工具转化一下就好了,其他设置都不用改,这工具在二楼链接里可以下载,如不能正常打开,请下载链接里的"TexTool运行库"
饥荒mod制作初学笔记

这里给一张图标修改模板