2015-02-02 03:45:57 +01:00
|
|
|
--[[
|
2015-02-10 02:50:35 +01:00
|
|
|
Mana 0.3.0
|
2015-02-02 03:45:57 +01:00
|
|
|
This mod adds mana to players, a special attribute
|
|
|
|
|
|
|
|
License: WTFPL
|
|
|
|
]]
|
|
|
|
|
|
|
|
--[===[
|
|
|
|
Initialization
|
|
|
|
]===]
|
|
|
|
|
|
|
|
mana = {}
|
|
|
|
mana.playerlist = {}
|
|
|
|
|
2015-02-14 00:59:47 +01:00
|
|
|
mana.settings = {}
|
|
|
|
mana.settings.default_max = 200
|
2015-02-14 02:16:25 +01:00
|
|
|
mana.settings.default_regen = 1
|
2015-02-14 02:37:03 +01:00
|
|
|
mana.settings.regen_timer = 0.2
|
2015-02-14 00:59:47 +01:00
|
|
|
|
|
|
|
do
|
|
|
|
local default_max = tonumber(minetest.setting_get("mana_default_max"))
|
|
|
|
if default_max ~= nil then
|
|
|
|
mana.settings.default_max = default_max
|
|
|
|
end
|
2015-02-14 02:16:25 +01:00
|
|
|
|
|
|
|
local default_regen = tonumber(minetest.setting_get("mana_default_regen"))
|
|
|
|
if default_regen ~= nil then
|
|
|
|
mana.settings.default_regen = default_regen
|
|
|
|
end
|
|
|
|
|
|
|
|
local regen_timer = tonumber(minetest.setting_get("mana_regen_timer"))
|
|
|
|
if regen_timer ~= nil then
|
|
|
|
mana.settings.regen_timer = regen_timer
|
|
|
|
end
|
2015-02-14 00:59:47 +01:00
|
|
|
end
|
2015-02-02 03:45:57 +01:00
|
|
|
|
|
|
|
|
|
|
|
--[===[
|
|
|
|
API functions
|
|
|
|
]===]
|
|
|
|
|
2015-02-02 04:20:38 +01:00
|
|
|
function mana.set(playername, value)
|
2015-02-04 21:21:04 +01:00
|
|
|
if value < 0 then
|
|
|
|
minetest.log("info", "[mana] Warning: mana.set was called with negative value!")
|
|
|
|
value = 0
|
|
|
|
end
|
|
|
|
if value > mana.playerlist[playername].maxmana then
|
|
|
|
value = mana.playerlist[playername].maxmana
|
|
|
|
end
|
|
|
|
if mana.playerlist[playername].mana ~= value then
|
|
|
|
mana.playerlist[playername].mana = value
|
|
|
|
mana.hud_update(playername)
|
|
|
|
end
|
2015-02-02 03:45:57 +01:00
|
|
|
end
|
|
|
|
|
2015-02-02 04:20:38 +01:00
|
|
|
function mana.setmax(playername, value)
|
2015-02-04 21:21:04 +01:00
|
|
|
if value < 0 then
|
|
|
|
value = 0
|
|
|
|
minetest.log("info", "[mana] Warning: mana.setmax was called with negative value!")
|
|
|
|
end
|
|
|
|
if mana.playerlist[playername].maxmana ~= value then
|
|
|
|
mana.playerlist[playername].maxmana = value
|
|
|
|
if(mana.playerlist[playername].mana > value) then
|
|
|
|
mana.playerlist[playername].mana = value
|
|
|
|
end
|
|
|
|
mana.hud_update(playername)
|
|
|
|
end
|
2015-02-02 03:45:57 +01:00
|
|
|
end
|
|
|
|
|
2015-02-14 02:26:34 +01:00
|
|
|
function mana.setregen(playername, value)
|
|
|
|
if value < 0 then
|
|
|
|
value = 0
|
|
|
|
minetest.log("info", "[mana] Warning: mana.setregen was called with negative value!")
|
|
|
|
end
|
|
|
|
mana.playerlist[playername].regen = value
|
|
|
|
end
|
|
|
|
|
2015-02-02 03:45:57 +01:00
|
|
|
function mana.get(playername)
|
2015-02-02 04:20:38 +01:00
|
|
|
return mana.playerlist[playername].mana
|
2015-02-02 03:45:57 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
function mana.getmax(playername)
|
2015-02-02 04:20:38 +01:00
|
|
|
return mana.playerlist[playername].maxmana
|
2015-02-02 03:45:57 +01:00
|
|
|
end
|
|
|
|
|
2015-02-14 02:26:34 +01:00
|
|
|
function mana.getregen(playername)
|
|
|
|
return mana.playerlist[playername].regen
|
|
|
|
end
|
|
|
|
|
2015-02-08 01:44:23 +01:00
|
|
|
function mana.add_up_to(playername, value)
|
2015-02-02 03:45:57 +01:00
|
|
|
local t = mana.playerlist[playername]
|
2015-02-02 04:20:38 +01:00
|
|
|
if(t ~= nil and value >= 0) then
|
2015-02-02 03:45:57 +01:00
|
|
|
local excess
|
2015-02-02 04:20:38 +01:00
|
|
|
if((t.mana + value) > t.maxmana) then
|
|
|
|
excess = (t.mana + value) - t.maxmana
|
2015-02-02 03:45:57 +01:00
|
|
|
t.mana = t.maxmana
|
|
|
|
else
|
|
|
|
excess = 0
|
2015-02-02 04:20:38 +01:00
|
|
|
t.mana = t.mana + value
|
2015-02-02 03:45:57 +01:00
|
|
|
end
|
2015-02-02 04:20:38 +01:00
|
|
|
mana.hud_update(playername)
|
2015-02-02 03:45:57 +01:00
|
|
|
return true, excess
|
|
|
|
else
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-02-08 01:44:23 +01:00
|
|
|
function mana.add(playername, value)
|
|
|
|
local t = mana.playerlist[playername]
|
|
|
|
if(t ~= nil and ((t.mana + value) <= t.maxmana) and value >= 0) then
|
|
|
|
t.mana = t.mana + value
|
|
|
|
mana.hud_update(playername)
|
|
|
|
return true
|
|
|
|
else
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-02-02 04:20:38 +01:00
|
|
|
function mana.subtract(playername, value)
|
2015-02-02 03:45:57 +01:00
|
|
|
local t = mana.playerlist[playername]
|
2015-02-02 04:20:38 +01:00
|
|
|
if(t ~= nil and t.mana >= value and value >= 0) then
|
|
|
|
t.mana = t.mana -value
|
|
|
|
mana.hud_update(playername)
|
2015-02-02 03:45:57 +01:00
|
|
|
return true
|
|
|
|
else
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-02-08 01:44:23 +01:00
|
|
|
function mana.subtract_up_to(playername, value)
|
|
|
|
local t = mana.playerlist[playername]
|
|
|
|
if(t ~= nil and value >= 0) then
|
|
|
|
local missing
|
|
|
|
if((t.mana - value) < 0) then
|
|
|
|
missing = math.abs(t.mana - value)
|
|
|
|
t.mana = 0
|
|
|
|
else
|
|
|
|
missing = 0
|
|
|
|
t.mana = t.mana - value
|
|
|
|
end
|
|
|
|
mana.hud_update(playername)
|
|
|
|
return true, missing
|
|
|
|
else
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-02-02 03:45:57 +01:00
|
|
|
--[===[
|
|
|
|
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)
|
2015-02-02 04:20:38 +01:00
|
|
|
mana.hud_update(playername)
|
2015-02-02 03:45:57 +01:00
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
|
|
minetest.register_on_leaveplayer(function(player)
|
|
|
|
local playername = player:get_player_name()
|
2015-02-02 04:20:38 +01:00
|
|
|
mana.hud_remove(playername)
|
2015-02-02 03:45:57 +01:00
|
|
|
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
|
2015-02-14 00:59:47 +01:00
|
|
|
mana.playerlist[playername].maxmana = mana.settings.default_max
|
2015-02-14 02:16:25 +01:00
|
|
|
mana.playerlist[playername].regen = mana.settings.default_regen
|
2015-02-02 03:45:57 +01:00
|
|
|
end
|
|
|
|
|
2015-02-04 20:43:39 +01:00
|
|
|
if minetest.get_modpath("hudbars") ~= nil then
|
2015-02-10 02:49:01 +01:00
|
|
|
hb.init_hudbar(player, "mana", mana.get(playername), mana.getmax(playername))
|
2015-02-04 20:43:39 +01:00
|
|
|
else
|
|
|
|
mana.hud_add(playername)
|
|
|
|
end
|
2015-02-02 03:45:57 +01:00
|
|
|
end)
|
|
|
|
|
|
|
|
|
2015-02-14 02:16:25 +01:00
|
|
|
--[===[
|
|
|
|
Mana regeneration
|
|
|
|
]===]
|
|
|
|
|
|
|
|
mana.regen_timer = 0
|
|
|
|
|
|
|
|
minetest.register_globalstep(function(dtime)
|
|
|
|
mana.regen_timer = mana.regen_timer + dtime
|
|
|
|
if mana.regen_timer >= mana.settings.regen_timer then
|
2015-02-14 06:04:13 +01:00
|
|
|
local players = minetest.get_connected_players()
|
|
|
|
for i=1, #players do
|
|
|
|
local name = players[i]:get_player_name()
|
|
|
|
if mana.playerlist[name] ~= nil then
|
|
|
|
mana.add_up_to(name, mana.playerlist[name].regen)
|
|
|
|
end
|
2015-02-14 02:16:25 +01:00
|
|
|
end
|
|
|
|
mana.regen_timer = 0
|
|
|
|
end
|
|
|
|
end)
|
2015-02-02 03:45:57 +01:00
|
|
|
|
|
|
|
--[===[
|
2015-02-02 04:20:38 +01:00
|
|
|
HUD functions
|
2015-02-02 03:45:57 +01:00
|
|
|
]===]
|
|
|
|
|
2015-02-04 20:43:39 +01:00
|
|
|
if minetest.get_modpath("hudbars") ~= nil then
|
2015-02-14 00:59:47 +01:00
|
|
|
hb.register_hudbar("mana", 0xFFFFFF, "Mana", { bar = "mana_bar.png", icon = "mana_icon.png" }, 0, mana.settings.default_max, false)
|
2015-02-04 20:43:39 +01:00
|
|
|
|
|
|
|
function mana.hud_update(playername)
|
|
|
|
local player = minetest.get_player_by_name(playername)
|
2015-02-14 02:16:25 +01:00
|
|
|
if player ~= nil then
|
|
|
|
hb.change_hudbar(player, "mana", mana.get(playername), mana.getmax(playername))
|
|
|
|
end
|
2015-02-04 20:43:39 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
else
|
|
|
|
|
2015-02-02 04:20:38 +01:00
|
|
|
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",
|
2015-02-04 20:43:39 +01:00
|
|
|
position = { x = 0.5, y=0.9 },
|
2015-02-02 04:20:38 +01:00
|
|
|
text = mana.manastring(playername),
|
|
|
|
scale = { x = 0, y = 0 },
|
2015-02-04 20:43:39 +01:00
|
|
|
alignment = { x = 1, y = 0},
|
2015-02-02 04:20:38 +01:00
|
|
|
direction = 1,
|
|
|
|
number = 0xFFFFFF,
|
2015-02-04 20:43:39 +01:00
|
|
|
offset = { x = -200, y = 15}
|
2015-02-02 04:20:38 +01:00
|
|
|
})
|
|
|
|
mana.playerlist[playername].hudid = id
|
|
|
|
return id
|
|
|
|
end
|
|
|
|
|
|
|
|
function mana.hud_update(playername)
|
|
|
|
local player = minetest.get_player_by_name(playername)
|
2015-02-04 20:43:39 +01:00
|
|
|
player:hud_change(mana.playerlist[playername].hudid, "number", mana.get(playername))
|
2015-02-02 04:20:38 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
function mana.hud_remove(playername)
|
|
|
|
local player = minetest.get_player_by_name(playername)
|
|
|
|
player:hud_remove(mana.playerlist[playername].hudid)
|
|
|
|
end
|
2015-02-04 20:43:39 +01:00
|
|
|
|
|
|
|
end
|