Fix version number in init.lua
[minetest_mana.git] / init.lua
blobd384bc9b2416fb5d9c774618af30c4bc103546e8
1 --[[
2 Mana 1.0.2
3 This mod adds mana to players, a special attribute
5 License: WTFPL
6 ]]
8 --[===[
9 Initialization
10 ]===]
12 mana = {}
13 mana.playerlist = {}
15 mana.settings = {}
16 mana.settings.default_max = 200
17 mana.settings.default_regen = 1
18 mana.settings.regen_timer = 0.2
21 local default_max = tonumber(minetest.setting_get("mana_default_max"))
22 if default_max ~= nil then
23 mana.settings.default_max = default_max
24 end
26 local default_regen = tonumber(minetest.setting_get("mana_default_regen"))
27 if default_regen ~= nil then
28 mana.settings.default_regen = default_regen
29 end
31 local regen_timer = tonumber(minetest.setting_get("mana_regen_timer"))
32 if regen_timer ~= nil then
33 mana.settings.regen_timer = regen_timer
34 end
35 end
38 --[===[
39 API functions
40 ]===]
42 function mana.set(playername, value)
43 if value < 0 then
44 minetest.log("info", "[mana] Warning: mana.set was called with negative value!")
45 value = 0
46 end
47 value = mana.round(value)
48 if value > mana.playerlist[playername].maxmana then
49 value = mana.playerlist[playername].maxmana
50 end
51 if mana.playerlist[playername].mana ~= value then
52 mana.playerlist[playername].mana = value
53 mana.hud_update(playername)
54 end
55 end
57 function mana.setmax(playername, value)
58 if value < 0 then
59 value = 0
60 minetest.log("info", "[mana] Warning: mana.setmax was called with negative value!")
61 end
62 value = mana.round(value)
63 if mana.playerlist[playername].maxmana ~= value then
64 mana.playerlist[playername].maxmana = value
65 if(mana.playerlist[playername].mana > value) then
66 mana.playerlist[playername].mana = value
67 end
68 mana.hud_update(playername)
69 end
70 end
72 function mana.setregen(playername, value)
73 if value < 0 then
74 value = 0
75 minetest.log("info", "[mana] Warning: mana.setregen was called with negative value!")
76 end
77 value = mana.round(value)
78 mana.playerlist[playername].regen = value
79 end
81 function mana.get(playername)
82 return mana.playerlist[playername].mana
83 end
85 function mana.getmax(playername)
86 return mana.playerlist[playername].maxmana
87 end
89 function mana.getregen(playername)
90 return mana.playerlist[playername].regen
91 end
93 function mana.add_up_to(playername, value)
94 local t = mana.playerlist[playername]
95 value = mana.round(value)
96 if(t ~= nil and value >= 0) then
97 local excess
98 if((t.mana + value) > t.maxmana) then
99 excess = (t.mana + value) - t.maxmana
100 t.mana = t.maxmana
101 else
102 excess = 0
103 t.mana = t.mana + value
105 mana.hud_update(playername)
106 return true, excess
107 else
108 return false
112 function mana.add(playername, value)
113 local t = mana.playerlist[playername]
114 value = mana.round(value)
115 if(t ~= nil and ((t.mana + value) <= t.maxmana) and value >= 0) then
116 t.mana = t.mana + value
117 mana.hud_update(playername)
118 return true
119 else
120 return false
124 function mana.subtract(playername, value)
125 local t = mana.playerlist[playername]
126 value = mana.round(value)
127 if(t ~= nil and t.mana >= value and value >= 0) then
128 t.mana = t.mana -value
129 mana.hud_update(playername)
130 return true
131 else
132 return false
136 function mana.subtract_up_to(playername, value)
137 local t = mana.playerlist[playername]
138 value = mana.round(value)
139 if(t ~= nil and value >= 0) then
140 local missing
141 if((t.mana - value) < 0) then
142 missing = math.abs(t.mana - value)
143 t.mana = 0
144 else
145 missing = 0
146 t.mana = t.mana - value
148 mana.hud_update(playername)
149 return true, missing
150 else
151 return false
159 --[===[
160 File handling, loading data, saving data, setting up stuff for players.
161 ]===]
164 -- Load the playerlist from a previous session, if available.
166 local filepath = minetest.get_worldpath().."/mana.mt"
167 local file = io.open(filepath, "r")
168 if file then
169 minetest.log("action", "[mana] mana.mt opened.")
170 local string = file:read()
171 io.close(file)
172 if(string ~= nil) then
173 local savetable = minetest.deserialize(string)
174 mana.playerlist = savetable.playerlist
175 minetest.debug("[mana] mana.mt successfully read.")
180 function mana.save_to_file()
181 local savetable = {}
182 savetable.playerlist = mana.playerlist
184 local savestring = minetest.serialize(savetable)
186 local filepath = minetest.get_worldpath().."/mana.mt"
187 local file = io.open(filepath, "w")
188 if file then
189 file:write(savestring)
190 io.close(file)
191 minetest.log("action", "[mana] Wrote mana data into "..filepath..".")
192 else
193 minetest.log("error", "[mana] Failed to write mana data into "..filepath..".")
198 minetest.register_on_respawnplayer(function(player)
199 local playername = player:get_player_name()
200 mana.set(playername, 0)
201 mana.hud_update(playername)
202 end)
205 minetest.register_on_leaveplayer(function(player)
206 local playername = player:get_player_name()
207 if not minetest.get_modpath("hudbars") ~= nil then
208 mana.hud_remove(playername)
210 mana.save_to_file()
211 end)
213 minetest.register_on_shutdown(function()
214 minetest.log("action", "[mana] Server shuts down. Rescuing data into mana.mt")
215 mana.save_to_file()
216 end)
218 minetest.register_on_joinplayer(function(player)
219 local playername = player:get_player_name()
221 if mana.playerlist[playername] == nil then
222 mana.playerlist[playername] = {}
223 mana.playerlist[playername].mana = 0
224 mana.playerlist[playername].maxmana = mana.settings.default_max
225 mana.playerlist[playername].regen = mana.settings.default_regen
228 if minetest.get_modpath("hudbars") ~= nil then
229 hb.init_hudbar(player, "mana", mana.get(playername), mana.getmax(playername))
230 else
231 mana.hud_add(playername)
233 end)
236 --[===[
237 Mana regeneration
238 ]===]
240 mana.regen_timer = 0
242 minetest.register_globalstep(function(dtime)
243 mana.regen_timer = mana.regen_timer + dtime
244 if mana.regen_timer >= mana.settings.regen_timer then
245 local factor = math.floor(mana.regen_timer / mana.settings.regen_timer)
246 local players = minetest.get_connected_players()
247 for i=1, #players do
248 local name = players[i]:get_player_name()
249 if mana.playerlist[name] ~= nil then
250 if players[i]:get_hp() > 0 then
251 mana.add_up_to(name, mana.playerlist[name].regen * factor)
255 mana.regen_timer = mana.regen_timer % mana.settings.regen_timer
257 end)
259 --[===[
260 HUD functions
261 ]===]
263 if minetest.get_modpath("hudbars") ~= nil then
264 hb.register_hudbar("mana", 0xFFFFFF, "Mana", { bar = "mana_bar.png", icon = "mana_icon.png" }, 0, mana.settings.default_max, false)
266 function mana.hud_update(playername)
267 local player = minetest.get_player_by_name(playername)
268 if player ~= nil then
269 hb.change_hudbar(player, "mana", mana.get(playername), mana.getmax(playername))
273 function mana.hud_remove(playername)
276 else
277 function mana.manastring(playername)
278 return string.format("Mana: %d/%d", mana.get(playername), mana.getmax(playername))
281 function mana.hud_add(playername)
282 local player = minetest.get_player_by_name(playername)
283 id = player:hud_add({
284 hud_elem_type = "text",
285 position = { x = 0.5, y=0.9 },
286 text = mana.manastring(playername),
287 scale = { x = 0, y = 0 },
288 alignment = { x = 1, y = 0},
289 direction = 1,
290 number = 0xFFFFFF,
291 offset = { x = -200, y = 15}
293 mana.playerlist[playername].hudid = id
294 return id
297 function mana.hud_update(playername)
298 local player = minetest.get_player_by_name(playername)
299 player:hud_change(mana.playerlist[playername].hudid, "number", mana.get(playername))
302 function mana.hud_remove(playername)
303 local player = minetest.get_player_by_name(playername)
304 player:hud_remove(mana.playerlist[playername].hudid)
308 --[===[
309 Helper functions
310 ]===]
311 mana.round = function(x)
312 return math.ceil(math.floor(x+0.5))