local nutrition_mod = dofile(core.get_modpath("nutritional") .. "/api.lua") local hunger_ng_exist = core.get_modpath("hunger_ng") ~= nil local hunger_mcl_exist = core.get_modpath("mcl_hunger") ~= nil local hbhunger_exist = core.get_modpath("hbhunger") ~= nil local active_mod local hungermods = { mcl = { get_max_hunger = function(_name) return 20 --currently hardcoded into mcl_hunger end, get_hunger = function(_name, player) return mcl_hunger.get_hunger(player) end, set_hunger = function(player, hunger) mcl_hunger.set_hunger(player, hunger, true) end, alter_hunger = function(_name, player, value, hunger) mcl_hunger.set_hunger(player, hunger + value, true) end }, hunger_ng = { get_max_hunger = function(name) local info = hunger_ng.get_hunger_information(name) if not info.invalid then return info.maximum.hunger end end, get_hunger = function(name, _player) local info = hunger_ng.get_hunger_information(name) if not info.invalid then return info.hunger.exact end end, set_hunger = function(name, _player, value) --- I am not sure, but whatever, not using this function anyway hunger_ng.interoperability.set_data(name, {hunger={ floored = math.floor(value), ceiled = math.ceil(value), exact = value, }}) end, alter_hunger = function(name, _player, value, _hunger) hunger_ng.alter_hunger(name, value, 'nutritional') end }, hbhunger = { get_hunger = function(_name, player) return hbhunger.get_hunger_raw(player) end, set_hunger= function(name, _player, value) hbhunger.hunger[name] = value hbhunger.set_hunger_raw(player) end, alter_hunger = function(name, _player, value, hunger) hbhunger.hunger[name] = value + hunger hbhunger.set_hunger_raw(player) end, get_max_hunger= function(name) return hbhunger.SAT_MAX end }, } if hunger_mcl_exist and mcl_hunger.get_active() then active_mod = hungermods["mcl"] elseif hunger_ng_exist then active_mod = hungermods["hunger_ng"] elseif hbhunger_exist then active_mod = hungermods["hbhunger"] else return end local categories = { "vegetable", -- 🥕 Beetroot, Potato, Carrot "fruit", -- 🍎 "carbs",-- 🍞 Whole Grains & Starches "fats", -- 🍯 Cooked fatty meats and sugar items, Cookies, Cake, Pumpkin Pie, Honey Bottle "meat", -- 🍖 "fish", -- 🐟 Fish & Seafood "dairy", -- 🥛 Milk (buckets), Cake (contains milk), Pumpkin Pie (milk) "drink", -- 💧 water, milk (buckets) "mineral", -- ✨ rare, micronutrients : gold, Glow Berries, chorus fruit, tropical fish, Dried Kelp, "poison", -- ☠️ Pufferfish, Spider Eye } core.register_on_joinplayer(function(player) local name = player:get_player_name() nutrition_mod.hud[name] = {} for i, cat in ipairs(categories) do local id = player:hud_add({ hud_elem_type = "image", position = {x = 0.5, y = 1}, alignment = {x = 0, y = -1}, offset = { x = (i) * 24 + 2, -- centers the row y = -85-24 }, text = "nutri_" .. cat .. "_empty.png", scale = {x = 3, y = 3}, z_index = 100, }) nutrition_mod.hud[name][cat] = id end nutrition_mod.update_hud(player) end) core.register_on_respawnplayer(function(player) if player:is_player() ~= true then return end local player_name = player:get_player_name() for i, cat in ipairs(categories) do nutrition_mod.add(player, cat, 2) end nutrition_mod.update_hud(player) end) local old = minetest.do_item_eat on_item_eat = function(hp_change, replace_with_item, itemstack, player, pointed_thing) if player:is_player() ~= true then return end local player_name = player:get_player_name() local MAX_HUNGER = active_mod.get_max_hunger(player_name) local hunger_step = MAX_HUNGER / 20 local hunger = active_mod.get_hunger(player_name, player) if hunger <= (MAX_HUNGER-hunger_step) then local name = itemstack:get_name() local categories_player = nutrition_mod.foods[name] if categories_player then for _, cat in ipairs(categories_player) do nutrition_mod.add(player, cat, 1) end end end nutrition_mod.update_hud(player) end -- for some games register_on_item_eat doesnt work? minetest.do_item_eat = function(hp_change, replace_with_item, itemstack, player, pointed_thing) on_item_eat(hp_change, replace_with_item, itemstack, player, pointed_thing) return old(hp_change, replace_with_item, itemstack, player, pointed_thing) end core.register_on_item_eat(on_item_eat) local timer = 0 core.register_globalstep(function(dtime) timer = timer + dtime if timer < 1 then return end -- run once per second timer = 0 for _, player in ipairs(core.get_connected_players()) do local data = nutrition_mod.get(player) local name = player:get_player_name() local MAX_HUNGER = active_mod.get_max_hunger(name) local hunger_step = MAX_HUNGER / 20 local hunger = active_mod.get_hunger(name, player) -- local hunger = mcl_hunger.get_hunger(player) -- core.chat_send_all(hunger) if data and hunger <= (MAX_HUNGER-hunger_step) then for cat, hud_id in pairs(nutrition_mod.hud[name]) do local val = data[cat] or 0 if val >= 1 then --mcl_hunger.set_hunger(player, hunger + 1, true) active_mod.alter_hunger(name, player, hunger_step, hunger) nutrition_mod.add(player, cat, -1) nutrition_mod.update_hud(player) break end end end end end) -- hides the hunger bar -- core.register_on_joinplayer(function(player) -- vl_hudbars.hide(player, "hunger") -- end) -- compatibility for hunger_ng -- local info = hunger_ng.get_hunger_information(name) -- if not info.invalid then -- info.hunger.exact -- info.maximum.hunger -- hunger_ng.alter_hunger(name, 1, 'nutrient') -- info: -- { -- player_name = 'Foobar', -- hunger = { -- floored = 18, -- ceiled = 19 -- exact = 18.928, -- disabled = false, -- enabled = true -- }, -- maximum = { -- hunger = 20, -- health = 20, -- breath = 11 -- }, -- effects = { -- starving = { enabled = true, status = false }, -- healing = { enabled = true, status = true }, -- current_breath = 11 -- }, -- timestamps = { -- last_eaten = 1549670580, -- request = 1549671198 -- } -- } -- compat minetest_hbhunger -- hbhunger.get_hunger_raw(player) -- hbhunger.hunger[name] = hbhunger.SAT_INIT -- hbhunger.set_hunger_raw(player) -- hbhunger.SAT_MAX -- compat stamina -- this mod sucks -- stamina.get_saturation(player) -- stamina.change_saturation(player, 1) -- stamina.settings.visual_max?? --- compat game exile -- maybe not -- local meta = player:get_meta() -- local st = player_api.get_state(player) -- meta:set_int("hunger", 1000) -- st:add("hunger", 1000) -- compat game Repixture -- hunger.MAX_HUNGER -- hunger.get_hunger(playername) -- hunger.set_hunger(playername, hunger)