Use "minetest", not "core"
[minetest_hbhunger.git] / init.lua
blobee5019f3d2a817b12fe4a262cd1109071fdb215e
1 local S = minetest.get_translator("hbhunger")
3 if minetest.settings:get_bool("enable_damage") then
5 hbhunger = {}
6 hbhunger.food = {}
8 -- HUD statbar values
9 hbhunger.hunger = {}
10 hbhunger.hunger_out = {}
12 -- Count number of poisonings a player has at once
13 hbhunger.poisonings = {}
15 -- HUD item ids
16 local hunger_hud = {}
18 hbhunger.HUD_TICK = 0.1
20 --Some hunger settings
21 hbhunger.exhaustion = {} -- Exhaustion is experimental!
23 hbhunger.HUNGER_TICK = 800 -- time in seconds after that 1 hunger point is taken
24 hbhunger.EXHAUST_DIG = 3 -- exhaustion increased this value after digged node
25 hbhunger.EXHAUST_PLACE = 1 -- exhaustion increased this value after placed
26 hbhunger.EXHAUST_MOVE = 0.3 -- exhaustion increased this value if player movement detected
27 hbhunger.EXHAUST_LVL = 160 -- at what exhaustion player satiation gets lowerd
30 --load custom settings
31 local set = io.open(minetest.get_modpath("hbhunger").."/hbhunger.conf", "r")
32 if set then
33 dofile(minetest.get_modpath("hbhunger").."/hbhunger.conf")
34 set:close()
35 end
37 local function custom_hud(player)
38 hb.init_hudbar(player, "satiation", hbhunger.get_hunger_raw(player))
39 end
41 dofile(minetest.get_modpath("hbhunger").."/hunger.lua")
43 -- register satiation hudbar
44 hb.register_hudbar("satiation", 0xFFFFFF, S("Satiation"), { icon = "hbhunger_icon.png", bgicon = "hbhunger_bgicon.png", bar = "hbhunger_bar.png" }, 20, 30, false, nil, { format_value = "%.1f", format_max_value = "%d" })
46 -- update hud elemtens if value has changed
47 local function update_hud(player)
48 local name = player:get_player_name()
49 --hunger
50 local h_out = tonumber(hbhunger.hunger_out[name])
51 local h = tonumber(hbhunger.hunger[name])
52 if h_out ~= h then
53 hbhunger.hunger_out[name] = h
54 hb.change_hudbar(player, "satiation", h)
55 end
56 end
58 hbhunger.get_hunger_raw = function(player)
59 local inv = player:get_inventory()
60 if not inv then return nil end
61 local hgp = inv:get_stack("hunger", 1):get_count()
62 if hgp == 0 then
63 hgp = 21
64 inv:set_stack("hunger", 1, ItemStack({name=":", count=hgp}))
65 else
66 hgp = hgp
67 end
68 return hgp-1
69 end
71 hbhunger.set_hunger_raw = function(player)
72 local inv = player:get_inventory()
73 local name = player:get_player_name()
74 local value = hbhunger.hunger[name]
75 if not inv or not value then return nil end
76 if value > 30 then value = 30 end
77 if value < 0 then value = 0 end
79 inv:set_stack("hunger", 1, ItemStack({name=":", count=value+1}))
81 return true
82 end
84 minetest.register_on_joinplayer(function(player)
85 local name = player:get_player_name()
86 local inv = player:get_inventory()
87 inv:set_size("hunger",1)
88 hbhunger.hunger[name] = hbhunger.get_hunger_raw(player)
89 hbhunger.hunger_out[name] = hbhunger.hunger[name]
90 hbhunger.exhaustion[name] = 0
91 hbhunger.poisonings[name] = 0
92 custom_hud(player)
93 hbhunger.set_hunger_raw(player)
94 end)
96 minetest.register_on_respawnplayer(function(player)
97 -- reset hunger (and save)
98 local name = player:get_player_name()
99 hbhunger.hunger[name] = 20
100 hbhunger.set_hunger_raw(player)
101 hbhunger.exhaustion[name] = 0
102 end)
104 local main_timer = 0
105 local timer = 0
106 local timer2 = 0
107 minetest.register_globalstep(function(dtime)
108 main_timer = main_timer + dtime
109 timer = timer + dtime
110 timer2 = timer2 + dtime
111 if main_timer > hbhunger.HUD_TICK or timer > 4 or timer2 > hbhunger.HUNGER_TICK then
112 if main_timer > hbhunger.HUD_TICK then main_timer = 0 end
113 for _,player in ipairs(minetest.get_connected_players()) do
114 local name = player:get_player_name()
116 local h = tonumber(hbhunger.hunger[name])
117 local hp = player:get_hp()
118 if timer > 4 then
119 -- heal player by 1 hp if not dead and satiation is > 15 (of 30)
120 if h > 15 and hp > 0 and player:get_breath() > 0 then
121 player:set_hp(hp+1)
122 -- or damage player by 1 hp if satiation is < 2 (of 30)
123 elseif h <= 1 then
124 if hp-1 >= 0 then player:set_hp(hp-1) end
127 -- lower satiation by 1 point after xx seconds
128 if timer2 > hbhunger.HUNGER_TICK then
129 if h > 0 then
130 h = h-1
131 hbhunger.hunger[name] = h
132 hbhunger.set_hunger_raw(player)
136 -- update all hud elements
137 update_hud(player)
139 local controls = player:get_player_control()
140 -- Determine if the player is walking
141 if controls.up or controls.down or controls.left or controls.right then
142 hbhunger.handle_node_actions(nil, nil, player)
146 if timer > 4 then timer = 0 end
147 if timer2 > hbhunger.HUNGER_TICK then timer2 = 0 end
148 end)