capturetheflag/mods/pvp/anticoward/init.lua

164 lines
4.1 KiB
Lua

-- Capture The Flag mod: anticoward
potential_cowards = {}
local TIMER_UPDATE_INTERVAL = 2
local COMBAT_TIMEOUT_TIME = 20
--
--- Make suicides and combat logs award last puncher with kill
--
minetest.register_on_punchplayer(function(player, hitter,
time_from_last_punch, tool_capabilities, dir, damage)
if player and hitter then
local pname = player:get_player_name()
local hname = hitter:get_player_name()
local to = ctf.player(pname)
local from = ctf.player(hname)
if to.team == from.team and to.team ~= "" and
to.team ~= nil and to.name ~= from.name then
return
end
if ctf_respawn_immunity.is_immune(player) then
return
end
local hp = player:get_hp() - damage
if hp <= 0 then
if potential_cowards[pname] then
player:hud_remove(potential_cowards[pname].hud or 0)
potential_cowards[pname] = nil
end
if potential_cowards[hname] and potential_cowards[hname].puncher == pname then
hitter:hud_remove(potential_cowards[hname].hud or 0)
potential_cowards[hname] = nil
end
return false
end
if not potential_cowards[pname] then
potential_cowards[pname] = {
hud = player:hud_add({
hud_elem_type = "text",
position = {x=1, y=0.3},
name = "combat_hud",
scale = {x = 2, y = 2},
text = "You are in combat. If you leave/suicide your attacker will get the kill",
number = 0xff0000,
direction = 0,
alignment = {x=-1, y=1},
size = {x=1},
z_index = 100,
})
}
end
potential_cowards[pname].timer = 0
potential_cowards[pname].puncher = hname
potential_cowards[pname].toolcaps = tool_capabilities
end
end)
minetest.register_on_dieplayer(function(player, reason)
local pname = player:get_player_name()
if reason.type == "node_damage" or reason.type == "drown" or reason.type == "fall" then
if potential_cowards[pname] then
local hname = potential_cowards[pname].puncher
local last_attacker = minetest.get_player_by_name(hname)
if not last_attacker then
player:hud_remove(potential_cowards[pname].hud or 0)
potential_cowards[pname] = nil
return
end
potential_cowards[pname].toolcaps.damage_groups.suicide = 1
for i = 1, #ctf.registered_on_killedplayer do
ctf.registered_on_killedplayer[i](
pname,
hname,
last_attacker:get_wielded_item(),
potential_cowards[pname].toolcaps
)
end
if potential_cowards[hname] and potential_cowards[hname].puncher == pname then
last_attacker:hud_remove(potential_cowards[hname].hud or 0)
potential_cowards[hname] = nil
end
if potential_cowards[pname] then
player:hud_remove(potential_cowards[pname].hud or 0)
potential_cowards[pname] = nil
end
else
for victim in pairs(potential_cowards) do
if potential_cowards[victim].puncher == pname then
local victimobj = minetest.get_player_by_name(victim)
if victimobj then
victimobj:hud_remove(potential_cowards[victim].hud or 0)
end
potential_cowards[victim] = nil
break
end
end
end
end
end)
minetest.register_on_leaveplayer(function(player, timeout)
if timeout == true then return end
local pname = player:get_player_name()
if potential_cowards[pname] then
local last_attacker = minetest.get_player_by_name(potential_cowards[pname].puncher)
if not last_attacker then return end
potential_cowards[pname].toolcaps.damage_groups.combat_log = 1
for i = 1, #ctf.registered_on_killedplayer do
ctf.registered_on_killedplayer[i](
pname,
potential_cowards[pname].puncher,
last_attacker:get_wielded_item(),
potential_cowards[pname].toolcaps
)
end
potential_cowards[pname] = nil
end
end)
local globtimer = 0
minetest.register_globalstep(function(dtime)
globtimer = globtimer + dtime
if globtimer >= TIMER_UPDATE_INTERVAL then
for k in pairs(potential_cowards) do
potential_cowards[k].timer = potential_cowards[k].timer + globtimer
if potential_cowards[k].timer >= COMBAT_TIMEOUT_TIME then
local player = minetest.get_player_by_name(k)
if player then
player:hud_remove(potential_cowards[k].hud or 0)
end
potential_cowards[k] = nil
end
end
globtimer = 0
end
end)