--[[ Mana 0.1.0 This mod adds mana to players, a special attribute License: WTFPL ]] --[===[ Initialization ]===] mana = {} mana.playerlist = {} --[===[ API functions ]===] -- Sets the maximum mana of the specified player function mana.set(playername, value) mana.playerlist[playername].mana = value mana.hud_update(playername) end -- Sets the maximum mana of the specified player function mana.setmax(playername, value) mana.playerlist[playername].maxmana = value mana.hud_update(playername) end -- Returns the current mana of the specified player function mana.get(playername) return mana.playerlist[playername].mana end -- Returns the maximum mana of the specified player function mana.getmax(playername) return mana.playerlist[playername].maxmana end --[[ Adds the specified amount of mana to the player, but will respect the player's maximum. returns: - true, excess on success, where excess is the amount of mana which was no - false on failure ]] function mana.add(playername, value) local t = mana.playerlist[playername] if(t ~= nil and value >= 0) then local excess if((t.mana + value) > t.maxmana) then excess = (t.mana + value) - t.maxmana t.mana = t.maxmana else excess = 0 t.mana = t.mana + value end mana.hud_update(playername) return true, excess else return false end end --[[ Subtracts the specified amount of mana from the player, iff the player has enough mana reserves. returns: - true on success, mana has been subtracted - false on failure, no mana has been subtracted ]] function mana.subtract(playername, value) local t = mana.playerlist[playername] if(t ~= nil and t.mana >= value and value >= 0) then t.mana = t.mana -value mana.hud_update(playername) return true else return false end end --[===[ File handling, loading data, saving data, setting up stuff for players. ]===] -- Load the playerlist from a previous session, if available. do local filepath = minetest.get_worldpath().."/mana.mt" local file = io.open(filepath, "r") if file then minetest.log("action", "[mana] mana.mt opened.") local string = file:read() io.close(file) if(string ~= nil) then local savetable = minetest.deserialize(string) mana.playerlist = savetable.playerlist minetest.debug("[mana] mana.mt successfully read.") end end end function mana.save_to_file() local savetable = {} savetable.playerlist = mana.playerlist local savestring = minetest.serialize(savetable) local filepath = minetest.get_worldpath().."/mana.mt" local file = io.open(filepath, "w") if file then file:write(savestring) io.close(file) minetest.log("action", "[mana] Wrote mana data into "..filepath..".") else minetest.log("error", "[mana] Failed to write mana data into "..filepath..".") end end minetest.register_on_dieplayer(function(player) local playername = player:get_player_name() mana.set(playername, 0) mana.hud_update(playername) end) minetest.register_on_leaveplayer(function(player) local playername = player:get_player_name() mana.hud_remove(playername) mana.playerlist[playername] = nil end) minetest.register_on_shutdown(function() minetest.log("action", "[mana] Server shuts down. Rescuing data into mana.mt") mana.save_to_file() end) minetest.register_on_joinplayer(function(player) local playername = player:get_player_name() if mana.playerlist[playername] == nil then mana.playerlist[playername] = {} mana.playerlist[playername].mana = 0 mana.playerlist[playername].maxmana = 100 end if minetest.get_modpath("hudbars") ~= nil then hud.hudtables.mana.add_all(player, mana.get(playername), mana.getmax(playername)) else mana.hud_add(playername) end end) --[===[ HUD functions ]===] if minetest.get_modpath("hudbars") ~= nil then hud.register_hudbar("mana", 0xFFFFFF, "Mana", { bar = "mana_bar.png", icon = "mana_icon.png" }, 0, 100, false) function mana.hud_update(playername) local player = minetest.get_player_by_name(playername) hud.change_hudbar(player, hud.hudtables.mana, mana.get(playername), mana.getmax(playername)) end else function mana.manastring(playername) return string.format("Mana: %d/%d", mana.get(playername), mana.getmax(playername)) end function mana.hud_add(playername) local player = minetest.get_player_by_name(playername) id = player:hud_add({ hud_elem_type = "text", position = { x = 0.5, y=0.9 }, text = mana.manastring(playername), scale = { x = 0, y = 0 }, alignment = { x = 1, y = 0}, direction = 1, number = 0xFFFFFF, offset = { x = -200, y = 15} }) mana.playerlist[playername].hudid = id return id end function mana.hud_update(playername) local player = minetest.get_player_by_name(playername) player:hud_change(mana.playerlist[playername].hudid, "number", mana.get(playername)) end function mana.hud_remove(playername) local player = minetest.get_player_by_name(playername) player:hud_remove(mana.playerlist[playername].hudid) end end