From 0b3cb96fb83ee175d0cb5d1619403042743ee245 Mon Sep 17 00:00:00 2001 From: Jackz Date: Sun, 14 Jun 2020 13:36:06 -0500 Subject: [PATCH] Added CSGOTroll plugin --- README.md | 11 +++- plugins/CSGOTroll.smx | Bin 0 -> 6765 bytes scripting/CSGOTroll.sp | 112 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 plugins/CSGOTroll.smx create mode 100644 scripting/CSGOTroll.sp diff --git a/README.md b/README.md index c893f03..3bbd3e1 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ All my sourcemod plugins... shitty probably * [BetterWitchAvoidance](#BetterWitchAvoidance) * [L4D2FFKickProtection](#L4D2FFKickProtection) * [l4d2_ff_test](#l4d2_ff_test) +* [CSGOTroll](#CSGOTroll) ## Descriptions ### csgo-knifehp @@ -71,9 +72,17 @@ Inspired by the 200IQBots_FlyYouFools. Bots avoid witch if its over 40% anger wh ### 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. + * `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 + +### CSGOTroll +Another joke plugin, with it configured, a victim will have a % chance their shots just fail. This can be for the AWP or all weapons at least for now. +* **Convars:** + * `troll_enable <0/1>` - Enable troll. 0 -> OFF, 1 -> Shots + * `troll_shot_fail_percentage <0.0-1.1>` - percentage float (0.0 to 1.0) chance that victims' shots fail + * `troll_targets ` - comma seperated list of steamid64 targets (ex: STEAM_0:0:75141700) + * `troll_shot_mode <0/1>` - 0 -> ALL Weapons, 1 -> AWP \ No newline at end of file diff --git a/plugins/CSGOTroll.smx b/plugins/CSGOTroll.smx new file mode 100644 index 0000000000000000000000000000000000000000..5cae2d45efb92dc9fb098dc35a11ba7a1cb25b91 GIT binary patch literal 6765 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 F{{YR<2PFUi literal 0 HcmV?d00001 diff --git a/scripting/CSGOTroll.sp b/scripting/CSGOTroll.sp new file mode 100644 index 0000000..565415d --- /dev/null +++ b/scripting/CSGOTroll.sp @@ -0,0 +1,112 @@ +#pragma semicolon 1 + +#define DEBUG + +#define PLUGIN_AUTHOR "" +#define PLUGIN_VERSION "0.00" + +#include +#include +#include +#include + +EngineVersion g_Game; +ConVar hTrollEnableState, hShotFailPercentage, hTrollTargets, hGunType; +bool TrollTargets[MAXPLAYERS+1], lateLoaded; + +public Plugin myinfo = +{ + name = "", + author = PLUGIN_AUTHOR, + description = "", + version = PLUGIN_VERSION, + url = "" +}; + +public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { + if(late) { + lateLoaded = true; + } +} + +public OnPluginStart() +{ + g_Game = GetEngineVersion(); + if(g_Game != Engine_CSGO && g_Game != Engine_CSS) + { + SetFailState("This plugin is for CSGO/CSS only."); + } + //convars + hTrollEnableState = CreateConVar("troll_enable", "1.0", "Enable troll. 0 -> OFF, 1 -> Shots", FCVAR_NONE, true, 0.0, true, 1.0); + hShotFailPercentage = CreateConVar("troll_shot_fail_percentage", "0.4", "The percentage that the troll acts (shots fail). float 0-1", FCVAR_NONE, true, 0.0, true, 1.0); + hTrollTargets = CreateConVar("troll_targets", "", "comma seperated list of steamid64 targets (ex: STEAM_0:0:75141700)", FCVAR_NONE); + hGunType = CreateConVar("troll_shot_mode", "0", "0 -> ALL Weapons, 1 -> AWP", FCVAR_NONE, true, 0.0, true, 1.0); + + if(lateLoaded) FindExistingVictims(); +} + +public void OnClientAuthorized(int client, const char[] auth) { + if(hTrollEnableState.IntValue > 0) { + if(StrContains(auth, "BOT", true) == -1) { + TestForTrollUser(client, auth); + } + } +} +public void OnClientPutInServer(int client) { + SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage); +} +public OnClientDisconnect(int client) { + TrollTargets[client] = false; +} +public void FindExistingVictims() { + for(int i = 1; i <= MaxClients; i++) { + if(IsClientInGame(i) && IsClientAuthorized(i)) { + if(!IsFakeClient(i)) { + char auth[64]; + GetClientAuthId(i, AuthId_Steam2, auth, sizeof(auth)); + TestForTrollUser(i, auth); + } + SDKHook(i, SDKHook_OnTakeDamage, OnTakeDamage); + } + } +} +public bool TestForTrollUser(int client, const char[] auth) { + char targets[32][8]; + char raw_targets[64]; + hTrollTargets.GetString(raw_targets, sizeof(raw_targets)); + ExplodeString(raw_targets, ",", targets, 8, 32, false); + for(int i = 0; i < 8; i++) { + if(StrEqual(targets[i], auth, true)) { + PrintToServer("Troll victim detected with id %d and steamid %s", client, auth); + TrollTargets[client] = true; + return true; + } + } + return false; +} +public Action OnTakeDamage(int victim, int& attacker, int& inflictor, float& damage, int& damagetype, int& weapon, float damageForce[3], float damagePosition[3]) { + if(hTrollEnableState.IntValue == 1) { + if(TrollTargets[attacker]) { + bool try_failure = false; + char weapon_name[64]; + GetClientWeapon(victim, weapon_name, sizeof(weapon_name)); + + if(hGunType.IntValue == 0) { + try_failure = true; + }else{ + if(StrEqual(weapon_name, "weapon_awp", true)) { + try_failure = true; + } + + } + float random_float = GetURandomFloat(); + if(try_failure) { + if(FloatCompare(random_float, hShotFailPercentage.FloatValue) == -1) { + damage = 0.0; + return Plugin_Handled; + } + } + } + } + return Plugin_Continue; +} \ No newline at end of file