饥荒Mod 开发(十一):修改物品堆叠
饥荒Mod 开发(十三):木牌传送
饥荒中制作物品的痛点
饥荒中可以使用工作台制作物品,对于较复杂的物品我们可能需要制作多次。比如制作木牌,我们需要2个步骤
木头–》木板–》 木牌。 虽然我们有很多木头,但是也只能先一步一步制作木板,才能制作木牌,从下面的图可以看出虽然我们有很多的木头,想要制作一个木牌,不能一步到位,得先制作木板。
比如制作 木甲,我们需要木头和绳子, 而绳子又需要干草制作。 所以我们需要先制作2个绳子,然后才能制作木甲,这样真的太繁琐了。而且饥荒的制作台想要找个东西还真的很难。
一键制作
我们可以在制作台上增加一个小按钮,如果材料充足,并且可以制作的话就显示个小按钮,点击就可以制作 子材料。modmian.lua 中添加下面代码即可
-- 引入 ImageButton 控件
local ImageButton = GLOBAL.require "widgets/imagebutton"
-- 修改 RecipePopup 控件的行为
AddClassPostConstruct("widgets/recipepopup", function(self)
-- 保存原始的 Refresh 方法
local old = self.Refresh
-- 重写 Refresh 方法
self.Refresh = function(...)
-- 调用原始的 Refresh 方法
old(...)
-- 如果弹窗没有显示,则直接返回
if not self.shown then
return
end
-- 获取当前的配方和拥有者
local recipe = self.recipe
local owner = self.owner
-- 如果 doAction 控件存在,则先隐藏它
if self.doAction then
self.doAction:Hide()
end
-- 遍历配方的所有材料
for k,v in pairs(recipe.ingredients) do
-- 判断材料是否是需要合成的物品
local slotrecipe = GLOBAL.Recipes[v.type]
if slotrecipe then
-- 判断拥有者是否知道这个配方,是否可以制作这个物品,以及是否拥有足够的材料
local knows = owner.components.builder:KnowsRecipe(v.type)
local can_build = owner.components.builder:CanBuild(v.type)
local has, num_found = owner.components.inventory:Has(v.type, GLOBAL.RoundUp(v.amount * owner.components.builder.ingredientmod), true)
-- 如果知道配方,可以制作物品,但是没有足够的材料,并且 doAction 控件不存在,则创建一个新的 doAction 控件
if knows and can_build and not has and not self.doAction then
self.doAction = self.contents:AddChild(ImageButton("images/ui.xml", "button_small.tex", "button_small_over.tex", "button_small_disabled.tex"))
self.doAction:SetPosition(220, 140)
self.doAction:SetText("材料")
self.doAction:MoveToFront()
self.doAction:SetOnClick(function()
GLOBAL.DoRecipeClick(self.owner, self.doAction.slotrecipe)
end)
end
if knows and can_build and not has then
self.doAction.slotrecipe = slotrecipe
self.doAction:Show()
end
-- 如果不知道配方,但是可以制作物品,则让拥有者说出需要制作原型的提示
if not knows and can_build then
--说话
owner.components.talker:Say(GLOBAL.STRINGS.NAMES[string.upper(slotrecipe.name)] .. "(需要制作一个原型)")
end
end
end
end
end)
下面是一个木牌的制作台
下面是木甲的制作台
点击上面 “材料” 按钮,将会制动制作 子材料, 然后就可以直接建造了,再也不用到处去找了。
一键制作源码