From ba1d683875f0abcb3127906511eb4436bbe8b185 Mon Sep 17 00:00:00 2001 From: Jackz Date: Thu, 18 Mar 2021 10:50:03 -0500 Subject: [PATCH] Update l4d2_feedthetrolls --- README.md | 12 +- plugins/l4d2_feedthetrolls.smx | Bin 27771 -> 30454 bytes scripting/l4d2_feedthetrolls.sp | 653 ++++++++++++++++++++------------ 3 files changed, 418 insertions(+), 247 deletions(-) diff --git a/README.md b/README.md index da52744..4c428a8 100644 --- a/README.md +++ b/README.md @@ -180,17 +180,27 @@ Troll Modes: (updated 1/2/2021) 11. **ThrowItAll** - Makes a player throw all their items at any nearby players. Runs on the interval set by sm_ftt_throw_interval. 12. **GunJam** - On reload, small chance their gun gets jammed - Can't reload. 13. **NoPickup** - Prevents a player from picking up ANY (new) item. Use ThrowItAll to make them drop -14. **Swarm** - Swarms a player with zombies. Requires my [swarm plugin](#l4d2_swarm) +14. **Swarm** - Swarms a player with zombies. Requires my [swarm plugin](#l4d2_swarm) +15. **Honk** – Replaces player's chat messages with honk +16. **Special Magnet** – Attracts ALL specials to the closest alive trolled target with this troll enabled +17. **Tank Magnet** – Attracts ALL tanks to the closest alive trolled target with this troll enabled +18. **No Shove** – Prevents player from shoving at a % chance +19. **Damage Boost** – Will make the player take 2x more damage than normal +20. **Temp Quick Drain** – Will make a player’s temp health drain very quickly +21. **Vomit Player** – Shortcut to sm_vomitplayer. Vomits the player. * **Convars:** * `sm_ftt_victims` - A comma separated list of troll targets. Unused while new version is being implemented * `sm_ftt_throw_interval` - For troll mode 'ThrowItAll' (#11), how often players will re-throw all their items. 0 to disable * `sm_ftt_autopunish_mode` - (Not used, WIP) Sets the modes that auto punish will activate for. 1 -> Early crescendo activations + * `sm_ftt_magnet_chance <0.0 - 1.0>` - % of the time that the magnet will work on a player." + * `sm_ftt_shove_fail_chance <0.0 - 1.0>` - The % chance that a shove fails * **Commands:** * `sm_fta ` - Applies a mode to a set of users. See list above * `sm_fta` - No arguments: Shows a menu, choose player, mode, and modifiers all in one. * `sm_ftr ` - Removes & deactivates all trolls. * `sm_ftl` - Lists all players that have a mode applied. + * `sm_ftm` - Lists all troll options & their descriptions ### l4d2_autobotcrown Makes any suitable bot (> 40 hp, has shotgun) automatically crown a witch. Supports multiple bots and witches, but only one bot can crown one witch at a time. Plugin is obviously disabled in realism, and is really on suitable for coop or versus. Even works with idle players. diff --git a/plugins/l4d2_feedthetrolls.smx b/plugins/l4d2_feedthetrolls.smx index f00161ee7976269b44198f43074b94adaeba83bc..e9bf964fea4f0bd8e07b968bb262a3a04f43c731 100644 GIT binary patch literal 30454 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 #include "jutils.inc" #include +#include #undef REQUIRE_PLUGIN #include @@ -29,7 +30,7 @@ public Plugin myinfo = //HANDLES Handle hThrowTimer; //CONVARS -ConVar hVictimsList, hThrowItemInterval, hAutoPunish; +ConVar hVictimsList, hThrowItemInterval, hAutoPunish, hMagnetChance, hShoveFailChance; //BOOLS bool lateLoaded; //Is plugin late loaded bool bChooseVictimAvailable = false; //For charge player feature, is it available? @@ -57,18 +58,19 @@ public void OnPluginStart() { LoadTranslations("common.phrases"); g_iAmmoTable = FindSendPropInfo("CTerrorPlayer", "m_iAmmo"); - hVictimsList = CreateConVar("sm_ftt_victims", "", "Comma seperated list of steamid64 targets (ex: STEAM_0:0:75141700)", FCVAR_NONE); - hVictimsList.AddChangeHook(Change_VictimList); hThrowItemInterval = CreateConVar("sm_ftt_throw_interval", "30", "The interval in seconds to throw items. 0 to disable", FCVAR_NONE, true, 0.0); hThrowItemInterval.AddChangeHook(Change_ThrowInterval); - hAutoPunish = CreateConVar("sm_ftt_autopunish_mode", "0", "Setup automatic punishment of players. Add bits together. 0: Disabled, 1: Early Crescendos", FCVAR_NONE, true, 0.0); + hAutoPunish = CreateConVar("sm_ftt_autopunish_action", "0", "Setup automatic punishment of players. Add bits together\n0=Disabled, 1=Tank magnet, 2=Special magnet, 4=Swarm", FCVAR_NONE, true, 0.0); + hMagnetChance = CreateConVar("sm_ftt_magnet_chance", "1.0", "% of the time that the magnet will work on a player.", FCVAR_NONE, true, 0.0, true, 1.0); + hShoveFailChance = CreateConVar("sm_ftt_shove_fail_chance", "0.5", "The % chance that a shove fails", FCVAR_NONE, true, 0.0, true, 1.0); - RegAdminCmd("sm_ftl", Command_ListTheTrolls, ADMFLAG_ROOT, "Lists all the trolls currently ingame."); - RegAdminCmd("sm_ftm", Command_ListModes, ADMFLAG_ROOT, "Lists all the troll modes and their description"); - RegAdminCmd("sm_ftr", Command_ResetUser, ADMFLAG_ROOT, "Resets user of any troll effects."); - RegAdminCmd("sm_fta", Command_ApplyUser, ADMFLAG_ROOT, "Apply a troll mod to a player, or shows menu if no parameters."); + RegAdminCmd("sm_ftl", Command_ListTheTrolls, ADMFLAG_KICK, "Lists all the trolls currently ingame."); + RegAdminCmd("sm_ftm", Command_ListModes, ADMFLAG_KICK, "Lists all the troll modes and their description"); + RegAdminCmd("sm_ftr", Command_ResetUser, ADMFLAG_KICK, "Resets user of any troll effects."); + RegAdminCmd("sm_fta", Command_ApplyUser, ADMFLAG_KICK, "Apply a troll mod to a player, or shows menu if no parameters."); HookEvent("player_disconnect", Event_PlayerDisconnect); + HookEvent("player_death", Event_PlayerDeath); AutoExecConfig(true, "l4d2_feedthetrolls"); @@ -77,6 +79,11 @@ public void OnPluginStart() { HookEntityOutput("func_button", "OnPressed", Event_ButtonPress); } } + +/////////////////////////////////////////////////////////////////////////////// +// EVENTS +/////////////////////////////////////////////////////////////////////////////// + public void OnPluginEnd() { UnhookEntityOutput("func_button", "OnPressed", Event_ButtonPress); } @@ -86,216 +93,29 @@ public void OnMapEnd() { public void OnMapStart() { HookEntityOutput("func_button", "OnPressed", Event_ButtonPress); CreateTimer(MAIN_TIMER_INTERVAL_S, Timer_Main, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE); + //CreateTimer(30.0, Timer_AutoPunishCheck, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE); } public void Event_PlayerDisconnect(Event event, const char[] name, bool dontBroadcast) { int client = GetClientOfUserId(event.GetInt("userid")); g_iTrollUsers[client] = 0; + g_iAttackerTarget[client] = 0; } -public void OnClientAuthorized(int client, const char[] auth) { - if(StrContains(auth, "BOT", true) == -1) { - TestForTarget(client, auth); - } +public Action Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast) { + int client = GetClientOfUserId(event.GetInt("userid")); + g_iAttackerTarget[client] = 0; } -// #region evrnts -public void Change_VictimList(ConVar convar, const char[] oldValue, const char[] newValue) { -} -public void Change_ThrowInterval(ConVar convar, const char[] oldValue, const char[] newValue) { - //If a throw timer exists (someone has mode 11), destroy & recreate w/ new interval - if(hThrowTimer != INVALID_HANDLE) { - delete hThrowTimer; - PrintToServer("Reset new throw item timer"); - hThrowTimer = CreateTimer(convar.FloatValue, Timer_ThrowTimer, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE); - } -} -// #endregion -// #region commands -public Action Command_ResetUser(int client, int args) { - if(args < 1) { - ReplyToCommand(client, "Usage: sm_ftr "); - }else{ - char arg1[32]; - GetCmdArg(1, arg1, sizeof(arg1)); - char target_name[MAX_TARGET_LENGTH]; - int target_list[MAXPLAYERS], target_count; - bool tn_is_ml; - if ((target_count = ProcessTargetString( - arg1, - client, - target_list, - MAXPLAYERS, - COMMAND_FILTER_ALIVE, /* Only allow alive players */ - target_name, - sizeof(target_name), - tn_is_ml)) <= 0) - { - /* This function replies to the admin with a failure message */ - ReplyToTargetError(client, target_count); - return Plugin_Handled; - } - for (int i = 0; i < target_count; i++) - { - if(IsClientConnected(target_list[i]) && IsClientInGame(target_list[i]) && IsPlayerAlive(target_list[i]) && GetClientTeam(target_list[i]) == 2) { - ResetClient(target_list[i], true); - ShowActivity(client, "reset troll effects on \"%N\". ", target_list[i]); - } +public Action Event_WeaponReload(int weapon) { + int client = GetEntPropEnt(weapon, Prop_Send, "m_hOwner"); + if(HasTrollMode(client,Troll_GunJam)) { + float dec = GetRandomFloat(0.0, 1.0); + if(FloatCompare(dec, 0.50) == -1) { //10% chance gun jams + return Plugin_Stop; } } - return Plugin_Handled; -} -public Action Command_ApplyUser(int client, int args) { - if(args < 2) { - Menu menu = new Menu(ChoosePlayerHandler); - menu.SetTitle("Choose a player"); - for(int i = 1; i < MaxClients; i++) { - if(IsClientConnected(i) && IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 2) { - char userid[8], display[16]; - Format(userid, sizeof(userid), "%d", GetClientUserId(i)); - GetClientName(i, display, sizeof(display)); - menu.AddItem(userid, display); - } - } - menu.ExitButton = true; - menu.Display(client, 0); - }else{ - char arg1[32], arg2[32]; - GetCmdArg(1, arg1, sizeof(arg1)); - GetCmdArg(2, arg2, sizeof(arg2)); - - int mode = StringToInt(arg2); - if(mode == 0) { - ReplyToCommand(client, "Not a valid mode. Must be greater than 0. Usage: sm_fta . Use sm_ftr to reset."); - }else{ - char target_name[MAX_TARGET_LENGTH]; - int target_list[MAXPLAYERS], target_count; - bool tn_is_ml; - if ((target_count = ProcessTargetString( - arg1, - client, - target_list, - MAXPLAYERS, - COMMAND_FILTER_ALIVE, /* Only allow alive players */ - target_name, - sizeof(target_name), - tn_is_ml)) <= 0) - { - /* This function replies to the admin with a failure message */ - ReplyToTargetError(client, target_count); - return Plugin_Handled; - } - for (int i = 0; i < target_count; i++) - { - if(GetClientTeam(target_list[i]) == 2) - ApplyModeToClient(client, target_list[i], view_as(mode), TrollMod_None); - } - } - } - return Plugin_Handled; -} -public Action Command_ListModes(int client, int args) { - for(int mode = 0; mode < TROLL_MODE_COUNT; mode++) { - ReplyToCommand(client, "%d. %s - %s", mode, TROLL_MODES_NAMES[mode], TROLL_MODES_DESCRIPTIONS[mode]); - } - return Plugin_Handled; -} -public Action Command_ListTheTrolls(int client, int args) { - int count = 0; - for(int i = 1; i < MaxClients; i++) { - if(IsClientConnected(i) && IsPlayerAlive(i) && g_iTrollUsers[i] > 0) { - int modes = g_iTrollUsers[i], modeCount = 0; - char modeListArr[TROLL_MODE_COUNT][32]; - for(int mode = 1; mode < TROLL_MODE_COUNT; mode++) { - //If troll mode exists: - bool hasTrollMode = HasTrollMode(i, view_as(mode)); - PrintToConsole(i, "[%d]: #%d %s value: %b", modes, mode, TROLL_MODES_NAMES[mode], hasTrollMode); - if(hasTrollMode) { - modeListArr[modeCount] = TROLL_MODES_NAMES[mode]; - modeCount++; - } - } - char modeList[255]; - ImplodeStrings(modeListArr, modeCount, ", ", modeList, sizeof(modeList)); - ReplyToCommand(client, "%N | %d | %s", i, modes, modeList); - count++; - } - } - if(count == 0) { - ReplyToCommand(client, "No clients have a mode applied."); - } - return Plugin_Handled; -} -public int ChoosePlayerHandler(Menu menu, MenuAction action, int param1, int param2) { - /* If an option was selected, tell the client about the item. */ - if (action == MenuAction_Select) { - char info[16]; - menu.GetItem(param2, info, sizeof(info)); - int userid = StringToInt(info); - - Menu trollMenu = new Menu(ChooseModeMenuHandler); - trollMenu.SetTitle("Choose a troll mode"); - for(int i = 0; i < TROLL_MODE_COUNT; i++) { - char id[8]; - Format(id, sizeof(id), "%d|%d", userid, i); - trollMenu.AddItem(id, TROLL_MODES_NAMES[i]); - } - trollMenu.ExitButton = true; - trollMenu.Display(param1, 0); - } else if (action == MenuAction_End) - delete menu; -} -public int ChooseModeMenuHandler(Menu menu, MenuAction action, int param1, int param2) { - /* If an option was selected, tell the client about the item. */ - if (action == MenuAction_Select) { - char info[16]; - menu.GetItem(param2, info, sizeof(info)); - char str[2][8]; - ExplodeString(info, "|", str, 2, 8, false); - int userid = StringToInt(str[0]); - int client = GetClientOfUserId(userid); - trollMode mode = view_as(StringToInt(str[1])); - //If mode has an option to be single-time fired/continous/both, prompt: - if(mode == Troll_Clumsy - || mode ==Troll_ThrowItAll - || mode == Troll_PrimaryDisable - || mode == Troll_CameTooEarly - || mode == Troll_Swarm - ) { - Menu modiferMenu = new Menu(ChooseTrollModiferHandler); - modiferMenu.SetTitle("Choose Troll Modifer Option"); - char singleUse[16], multiUse[16], bothUse[16]; - Format(singleUse, sizeof(singleUse), "%d|%d|1", userid, mode); - Format(multiUse, sizeof(multiUse), "%d|%d|2", userid, mode); - Format(bothUse, sizeof(bothUse), "%d|%d|3", userid, mode); - modiferMenu.AddItem(singleUse, "Activate once"); - modiferMenu.AddItem(multiUse, "Activate Periodically"); - modiferMenu.AddItem(bothUse, "Activate Periodically & Instantly"); - modiferMenu.ExitButton = true; - modiferMenu.Display(param1, 0); - } else { - ApplyModeToClient(param1, client, mode, TrollMod_None); - } - } else if (action == MenuAction_End) - delete menu; -} -public int ChooseTrollModiferHandler(Menu menu, MenuAction action, int param1, int param2) { - if (action == MenuAction_Select) { - char info[16]; - menu.GetItem(param2, info, sizeof(info)); - char str[3][8]; - ExplodeString(info, "|", str, 3, 8, false); - int client = GetClientOfUserId(StringToInt(str[0])); - trollMode mode = view_as(StringToInt(str[1])); - int modifier = StringToInt(str[2]); - if(modifier == 2 || modifier == 3) - ApplyModeToClient(param1, client, mode, TrollMod_Repeat); - else - ApplyModeToClient(param1, client, mode, TrollMod_InstantFire); - } else if (action == MenuAction_End) - delete menu; + return Plugin_Continue; } public Action Event_ButtonPress(const char[] output, int entity, int client, float delay) { - PrintToServer("Client %N pressed a func_button", client); - PrintToConsoleAll("Client %N pressed a func_button", client); - if(hAutoPunish.IntValue & 1 > 0) { + if(client > 0 && client <= MaxClients && hAutoPunish.IntValue & 1 > 0) { float closestDistance = -1.0, cPos[3], scanPos[3]; GetClientAbsOrigin(client, cPos); @@ -318,9 +138,64 @@ public Action Event_ButtonPress(const char[] output, int entity, int client, flo } return Plugin_Continue; } +public Action L4D2_OnChooseVictim(int attacker, int &curTarget) { + // ========================= + // OVERRIDE VICTIM + // ========================= + if(hMagnetChance.FloatValue < GetRandomFloat()) return Plugin_Continue; + L4D2Infected class = view_as(GetEntProp(attacker, Prop_Send, "m_zombieClass")); + if(class != L4D2Infected_Tank) { + int existingTarget = GetClientOfUserId(g_iAttackerTarget[attacker]); + if(existingTarget > 0 && IsClientInGame(existingTarget) && IsPlayerAlive(existingTarget)) { + curTarget = existingTarget; + return Plugin_Changed; + } + + float closestDistance, survPos[3], spPos[3]; + GetClientAbsOrigin(attacker, spPos); + int closestClient = -1; + for(int i = 1; i <= MaxClients; i++) { + if(IsClientConnected(i) && IsClientInGame(i) && GetClientTeam(i) == 2 && IsPlayerAlive(i)) { + if(class == L4D2Infected_Tank && HasTrollMode(i, Troll_TankMagnet) || (class != L4D2Infected_Tank && HasTrollMode(i, Troll_SpecialMagnet))) { + GetClientAbsOrigin(i, survPos); + float dist = GetVectorDistance(survPos, spPos, true); + if(closestClient == -1 || dist < closestDistance) { + closestDistance = dist; + closestClient = i; + } + } + } + } + + if(closestClient > 0) { + g_iAttackerTarget[attacker] = GetClientUserId(closestClient); + curTarget = closestClient; + return Plugin_Changed; + } + } + return Plugin_Continue; +} +public Action L4D2_OnEntityShoved(int client, int entity, int weapon, float vecDir[3], bool bIsHighPounce) { + if(client > 0 && client <= MaxClients && HasTrollMode(client, Troll_NoShove) && hShoveFailChance.FloatValue > GetRandomFloat()) { + return Plugin_Handled; + } + return Plugin_Continue; +} public Action OnClientSayCommand(int client, const char[] command, const char[] sArgs) { - if(HasTrollMode(client, Troll_iCantSpellNoMore)) { - int type = GetRandomInt(1, 24); + if(HasTrollMode(client, Troll_Honk)) { + char strings[32][7]; + int words = ExplodeString(sArgs, " ", strings, sizeof(strings), 5); + for(int i = 0; i < words; i++) { + if(GetRandomFloat() <= 0.8) strings[i] = "honk"; + else strings[i] = "squeak"; + } + int length = 7 * words; + char[] message = new char[length]; + ImplodeStrings(strings, 32, " ", message, length); + CPrintToChatAll("{blue}%N {default}: %s", client, message); + return Plugin_Handled; + }else if(HasTrollMode(client, Troll_iCantSpellNoMore)) { + int type = GetRandomInt(1, 33); char letterSrc, replaceChar; switch(type) { case 1: { @@ -371,6 +246,10 @@ public Action OnClientSayCommand(int client, const char[] command, const char[] letterSrc = 'o'; replaceChar = 'i'; } + case 13: { + letterSrc = 'e'; + replaceChar = 'r'; + } default: return Plugin_Continue; @@ -440,21 +319,225 @@ public Action OnPlayerRunCmd(int client, int& buttons, int& impulse, float vel[3 } return Plugin_Continue; } +public Action Event_TakeDamage(int victim, int& attacker, int& inflictor, float& damage, int& damagetype) { + if(attacker > 0 && attacker <= MaxClients && HasTrollMode(attacker, Troll_DamageBoost)) { + damage * 2; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// CVAR CHANGES +/////////////////////////////////////////////////////////////////////////////// + +public void Change_ThrowInterval(ConVar convar, const char[] oldValue, const char[] newValue) { + //If a throw timer exists (someone has mode 11), destroy & recreate w/ new interval + if(hThrowTimer != INVALID_HANDLE) { + delete hThrowTimer; + PrintToServer("Reset new throw item timer"); + hThrowTimer = CreateTimer(convar.FloatValue, Timer_ThrowTimer, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// COMMANDS +/////////////////////////////////////////////////////////////////////////////// + +public Action Command_ResetUser(int client, int args) { + if(args < 1) { + ReplyToCommand(client, "Usage: sm_ftr "); + }else{ + char arg1[32]; + GetCmdArg(1, arg1, sizeof(arg1)); + char target_name[MAX_TARGET_LENGTH]; + int target_list[MAXPLAYERS], target_count; + bool tn_is_ml; + if ((target_count = ProcessTargetString( + arg1, + client, + target_list, + MAXPLAYERS, + COMMAND_FILTER_ALIVE, /* Only allow alive players */ + target_name, + sizeof(target_name), + tn_is_ml)) <= 0) + { + /* This function replies to the admin with a failure message */ + ReplyToTargetError(client, target_count); + return Plugin_Handled; + } + for (int i = 0; i < target_count; i++) + { + if(IsClientConnected(target_list[i]) && IsClientInGame(target_list[i]) && IsPlayerAlive(target_list[i])) { + ResetClient(target_list[i], true); + ShowActivity(client, "reset troll effects on \"%N\". ", target_list[i]); + } + } + } + return Plugin_Handled; +} +public Action Command_ApplyUser(int client, int args) { + if(args < 2) { + Menu menu = new Menu(ChoosePlayerHandler); + menu.SetTitle("Choose a player"); + for(int i = 1; i < MaxClients; i++) { + if(IsClientConnected(i) && IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 2) { + char userid[8], display[16]; + Format(userid, sizeof(userid), "%d", GetClientUserId(i)); + GetClientName(i, display, sizeof(display)); + menu.AddItem(userid, display); + } + } + menu.ExitButton = true; + menu.Display(client, 0); + }else{ + char arg1[32], arg2[32]; + GetCmdArg(1, arg1, sizeof(arg1)); + GetCmdArg(2, arg2, sizeof(arg2)); + + int mode = StringToInt(arg2); + if(mode == 0) { + ReplyToCommand(client, "Not a valid mode. Must be greater than 0. Usage: sm_fta . Use sm_ftr to reset."); + }else{ + char target_name[MAX_TARGET_LENGTH]; + int target_list[MAXPLAYERS], target_count; + bool tn_is_ml; + if ((target_count = ProcessTargetString( + arg1, + client, + target_list, + MAXPLAYERS, + COMMAND_FILTER_ALIVE, /* Only allow alive players */ + target_name, + sizeof(target_name), + tn_is_ml)) <= 0) + { + /* This function replies to the admin with a failure message */ + ReplyToTargetError(client, target_count); + return Plugin_Handled; + } + for (int i = 0; i < target_count; i++) + { + if(IsClientConnected(target_list[i]) && IsClientInGame(target_list[i]) && GetClientTeam(target_list[i]) == 2) + ApplyModeToClient(client, target_list[i], view_as(mode), TrollMod_None); + } + } + } + return Plugin_Handled; +} +public Action Command_ListModes(int client, int args) { + for(int mode = 0; mode < TROLL_MODE_COUNT; mode++) { + ReplyToCommand(client, "%d. %s - %s", mode, TROLL_MODES_NAMES[mode], TROLL_MODES_DESCRIPTIONS[mode]); + } + return Plugin_Handled; +} +public Action Command_ListTheTrolls(int client, int args) { + int count = 0; + for(int i = 1; i < MaxClients; i++) { + if(IsClientConnected(i) && IsPlayerAlive(i) && g_iTrollUsers[i] > 0) { + int modes = g_iTrollUsers[i], modeCount = 0; + char modeListArr[TROLL_MODE_COUNT][32]; + for(int mode = 1; mode < TROLL_MODE_COUNT; mode++) { + //If troll mode exists: + bool hasTrollMode = HasTrollMode(i, view_as(mode)); + PrintToConsole(i, "[%d]: #%d %s value: %b", modes, mode, TROLL_MODES_NAMES[mode], hasTrollMode); + if(hasTrollMode) { + modeListArr[modeCount] = TROLL_MODES_NAMES[mode]; + modeCount++; + } + } + char modeList[255]; + ImplodeStrings(modeListArr, modeCount, ", ", modeList, sizeof(modeList)); + ReplyToCommand(client, "%N | %d | %s", i, modes, modeList); + count++; + } + } + if(count == 0) { + ReplyToCommand(client, "No clients have a mode applied."); + } + return Plugin_Handled; +} + +/////////////////////////////////////////////////////////////////////////////// +// MENU HANDLER +/////////////////////////////////////////////////////////////////////////////// + +public int ChoosePlayerHandler(Menu menu, MenuAction action, int param1, int param2) { + /* If an option was selected, tell the client about the item. */ + if (action == MenuAction_Select) { + char info[16]; + menu.GetItem(param2, info, sizeof(info)); + int userid = StringToInt(info); + + Menu trollMenu = new Menu(ChooseModeMenuHandler); + trollMenu.SetTitle("Choose a troll mode"); + for(int i = 0; i < TROLL_MODE_COUNT; i++) { + char id[8]; + Format(id, sizeof(id), "%d|%d", userid, i); + trollMenu.AddItem(id, TROLL_MODES_NAMES[i]); + } + trollMenu.ExitButton = true; + trollMenu.Display(param1, 0); + } else if (action == MenuAction_End) + delete menu; +} +public int ChooseModeMenuHandler(Menu menu, MenuAction action, int param1, int param2) { + /* If an option was selected, tell the client about the item. */ + if (action == MenuAction_Select) { + char info[16]; + menu.GetItem(param2, info, sizeof(info)); + char str[2][8]; + ExplodeString(info, "|", str, 2, 8, false); + int userid = StringToInt(str[0]); + int client = GetClientOfUserId(userid); + trollMode mode = view_as(StringToInt(str[1])); + //If mode has an option to be single-time fired/continous/both, prompt: + if(mode == Troll_Clumsy + || mode ==Troll_ThrowItAll + || mode == Troll_PrimaryDisable + || mode == Troll_CameTooEarly + || mode == Troll_Swarm + ) { + Menu modiferMenu = new Menu(ChooseTrollModiferHandler); + modiferMenu.SetTitle("Choose Troll Modifer Option"); + char singleUse[16], multiUse[16], bothUse[16]; + Format(singleUse, sizeof(singleUse), "%d|%d|1", userid, mode); + Format(multiUse, sizeof(multiUse), "%d|%d|2", userid, mode); + Format(bothUse, sizeof(bothUse), "%d|%d|3", userid, mode); + modiferMenu.AddItem(singleUse, "Activate once"); + modiferMenu.AddItem(multiUse, "Activate Periodically"); + modiferMenu.AddItem(bothUse, "Activate Periodically & Instantly"); + modiferMenu.ExitButton = true; + modiferMenu.Display(param1, 0); + } else { + ApplyModeToClient(param1, client, mode, TrollMod_None); + } + } else if (action == MenuAction_End) + delete menu; +} +public int ChooseTrollModiferHandler(Menu menu, MenuAction action, int param1, int param2) { + if (action == MenuAction_Select) { + char info[16]; + menu.GetItem(param2, info, sizeof(info)); + char str[3][8]; + ExplodeString(info, "|", str, 3, 8, false); + int client = GetClientOfUserId(StringToInt(str[0])); + trollMode mode = view_as(StringToInt(str[1])); + int modifier = StringToInt(str[2]); + if(modifier == 2 || modifier == 3) + ApplyModeToClient(param1, client, mode, TrollMod_Repeat); + else + ApplyModeToClient(param1, client, mode, TrollMod_InstantFire); + } else if (action == MenuAction_End) + delete menu; +} + public void StopItemGive(int client) { g_bPendingItemGive[client] = false; } -public Action Event_WeaponReload(int weapon) { - int client = GetEntPropEnt(weapon, Prop_Send, "m_hOwner"); - if(HasTrollMode(client,Troll_GunJam)) { - float dec = GetRandomFloat(0.0, 1.0); - if(FloatCompare(dec, 0.50) == -1) { //10% chance gun jams - return Plugin_Stop; - } - } - return Plugin_Continue; -} -// #endregion -// #region timer +/////////////////////////////////////////////////////////////////////////////// +// TIMERS +/////////////////////////////////////////////////////////////////////////////// + public Action Timer_ThrowTimer(Handle timer) { int count = 0; for(int i = 1; i < MaxClients; i++) { @@ -467,16 +550,26 @@ public Action Timer_ThrowTimer(Handle timer) { } public Action Timer_Main(Handle timer) { static int loop; - for(int i = 1; i < MaxClients; i++) { + for(int i = 1; i <= MaxClients; i++) { if(IsClientConnected(i) && IsClientInGame(i) && IsPlayerAlive(i)) { - switch(g_iTrollUsers[i]) { - case Troll_SlowDrain: - if(loop % 4 == 0) { - int hp = GetClientHealth(i); - if(hp > 50) { - SetEntProp(i, Prop_Send, "m_iHealth", hp - 1); - } + if(HasTrollMode(i, Troll_SlowDrain)) { + if(loop % 4 == 0) { + int hp = GetClientHealth(i); + if(hp > 50) { + SetEntProp(i, Prop_Send, "m_iHealth", hp - 1); } + } + }else if(HasTrollMode(i, Troll_TempHealthQuickDrain)) { + if(loop % 2 == 0) { + float bufferTime = GetEntPropFloat(i, Prop_Send, "m_healthBufferTime"); + float buffer = GetEntPropFloat(i, Prop_Send, "m_healthBuffer"); + float tempHealth = GetTempHealth(i); + if(tempHealth > 0.0) { + PrintToConsole(i, "%f | %f %f", tempHealth, buffer, bufferTime); + //SetEntPropFloat(i, Prop_Send, "m_healthBuffer", buffer - 10.0); + SetEntPropFloat(i, Prop_Send, "m_healthBufferTime", bufferTime - 7.0); + } + } } } } @@ -486,7 +579,48 @@ public Action Timer_Main(Handle timer) { return Plugin_Continue; } +public Action Timer_AutoPunishCheck(Handle timer) { + int punished = GetClientOfUserId(autoPunished); + if(punished > 0) { + PrintToConsoleAll("Auto Punish | Player=%N", punished); + //Check flow distance, drop if needed. + return Plugin_Continue; + } + int farthestClient = -1, secondClient = -1; + float highestFlow, secondHighestFlow; + for(int i = 1; i <= MaxClients; i++) { + if(IsClientConnected(i) && IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 2) { + float flow = L4D2Direct_GetFlowDistance(i); + if(flow > highestFlow || farthestClient == -1) { + secondHighestFlow = highestFlow; + secondClient = farthestClient; + farthestClient = i; + highestFlow = flow; + } + } + } + //Incase the first player checked is the farthest: + if(secondClient == -1) { + for(int i = 1; i <= MaxClients; i++) { + if(IsClientConnected(i) && IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 2) { + float flow = L4D2Direct_GetFlowDistance(i); + if(farthestClient != i && ((flow < highestFlow && flow > secondHighestFlow) || secondClient == -1)) { + secondClient = i; + secondHighestFlow = flow; + } + } + } + } + float difference = highestFlow - secondHighestFlow; + PrintToConsoleAll("Flow Check | Player=%N Flow=%f Delta=%f", farthestClient, highestFlow, difference); + PrintToConsoleAll("Flow Check | Player2=%N Flow2=%f", secondClient, secondHighestFlow); + if(difference > AUTOPUNISH_FLOW_MIN_DISTANCE) { + autoPunished = GetClientUserId(farthestClient); + autoPunishMode = GetAutoPunishMode(); + } + return Plugin_Continue; +} public Action Timer_GivePistol(Handle timer, int client) { int flags = GetCommandFlags("give"); @@ -494,6 +628,7 @@ public Action Timer_GivePistol(Handle timer, int client) { FakeClientCommand(client, "give pistol"); SetCommandFlags("give", flags|FCVAR_CHEAT); } + public Action Timer_ThrowWeapon(Handle timer, Handle pack) { ResetPack(pack); float dest[3]; @@ -520,6 +655,9 @@ public Action Timer_ThrowWeapon(Handle timer, Handle pack) { } } +/////////////////////////////////////////////////////////////////////////////// +// METHODS +/////////////////////////////////////////////////////////////////////////////// void ThrowAllItems(int victim) { float vicPos[3], destPos[3]; @@ -548,23 +686,15 @@ void ThrowAllItems(int victim) { } } - -bool TestForTarget(int client, const char[] auth) { - char targets[32][8]; - char raw_targets[64]; - hVictimsList.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)) { - #if defined debug - PrintToServer("[Debug] Troll target detected with id %d and steamid %s", client, auth); - #endif - return true; - } +int GetAutoPunishMode() { + int number = 2 ^ GetRandomInt(0, AUTOPUNISH_MODE_COUNT - 1); + if(hAutoPunish.IntValue & number == 0) { + return GetAutoPunishMode(); + }else{ + return number; } - return false; } -// #endregion + stock int GetPrimaryReserveAmmo(int client) { int weapon = GetPlayerWeaponSlot(client, 0); if(weapon > -1) { @@ -585,7 +715,6 @@ stock bool SetPrimaryReserveAmmo(int client, int amount) { } } - stock void SendChatToAll(int client, const char[] message) { char nameBuf[MAX_NAME_LENGTH]; @@ -598,4 +727,36 @@ stock void SendChatToAll(int client, const char[] message) { FormatActivitySource(client, i, nameBuf, sizeof(nameBuf)); PrintToChat(i, "\x03 %s : \x01%s", nameBuf, message); } +} +stock float GetTempHealth(int client) { + //First filter -> Must be a valid client, successfully in-game and not an spectator (The dont have health). + if(!client || !IsValidEntity(client) || !IsClientInGame(client)|| !IsPlayerAlive(client) || IsClientObserver(client)) { + return -1.0; + } + + //If the client is not on the survivors team, then just return the normal client health. + if(GetClientTeam(client) != 2) { + return 0.0; + } + + //First, we get the amount of temporal health the client has + float buffer = GetEntPropFloat(client, Prop_Send, "m_healthBuffer"); + + //In case the buffer is 0 or less, we set the temporal health as 0, because the client has not used any pills or adrenaline yet + if(buffer > 0.0) { + //This is the difference between the time we used the temporal item, and the current time + float difference = GetGameTime() - GetEntPropFloat(client, Prop_Send, "m_healthBufferTime"); + + //We get the decay rate from this convar (Note: Adrenaline uses this value) + float decay = GetConVarFloat(FindConVar("pain_pills_decay_rate")); + + //This is a constant we create to determine the amount of health. This is the amount of time it has to pass + //before 1 Temporal HP is consumed. + float constant = 1.0 / decay; + + //Then we do the calcs + return buffer - (difference / constant); + }else{ + return 0.0; + } } \ No newline at end of file