InsaneProtestor/mods/ip_terumet/material/vacfood.lua

98 lines
3.5 KiB
Lua
Raw Normal View History

2022-11-21 22:12:22 +01:00
--[[
Adds food to the vacuum oven recipes:
* Upgrades food items - vacuum two food items to create a condensed and packaged version that restores 3 times as much health/stamina.
* Food items are items that are of the group "food_*" and have an on_use (presumably minetest.item_eat)
* To ensure all food items are seen, any mods that add foods must be added as a dependent mod to Terumet - by default only "farming" is
]]--
local options = terumet.options.vac_oven.VAC_FOOD
local FMT = string.format
local generated_vacfoods = {}
local function make_vacfood_image(img)
return FMT('[combine:32x32:0,0=%s:8,8=%s', terumet.tex('item_vacfood'), img)
end
local function make_vacfood(item_id)
local def = minetest.registered_items[item_id]
if generated_vacfoods[item_id] or (not def) then return end
local mod, item = item_id:match('^(%S+):(%S+)')
if mod and item then
local vf_id = terumet.id(FMT('vacf_%s_%s', mod, item))
local image
if def.inventory_image and def.inventory_image ~= '' then
image = make_vacfood_image(def.inventory_image)
elseif def.tiles and def.tiles[1] and def.tiles[1] ~= '' then
image = make_vacfood_image(def.tiles[1])
else
image = terumet.tex('item_vacfood')
end
local item_sound
if def.sound then
item_sound = table.copy(def.sound)
else
item_sound = {}
end
item_sound.eat = 'terumet_eat_vacfood'
minetest.register_craftitem(vf_id, {
description = 'Vacuum-packed ' .. def.description,
inventory_image = image,
sound=item_sound,
_terumet_vacfood = true,
on_use = def.on_use,
})
terumet.register_vacoven_recipe{
input=item_id..' 2',
results={vf_id},
time=4.0
}
generated_vacfoods[item_id]=vf_id
else
minetest.log('warning', FMT('terumet: valid item "%s" was selected for vacfood but mod or item-id did not parse properly', item_id))
end
end
if options.AUTO_GENERATE then
for id,def in pairs(minetest.registered_items) do
local blacklisted = false
if options.BLACKLIST then
blacklisted = options.BLACKLIST[id]
if not blacklisted then
blacklisted = terumet.match_group_key(options.BLACKLIST, def)
end
end
if not blacklisted then
local is_food = false
for group,_ in pairs(def.groups) do
if def.on_use and group:match('^food_') then
is_food = true
break
end
end
if is_food then make_vacfood(id) end
end
end
end
if options.WHITELIST then
for id,_ in pairs(options.WHITELIST) do
make_vacfood(id)
end
end
-- add a wrapper to core function of do_item_eat which triples hp_change value of items with _terumet_vacfood flag
-- there's no way to read what value individual food items are calling minetest.item_eat() with, so this is the next best way to multiply the value
local old_item_eat = core.do_item_eat
core.do_item_eat = function(hp_change, replace_with_item, itemstack, ...)
local def = itemstack:get_definition()
if def and def._terumet_vacfood then
return old_item_eat(hp_change * 3, replace_with_item, itemstack, ...)
else
return old_item_eat(hp_change, replace_with_item, itemstack, ...)
end
end