259 lines
7.3 KiB
Lua
259 lines
7.3 KiB
Lua
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)
|