101 lines
2.9 KiB
Lua
101 lines
2.9 KiB
Lua
local tournament = pvpplus.tournament -- Shortcut table
|
|
tournament.hud = {}
|
|
tournament.hud_list = {}
|
|
|
|
-- These values cannot be exact for all clients. Default values should be fine for most of them.
|
|
local margin = tonumber(minetest.settings:get("pvpplus.tournament_hud_margin")) or 10 -- pixels
|
|
local font_width = tonumber(minetest.settings:get("pvpplus.font_width")) or 5 -- pixels
|
|
local separation = tonumber(minetest.settings:get("pvpplus.tournament_hud_separation")) or 18 -- pixels
|
|
|
|
function pvpplus.tournament_hud_update_list()
|
|
tournament.hud_list = {}
|
|
|
|
for name, _ in pairs(tournament.sent_damages) do
|
|
if pvpplus.get_score(name) then
|
|
table.insert(tournament.hud_list, {
|
|
name = name,
|
|
score = pvpplus.get_score(name),
|
|
status = pvpplus.is_playing_tournament(name)
|
|
})
|
|
end
|
|
end
|
|
|
|
table.sort(tournament.hud_list, function(a, b) return a.score > b.score end)
|
|
end
|
|
|
|
local function format_element(i, element, len)
|
|
if not len then
|
|
return tostring(i) .. " " .. element.name .. " " .. tostring(element.score)
|
|
else
|
|
local str = tostring(i) .. " " .. element.name .. " "
|
|
local score = tostring(element.score)
|
|
local score_len = #score
|
|
while #str + score_len < len do
|
|
str = str .. " "
|
|
end
|
|
str = str .. score
|
|
return str
|
|
end
|
|
end
|
|
|
|
function pvpplus.tournament_hud_update(player, update_list)
|
|
if update_list ~= false then
|
|
pvpplus.tournament_hud_update_list()
|
|
end
|
|
|
|
local name = player:get_player_name()
|
|
if not tournament.hud[name] then
|
|
tournament.hud[name] = {}
|
|
end
|
|
|
|
-- Compute x offset
|
|
local max_length = 0
|
|
for i, element in ipairs(tournament.hud_list) do
|
|
local len = string.len(format_element(i, element))
|
|
if len > max_length then
|
|
max_length = len
|
|
end
|
|
end
|
|
if max_length == 0 then
|
|
return
|
|
end
|
|
local x_offset = -(max_length * font_width + margin)
|
|
|
|
-- Remove the old HUD
|
|
pvpplus.tournament_hud_clear(player)
|
|
-- Add the new HUD
|
|
for i, element in ipairs(tournament.hud_list) do
|
|
tournament.hud[name][i] = player:hud_add({
|
|
name = "Tournament HUD section " .. tostring(i),
|
|
hud_elem_type = "text",
|
|
aligment = {x = 1, y = 0},
|
|
position = {x = 1, y = 0.2},
|
|
-- Colors: self is red, playing players are green, no-longer playing players are blue.
|
|
number = (element.name == name and 0xFF0000) or ((element.status and 0x00FF00) or 0x0000FF),
|
|
text = format_element(i, element, max_length),
|
|
offset = {x = x_offset, y = (i-1)*separation}
|
|
})
|
|
end
|
|
end
|
|
|
|
function pvpplus.tournament_hud_update_all()
|
|
pvpplus.tournament_hud_update_list()
|
|
for name, _ in pairs(tournament.sent_damages) do
|
|
local player = minetest.get_player_by_name(name)
|
|
if player then
|
|
pvpplus.tournament_hud_update(player, false)
|
|
end
|
|
end
|
|
end
|
|
|
|
function pvpplus.tournament_hud_clear(player)
|
|
local name = player:get_player_name()
|
|
if not tournament.hud[name] then -- Happens on first update
|
|
return
|
|
end
|
|
|
|
for _, id in ipairs(tournament.hud[name]) do
|
|
player:hud_remove(id)
|
|
end
|
|
end
|