[饥荒联机版模组]修改制作栏中的合成物品时的需要资源和其它相关技巧

文章介绍了如何在饥荒游戏中通过编程修改合成物品所需的资源,以及使用AddRecipePostInit和AddRecipe2方法添加新的合成方式。文章详细讲解了Recipe类和过滤器的概念,以及如何将物品添加到不同的制作类别中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此文章只是记录编写联机版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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值