此文章只是记录编写联机版mod时做的记录,不是一篇很正式的文档
想要入门饥荒mod制作,可以看同站的夏湾作者文章,很详细~
直接给代码和结论,目前在饥荒是可用的
修改制作栏中的合成物品时的需要资源
--有需要直接拿来用就行
--可通过AddRecipePostInit方法修改,第一个传入需要合成的物品的prefab名字,第二个是制作栏修改的方法,self不是预制体而是另外一个东西,这不用在意
AddRecipePostInit("armorwood",function(self)
--print("AddRecipePostInit") --log语句
if IsRecipeValid(self.name) then--判断prefab的名字是否可制作(暂时这样理解把)
--ingredients是合成该prefab所需要的资源,在后面以数组(应该)的方式放入
GetValidRecipe(self.name).ingredients={
Ingredient("log", 6),Ingredient("rope", 2)}
--这里的意思六个木头和两个绳索合成木甲
end
end)
在制作栏中添加一个prefab的多个合成方式
--向物品栏(合成栏)添加合成方式,这是官方的新的方法,用这个是没问题的
AddRecipe2(
"blowdart_pipe1", --当前Recipe的名称,不能用已经存在的于物品栏的prefab的名字,得另起一个
--合成所需要的材料,按格式添加即可
{
Ingredient("cutreeds", 1),Ingredient("rocks", 2),Ingredient("feather_robin_winter", 1)},
--合成所需要的条件,需要解锁科技?解锁魔法?还是远古等等
TECH.SCIENCE_TWO,--SCIENCE_ONE SCIENCE_THREE MAGIC_TWO MAGIC_THREE ANCIENT_TWO等等
--这个是名字为config参数,一般可选有很多,但是在这里,我们只需要把product 设置为已经存在的于物品栏的prefab的名字,即你需要的prefabs,numtogive 的意思是制作后会给你几个该物品
{
product ="blowdart_pipe",numtogive = 2},
--最后这个是filters参数,就是制作栏(合成栏)的分累,比如武器建筑生存什么的,这些东西的tag或者flag暂时可以这样理解
{
"WEAPONS","MODS"})--不会填就填个MODS,具体的需要看文件\scripts\recipes_filter.lua 中的CRAFTING_FILTER_DEFS 这个table里的第一个字段的内容
放个效果图把
这里如果你想说我自己创建一个新的prefab然后配置同样的参数,添加到物品栏中不是也可以实现这个需要
答案是可以这样做,我也这样做了,我发现这个有几个不好的地方,一个是贴图要配置(物品栏的和背包里面的都需要),另一个是然后你这个预制体其实是一个新的prefab和之前的都不一样,所以和之前的或者新的不能叠加在一起,如果还得非有说一点的话就是为了更好管理mod,你可能需要新起大目录(或者叫模块?)专门放置你新建的预制体,然后在添加进入modmain中去
进阶(如果你还想更深入的了解的话,继续看吧,不保证完全对)
上述的AddRecipe2方法,其实在/scirpts/modutil.lua里面有具体实现
env.AddRecipe2 = function(name, ingredients, tech, config, filters)
require("recipe")--引入scripts\recipe.lua,需要用到里面的Recipe2
mod_protect_Recipe = false --recipe.lua 中的一个变量在Recipe2中有用到
local rec = Recipe2(name, ingredients, tech, config) --结果存下来
--如果不是可分解或者可被锤子敲的物品
if not rec.is_deconstruction_recipe then
--就进入这里主要是给当前合成栏的物品进行分类,把其和某个Filter关联在一起
--也就是我们进游戏后制作栏看到各种物品被分类到不同的地方用的,比如武器/防具/光源等
if config ~= nil and config.nounlock then
env.AddRecipeToFilter(name, CRAFTING_FILTERS.CRAFTING_STATION.name)
else
--AddRecipeToFilter这个方法稍后说
env.AddRecipeToFilter(name, CRAFTING_FILTERS.MODS.name)
end
if filters ~= nil then
for _, filter_name in ipairs(filters) do
env.AddRecipeToFilter(name, filter_name)
end
end
end
mod_protect_Recipe = true --结束再把这个状态置回来
rec:SetModRPCID() --这是和网络相关的,目前我也不太了解
return rec
end
其实到目前为止还没有做什么很明显的动作,重点主要是在Recipe2中
我们看到Recipe2的代码
--scripts\recipe.lua文件
--Class是klei自己写的东西,调用Recipe2()主要是调用function中的内容
Recipe2 = Class(Recipe, function(self, name, ingredients, tech, config)
--最后是调用了Recipe的_ctor函数,在这里可以看到config内的参数有很多
if config ~= nil