3 This mod adds mana to players, a special attribute
12 local S
= minetest
.get_translator("mana")
18 mana
.settings
.default_max
= 200
19 mana
.settings
.default_regen
= 1
20 mana
.settings
.regen_timer
= 0.2
23 local default_max
= tonumber(minetest
.settings
:get("mana_default_max"))
24 if default_max
~= nil then
25 mana
.settings
.default_max
= default_max
28 local default_regen
= tonumber(minetest
.settings
:get("mana_default_regen"))
29 if default_regen
~= nil then
30 mana
.settings
.default_regen
= default_regen
33 local regen_timer
= tonumber(minetest
.settings
:get("mana_regen_timer"))
34 if regen_timer
~= nil then
35 mana
.settings
.regen_timer
= regen_timer
44 function mana
.set(playername
, value
)
46 minetest
.log("info", "[mana] Warning: mana.set was called with negative value!")
49 value
= mana
.round(value
)
50 if value
> mana
.playerlist
[playername
].maxmana
then
51 value
= mana
.playerlist
[playername
].maxmana
53 if mana
.playerlist
[playername
].mana
~= value
then
54 mana
.playerlist
[playername
].mana
= value
55 mana
.hud_update(playername
)
59 function mana
.setmax(playername
, value
)
62 minetest
.log("info", "[mana] Warning: mana.setmax was called with negative value!")
64 value
= mana
.round(value
)
65 if mana
.playerlist
[playername
].maxmana
~= value
then
66 mana
.playerlist
[playername
].maxmana
= value
67 if(mana
.playerlist
[playername
].mana
> value
) then
68 mana
.playerlist
[playername
].mana
= value
70 mana
.hud_update(playername
)
74 function mana
.setregen(playername
, value
)
75 mana
.playerlist
[playername
].regen
= value
78 function mana
.get(playername
)
79 return mana
.playerlist
[playername
].mana
82 function mana
.getmax(playername
)
83 return mana
.playerlist
[playername
].maxmana
86 function mana
.getregen(playername
)
87 return mana
.playerlist
[playername
].regen
90 function mana
.add_up_to(playername
, value
)
91 local t
= mana
.playerlist
[playername
]
92 value
= mana
.round(value
)
93 if(t
~= nil and value
>= 0) then
95 if((t
.mana
+ value
) > t
.maxmana
) then
96 excess
= (t
.mana
+ value
) - t
.maxmana
100 t
.mana
= t
.mana
+ value
102 mana
.hud_update(playername
)
109 function mana
.add(playername
, value
)
110 local t
= mana
.playerlist
[playername
]
111 value
= mana
.round(value
)
112 if(t
~= nil and ((t
.mana
+ value
) <= t
.maxmana
) and value
>= 0) then
113 t
.mana
= t
.mana
+ value
114 mana
.hud_update(playername
)
121 function mana
.subtract(playername
, value
)
122 local t
= mana
.playerlist
[playername
]
123 value
= mana
.round(value
)
124 if(t
~= nil and t
.mana
>= value
and value
>= 0) then
125 t
.mana
= t
.mana
-value
126 mana
.hud_update(playername
)
133 function mana
.subtract_up_to(playername
, value
)
134 local t
= mana
.playerlist
[playername
]
135 value
= mana
.round(value
)
136 if(t
~= nil and value
>= 0) then
138 if((t
.mana
- value
) < 0) then
139 missing
= math
.abs(t
.mana
- value
)
143 t
.mana
= t
.mana
- value
145 mana
.hud_update(playername
)
157 File handling
, loading data
, saving data
, setting up stuff
for players
.
161 -- Load the playerlist from a previous session, if available.
163 local filepath
= minetest
.get_worldpath().."/mana.mt"
164 local file
= io
.open(filepath
, "r")
166 minetest
.log("action", "[mana] mana.mt opened.")
167 local string = file
:read()
169 if(string ~= nil) then
170 local savetable
= minetest
.deserialize(string)
171 mana
.playerlist
= savetable
.playerlist
172 minetest
.debug("[mana] mana.mt successfully read.")
177 function mana
.save_to_file()
179 savetable
.playerlist
= mana
.playerlist
181 local savestring
= minetest
.serialize(savetable
)
183 local filepath
= minetest
.get_worldpath().."/mana.mt"
184 local file
= io
.open(filepath
, "w")
186 file
:write(savestring
)
188 minetest
.log("action", "[mana] Wrote mana data into "..filepath
..".")
190 minetest
.log("error", "[mana] Failed to write mana data into "..filepath
..".")
195 minetest
.register_on_respawnplayer(function(player
)
196 local playername
= player
:get_player_name()
197 mana
.set(playername
, 0)
198 mana
.hud_update(playername
)
202 minetest
.register_on_leaveplayer(function(player
)
203 local playername
= player
:get_player_name()
204 if not minetest
.get_modpath("hudbars") ~= nil then
205 mana
.hud_remove(playername
)
210 minetest
.register_on_shutdown(function()
211 minetest
.log("action", "[mana] Server shuts down. Rescuing data into mana.mt")
215 minetest
.register_on_joinplayer(function(player
)
216 local playername
= player
:get_player_name()
218 if mana
.playerlist
[playername
] == nil then
219 mana
.playerlist
[playername
] = {}
220 mana
.playerlist
[playername
].mana
= 0
221 mana
.playerlist
[playername
].maxmana
= mana
.settings
.default_max
222 mana
.playerlist
[playername
].regen
= mana
.settings
.default_regen
223 mana
.playerlist
[playername
].remainder
= 0
226 if minetest
.get_modpath("hudbars") ~= nil then
227 hb
.init_hudbar(player
, "mana", mana
.get(playername
), mana
.getmax(playername
))
229 mana
.hud_add(playername
)
240 minetest
.register_globalstep(function(dtime
)
241 mana
.regen_timer
= mana
.regen_timer
+ dtime
242 if mana
.regen_timer
>= mana
.settings
.regen_timer
then
243 local factor
= math
.floor(mana
.regen_timer
/ mana
.settings
.regen_timer
)
244 local players
= minetest
.get_connected_players()
246 local name
= players
[i
]:get_player_name()
247 if mana
.playerlist
[name
] ~= nil then
248 if players
[i
]:get_hp() > 0 then
249 local plus
= mana
.playerlist
[name
].regen
* factor
250 -- Compability check for version <= 1.0.2 which did not have the remainder field
251 if mana
.playerlist
[name
].remainder
~= nil then
252 plus
= plus
+ mana
.playerlist
[name
].remainder
254 local plus_now
= math
.floor(plus
)
255 local floor = plus
- plus_now
257 mana
.add_up_to(name
, plus_now
)
259 mana
.subtract_up_to(name
, math
.abs(plus_now
))
261 mana
.playerlist
[name
].remainder
= floor
265 mana
.regen_timer
= mana
.regen_timer
% mana
.settings
.regen_timer
273 if minetest
.get_modpath("hudbars") ~= nil then
274 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)
276 function mana
.hud_update(playername
)
277 local player
= minetest
.get_player_by_name(playername
)
278 if player
~= nil then
279 hb
.change_hudbar(player
, "mana", mana
.get(playername
), mana
.getmax(playername
))
283 function mana
.hud_remove(playername
)
287 function mana
.manastring(playername
)
288 return S("Mana: @1/@2", mana
.get(playername
), mana
.getmax(playername
))
291 function mana
.hud_add(playername
)
292 local player
= minetest
.get_player_by_name(playername
)
293 local id
= player
:hud_add({
294 hud_elem_type
= "text",
295 position
= { x
= 0.5, y
=1 },
296 text
= mana
.manastring(playername
),
297 scale
= { x
= 0, y
= 0 },
298 alignment
= { x
= 1, y
= 0},
301 offset
= { x
= -262, y
= -103}
303 mana
.playerlist
[playername
].hudid
= id
307 function mana
.hud_update(playername
)
308 local player
= minetest
.get_player_by_name(playername
)
309 player
:hud_change(mana
.playerlist
[playername
].hudid
, "text", mana
.manastring(playername
))
312 function mana
.hud_remove(playername
)
313 local player
= minetest
.get_player_by_name(playername
)
314 player
:hud_remove(mana
.playerlist
[playername
].hudid
)
321 mana
.round
= function(x
)
322 return math
.ceil(math
.floor(x
+0.5))