3 This mod adds mana to players, a special attribute
13 if (minetest
.get_modpath("intllib")) then
14 dofile(minetest
.get_modpath("intllib").."/intllib.lua")
15 S
= intllib
.Getter(minetest
.get_current_modname())
17 S
= function ( s
) return s
end
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
34 local default_regen
= tonumber(minetest
.setting_get("mana_default_regen"))
35 if default_regen
~= nil then
36 mana
.settings
.default_regen
= default_regen
39 local regen_timer
= tonumber(minetest
.setting_get("mana_regen_timer"))
40 if regen_timer
~= nil then
41 mana
.settings
.regen_timer
= regen_timer
50 function mana
.set(playername
, value
)
52 minetest
.log("info", "[mana] Warning: mana.set was called with negative value!")
55 value
= mana
.round(value
)
56 if value
> mana
.playerlist
[playername
].maxmana
then
57 value
= mana
.playerlist
[playername
].maxmana
59 if mana
.playerlist
[playername
].mana
~= value
then
60 mana
.playerlist
[playername
].mana
= value
61 mana
.hud_update(playername
)
65 function mana
.setmax(playername
, value
)
68 minetest
.log("info", "[mana] Warning: mana.setmax was called with negative value!")
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
76 mana
.hud_update(playername
)
80 function mana
.setregen(playername
, value
)
81 mana
.playerlist
[playername
].regen
= value
84 function mana
.get(playername
)
85 return mana
.playerlist
[playername
].mana
88 function mana
.getmax(playername
)
89 return mana
.playerlist
[playername
].maxmana
92 function mana
.getregen(playername
)
93 return mana
.playerlist
[playername
].regen
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
101 if((t
.mana
+ value
) > t
.maxmana
) then
102 excess
= (t
.mana
+ value
) - t
.maxmana
106 t
.mana
= t
.mana
+ value
108 mana
.hud_update(playername
)
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
)
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
)
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
144 if((t
.mana
- value
) < 0) then
145 missing
= math
.abs(t
.mana
- value
)
149 t
.mana
= t
.mana
- value
151 mana
.hud_update(playername
)
163 File handling
, loading data
, saving data
, setting up stuff
for players
.
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")
172 minetest
.log("action", "[mana] mana.mt opened.")
173 local string = file
:read()
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()
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")
192 file
:write(savestring
)
194 minetest
.log("action", "[mana] Wrote mana data into "..filepath
..".")
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
)
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
)
216 minetest
.register_on_shutdown(function()
217 minetest
.log("action", "[mana] Server shuts down. Rescuing data into mana.mt")
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
))
235 mana
.hud_add(playername
)
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()
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
263 mana
.add_up_to(name
, plus_now
)
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
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
)
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},
307 offset
= { x
= -262, y
= -103}
309 mana
.playerlist
[playername
].hudid
= 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
)
327 mana
.round
= function(x
)
328 return math
.ceil(math
.floor(x
+0.5))