magic/mana.lua

80 lines
2.6 KiB
Lua

magic.manadb = {}
local huds = {}
local timer = 0
kingdoms.at_mod_load("kingdoms", function()
kingdoms.db.magic = kingdoms.db.magic or {}
kingdoms.db.magic.mana = kingdoms.db.magic.mana or {}
magic.manadb = kingdoms.db.magic.mana
end)
minetest.register_globalstep(function(dtime)
timer = timer + dtime
if timer < 0.1 then return end
timer = 0
for _, player in pairs(minetest.get_connected_players()) do
local name = player:get_player_name()
local p = magic.manadb[name]
p.mana = math.min(p.max_mana, p.mana + (dtime / magic.config.mana_regen) * (player:get_hp() >= magic.config.mana_fast_regen_threshold and magic.config.mana_fast_regen or 1 ))
local hud = huds[name]
if not hud then
hud = {}
huds[name] = hud
hud.id = player:hud_add({
name = "mana",
hud_elem_type = "statbar",
position = {x = 0.5, y = 1},
size = {x = 24, y = 24},
text = "magic_essence.png^[colorize:#00A:200",
number = p.mana,
alignment = {x = -1, y = -1},
offset = {x = -266, y = -110 - 24},
max = 0,
})
hud.oldvalue = p.mana
return
elseif hud.oldvalue ~= p.mana then
player:hud_change(hud.id, "number", p.mana)
hud.oldvalue = p.mana
end
end
end)
function magic.require_mana(player, cost, message)
local p = magic.manadb[player:get_player_name()]
if not p then return false end
if p.mana < cost then
if message then minetest.chat_send_player(player:get_player_name(), "You do not have enough mana.") end
return false
end
p.mana = math.max(0, p.mana - cost)
return true
end
function magic.require_energy(player, cost, message)
local p = magic.manadb[player:get_player_name()]
if not p then return false end
if magic.require_mana(player, cost) then
return true
end
local newcost = cost - p.mana
p.mana = 0
if player:get_hp() <= newcost then
if message then minetest.chat_send_player(player:get_player_name(), "You do not have enough health.") end
return false
end
player:set_hp(player:get_hp() - newcost)
return true
end
minetest.register_on_joinplayer(function(player)
magic.manadb[player:get_player_name()] = magic.manadb[player:get_player_name()] or {
mana = magic.config.max_mana,
}
magic.manadb[player:get_player_name()].max_mana = magic.config.max_mana
end)
minetest.register_on_leaveplayer(function(player)
huds[player:get_player_name()] = nil
end)