From 074cf2fd3cd0fe1d1a0079d9e30317ebba18e626 Mon Sep 17 00:00:00 2001 From: Jackz Date: Tue, 15 Mar 2022 10:57:20 -0500 Subject: [PATCH] TKStopper: Minor tweaks --- plugins/l4d2_TKStopper.smx | Bin 14517 -> 14770 bytes scripting/l4d2_TKStopper.sp | 86 +++++++++++++++++++++++------------- 2 files changed, 56 insertions(+), 30 deletions(-) diff --git a/plugins/l4d2_TKStopper.smx b/plugins/l4d2_TKStopper.smx index e42e9f9f67372ff43f9f71b09e4ca8d11dc94794..642e11ad79e98e5fcb64fcfe8a4dd05d4fccc852 100644 GIT binary patch literal 14770 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 literal 14517 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 diff --git a/scripting/l4d2_TKStopper.sp b/scripting/l4d2_TKStopper.sp index 7f33d44..9ffdad7 100644 --- a/scripting/l4d2_TKStopper.sp +++ b/scripting/l4d2_TKStopper.sp @@ -33,6 +33,7 @@ enum struct PlayerData { int idleStartTime; int lastFFTime; int jumpAttempts; + int ffCount; float TKDamageBuffer; float totalDamageFF; @@ -84,7 +85,7 @@ public void OnPluginStart() { AutoExecConfig(true, "l4d2_tkstopper"); HookEvent("finale_vehicle_ready", Event_FinaleVehicleReady); - HookEvent("player_disconnect", Event_PlayerDisconnect); + HookEvent("player_team", Event_PlayerDisconnect); HookEvent("charger_carry_start", Event_ChargerCarry); HookEvent("charger_carry_end", Event_ChargerCarry); @@ -115,6 +116,7 @@ public void OnPluginStart() { } } } + LoadTranslations("common.phrases"); } /////////////////////////////////////////////////////////////////////////////// // Special Infected Events @@ -202,31 +204,39 @@ public void OnClientDisconnect(int client) { pData[client].TKDamageBuffer = 0.0; pData[client].jumpAttempts = 0; pData[client].underAttack = false; + pData[client].ffCount = 0; } // Only clear things when they fully left on their own accord: public void Event_PlayerDisconnect(Event event, const char[] name, bool dontBroadcast) { + if(!event.GetBool("disconnect")) return; + int client = GetClientOfUserId(event.GetInt("userid")); - if(client > 0 && !IsFakeClient(client) && GetClientTeam(client) <= 2) { - if (pData[client].isTroll) { - BanClient(client, hBanTime.IntValue, BANFLAG_AUTO | BANFLAG_AUTHID, "Excessive FF", "Excessive Friendly Fire", "TKStopper"); + if(client > 0 && event.GetInt("team") <= 2) { + if (pData[client].isTroll && !IsFakeClient(client)) { + BanClient(client, hBanTime.IntValue, BANFLAG_AUTO | BANFLAG_AUTHID, "Excessive FF (Auto)", "Excessive Friendly Fire", "TKStopper"); pData[client].isTroll = false; - pData[client].autoRFFScaleFactor = 0.0; - pData[client].totalDamageFF = 0.0; } - float minutesSinceiLastFFTime = (GetTime() - pData[client].lastFFTime) / 60.0; - float activeRate = pData[client].autoRFFScaleFactor - (minutesSinceiLastFFTime * hFFAutoScaleForgivenessAmount.FloatValue); - if(activeRate < 0.0) activeRate = 0.0; - PrintToConsoleAll("[TKStopper] FF Summary for %N:", client); - PrintToConsoleAll("\t\t%.2f TK-FF buffer (%.2f total ff) | %.3f (buf %f) rFF rate | lastff %.1f min ago | %d suicide jumps", - pData[client].TKDamageBuffer, - pData[client].totalDamageFF, - activeRate, - pData[client].autoRFFScaleFactor, - minutesSinceiLastFFTime, - pData[client].jumpAttempts - ); + if(!IsFakeClient(client)) { + float minutesSinceiLastFFTime = GetLastFFMinutes(client); + float activeRate = GetActiveRate(client); + PrintToConsoleAll("[TKStopper] FF Summary for %N:", client); + PrintToConsoleAll("\t\t%.2f TK-FF buffer (%.2f total ff, %d freq.) | %.3f (buf %f) rFF rate | lastff %.1f min ago | %d suicide jumps", + pData[client].TKDamageBuffer, + pData[client].totalDamageFF, + pData[client].ffCount, + activeRate, + pData[client].autoRFFScaleFactor, + minutesSinceiLastFFTime, + pData[client].jumpAttempts + ); + } + + pData[client].autoRFFScaleFactor = 0.0; + pData[client].totalDamageFF = 0.0; + pData[client].ffCount = 0; + pData[client].immunityFlags = 0; } } @@ -288,12 +298,13 @@ public Action Event_OnTakeDamage(int victim, int& attacker, int& inflictor, flo } pData[attacker].TKDamageBuffer += damage; pData[attacker].totalDamageFF += damage; + pData[attacker].ffCount++; // Auto reverse ff logic int prevFFTime = pData[attacker].lastFFTime; pData[attacker].lastFFTime = time; // If not immune to RFF, damage is direct, _or admin shit_ - if(~pData[attacker].immunityFlags & Immune_RFF && isDamageDirect && (!hFFAutoScaleIgnoreAdmins.BoolValue || !isAdmin)) { + if(~pData[attacker].immunityFlags & Immune_RFF && isDamageDirect) { // Decrement any forgiven ratio (computed on demand) float minutesSinceiLastFFTime = (time - pData[attacker].lastFFTime) / 60.0; pData[attacker].autoRFFScaleFactor -= minutesSinceiLastFFTime * hFFAutoScaleForgivenessAmount.FloatValue; @@ -315,7 +326,12 @@ public Action Event_OnTakeDamage(int victim, int& attacker, int& inflictor, flo // Check for excessive friendly fire damage in short timespan // If not immune to TK, if over TK threshold, not when escaping, and direct damage - if(~pData[attacker].immunityFlags & Immune_TK && pData[attacker].TKDamageBuffer > hThreshold.IntValue && !isFinaleEnding && isDamageDirect) { + if(~pData[attacker].immunityFlags & Immune_TK + && pData[attacker].TKDamageBuffer > hThreshold.IntValue + && !isFinaleEnding + && isDamageDirect + && !IsFakeClient(victim) // Don't increment on bot-ff for now + ) { float diffJoinMin = (float(GetTime()) - float(pData[attacker].joinTime)) / 60.0; float lastFFMin = (float(GetTime()) - float(prevFFTime)) / 60.0; LogAction(-1, attacker, "Excessive FF (%.2f HP/%.2f total) (%.2f RFF Rate) (joined %.1fm ago) (%.1fmin last FF)", @@ -332,7 +348,7 @@ public Action Event_OnTakeDamage(int victim, int& attacker, int& inflictor, flo } else if(hTKAction.IntValue == 2) { LogMessage("[TKStopper] Banning %N for excessive FF (%.2f HP) for %d minutes.", attacker, pData[attacker].TKDamageBuffer, hBanTime.IntValue); NotifyAllAdmins("[Notice] Banning %N for excessive FF (%.2f HP) for %d minutes.", attacker, pData[attacker].TKDamageBuffer, hBanTime.IntValue); - BanClient(attacker, hBanTime.IntValue, BANFLAG_AUTO | BANFLAG_AUTHID, "Excessive FF", "Excessive Friendly Fire", "TKStopper"); + BanClient(attacker, hBanTime.IntValue, BANFLAG_AUTO | BANFLAG_AUTHID, "Excessive FF (Auto)", "Excessive Friendly Fire", "TKStopper"); } else if(hTKAction.IntValue == 3) { LogMessage("[TKStopper] %N will be banned for FF on disconnect (%.2f HP) for %d minutes. ", attacker, pData[attacker].TKDamageBuffer, hBanTime.IntValue); NotifyAllAdmins("[Notice] %N will be banned for FF on disconnect (%.2f HP) for %d minutes. Use \"/ignore tk\" to make them immune.", attacker, pData[attacker].TKDamageBuffer, hBanTime.IntValue); @@ -358,10 +374,11 @@ public Action Event_OnTakeDamage(int victim, int& attacker, int& inflictor, flo }else if(isFinaleEnding) { // Keep admins immune if escape vehicle out, or if victim is a bot if(isAdmin || IsFakeClient(victim)) return Plugin_Continue; - SDKHooks_TakeDamage(attacker, attacker, attacker, damage * 2.0); + if(isDamageDirect) + SDKHooks_TakeDamage(attacker, attacker, attacker, damage * 2.0); damage = 0.0; return Plugin_Changed; - }else if(isDamageDirect && !isAdmin && pData[attacker].autoRFFScaleFactor > 0.3) { // Ignore fire and propane damage, mistakes can happen + }else if(isDamageDirect && pData[attacker].autoRFFScaleFactor > 0.3) { // Ignore fire and propane damage, mistakes can happen // Apply their reverse ff damage, and have victim take a decreasing amount SDKHooks_TakeDamage(attacker, attacker, attacker, pData[attacker].autoRFFScaleFactor * damage); if(pData[attacker].isTroll) return Plugin_Stop; @@ -416,10 +433,9 @@ public Action Command_TKInfo(int client, int args) { } else { ReplyToCommand(client, "Immunity: (none, use /ignore [immunity] to toggle)", target); } - float minutesSinceiLastFFTime = (time - pData[target].lastFFTime) / 60.0; - float activeRate = pData[target].autoRFFScaleFactor - (minutesSinceiLastFFTime * hFFAutoScaleForgivenessAmount.FloatValue); - if(activeRate < 0.0) activeRate = 0.0; - + float minutesSinceiLastFFTime = GetLastFFMinutes(target); + float activeRate = GetActiveRate(target); + ReplyToCommand(client, "FF Frequency: %d", pData[target].ffCount); ReplyToCommand(client, "Total FF Damage: %.1f (%.1f min ago last ff)", pData[target].totalDamageFF, minutesSinceiLastFFTime); if(~pData[target].immunityFlags & Immune_TK) ReplyToCommand(client, "Recent FF (TKDetectBuff): %.1f", pData[target].TKDamageBuffer); @@ -492,10 +508,10 @@ public Action Command_IgnorePlayer(int client, int args) { for (int i = 0; i < target_count; i++) { int target = target_list[i]; - if (GetUserAdmin(target) != INVALID_ADMIN_ID) { - ReplyToCommand(client, "%N is an admin and is already immune."); + /*if (GetUserAdmin(target) != INVALID_ADMIN_ID) { + ReplyToCommand(client, "%N is an admin and is already immune.", target); return Plugin_Handled; - } + }*/ if (flags & Immune_TK) { if (pData[target].immunityFlags & Immune_TK) { @@ -528,6 +544,16 @@ public Action Command_IgnorePlayer(int client, int args) { /// STOCKS +float GetLastFFMinutes(int client) { + return (GetTime() - pData[client].lastFFTime) / 60.0; +} + +float GetActiveRate(int client) { + float activeRate = pData[client].autoRFFScaleFactor - (GetLastFFMinutes(client) * hFFAutoScaleForgivenessAmount.FloatValue); + if(activeRate < 0.0) activeRate = 0.0; + return activeRate; +} + stock bool GetNearestPlayerPosition(int client, float pos[3]) { static float targetPos[3], lowestDist; int lowestID = -1;