xpro/ranking.lua

159 lines
4.0 KiB
Lua

--[[
Mod Xpro para Minetest
Copyright (C) 2018 BrunoMine (https://github.com/BrunoMine)
Recebeste uma cópia da GNU Lesser General
Public License junto com esse software,
se não, veja em <http://www.gnu.org/licenses/>.
Gerenciamento do Ranking
]]
-- Traduções
local S = xpro.S
-- Pegar ranking
xpro.get_rank = function()
return xpro.bd.pegar("ranking", "pontos")
end
-- Tabela de acesso rapido ao ranking global
xpro.ranking = {}
-- Atualizar ranking
xpro.update_rank = function(name)
local att_name = {}
local rank = xpro.get_rank()
local pontos = 0
if xpro.bd.verif("player:"..name, "xp") == true then pontos = xpro.bd.pegar("player:"..name, "xp") end
local m1 = {name=name,pontos=pontos}
local m2 = {}
for x=1, 10 do
-- Se o objeto atual for o novo colocado
if m1.name == name then
-- Verifica se fica no lugar
if rank[tostring(x)].pontos < m1.pontos then
--Substitui posicao
m2.name = rank[tostring(x)].name
m2.pontos = rank[tostring(x)].pontos
rank[tostring(x)].name = m1.name
rank[tostring(x)].pontos = m1.pontos
-- Verifica se o que foi tirado é ele mesmo
if name == m2.name then
break
end
-- m2 para a ser m1 para a proxima comparacao
m1.name = m2.name
m1.pontos = m2.pontos
-- Nao é maior mas é o mesmo jogador
elseif m1.name == rank[tostring(x)].name then
-- atualiza os pontos e encerra
rank[tostring(x)].pontos = m1.pontos
break
end
-- Se o objeto atual for um recolocado
else
-- Marca para reclassificalos posteriormente
table.insert(att_name, tostring(m1.name))
-- Se for o objeto novo que ja foi colocado
if rank[tostring(x)].name == name then
rank[tostring(x)].name = m1.name
rank[tostring(x)].pontos = m1.pontos
break
-- Se nao for compara normalmente
else
if rank[tostring(x)].pontos < m1.pontos then
-- Substitui posicao
m2.name = rank[tostring(x)].name
m2.pontos = rank[tostring(x)].pontos
rank[tostring(x)].name = m1.name
rank[tostring(x)].pontos = m1.pontos
-- m2 para a ser m1 para a proxima comparacao
m1.name = m2.name
m1.pontos = m2.pontos
end
end
end
end
xpro.bd.salvar("ranking", "pontos", rank)
xpro.ranking = minetest.deserialize(minetest.serialize(rank))
-- Recoloca os necessarios
for _, n in ipairs(att_name) do
xpro.update_rank(n)
break
end
end
-- Certifica de que rank existe
if xpro.bd.verif("ranking", "pontos") == false then
rank = {
["1"] = {name="-1-",pontos=0},
["2"] = {name="-2-",pontos=0},
["3"] = {name="-3-",pontos=0},
["4"] = {name="-4-",pontos=0},
["5"] = {name="-5-",pontos=0},
["6"] = {name="-6-",pontos=0},
["7"] = {name="-7-",pontos=0},
["8"] = {name="-8-",pontos=0},
["9"] = {name="-9-",pontos=0},
["10"] = {name="-10-",pontos=0},
}
xpro.bd.salvar("ranking", "pontos", rank)
end
-- Formspec do ranking
xpro.ranking_formspec = ""
local update_formspec = function()
xpro.ranking_formspec = "size[7,7]"
..default.gui_bg
..default.gui_bg_img
.."button_exit[5,-0.2;2,1;close;"..S("Fechar").."]"
.."label[0.6,0.4;"..S("Pontos").."]"
.."label[2.4,0.4;"..S("Jogador").."]"
-- Monta Ranking
local rank = xpro.get_rank()
for x=1, 10 do
local w = (0.4+(0.5*x))+(0.1*x)
local liga = nil
if xpro.bd.verif("player:"..rank[tostring(x)].name, "lvl") == true then liga = xpro.ligas[xpro.bd.pegar("player:"..rank[tostring(x)].name, "lvl")] end
if liga ~= nil then
liga = "image[1.75,"..(w*0.995-0.05)..";0.66,0.66;"..liga.img.."]"
else
liga = ""
end
xpro.ranking_formspec = xpro.ranking_formspec .."label[0.6,"..w..";"..rank[tostring(x)].pontos.."]"
.."image[1.75,"..(w*0.995-0.05)..";0.66,0.66;xpro_liga_bg.png]"
..liga
.."label[2.4,"..w..";"..rank[tostring(x)].name.."]"
end
end
update_formspec()
xpro.register_on_add_xp(function(name, xp_added)
--if xpro.ranking
xpro.update_rank(name)
update_formspec()
end)
xpro.register_on_rem_xp(function(name, xp_removed)
xpro.update_rank(name)
update_formspec()
end)