function ctf_stats.get_formspec_match_summary(stats)
local players = {}
for name, pstat in pairs(stats.red) do
pstat.name = name
pstat.color = ctf.flag_colors.red
table.insert(players, pstat)
end
for name, pstat in pairs(stats.blue) do
pstat.name = name
pstat.color = ctf.flag_colors.blue
table.insert(players, pstat)
end
local ret = ctf_stats.get_formspec("Match Summary", players)
ret = ret .. "label[3.5,6.2;Tip: type /rankings for league tables]"
return ret
end
function ctf_stats.get_formspec(title, players)
table.sort(players, function(one, two)
return one.score > two.score
end)
local ret = "size[12,6.5]"
ret = ret .. "vertlabel[0,0;" .. title .. "]"
ret = ret .. "tablecolumns[color;text;text;text;text;text;text;text;text]"
ret = ret .. "tableoptions[highlight=#00000000]"
ret = ret .. "table[0.5,0;11.25,6;scores;"
ret = ret .. "#ffffff,,username,kills,deaths,K/D ratio,captures,attempts,score"
for i = 1, #players do
local pstat = players[i]
local color = pstat.color or "#ffffff"
local kd = pstat.kills
if pstat.deaths > 0 then
kd = kd / pstat.deaths
end
ret = ret ..
"," .. string.gsub(color, "0x", "#") ..
"," .. i ..
"," .. pstat.name ..
"," .. pstat.kills ..
"," .. pstat.deaths ..
"," .. math.floor(kd*10)/10 ..
"," .. pstat.captures ..
"," .. pstat.attempts ..
"," .. math.floor(pstat.score*10)/10
if i > 40 then
break
end
end
ret = ret .. ";-1]"
ret = ret .. "button_exit[0.5,6;3,1;close;Close]"
return ret
end
function ctf_stats.get_html(title, players)
table.sort(players, function(one, two)
return one.score > two.score
end)
local ret = "
" .. title .. "
"
ret = ret .. "
" ..
"
" ..
"
username
" ..
"
kills
" ..
"
deaths
" ..
"
K/D ratio
" ..
"
captures
" ..
"
attempts
" ..
"
score
"
for i = 1, #players do
local pstat = players[i]
local color = pstat.color or "#ffffff"
local kd = pstat.kills
if pstat.deaths > 0 then
kd = kd / pstat.deaths
end
ret = ret ..
"
" .. i ..
"
" .. pstat.name ..
"
" .. pstat.kills ..
"
" .. pstat.deaths ..
"
" .. math.floor(kd*10)/10 ..
"
" .. pstat.captures ..
"
" .. pstat.attempts ..
"
" .. math.floor(pstat.score*10)/10 .. "
"
if i > 40 then
break
end
end
ret = ret .. "
\n"
return ret
end
function ctf_stats.html_to_file(filepath)
local players = {}
for name, pstat in pairs(ctf_stats.players) do
pstat.name = name
pstat.color = nil
table.insert(players, pstat)
end
local html = ctf_stats.get_html("Player Rankings", players)
local f = io.open(filepath, "w")
f:write("\n")
f:write("\n")
f:write("\n")
f:write("Player Rankings\n")
f:write("\n")
f:write("\n")
f:write(html)
f:write("\n")
f:close()
end
local function send_as_chat_message(to, name)
local players = {}
for pname, pstat in pairs(ctf_stats.players) do
pstat.name = pname
pstat.color = nil
table.insert(players, pstat)
end
table.sort(players, function(one, two)
return one.score > two.score
end)
local place = -1
local me = nil
for i = 1, #players do
local pstat = players[i]
if pstat.name == name then
me = pstat
place = i
break
end
end
if place < 1 then
place = #players + 1
end
local you_are_in = (to == name) and "You are in " or "They are in "
minetest.chat_send_player(to, you_are_in .. place .. " place.")
if me then
local kd = me.kills
if me.deaths > 0 then
kd = kd / me.deaths
end
minetest.chat_send_player(to,
"Kills: " .. me.kills ..
" | Deaths: " .. me.deaths ..
" | K/D: " .. math.floor(kd*10)/10 ..
" | Captures: " .. me.captures ..
" | Attempts: " .. me.attempts ..
" | Score: " .. me.score)
end
end
minetest.register_chatcommand("rankings", {
func = function(name, param)
if param == "me" then
send_as_chat_message(name, name)
elseif param ~= "" then
if ctf_stats.players[param:trim()] then
send_as_chat_message(name, param:trim())
else
return false, "Can't find player '" .. param:trim() .. "'"
end
else
local players = {}
for pname, pstat in pairs(ctf_stats.players) do
pstat.name = pname
pstat.color = nil
table.insert(players, pstat)
end
local fs = ctf_stats.get_formspec("Player Rankings", players)
fs = fs .. "label[3.5,6.2;Tip: to see where you are, type /rankings me]"
minetest.show_formspec(name, "ctf_stats:rankings", fs)
end
end
})