《饥荒》MOD制作图文教程 饥荒怎么制作MOD
自己制作《饥荒》MOD是一件不简单的事,如果不懂代码那就更难了,不用担心!今天小编就为大家带来的《饥荒》制作MOD的图文教程,非常详细,代码部分都有解析,再也不用担心看不懂代码啦!下面就让我们一起看看《饥荒》是如何制作MOD吧。
第一部:工具下载
1.官方mod工具
有steam的童鞋可以在steam的库中找到工具一栏进入后下载安装
PS:有了这个工具基本上就可以制作了。下面的工具都是为了方便。
2.Textool
tex文件编辑器下载地址:点击进入
3.BuildRenamer-1.0
下载地址:ht请tp自://觉pan删.ba除idu.c中om/s文/1内zn容KF8
用途:改mod(非自制)时修改动画内build文件的名称
第二步:确认mod的作用
此部分全看自身的创意
由于本帖结合楼主的自制mod‘goldcoin’讲解,撸主先说说goldcoin的设计思路吧。
在易宁修改中,易宁哥提出了金融体系,货币这一说法。因此撸主想要制作饥荒的流通货币,并加入初步的交易系统(食物买卖)。
第三部:文件夹初步创建
1.创建mod文件夹 goldcoin
2.在goldcoin中创建文件夹
‘anim’(动画)
‘exported’(动画源文件)
‘images’(图标)
‘scripts’(代码)
3.在exported中创建文件夹
‘exchange’(交易所)
‘goldcoin’(金币)
4.在images中创建文件夹
‘inventoryimages’(图标)
5.在scripts中创建文件夹
‘prefabs’(物件)
第四步:动画的创设
1.寻找你所需要的图片素材
把相应的图片素材放入相应的文件夹中
比如
放入exported中的goldcoin。其余的放入exchange。
2.创建scml文件(动画的源文件)
现在各个文件夹状态
然后打开Don't Starve Mod Tools\mod_tools\Spriter\Spriter
新建scml文件
选择OK
选择如图路径
点击选择文件夹
修改下图位置
双击把entity_000改为exchange, NewAnimation改成idle,(即‘闲置’动画)
拖动右上角素材至灰色区域并组装好你的动画。这样子你的建筑物在建造后的成像就做好了。注意图中黑色细线交叉处基本就是你的动画在游戏时显示的显示图片的中心。尽量让左右对称,下部超出横线一点距离。如图所示。
点击上图第三个图标新建动画并改名为place,(即建造时预览的绿色部分)
拖动素材,拼接好你的place动画。
然后
另存为
exchange
对于goldcoin做相同处理,
注意这里没有place动画。另存为goldcoin.scml。
然后移动
整个Mod(而不是exported中的goldcoin。
)至SteamLibrary\SteamApps\common\dont_starve\mods。
打卡Don't Starve Mod Tools\mod_tools中的autocompiler
稍等片刻后
结束后该程序会自动关闭。
这时你会发现
anim中已有做好的动画文件了。
第五步:图标创设
随便找个你已经有的mod,找到\images\inventoryimages
复制一组文件名对应的TEX和XML文件至我们做的mod的\images\inventoryimages(由于我们的mod中有exchange和goldcoin两个物件所以我们直接黏贴两下)
修改文件名与exchange和goldcoin对应。
打开xml文件,将原来的candycane分别对应修改成exchange和goldcoin。
打开textool中的TEXTool
用它打开exchange.tex
单击save按钮
另存到桌面
使用photoshop一类的图像制作软件打开你另存好的文件。
将原图标修改成你要的图标后储存为PNG格式
打开TEXTool中的TEXCreator
勾选这两个方框
点击Add后选择修改好的文件
点击output下文字框后的.按钮选择输出路径
点击Convert后在输出路径中找到你的TEX文件
改名为exchang后移动到goldcoin\images\inventoryimages并选择替换。
以同样方式处理好goldcoin.tex
第六步:代码制作
打开goldcoin\scripts\prefabs新建goldcoin和exchange的文本文档。
点击工具-文件夹选项-查看,去除勾选的隐藏已知文件类型的拓展名
然后把exchange和goldcoin的拓展名改为
双击打开goldcoin.lua写入
local assets=
{
Asset("ANIM", "anim/goldcoin.zip"),
Asset("ATLAS", "images/inventoryimages/goldcoin.xml"),
}
local function fn(Sim)
local inst = CreateEntity()
inst.entity:AddTransform()
inst.entity:AddAnimState()
inst.entity:AddSoundEmitter()
inst.entity:AddPhysics()
MakeInventoryPhysics(inst)
inst.AnimState:SetBank("goldcoin")
inst.AnimState:SetBuild("goldcoin")
inst.AnimState:PlayAnimation("idle")
inst:AddComponent("edible")
inst.components.edible.foodtype = "ELEMENTAL"
inst.components.edible.hungervalue = 2
inst:AddComponent("tradable")
inst:AddComponent("inspectable")
inst:AddComponent("stackable")
inst:AddComponent("inventoryitem")
inst.components.inventoryitem.atlasname = "images/inventoryimages/goldcoin.xml"
return inst
end
return Prefab( "common/inventory/goldcoin", fn, assets)
同样在exchange.lua中写入
exchange.lua
require "prefabutil"
local assets =
{
Asset("ANIM", "anim/exchange.zip"),
Asset("IMAGE", "images/inventoryimages/exchange.tex"),
Asset("ATLAS", "images/inventoryimages/exchange.xml"),
}
local prefabs =
{
"exchange",
}
local function getstatus(inst)
end
local function onhammered(inst, worker)
inst.components.lootdropper:DropLoot()
SpawnPrefab("collapse_small").Transform:SetPosition(inst.Transform:GetWorldPosition())
inst.SoundEmitter:PlaySound("dontstarve/common/destroy_wood")
inst:Remove()
end
local function onhit(inst, worker)
inst.AnimState:PlayAnimation("hit")
inst.AnimState:PushAnimation("idle", true)
end
local function onbuilt(inst)
inst.AnimState:PlayAnimation("place")
inst.AnimState:PushAnimation("idle")
end
local function fn(Sim)
local inst = CreateEntity()
local trans = inst.entity:AddTransform()
local anim = inst.entity:AddAnimState()
inst.entity:AddSoundEmitter()
MakeObstaclePhysics(inst, 1)
anim:SetBank("exchange")
anim:SetBuild("exchange")
anim:PlayAnimation("idle", true)
inst:AddTag("structure")
inst:AddTag("structure")
inst:AddComponent("lootdropper")
inst:AddComponent("workable")
inst.components.workable:SetWorkAction(ACTIONS.HAMMER)
inst.components.workable:SetWorkLeft(4)
inst.components.workable:SetOnFinishCallback(onhammered)
inst.components.workable:SetOnWorkCallback(onhit)
inst:AddComponent("inspectable")
local function ShouldAcceptItem(inst, item)
if item:HasTag("hat") then
return false
end
if item.components.edible.foodtype == "SEEDS" then
return false
end
return true
end
local function OnGetItemFromPlayer(inst, giver, item)
local names = {"cave_banana","carrot","corn","pumpkin","eggplant","durian","pomegranate","dragonfruit","berries","meat","smallmeat","fish","eel","drumstick","bird_egg","froglegs"}
inst.name = names[math.random(#names)]
local veggie = SpawnPrefab(inst.name)
local goldcoin = SpawnPrefab("goldcoin")
if item.components.edible.foodtype == "VEGGIE" then
giver.components.inventory:GiveItem(goldcoin)
end
if item.components.edible.foodtype == "MEAT" then
giver.components.inventory:GiveItem(goldcoin)
end
if item.prefab == "goldcoin" then
giver.components.inventory:GiveItem(veggie or meat)
end
end
inst:AddComponent("trader")
inst.components.trader.onaccept = OnGetItemFromPlayer
inst.components.trader:SetAcceptTest(ShouldAcceptItem)
inst.components.inspectable.getstatus = getstatus
return inst
end
return Prefab( "common/exchange", fn, assets, prefabs ),
MakePlacer("common/exchange_placer", "exchange", "exchange", "idle")
第七步:完成MOD信息补录
随便打开一个你已经有的MOD复制以下四个文件至咱的MOD。
用TEXTool和Photoshop编辑好modicon.tex 这个文件就是你的mod在MOD界面显示的图标。因为无关紧要在这撸主就不改了。
Modicon.xml不用修改。
打开modinfo.lua
name = "MOD的名字ˮ"
description = "MOD的描述"
author = "作者"
version = "MOD的版本,随便填写"
forumthread = "论坛地址"
api_version = 当前MOD的版本(现在最新的应该是填写 5)
icon_atlas = "modicon.xml"(不用修改)
icon = "modicon.tex"(不用修改)
打开modmain.lua
删除原有内容写入
PrefabFiles = {
"goldcoin",
"exchange",
}
Assets=
{
Asset("ANIM", "anim/goldcoin.zip"),
Asset("ATLAS", "images/inventoryimages/goldcoin.xml"),
Asset("IMAGE", "images/inventoryimages/goldcoin.tex"),
Asset("ANIM", "anim/exchange.zip"),
Asset("ATLAS", "images/inventoryimages/exchange.xml"),
Asset("IMAGE", "images/inventoryimages/exchange.tex"),
}
local STRINGS = GLOBAL.STRINGS
local Recipe = GLOBAL.Recipe
local Ingredient = GLOBAL.Ingredient
local RECIPETABS = GLOBAL.RECIPETABS
local TECH = GLOBAL.TECH
STRINGS.NAMES.GOLDCOIN = "Goldcoin"
STRINGS.RECIPE_DESC.GOLDCOIN = "For trade."
STRINGS.CHARACTERS.GENERIC.DESCRIBE.GOLDCOIN = {"This is a goldcoin."}
STRINGS.NAMES.EXCHANGE = "Exchange"
STRINGS.RECIPE_DESC.EXCHANGE = "A place to recycle."
STRINGS.CHARACTERS.GENERIC.DESCRIBE.EXCHANGE = {"An exchange."}
local function ex()
local exchange = Recipe("exchange", { Ingredient("cutstone", 8), Ingredient("goldnugget", 4), Ingredient("boards", 2) }, RECIPETABS.TOWN, TECH.SCIENCE_TWO, "exchange_placer")
exchange.atlas = "images/inventoryimages/exchange.xml"
end
AddGamePostInit(ex)
这样MOD就做好了,就可以拿去玩咯~
代码讲解
goldcoin.lua部分
local assets=
{
Asset("ANIM", "anim/goldcoin.zip"),
Asset("ATLAS", "images/inventoryimages/goldcoin.xml"),
}
这部分的作用是读取动画和图标,可套用格式。(注意替换其中的goldcoin)
local function fn(Sim)
local inst = CreateEntity()
inst.entity:AddTransform()
inst.entity:AddAnimState()
inst.entity:AddSoundEmitter()
inst.entity:AddPhysics()
MakeInventoryPhysics(inst)
这部分的作用是创设物理性,可直接套用。
inst.AnimState:SetBank("goldcoin")
inst.AnimState:SetBuild("goldcoin")
inst.AnimState:PlayAnimation("idle")
这部分是引用动画,第一个goldcoin指的是的框架,第二个是模型,idle是播放的动画,为idle。请结合教程中的spriter软件的使用。
inst:AddComponent("edible")
inst.components.edible.foodtype = "ELEMENTAL"
inst.components.edible.hungervalue = 2
这部分是表示金币(goldcoin)可以作为一种元素类型的食物,参考金子(goldnugget)。
inst:AddComponent("tradable")
这部分表示金币(goldcoin)可以用来交易。交易的内容涵盖很多,给猪王玩具和肉获得金块也是一种交易。
inst:AddComponent("inspectable")
这部分表示金币(goldcoin)可以检阅。即右击物件后人物会说话。
inst:AddComponent("stackable")
这部分表示金币(goldcoin)可以叠加。
inst:AddComponent("inventoryitem")
inst.components.inventoryitem.atlasname = "images/inventoryimages/goldcoin.xml"
这部分表示金币(goldcoin)在物品栏中显示的图标。套用时请修改其中的goldcoin。
return inst
end
这部分return inst是对上面所有inst语句的终结。end是对上面local function fn(Sim)的终结。
return Prefab( "common/inventory/goldcoin", fn, assets)
这部分是返回物件的值。套用时请修改goldcoin。
exchange.lua代码详解
require "prefabutil"
需要prefabutil.lua建筑相关,所有建筑的lua直接引用。
local assets =
{
Asset("ANIM", "anim/exchange.zip"),
Asset("IMAGE", "images/inventoryimages/exchange.tex"),
Asset("ATLAS", "images/inventoryimages/exchange.xml"),
}
读取动画和图标,可套用格式。(注意替换其中的exchange)
local prefabs =
{
"exchange",
}
与exchange所有有关的物件都有写上。比如树苗的lua,不仅要写树苗的,还要写树枝,灰烬,这些产物。
local function getstatus(inst)
end
使物件具有状态。
local function onhammered(inst, worker)
inst.components.lootdropper:DropLoot()
SpawnPrefab("collapse_small").Transform:SetPosition(inst.Transform:GetWorldPosition())
inst.SoundEmitter:PlaySound("dontstarve/common/destroy_wood")
inst:Remove()
end
使物件可以被锤子拆掉,并播放相关声音。
local function onhit(inst, worker)
inst.AnimState:PlayAnimation("hit")
inst.AnimState:PushAnimation("idle", true)
end
可以打击,并播放相关动画。
local function onbuilt(inst)
inst.AnimState:PlayAnimation("place")
inst.AnimState:PushAnimation("idle")
end
可以建筑,并调用建筑预览。
local function fn(Sim)
local inst = CreateEntity()
local trans = inst.entity:AddTransform()
local anim = inst.entity:AddAnimState()
inst.entity:AddSoundEmitter()
MakeObstaclePhysics(inst, 1) ---建筑物的占地大小
设置物理性。
anim:SetBank("exchange")
anim:SetBuild("exchange")
anim:PlayAnimation("idle", true)
设置闲置时的动画
inst:AddTag("structure")
加入结构标签
inst:AddComponent("lootdropper")
加入战利品掉落功能
inst:AddComponent("workable")
inst.components.workable:SetWorkAction(ACTIONS.HAMMER)
inst.components.workable:SetWorkLeft(4)
inst.components.workable:SetOnFinishCallback(onhammered)
inst.components.workable:SetOnWorkCallback(onhit)
加入可被锤子砸和打击的功能。与上文呼应使用。
inst:AddComponent("inspectable")
可以检阅。
local function ShouldAcceptItem(inst, item)
可接受物品。
if item:HasTag("hat") then
return false
end
不接受有标签有hat的物品。
if item.components.edible.foodtype == "SEEDS" then
return false
end
不接受seeds。
return true
接受其他物件。
end
local function OnGetItemFromPlayer(inst, giver, item)
local names = {"cave_banana","carrot","corn","pumpkin","eggplant","durian","pomegranate","dragonfruit","berries","meat","smallmeat","fish","eel","drumstick","bird_egg","froglegs"}
inst.name = names[math.random(#names)]
接受如上物件。
local veggie = SpawnPrefab(inst.name)
local goldcoin = SpawnPrefab("goldcoin")
if item.components.edible.foodtype == "VEGGIE" then
giver.components.inventory:GiveItem(goldcoin)
end
接受蔬菜后回馈一个goldcoin。
if item.components.edible.foodtype == "MEAT" then
giver.components.inventory:GiveItem(goldcoin)
end
接受肉后回馈一个goldcoin。
giver.components.inventory:GiveItem(veggie or meat)
接受goldcoin后回馈一个肉或者蔬菜
end
end
inst:AddComponent("trader")
加入交易功能
inst.components.trader.onaccept = OnGetItemFromPlayer
inst.components.trader:SetAcceptTest(ShouldAcceptItem)
inst.components.inspectable.getstatus = getstatus
可接受物件。
return inst
结束inst
end
结束function
return Prefab( "common/exchange", fn, assets, prefabs ),
返回物件的值
MakePlacer("common/exchange_placer", "exchange", "exchange", "idle")
返回建筑预览时的动画
modmain部分代码
PrefabFiles = {
"goldcoin",
"exchange",
}
固定格式,请输入相关物件名称。
Assets=
{
Asset("ANIM", "anim/goldcoin.zip"),
Asset("ATLAS", "images/inventoryimages/goldcoin.xml"),
Asset("IMAGE", "images/inventoryimages/goldcoin.tex"),
Asset("ANIM", "anim/exchange.zip"),
Asset("ATLAS", "images/inventoryimages/exchange.xml"),
Asset("IMAGE", "images/inventoryimages/exchange.tex"),
}
动画和图标路径设置。
local STRINGS = GLOBAL.STRINGS
local Recipe = GLOBAL.Recipe
local Ingredient = GLOBAL.Ingredient
local RECIPETABS = GLOBAL.RECIPETABS
local TECH = GLOBAL.TECH
整体参数设置,直接复制黏贴就行。
STRINGS.NAMES.GOLDCOIN = "Goldcoin" 物件名称
STRINGS.RECIPE_DESC.GOLDCOIN = "For trade."建造栏描述
STRINGS.CHARACTERS.GENERIC.DESCRIBE.GOLDCOIN = {"This is a goldcoin."} 检阅时描述。
STRINGS.NAMES.EXCHANGE = "Exchange"
STRINGS.RECIPE_DESC.EXCHANGE = "A place to recycle."
STRINGS.CHARACTERS.GENERIC.DESCRIBE.EXCHANGE = {"An exchange."}
同上。
local function ex() 固定格式,ex可任意跟换,不要和and,or 这些术语一样就行。
local exchange = Recipe("exchange", { Ingredient("cutstone", 8), Ingredient("goldnugget", 4), Ingredient("boards", 2) }, RECIPETABS.TOWN, TECH.SCIENCE_TWO, "exchange_placer") 设置建造时的材料,分类,科技需求,调用的建筑预览动画
exchange.atlas = "images/inventoryimages/exchange.xml"
设置建造栏显示的图标
end
AddGamePostInit(ex) 固定格式,ex与上文的ex一致。
PC
PS4
Switch