《飢荒》MOD製作圖文教程與MOD代碼講解

第一部:工具下載

1.官方mod工具

有steam的童鞋可以在steam的庫中找到工具一欄進入後下載安裝

《飢荒》MOD製作圖文教程與MOD代碼講解

《飢荒》MOD製作圖文教程與MOD代碼講解

PS:有了這個工具基本上就可以製作了。下面的工具都是為了方便。

2.Textool

《飢荒》MOD製作圖文教程與MOD代碼講解

《飢荒》MOD製作圖文教程與MOD代碼講解

tex文件編輯器下載地址:點擊進入

3.BuildRenamer-1.0

《飢荒》MOD製作圖文教程與MOD代碼講解

下載地址: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.尋找你所需要的圖片素材

《飢荒》MOD製作圖文教程與MOD代碼講解

《飢荒》MOD製作圖文教程與MOD代碼講解

《飢荒》MOD製作圖文教程與MOD代碼講解

《飢荒》MOD製作圖文教程與MOD代碼講解

《飢荒》MOD製作圖文教程與MOD代碼講解

《飢荒》MOD製作圖文教程與MOD代碼講解

把相應的圖片素材放入相應的文件夾中

比如

《飢荒》MOD製作圖文教程與MOD代碼講解

放入exported中的goldcoin。其餘的放入exchange。

2.創建scml文件(動畫的源文件)

現在各個文件夾狀態

《飢荒》MOD製作圖文教程與MOD代碼講解

《飢荒》MOD製作圖文教程與MOD代碼講解

《飢荒》MOD製作圖文教程與MOD代碼講解

《飢荒》MOD製作圖文教程與MOD代碼講解

《飢荒》MOD製作圖文教程與MOD代碼講解

《飢荒》MOD製作圖文教程與MOD代碼講解

《飢荒》MOD製作圖文教程與MOD代碼講解

《飢荒》MOD製作圖文教程與MOD代碼講解

《飢荒》MOD製作圖文教程與MOD代碼講解

然後打開Don’t Starve Mod Tools\mod_tools\Spriter\Spriter

《飢荒》MOD製作圖文教程與MOD代碼講解

新建scml文件

《飢荒》MOD製作圖文教程與MOD代碼講解

選擇OK

《飢荒》MOD製作圖文教程與MOD代碼講解

選擇如圖路徑

《飢荒》MOD製作圖文教程與MOD代碼講解

點擊選擇文件夾

修改下圖位置

《飢荒》MOD製作圖文教程與MOD代碼講解

雙擊把entity_000改為exchange, NewAnimation改成idle,(即『閒置』動畫)

《飢荒》MOD製作圖文教程與MOD代碼講解

拖動右上角素材至灰色區域並組裝好你的動畫。這樣子你的建築物在建造後的成像就做好了。注意圖中黑色細線交叉處基本就是你的動畫在游戲時顯示的顯示圖片的中心。盡量讓左右對稱,下部超出橫線一點距離。如圖所示。

《飢荒》MOD製作圖文教程與MOD代碼講解

點擊上圖第三個圖標新建動畫並改名為place,(即建造時預覽的綠色部分)

《飢荒》MOD製作圖文教程與MOD代碼講解

拖動素材,拼接好你的place動畫。

然後

《飢荒》MOD製作圖文教程與MOD代碼講解

另存為

《飢荒》MOD製作圖文教程與MOD代碼講解

exchange

對於goldcoin做相同處理,

《飢荒》MOD製作圖文教程與MOD代碼講解

注意這里沒有place動畫。另存為goldcoin.scml。

《飢荒》MOD製作圖文教程與MOD代碼講解

然後移動

《飢荒》MOD製作圖文教程與MOD代碼講解

整個Mod(而不是exported中的goldcoin。

)至SteamLibrary\SteamApps\common\dont_starve\mods。

《飢荒》MOD製作圖文教程與MOD代碼講解

打卡Don’t Starve Mod Tools\mod_tools中的autocompiler

《飢荒》MOD製作圖文教程與MOD代碼講解

稍等片刻後

《飢荒》MOD製作圖文教程與MOD代碼講解

結束後該程序會自動關閉。

這時你會發現

《飢荒》MOD製作圖文教程與MOD代碼講解

anim中已有做好的動畫文件了。

第五步:圖標創設

隨便找個你已經有的mod,找到\images\inventoryimages

《飢荒》MOD製作圖文教程與MOD代碼講解

復制一組文件名對應的TEX和XML文件至我們做的mod的\images\inventoryimages(由於我們的mod中有exchange和goldcoin兩個物件所以我們直接黏貼兩下)

《飢荒》MOD製作圖文教程與MOD代碼講解

修改文件名與exchange和goldcoin對應。

《飢荒》MOD製作圖文教程與MOD代碼講解

打開xml文件,將原來的candycane分別對應修改成exchange和goldcoin。

《飢荒》MOD製作圖文教程與MOD代碼講解

《飢荒》MOD製作圖文教程與MOD代碼講解

《飢荒》MOD製作圖文教程與MOD代碼講解

打開textool中的TEXTool

《飢荒》MOD製作圖文教程與MOD代碼講解

用它打開exchange.tex

《飢荒》MOD製作圖文教程與MOD代碼講解

單擊save按鈕

《飢荒》MOD製作圖文教程與MOD代碼講解

另存到桌面

《飢荒》MOD製作圖文教程與MOD代碼講解

使用photoshop一類的圖像製作軟體打開你另存好的文件。

《飢荒》MOD製作圖文教程與MOD代碼講解

將原圖標修改成你要的圖標後儲存為PNG格式

《飢荒》MOD製作圖文教程與MOD代碼講解

《飢荒》MOD製作圖文教程與MOD代碼講解

打開TEXTool中的TEXCreator

《飢荒》MOD製作圖文教程與MOD代碼講解

勾選這兩個方框

《飢荒》MOD製作圖文教程與MOD代碼講解

點擊Add後選擇修改好的文件

《飢荒》MOD製作圖文教程與MOD代碼講解

點擊output下文字框後的.按鈕選擇輸出路徑

《飢荒》MOD製作圖文教程與MOD代碼講解

點擊Convert後在輸出路徑中找到你的TEX文件

《飢荒》MOD製作圖文教程與MOD代碼講解

改名為exchang後移動到goldcoin\images\inventoryimages並選擇替換。

《飢荒》MOD製作圖文教程與MOD代碼講解

以同樣方式處理好goldcoin.tex

第六步:代碼製作

打開goldcoin\scripts\prefabs新建goldcoin和exchange的文本文檔。

《飢荒》MOD製作圖文教程與MOD代碼講解

點擊工具-文件夾選項-查看,去除勾選的隱藏已知文件類型的拓展名

《飢荒》MOD製作圖文教程與MOD代碼講解

然後把exchange和goldcoin的拓展名改為

《飢荒》MOD製作圖文教程與MOD代碼講解

雙擊打開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。

《飢荒》MOD製作圖文教程與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一致。

來源:飢荒游戲吧

guest
0 Comments
Inline Feedbacks
View all comments