From 49f4e6fd470b121af32092f7a19ef6190abf39e0 Mon Sep 17 00:00:00 2001 From: Anthony-De <48418309+Anthony-De@users.noreply.github.com> Date: Mon, 1 Feb 2021 11:24:29 -0500 Subject: [PATCH] Add kill assists (#755) * Update teams.lua * Update teams.lua and init.lua * Update teams.lua and init.lua * Update teams.lua and init.lua * Update teams.lua and init.lua Kill assist implemented * Update init.lua Remove unused variables * Added ctf.clearAssists function Only awards those who did more that 50% of damage Clears attackers stats after suicide * Remove unused variable * Minor modifications renamed ctf.clearAssists to ctf.clear_assists changed playerName to player * Cap assist points * Reaching full health while in combat clears assist data * split points between assisting players by damage done * Reworked assist data storage to work with a table rather than player metadata * Fix lua check * Removed duplicate scoring * Change kill assist color * Health regen subtracts from assist. Suicide gives assist points * Fixed accessing nil value for max_hp * Corrected max_hp * hardcode hp list for max hp --- mods/ctf/ctf/teams.lua | 82 ++++++++++++++++++++++++++++++++++ mods/ctf/ctf_bandages/init.lua | 4 +- mods/ctf/ctf_stats/init.lua | 25 ++--------- mods/pvp/anticoward/init.lua | 1 + mods/pvp/hpregen/init.lua | 2 + mods/pvp/medkits/init.lua | 1 + 6 files changed, 92 insertions(+), 23 deletions(-) diff --git a/mods/ctf/ctf/teams.lua b/mods/ctf/ctf/teams.lua index b13d7ea..426c98a 100644 --- a/mods/ctf/ctf/teams.lua +++ b/mods/ctf/ctf/teams.lua @@ -437,6 +437,86 @@ minetest.register_on_joinplayer(function(player) end end) +local kill_assists = {} +function ctf.clear_assists(victim) + if kill_assists[victim] and kill_assists[victim]["is_empty"] then + return + end + kill_assists[victim] = {} + kill_assists[victim]["is_empty"] = true + kill_assists[victim]["players"] = {} +end + +function ctf.add_assist(victim, attacker, damage)-- player names + kill_assists[victim]["players"][attacker] = (kill_assists[victim]["players"][attacker] or 0) + damage + kill_assists[victim]["is_empty"] = false +end + +function ctf.add_heal_assist(victim, healed_hp) + if kill_assists[victim] and kill_assists[victim]["is_empty"] then + return + end + if not kill_assists[victim] then + ctf.clear_assists(victim) + end + for name, damage in pairs(kill_assists[victim]["players"]) do + kill_assists[victim]["players"][name] = math.max(damage - healed_hp, 0) + end +end + +function ctf.reward_assists(victim, killer, reward, is_suicide) + local hitLength = 0 + for a,b in pairs(kill_assists[victim]["players"]) do + hitLength = hitLength + 1 + end + + if hitLength > 0 then + for name, damage in pairs(kill_assists[victim]["players"]) do + local playerExists = minetest.get_player_by_name(name) + if playerExists and name ~= victim then + local hpClass = { + knight = 30, + shooter = 16, + medic = 20 + } + local victimClass = minetest.get_player_by_name(victim):get_meta():to_table().fields["ctf_classes:class"] + local playerHP_max = (hpClass[victimClass] or hpClass.shooter)-8 + local standard = 0 + local percentofhelp = damage / playerHP_max + if name ~= killer then + standard = 0.5 + percentofhelp = math.min(percentofhelp, 0.75) + else + percentofhelp = math.min(percentofhelp, 1) + end + if percentofhelp >= standard then + local main, match = ctf_stats.player(name) + local newReward = math.floor((reward * percentofhelp)*100)/100 + match.score = match.score + newReward + main.score = main.score + newReward + if newReward < 1 then + newReward = 1 + end + local colour = "0x00FFFF" + if name == killer then + colour = "0x00FF00" + main.kills = main.kills + 1 + match.kills = match.kills + 1 + match.kills_since_death = match.kills_since_death + 1 + end + local _ = hud_score.new(name, { + name = "ctf_stats:kill_score", + color = colour, + value = newReward + }) + end + end + end + end + ctf_stats.request_save() + ctf.clear_assists(victim) +end + -- Disable friendly fire. ctf.registered_on_killedplayer = {} function ctf.register_on_killedplayer(func) @@ -473,6 +553,8 @@ minetest.register_on_punchplayer(function(player, hitter, end end + ctf.add_assist(pname, hname, damage) + local hp = player:get_hp() if hp == 0 then return false diff --git a/mods/ctf/ctf_bandages/init.lua b/mods/ctf/ctf_bandages/init.lua index a6a4bec..aca70b1 100644 --- a/mods/ctf/ctf_bandages/init.lua +++ b/mods/ctf/ctf_bandages/init.lua @@ -24,7 +24,9 @@ minetest.register_craftitem("ctf_bandages:bandage", { local limit = ctf_bandages.heal_percent * object:get_properties().hp_max if hp > 0 and hp < limit then - hp = hp + math.random(3,4) + local hp_add = math.random(3,4) + ctf.add_heal_assist(pname, hp_add) + hp = hp + hp_add if hp > limit then hp = limit end diff --git a/mods/ctf/ctf_stats/init.lua b/mods/ctf/ctf_stats/init.lua index 19c4a07..d656622 100644 --- a/mods/ctf/ctf_stats/init.lua +++ b/mods/ctf/ctf_stats/init.lua @@ -418,28 +418,9 @@ local function calculateKillReward(victim, killer, toolcaps) end ctf.register_on_killedplayer(function(victim, killer, _, toolcaps) - -- Suicide is not encouraged here at CTF - if victim == killer then - return - end - local main, match = ctf_stats.player(killer) - if main and match then - local reward = calculateKillReward(victim, killer, toolcaps) - main.kills = main.kills + 1 - main.score = main.score + reward - match.kills = match.kills + 1 - match.score = match.score + reward - match.kills_since_death = match.kills_since_death + 1 - _needs_save = true - - reward = math.floor(reward * 100) / 100 - - hud_score.new(killer, { - name = "ctf_stats:kill_score", - color = "0x00FF00", - value = reward - }) - end + local reward = calculateKillReward(victim, killer, toolcaps) + reward = math.floor(reward * 100) / 100 + ctf.reward_assists(victim, killer, reward, (victim == killer)) end) minetest.register_on_dieplayer(function(player) diff --git a/mods/pvp/anticoward/init.lua b/mods/pvp/anticoward/init.lua index 1dc70ec..474a171 100644 --- a/mods/pvp/anticoward/init.lua +++ b/mods/pvp/anticoward/init.lua @@ -153,6 +153,7 @@ minetest.register_globalstep(function(dtime) if player then player:hud_remove(potential_cowards[k].hud or 0) + ctf.clear_assists(k) end potential_cowards[k] = nil diff --git a/mods/pvp/hpregen/init.lua b/mods/pvp/hpregen/init.lua index 3b83e7e..e0d830b 100644 --- a/mods/pvp/hpregen/init.lua +++ b/mods/pvp/hpregen/init.lua @@ -16,8 +16,10 @@ local function regen_all() local newhp = oldhp + hpregen.amount if newhp > player:get_properties().hp_max then newhp = player:get_properties().hp_max + ctf.clear_assists(player:get_player_name()) end if oldhp ~= newhp then + ctf.add_heal_assist(player:get_player_name(), hpregen.amount) player:set_hp(newhp) end end diff --git a/mods/pvp/medkits/init.lua b/mods/pvp/medkits/init.lua index a9f6c11..1db40ca 100644 --- a/mods/pvp/medkits/init.lua +++ b/mods/pvp/medkits/init.lua @@ -117,6 +117,7 @@ minetest.register_globalstep(function(dtime) if pstat then local hp = player:get_hp() if hp < pstat.regen_max then + ctf.add_heal_assist(name, regen_step) player:set_hp(math.min(hp + regen_step, pstat.regen_max)) else stop_healing(player)