Remove redundant version number from init.lua
[minetest_mana.git] / init.lua
blobaa280568d932775b2ed36265f8b26c1de6a355c5
1 --[[
2 Mana
3 This mod adds mana to players, a special attribute
5 License: WTFPL
6 ]]
8 --[===[
9 Initialization
10 ]===]
12 local S
13 if (minetest.get_modpath("intllib")) then
14 dofile(minetest.get_modpath("intllib").."/intllib.lua")
15 S = intllib.Getter(minetest.get_current_modname())
16 else
17 S = function ( s ) return s end
18 end
20 mana = {}
21 mana.playerlist = {}
23 mana.settings = {}
24 mana.settings.default_max = 200
25 mana.settings.default_regen = 1
26 mana.settings.regen_timer = 0.2
29 local default_max = tonumber(minetest.setting_get("mana_default_max"))
30 if default_max ~= nil then
31 mana.settings.default_max = default_max
32 end
34 local default_regen = tonumber(minetest.setting_get("mana_default_regen"))
35 if default_regen ~= nil then
36 mana.settings.default_regen = default_regen
37 end
39 local regen_timer = tonumber(minetest.setting_get("mana_regen_timer"))
40 if regen_timer ~= nil then
41 mana.settings.regen_timer = regen_timer
42 end
43 end
46 --[===[
47 API functions
48 ]===]
50 function mana.set(playername, value)
51 if value < 0 then
52 minetest.log("info", "[mana] Warning: mana.set was called with negative value!")
53 value = 0
54 end
55 value = mana.round(value)
56 if value > mana.playerlist[playername].maxmana then
57 value = mana.playerlist[playername].maxmana
58 end
59 if mana.playerlist[playername].mana ~= value then
60 mana.playerlist[playername].mana = value
61 mana.hud_update(playername)
62 end
63 end
65 function mana.setmax(playername, value)
66 if value < 0 then
67 value = 0
68 minetest.log("info", "[mana] Warning: mana.setmax was called with negative value!")
69 end
70 value = mana.round(value)
71 if mana.playerlist[playername].maxmana ~= value then
72 mana.playerlist[playername].maxmana = value
73 if(mana.playerlist[playername].mana > value) then
74 mana.playerlist[playername].mana = value
75 end
76 mana.hud_update(playername)
77 end
78 end
80 function mana.setregen(playername, value)
81 mana.playerlist[playername].regen = value
82 end
84 function mana.get(playername)
85 return mana.playerlist[playername].mana
86 end
88 function mana.getmax(playername)
89 return mana.playerlist[playername].maxmana
90 end
92 function mana.getregen(playername)
93 return mana.playerlist[playername].regen
94 end
96 function mana.add_up_to(playername, value)
97 local t = mana.playerlist[playername]
98 value = mana.round(value)
99 if(t ~= nil and value >= 0) then
100 local excess
101 if((t.mana + value) > t.maxmana) then
102 excess = (t.mana + value) - t.maxmana
103 t.mana = t.maxmana
104 else
105 excess = 0
106 t.mana = t.mana + value
108 mana.hud_update(playername)
109 return true, excess
110 else
111 return false
115 function mana.add(playername, value)
116 local t = mana.playerlist[playername]
117 value = mana.round(value)
118 if(t ~= nil and ((t.mana + value) <= t.maxmana) and value >= 0) then
119 t.mana = t.mana + value
120 mana.hud_update(playername)
121 return true
122 else
123 return false
127 function mana.subtract(playername, value)
128 local t = mana.playerlist[playername]
129 value = mana.round(value)
130 if(t ~= nil and t.mana >= value and value >= 0) then
131 t.mana = t.mana -value
132 mana.hud_update(playername)
133 return true
134 else
135 return false
139 function mana.subtract_up_to(playername, value)
140 local t = mana.playerlist[playername]
141 value = mana.round(value)
142 if(t ~= nil and value >= 0) then
143 local missing
144 if((t.mana - value) < 0) then
145 missing = math.abs(t.mana - value)
146 t.mana = 0
147 else
148 missing = 0
149 t.mana = t.mana - value
151 mana.hud_update(playername)
152 return true, missing
153 else
154 return false
162 --[===[
163 File handling, loading data, saving data, setting up stuff for players.
164 ]===]
167 -- Load the playerlist from a previous session, if available.
169 local filepath = minetest.get_worldpath().."/mana.mt"
170 local file = io.open(filepath, "r")
171 if file then
172 minetest.log("action", "[mana] mana.mt opened.")
173 local string = file:read()
174 io.close(file)
175 if(string ~= nil) then
176 local savetable = minetest.deserialize(string)
177 mana.playerlist = savetable.playerlist
178 minetest.debug("[mana] mana.mt successfully read.")
183 function mana.save_to_file()
184 local savetable = {}
185 savetable.playerlist = mana.playerlist
187 local savestring = minetest.serialize(savetable)
189 local filepath = minetest.get_worldpath().."/mana.mt"
190 local file = io.open(filepath, "w")
191 if file then
192 file:write(savestring)
193 io.close(file)
194 minetest.log("action", "[mana] Wrote mana data into "..filepath..".")
195 else
196 minetest.log("error", "[mana] Failed to write mana data into "..filepath..".")
201 minetest.register_on_respawnplayer(function(player)
202 local playername = player:get_player_name()
203 mana.set(playername, 0)
204 mana.hud_update(playername)
205 end)
208 minetest.register_on_leaveplayer(function(player)
209 local playername = player:get_player_name()
210 if not minetest.get_modpath("hudbars") ~= nil then
211 mana.hud_remove(playername)
213 mana.save_to_file()
214 end)
216 minetest.register_on_shutdown(function()
217 minetest.log("action", "[mana] Server shuts down. Rescuing data into mana.mt")
218 mana.save_to_file()
219 end)
221 minetest.register_on_joinplayer(function(player)
222 local playername = player:get_player_name()
224 if mana.playerlist[playername] == nil then
225 mana.playerlist[playername] = {}
226 mana.playerlist[playername].mana = 0
227 mana.playerlist[playername].maxmana = mana.settings.default_max
228 mana.playerlist[playername].regen = mana.settings.default_regen
229 mana.playerlist[playername].remainder = 0
232 if minetest.get_modpath("hudbars") ~= nil then
233 hb.init_hudbar(player, "mana", mana.get(playername), mana.getmax(playername))
234 else
235 mana.hud_add(playername)
237 end)
240 --[===[
241 Mana regeneration
242 ]===]
244 mana.regen_timer = 0
246 minetest.register_globalstep(function(dtime)
247 mana.regen_timer = mana.regen_timer + dtime
248 if mana.regen_timer >= mana.settings.regen_timer then
249 local factor = math.floor(mana.regen_timer / mana.settings.regen_timer)
250 local players = minetest.get_connected_players()
251 for i=1, #players do
252 local name = players[i]:get_player_name()
253 if mana.playerlist[name] ~= nil then
254 if players[i]:get_hp() > 0 then
255 local plus = mana.playerlist[name].regen * factor
256 -- Compability check for version <= 1.0.2 which did not have the remainder field
257 if mana.playerlist[name].remainder ~= nil then
258 plus = plus + mana.playerlist[name].remainder
260 local plus_now = math.floor(plus)
261 local floor = plus - plus_now
262 if plus_now > 0 then
263 mana.add_up_to(name, plus_now)
264 else
265 mana.subtract_up_to(name, math.abs(plus_now))
267 mana.playerlist[name].remainder = floor
271 mana.regen_timer = mana.regen_timer % mana.settings.regen_timer
273 end)
275 --[===[
276 HUD functions
277 ]===]
279 if minetest.get_modpath("hudbars") ~= nil then
280 hb.register_hudbar("mana", 0xFFFFFF, S("Mana"), { bar = "mana_bar.png", icon = "mana_icon.png", bgicon = "mana_bgicon.png" }, 0, mana.settings.default_max, false)
282 function mana.hud_update(playername)
283 local player = minetest.get_player_by_name(playername)
284 if player ~= nil then
285 hb.change_hudbar(player, "mana", mana.get(playername), mana.getmax(playername))
289 function mana.hud_remove(playername)
292 else
293 function mana.manastring(playername)
294 return string.format(S("Mana: %d/%d"), mana.get(playername), mana.getmax(playername))
297 function mana.hud_add(playername)
298 local player = minetest.get_player_by_name(playername)
299 local id = player:hud_add({
300 hud_elem_type = "text",
301 position = { x = 0.5, y=1 },
302 text = mana.manastring(playername),
303 scale = { x = 0, y = 0 },
304 alignment = { x = 1, y = 0},
305 direction = 1,
306 number = 0xFFFFFF,
307 offset = { x = -262, y = -103}
309 mana.playerlist[playername].hudid = id
310 return id
313 function mana.hud_update(playername)
314 local player = minetest.get_player_by_name(playername)
315 player:hud_change(mana.playerlist[playername].hudid, "text", mana.manastring(playername))
318 function mana.hud_remove(playername)
319 local player = minetest.get_player_by_name(playername)
320 player:hud_remove(mana.playerlist[playername].hudid)
324 --[===[
325 Helper functions
326 ]===]
327 mana.round = function(x)
328 return math.ceil(math.floor(x+0.5))