local C = minetest.get_color_escape_sequence
+function elidragon.get_emtpy_highscore_list()
+ local list = {}
+ for i = 1, 10 do
+ list[i] = {name = "<empty>", score = 0}
+ end
+ return list
+end
+
+elidragon.savedata.xp_highscore = elidragon.savedata.xp_highscore or elidragon.get_emtpy_highscore_list()
+
+function elidragon.check_for_highscore(player)
+ local list = elidragon.savedata.xp_highscore
+ local name = player:get_player_name()
+ local score = elidragon.get_xp(player)
+ local old_rank, new_rank
+ for i, e in pairs(list) do
+ if e.name == name then
+ old_rank = i
+ end
+ if not new_rank and score >= e.score then
+ new_rank = i
+ end
+ end
+ if not new_rank then
+ return
+ elseif new_rank == old_rank then
+ list[old_rank].score = score
+ return
+ elseif old_rank then
+ table.remove(list, old_rank)
+ else
+ table.remove(list, 10)
+ end
+ table.insert(list, new_rank, {name = name, score = score})
+ minetest.chat_send_all(C("#ACF317") .. name .. C("#0064E4") .. " is now rank " .. C("#E4E400") .. new_rank .. C("#0064E4") .. " on the PvP highscore list with " .. C("#E4E400") .. score .. C("#0064E4") .. " XP.")
+end
+
function elidragon.add_xp(player, amount)
local xp = elidragon.get_xp(player)
player:get_meta():set_int("elidragon:xp", xp + amount)
+ elidragon.check_for_highscore(player)
end
function elidragon.get_xp(player)
end
end)
+minetest.register_on_joinplayer(elidragon.check_for_highscore)
+
minetest.register_chatcommand("xp", {
desc = "View your's or another player's PvP XP",
param = "[<player>]",
func = function(name, param)
local target = name
- if param ~= "" then
+ if param and param ~= "" then
target = param
end
- local target_ref = minetest.get_player_by_name(name)
+ local target_ref = minetest.get_player_by_name(target)
if not target_ref then return false, "Player '" .. target .. "' is not online." end
return true, C("#C00D00") .. "Score of " .. target .. ": " .. C("#9AB3FF") .. elidragon.get_xp(target_ref) .. " XP" .. C("#FFFFFF")
end
})
+
+minetest.register_chatcommand("rankings", {
+ description = "View the PvP highscore list",
+ func = function(name)
+ local msg = C("#07E400") .. "PvP Highscore List:"
+ for i, e in pairs(elidragon.savedata.xp_highscore) do
+ msg = msg .. "\n" .. C("#F4F73C") .. i .. ". " .. C("#3CF7EF") .. e.name .. C("#5DF73C") .. " (" .. e.score .. " XP)"
+ end
+ return true, msg
+ end
+})
elidragon.savedata.ranks = elidragon.savedata.ranks or elidragon.load_legacy_ranks() or {}
-function elidragon.get_rank(name)
- return elidragon.get_rank_by_name(elidragon.savedata.ranks[name] or "player")
+function elidragon.get_rank(player)
+ local rank = player:get_meta():get("elidragon:rank") or "player"
+ return elidragon.get_rank_by_name(rank)
end
function elidragon.get_rank_by_name(rankname)
end
end
-function elidragon.get_player_name(name, color, brackets)
- local rank = elidragon.get_rank(name)
+function elidragon.get_player_name(player, color, brackets)
+ local rank = elidragon.get_rank(player)
local rank_tag = rank.tag
if color then
rank_tag = minetest.colorize(rank.color, rank_tag)
if not brackets then
brackets = {"",""}
end
- return rank_tag .. brackets[1] .. name .. brackets[2] .. " "
+ return rank_tag .. brackets[1] .. player:get_player_name() .. brackets[2] .. " "
+end
+
+function elidragon.update_nametag(player)
+ player:set_nametag_attributes({color = elidragon.get_rank(player).color})
end
minetest.register_on_joinplayer(function(player)
local name = player:get_player_name()
- minetest.chat_send_all(elidragon.get_player_name(name, true) .. "has joined the Server.")
+ local rank = elidragon.savedata.ranks[name]
+ if rank then
+ player:get_meta():set_string("elidragon:rank", rank)
+ elidragon.savedata.ranks[name] = nil
+ end
+ minetest.chat_send_all(elidragon.get_player_name(player, true) .. "has joined the Server.")
if irc and irc.connected and irc.config.send_join_part then
- irc.say(elidragon.get_player_name(name) .. "has joined the Server.")
+ irc.say(elidragon.get_player_name(player) .. "has joined the Server.")
end
- player:set_nametag_attributes({color = elidragon.get_rank(name).color})
+ elidragon.update_nametag(player)
end)
minetest.register_on_leaveplayer(function(player)
- local name = player:get_player_name()
- minetest.chat_send_all(elidragon.get_player_name(name, true) .. "has left the Server.")
+ minetest.chat_send_all(elidragon.get_player_name(player, true) .. "has left the Server.")
if irc and irc.connected and irc.config.send_join_part then
- irc.say(elidragon.get_player_name(name) .. "has left the Server.")
+ irc.say(elidragon.get_player_name(player) .. "has left the Server.")
end
end)
minetest.register_on_chat_message(function(name, message)
- minetest.chat_send_all(elidragon.get_player_name(name, true, {"<", ">"}) .. message)
+ local player = minetest.get_player_by_name(name)
+ if not player then return end
+ minetest.chat_send_all(elidragon.get_player_name(player, true, {"<", ">"}) .. message)
if irc and irc.connected and irc.joined_players[name] then
- irc.say(elidragon.get_player_name(name, false, {"<", ">"}) .. message)
+ irc.say(elidragon.get_player_name(player, false, {"<", ">"}) .. message)
end
return true
end)
minetest.register_chatcommand("rank", {
params = "<player> <rank>",
- description = "Set a player's rank (admin|moderator|helper|builder|vip|player)",
+ description = "Set a player's rank (admin|developer|moderator|helper|builder|vip|player)",
privs = {privs = true},
func = function(name, param)
local target = param:split(" ")[1] or ""
local target_ref = minetest.get_player_by_name(target)
local rank_ref = elidragon.get_rank_by_name(rank)
if not rank_ref then
- minetest.chat_send_player(name, "Invalid Rank: " .. rank)
+ return false, "Invalid Rank: " .. rank
+ elseif not target_ref then
+ return false, "Player not online"
else
- elidragon.savedata.ranks[target] = rank
+ target_ref:get_meta():set_string("elidragon:rank", rank)
local privs = {}
for _, r in pairs(elidragon.ranks) do
for k, v in pairs(r.privs) do
end
minetest.set_player_privs(target, privs)
minetest.chat_send_all(target .. " is now a " .. minetest.colorize(rank_ref.color, rank_ref.name))
- if target_ref then
- target_ref:set_nametag_attributes({color = rank_ref.color})
- end
+ elidragon.update_nametag(target_ref)
end
end,
})