]> git.lizzy.rs Git - elidragon.git/blob - pvp.lua
Merge pull request #4 from HimbeerserverDE/master
[elidragon.git] / pvp.lua
1 local C = minetest.get_color_escape_sequence
2
3 function elidragon.get_emtpy_highscore_list()
4         local list = {}
5         for i = 1, 10 do
6                 list[i] = {name = "<empty>", score = 0}
7         end
8         return list
9 end
10
11 elidragon.savedata.xp_highscore = elidragon.savedata.xp_highscore or elidragon.get_emtpy_highscore_list()
12
13 function elidragon.check_for_highscore(player)
14         local list = elidragon.savedata.xp_highscore
15         local name = player:get_player_name()
16         local score = elidragon.get_xp(player)
17         local old_rank, new_rank
18         for i, e in pairs(list) do
19                 if e.name == name then
20                         old_rank = i
21                 end
22                 if not new_rank and score >= e.score then
23                         new_rank = i
24                 end
25         end
26         if not new_rank then
27                 return
28         elseif new_rank == old_rank then
29                 list[old_rank].score = score
30                 return
31         elseif old_rank then
32                 table.remove(list, old_rank)
33         else
34                 table.remove(list, 10)
35         end
36         table.insert(list, new_rank, {name = name, score = score})
37         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.")
38 end
39
40 function elidragon.add_xp(player, amount)
41         local xp = elidragon.get_xp(player)
42         player:get_meta():set_int("elidragon:xp", xp + amount)
43         elidragon.check_for_highscore(player)
44 end
45
46 function elidragon.get_xp(player)
47         return player:get_meta():get_int("elidragon:xp")
48 end 
49
50 minetest.register_on_dieplayer(function(player, reason)
51         local object = reason.object
52         if not object then return end
53         local killer
54         if object:is_player() then
55                 killer = object
56         else
57                 local object_name = object:get_luaentity().name
58                 if object_name == "bow:arrow" then
59                         local owner =  minetest.get_player_by_name(object:get_luaentity().owner or "")
60                         if owner and owner:is_player() then
61                                 killer = owner
62                         end
63                 end
64         end
65         if killer and elidragon.get_area_with_tag(killer:get_player_name(), "pvp") then
66                 minetest.chat_send_all(minetest.colorize("#D3FF2A", killer:get_player_name() .. " has killed " .. player:get_player_name() .. " in the PvP area!"))
67                 local earned_xp = math.floor(5 + math.sqrt(elidragon.get_xp(player)))
68                 elidragon.add_xp(killer, earned_xp)
69                 minetest.chat_send_player(killer:get_player_name(), C("#00F5FF") .. "You earned " .. C("#C000AC") .. earned_xp .. C("#00F5FF") .. " XP. Use /xp to view your total score." .. C("#FFFFFF")) 
70         end
71 end)
72
73 minetest.register_on_joinplayer(elidragon.check_for_highscore)
74
75 minetest.register_chatcommand("xp", {
76         desc = "View your's or another player's PvP XP",
77         param = "[<player>]",
78         func = function(name, param)
79                 local target = name
80                 if param and param ~= "" then
81                         target = param
82                 end
83                 local target_ref = minetest.get_player_by_name(target)
84                 if not target_ref then return false, "Player '" .. target .. "' is not online." end
85                 return true, C("#C00D00") .. "Score of " .. target .. ": " .. C("#9AB3FF") .. elidragon.get_xp(target_ref) .. " XP" .. C("#FFFFFF")
86         end
87 })
88
89 minetest.register_chatcommand("rankings", {
90         description = "View the PvP highscore list",
91         func = function(name)
92                 local msg = C("#07E400") .. "PvP Highscore List:"
93                 for i, e in pairs(elidragon.savedata.xp_highscore) do
94                         msg = msg .. "\n" .. C("#F4F73C") .. i .. ". " .. C("#3CF7EF") .. e.name .. C("#5DF73C") .. " (" .. e.score .. " XP)"
95                 end
96                 return true, msg
97         end
98 })