From f678a3ec8155ac6df39ba3fb5977ea16ca46742c Mon Sep 17 00:00:00 2001 From: Jackz Date: Sun, 14 Jun 2020 13:28:53 -0500 Subject: [PATCH] Added L4D2FFKickProtection && l4d2_ff_test --- README.md | 12 ++- plugins/L4D2FFKickProtection.smx | Bin 0 -> 6443 bytes plugins/l4d2_ff_test.smx | Bin 0 -> 6319 bytes scripting/L4D2FFKickProtection.sp | 113 +++++++++++++++++++++++++++ scripting/l4d2_ff_test.sp | 122 ++++++++++++++++++++++++++++++ 5 files changed, 246 insertions(+), 1 deletion(-) create mode 100644 plugins/L4D2FFKickProtection.smx create mode 100644 plugins/l4d2_ff_test.smx create mode 100644 scripting/L4D2FFKickProtection.sp create mode 100644 scripting/l4d2_ff_test.sp diff --git a/README.md b/README.md index b22006d..446d726 100644 --- a/README.md +++ b/README.md @@ -64,4 +64,14 @@ Updated version of ConnerRia's plugin. Improves bots avoidance of tanks. Change * `FlyYouFools_Version` - Prints the version of plugin ### BetterWitchAvoidance -Inspired by the 200IQBots_FlyYouFools. Bots avoid witch if its over 40% anger when close, or a little bigger range at 60% or more. \ No newline at end of file +Inspired by the 200IQBots_FlyYouFools. Bots avoid witch if its over 40% anger when close, or a little bigger range at 60% or more. + +### L4D2FFKickProtection +Simple plugin that prevents a player that is being vote-kicked from doing any ff damage to teammates. +* **Convars:** + * `sm_votekick_force_threshold` - The threshold of damage where the offending player is just immediately kicked. 0 -> Any attempted damage, -1 -> No auto kick. + +### l4d2_ff_test +More of a joke plugin, it will prevent a player from picking up a m60 if their friendly fire count or damage is over a certain threshold (Hardcoded as 5 and 35 respectively) +* **Commands:** + * `sm_view_ff` - View the ff damage and count of all players \ No newline at end of file diff --git a/plugins/L4D2FFKickProtection.smx b/plugins/L4D2FFKickProtection.smx new file mode 100644 index 0000000000000000000000000000000000000000..6c8596eab4c4ccc0d0896f71e89ddcee715cabaf GIT binary patch literal 6443 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 bYu_cHuQb9EYCUwT_O+fJb4$=DP$u+0_}pE# literal 0 HcmV?d00001 diff --git a/plugins/l4d2_ff_test.smx b/plugins/l4d2_ff_test.smx new file mode 100644 index 0000000000000000000000000000000000000000..70d5c9f9405a2c7d722606f7daaf86465af898bc GIT binary patch literal 6319 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 d`S33-F{La)XJZZSn|ejASQk%#7d`5c{|}4HGok +#include +#include + +static int disableFFClient; //client to disable FF for +static float ffDamageDone; //amount of damage offending user has attempted +static ConVar forceKickFFThreshold; + +public Plugin myinfo = { + name = PLUGIN_NAME, + author = PLUGIN_AUTHOR, + description = PLUGIN_DESCRIPTION, + version = PLUGIN_VERSION, + url = PLUGIN_URL +}; + +public void OnPluginStart() { + EngineVersion g_Game = GetEngineVersion(); + if(g_Game != Engine_Left4Dead && g_Game != Engine_Left4Dead2) + { + SetFailState("This plugin is for L4D/L4D2 only."); + } + AddCommandListener(VoteStart, "callvote"); + HookUserMessage(GetUserMessageId("VotePass"), VotePassFail); + HookUserMessage(GetUserMessageId("VoteFail"), VotePassFail); + + forceKickFFThreshold = CreateConVar("sm_votekick_force_threshold","0","The threshold of damage where the offending player is just immediately kicked. 0 -> Any attempted damage, -1 -> No auto kick.", FCVAR_NONE, true, -1.0); + + //HookEvent("vote_started",Event_VoteStarted); +} + +public void OnClientPutInServer(int client) { + int team = GetClientTeam(client); + if(team == 2) { + SDKHook(client, SDKHook_OnTakeDamageAlive, OnTakeDamage); + } +} + +public void Event_PlayerTeam(Event event, const char[] name, bool dontBroadcast) { + if(!event.GetBool("disconnect")) { + int team = event.GetInt("team"); + int userid = GetClientOfUserId(event.GetInt("userid")); + if(team == 2) { + SDKHook(userid, SDKHook_OnTakeDamageAlive, OnTakeDamage); + //add new hook + }else{ + SDKUnhook(userid, SDKHook_OnTakeDamageAlive, OnTakeDamage); + } + } +} + +public Action VoteStart(int client, const char[] command, int argc) { + if(GetClientCount(true) == 0 || client == 0) return Plugin_Handled; //prevent votes while server is empty or if server tries calling vote + if(argc >= 1) { + char issue[32]; + char caller[32]; + + GetCmdArg(1, issue, sizeof(issue)); + Format(caller, sizeof(caller), "%N", client); + + if(StrEqual(issue, "Kick", true)) { + char option[32]; + GetCmdArg(2, option, sizeof(option)); + if(strlen(option) < 1) { //empty userid/console can't call votes + int target = GetClientOfUserId(StringToInt(option)); + int team = GetClientTeam(target); + if(team == 2) { + disableFFClient = target; + ffDamageDone = -1.0; + } + return Plugin_Handled; + } + //Kick vote started + PrintToServer("KICK VOTE STARTED | Issue=%s Option=%s Caller=%N", issue, option, client); + } + } + return Plugin_Handled; //if it wasn't handled up there I would start panicking +} + +public Action VotePassFail(UserMsg msg_id, BfRead msg, const int[] players, int playersNum, bool reliable, bool init) { + disableFFClient = -1; + ffDamageDone = -1.0; +} + +public Action OnTakeDamage(int victim, int& attacker, int& inflictor, float& damage, int& damagetype, int& weapon, float damageForce[3], float damagePosition[3]) { + if(disableFFClient == attacker) { + if(ffDamageDone == -1) { + PrintToServer("Player in vote to be kicked has done ff damage"); + } + ffDamageDone = damage; + if(forceKickFFThreshold.FloatValue > -1.0) { + //auto kick + if(forceKickFFThreshold.FloatValue == 0.0) { + KickClient(disableFFClient, "Kicked for excessive friendly fire"); + }else if(FloatCompare(ffDamageDone, forceKickFFThreshold.FloatValue) == 1) { + KickClient(disableFFClient, "Kicked for excessive friendly fire"); + } + } + damage = 0.0; + return Plugin_Handled; + } + return Plugin_Continue; +} diff --git a/scripting/l4d2_ff_test.sp b/scripting/l4d2_ff_test.sp new file mode 100644 index 0000000..2b1e47b --- /dev/null +++ b/scripting/l4d2_ff_test.sp @@ -0,0 +1,122 @@ +#pragma semicolon 1 +#pragma newdecls required + +//#define DEBUG + +#define PLUGIN_NAME "l4d2_ff_test" +#define PLUGIN_DESCRIPTION "" +#define PLUGIN_AUTHOR "jackzmc" +#define PLUGIN_VERSION "1.0" +#define PLUGIN_URL "" + +#include +#include +#include + +static bool bLateLoaded; +static float ffDamage[MAXPLAYERS+1]; +static int ffCount[MAXPLAYERS+1]; + +public Plugin myinfo = +{ + name = PLUGIN_NAME, + author = PLUGIN_AUTHOR, + description = PLUGIN_DESCRIPTION, + version = PLUGIN_VERSION, + url = PLUGIN_URL +}; +public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { + if(late) { + bLateLoaded = true; + } +} + +public void OnPluginStart() +{ + EngineVersion g_Game = GetEngineVersion(); + if(g_Game != Engine_Left4Dead && g_Game != Engine_Left4Dead2) + { + SetFailState("This plugin is for L4D/L4D2 only."); + } + if(bLateLoaded) { + for(int i=1;i 5 || ffDamage[client] >= 35) { + int damage = RoundToNearest(ffDamage[client]); + PrintToChat(client, "Sorry, you can't use m60s due to your %d ff attacks (total %d HP)", ffCount[client], damage); + return Plugin_Handled; + } + } + return Plugin_Continue; +} \ No newline at end of file