elidragon = {}
-local modules = {"functions", "nodes", "commands", "ranks", "tags", "warps", "misc", "birthday", "skyblock", "playerlist", "quests"}
+local modules = {"functions", "nodes", "commands", "ranks", "tags", "warps", "misc", "birthday", "skyblock", "playerlist", "quests", "pvp"}
local modpath = minetest.get_modpath("elidragon")
--- /dev/null
+local C = minetest.get_color_escape_sequence
+
+function elidragon.add_xp(player, amount)
+ local xp = elidragon.get_xp(player)
+ player:get_meta():set_int("elidragon:xp", xp + amount)
+end
+
+function elidragon.get_xp(player)
+ return player:get_meta():get_int("elidragon:xp")
+end
+
+minetest.register_on_dieplayer(function(player, reason)
+ if reason.type == "punch" then
+ local killer = reason.object
+ if killer and killer:is_player() and elidragon.get_area_with_tag(killer:get_player_name(), "pvp") then
+ minetest.chat_send_all(minetest.colorize("#D3FF2A", killer:get_player_name() .. " has killed " .. player:get_player_name() .. " in the PvP area!"))
+ local earned_xp = math.floor(5 + math.sqrt(elidragon.get_xp(player)))
+ elidragon.add_xp(killer, earned_xp)
+ 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"))
+ end
+ end
+end)
+
+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
+ target = param
+ end
+ local target_ref = minetest.get_player_by_name(name)
+ 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
+})
return true
end
end)
-minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
- if elidragon.get_area_with_tag(player:get_player_name(), "pvp") then
- if player:get_hp() - damage < 0 and player:get_hp() <= 0 then
- minetest.chat_send_all(minetest.colorize("#D3FF2A", hitter:get_player_name() .. " has killed " .. player:get_player_name() .. " in the PvP area!"))
- end
- end
-end)
minetest.register_on_player_hpchange(function(player, hp_change)
local name = player:get_player_name()
if elidragon.get_area_with_tag(name, "no_damage") and hp_change < 0 then