]> git.lizzy.rs Git - elidragon.git/commitdiff
PvP Highscore
authorElias Fleckenstein <eliasfleckenstein@web.de>
Thu, 25 Jun 2020 13:12:01 +0000 (15:12 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Thu, 25 Jun 2020 13:12:01 +0000 (15:12 +0200)
playerlist.lua
pvp.lua
ranks.lua
tags.lua

index 14f978009a7a6f6ae0e9d304af404c72f1de4aa3..75472fe0055fdd6038bc96eb77250fc327f2f191 100644 (file)
@@ -14,7 +14,7 @@ controls.register_on_press(function(player, key)
                                text = n,
                                alignment = {x = 1, y = 1},
                                scale = {x = 100, y = 100},
-                               number = tonumber(elidragon.get_rank(n).color:gsub("#", ""), 16),
+                               number = tonumber(elidragon.get_rank(p).color:gsub("#", ""), 16),
                        })
                        list[#list + 1] = player:hud_add({
                                hud_elem_type = "image",
@@ -29,8 +29,9 @@ controls.register_on_press(function(player, key)
                elidragon.playerlist[name] = list
        end
 end)
+
 controls.register_on_release(function(player, key)
-       if key == "sneak" then
+       if key == "sneak" and player then
                for _, id in pairs(elidragon.playerlist[player:get_player_name()]) do
                        player:hud_remove(id)
                end
diff --git a/pvp.lua b/pvp.lua
index 759271b54cc0e2cd17bc8a0066f1d4697067450e..8d28d7d719352b40e81c0e53ad01e718157529c8 100644 (file)
--- a/pvp.lua
+++ b/pvp.lua
@@ -1,8 +1,46 @@
 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)
@@ -21,16 +59,29 @@ minetest.register_on_dieplayer(function(player, reason)
        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
+})
index 22147181f197c7b348963e3797a7f8c560ef0774..ea9fdb801251574f14000452b78c68cd521891d7 100755 (executable)
--- a/ranks.lua
+++ b/ranks.lua
@@ -54,8 +54,9 @@ 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)
@@ -66,8 +67,8 @@ 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)
@@ -75,37 +76,47 @@ function elidragon.get_player_name(name, color, brackets)
        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 ""
@@ -113,9 +124,11 @@ minetest.register_chatcommand("rank", {
                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
@@ -127,9 +140,7 @@ minetest.register_chatcommand("rank", {
                        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,
 })
index 19db90d8ba5ef23aa704b0fed9e26edd8503faae..c4cc269dcab90ab9291dbf13a2df2fd8a83a14d8 100755 (executable)
--- a/tags.lua
+++ b/tags.lua
@@ -65,7 +65,7 @@ minetest.register_chatcommand("print_tags", {
 function elidragon.limit_tick()
     for _, player in pairs(minetest.get_connected_players()) do
                local name = player:get_player_name()
-               local rank = elidragon.get_rank(name).name
+               local rank = elidragon.get_rank(player).name
                local privs = minetest.get_player_privs(name)
                local has_fly = rank ~= "player"
         if rank ~= "admin" then