capturetheflag/mods/ctf/ctf_events/init.lua
2021-09-03 16:20:18 -07:00

157 lines
3.7 KiB
Lua

local hud = hudkit()
minetest.register_on_leaveplayer(function(player)
hud.players[player:get_player_name()] = nil
end)
local NUM_EVT = 6
ctf_events = {
events = {}
}
function ctf_events.post(action, one, one_color, two, two_color)
table.insert(ctf_events.events, 1, {
action = action,
one = one,
one_color = one_color,
two = two,
two_color = two_color
})
while #ctf_events.events > NUM_EVT do
table.remove(ctf_events.events, #ctf_events.events)
end
end
function ctf_events.update_row(i, player, name, tplayer, evt)
local idx = "ctf_events:" .. i .. "_one"
local idxa = "ctf_events:" .. i .. "_action"
local idx2 = "ctf_events:" .. i .. "_two"
if not evt then
hud:remove(player, idx)
hud:remove(player, idxa)
hud:remove(player, idx2)
return
end
local y_pos = i * 20
-- One
if evt.one then
if hud:exists(player, idx) then
hud:change(player, idx, "text", evt.one)
hud:change(player, idx, "number", evt.one_color.hex)
else
local tmp = {
hud_elem_type = "text",
position = {x = 0, y = 0.8},
scale = {x = 200, y = 100},
text = evt.one,
number = evt.one_color.hex,
offset = {x = 145, y = -y_pos},
alignment = {x = -1, y = 0}
}
hud:add(player, idx, tmp)
end
else
hud:remove(player, idx)
end
-- Two
if evt.two then
if hud:exists(player, idx2) then
hud:change(player, idx2, "text", evt.two)
hud:change(player, idx2, "number", evt.two_color.hex)
else
local tmp = {
hud_elem_type = "text",
position = {x = 0, y = 0.8},
scale = {x = 200, y = 100},
text = evt.two,
number = evt.two_color.hex,
offset = {x = 175, y = -y_pos},
alignment = {x = 1, y = 0}
}
hud:add(player, idx2, tmp)
end
else
hud:remove(player, idx2)
end
-- Action
if evt.action then
if hud:exists(player, idxa) then
hud:change(player, idxa, "text", "ctf_events_" .. evt.action .. ".png")
else
local tmp = {
hud_elem_type = "image",
position = {x = 0, y = 0.8},
scale = {x = 1, y = 1},
text = "ctf_events_" .. evt.action .. ".png",
offset = {x = 160, y = -y_pos},
alignment = {x = 0, y = 0}
}
hud:add(player, idxa, tmp)
end
else
hud:remove(player, idxa)
end
end
function ctf_events.update(player)
local name = player:get_player_name()
local tplayer = ctf.player_or_nil(name)
if tplayer then
for i=1, NUM_EVT do
local evt = nil
if #ctf_events.events >= i then
evt = ctf_events.events[i]
end
ctf_events.update_row(i, player, name, tplayer, evt)
end
end
end
function ctf_events.update_all()
for _, player in pairs(minetest.get_connected_players()) do
ctf_events.update(player)
end
end
ctf.register_on_killedplayer(function(victim, killer, stack, tool_caps)
local victim_color = ctf_colors.get_color(ctf.player(victim))
local killer_color = ctf_colors.get_color(ctf.player(killer))
local type = "sword" -- Also used for unknown attacks
if tool_caps.damage_groups.grenade then
type = "grenade"
elseif tool_caps.damage_groups.rocket then
type = "rocket"
elseif tool_caps.damage_groups.ranged then
type = "bullet"
elseif tool_caps.damage_groups.sniper then
type = "sniper"
end
if tool_caps.damage_groups.combat_log then
victim = victim .. " (Combat Log)"
elseif tool_caps.damage_groups.suicide then
victim = victim .. " (Suicide?)"
end
ctf_events.post("kill_" .. type, killer, killer_color, victim, victim_color)
ctf_events.update_all()
end)
minetest.register_on_joinplayer(function(player)
ctf_events.update(player)
end)
ctf_match.register_on_new_match(function()
ctf_events.events = {}
ctf_events.update_all()
end)