From af9ae6113ce17cb55914f24a6a5f41b21f705a03 Mon Sep 17 00:00:00 2001 From: Jackz Date: Wed, 12 May 2021 17:56:25 -0500 Subject: [PATCH] ftt: Convert fully to new system --- scripting/include/ftt.inc | 348 ++++++++------------------------ scripting/l4d2_feedthetrolls.sp | 143 +++---------- 2 files changed, 120 insertions(+), 371 deletions(-) diff --git a/scripting/include/ftt.inc b/scripting/include/ftt.inc index cad2c5b..928aeed 100644 --- a/scripting/include/ftt.inc +++ b/scripting/include/ftt.inc @@ -1,94 +1,40 @@ #define AUTOPUNISH_FLOW_MIN_DISTANCE 5000.0 #define AUTOPUNISH_MODE_COUNT 3 -#define TROLL_MODE_COUNT 23 #define TROLL_NAME_MAX_LENGTH 64 -// + enum trollMode { - Troll_Reset = 0, //0 - Troll_SlowSpeed, //1 - Troll_HigherGravity, //2 - Troll_HalfPrimaryAmmo, //3 - Troll_UziRules, //4 - Troll_PrimaryDisable, //5 - Troll_SlowDrain, //6 - Troll_Clumsy, //7 - Troll_iCantSpellNoMore, //8 - Troll_CameTooEarly, //9 - Troll_KillMeSoftly, //10 - Troll_ThrowItAll, //11 - Troll_GunJam, //12 - Troll_NoPickup, //13 - Troll_Swarm, //14 - Troll_Honk, //15, //TODO: Modify sounds :) - Troll_SpecialMagnet, //16 - Troll_TankMagnet, //17 - Troll_NoShove, //18 - Troll_DamageBoost, //19 - Troll_TempHealthQuickDrain, //20 - Troll_VomitPlayer, //21 - Troll_VocalizeGag -} -enum TrollModifier { - TrollMod_None = 0, - TrollMod_InstantFire = 1, - TrollMod_Repeat = 2 -} -enum trollType { - Type_Constant = 1, - Type_Repeat = 2, - Type_Single = 4 + Troll_Reset = 0, + Troll_SlowSpeed, + Troll_HigherGravity, + Troll_HalfPrimaryAmmo, + Troll_UziRules, + Troll_PrimaryDisable, + Troll_SlowDrain, + Troll_Clumsy, + Troll_iCantSpellNoMore, + Troll_CameTooEarly, + Troll_KillMeSoftly, + Troll_ThrowItAll, + Troll_GunJam, + Troll_NoPickup, + Troll_Swarm, + Troll_Honk, + Troll_SpecialMagnet, + Troll_TankMagnet, + Troll_NoShove, + Troll_DamageBoost, + Troll_TempHealthQuickDrain, + Troll_VomitPlayer, + Troll_VocalizeGag, + Troll_TakePills } -char TROLL_MODES_NAMES[TROLL_MODE_COUNT][32] = { - "Reset User", //0 - "Slow Speed", //1 - "Higher Gravity", //2 - "Half Primary Ammo", //3 - "UziRules", //4 - "PrimaryDisable", //5 - "SlowDrain", //6 - "Clusmy", //7 - "iCantSpellNoMore", //8 - "CameTooEarly", //9 - "KillMeSoftly", //10 - "ThrowItAll", //11 - "GunJam", //12 - "NoPickup", - "Swarm", - "Honk", - "Special Magnet", - "Tank Magnet", - "No Shove", - "Damage Boost", - "Temp Quick Drain", - "Vomit Player", - "Vocalize Gag" -}; -char TROLL_MODES_DESCRIPTIONS[TROLL_MODE_COUNT][128] = { - "Resets the user, removes all troll effects", //0 - "Sets player speed to 0.8x of normal speed", //1 - "Sets player gravity to 1.3x of normal gravity", //2 - "Cuts their primary reserve ammo in half", //3 - "Picking up a weapon gives them a UZI instead", //4 - "Player cannot pickup any weapons, only melee/pistols", //5 - "Player slowly loses health", //6 - "Player drops axe periodically or on demand", //7 - "Chat messages letter will randomly changed with wrong letters ", //8 - "When they shoot, random chance they empty whole clip", //9 - "Make player eat or waste pills whenever possible", //10 - "Player throws all their items at nearby player, periodically", //11 - "On reload, small chance their gun gets jammed - Can't reload.", //12 - "Prevents a player from picking up ANY (new) item. Use ThrowItAll to make them drop", - "Swarms a player with zombies. Requires swarm plugin", - "Honk", - "Attracts ALL specials to any alive target with this troll enabled", - "Attracts ALL tanks to any alive target with this troll enabled", - "Prevents a player from shoving", - "Makes a player take more damage than normal", - "Makes a player's temporarily health drain very quickly", - "Shortcut to sm_vomitplayer. vomits the player.", - "Prevents player from sending any vocalizations (even automatic)" -}; +enum trollModifier { + Modifier_Auto = 0, + Modifier_Constant = 1, + Modifier_Repeat = 2, + Modifier_Single = 4 +} enum L4D2Infected { L4D2Infected_None = 0, @@ -164,9 +110,9 @@ void LoadTrolls() { //Parse the types of troll for(int i = 0; i < strlen(modifiers); i++) { - if(modifiers[i] == 's') troll.modifiers |= view_as(Type_Single); - else if(modifiers[i] == 'r') troll.modifiers |= view_as(Type_Repeat); - else if(modifiers[i] == 'c') troll.modifiers |= view_as(Type_Constant); + if(modifiers[i] == 's') troll.modifiers |= view_as(Modifier_Single); + else if(modifiers[i] == 'r') troll.modifiers |= view_as(Modifier_Repeat); + else if(modifiers[i] == 'c') troll.modifiers |= view_as(Modifier_Constant); } trolls.SetArray(troll.id, troll, sizeof(troll), true); ++loaded; @@ -176,18 +122,33 @@ void LoadTrolls() { PrintToServer("[FTT] Loaded %d trolls successfully", loaded); } -void GetTrollByIndex(int index, Troll troll) { - char key[TROLL_NAME_MAX_LENGTH]; - trollIds.GetKey(index, key, sizeof(key)); +void ApplyTrollByKey(const char[] key, int victim, int activator, trollModifier modifier, bool silent = false) { + Troll troll; trolls.GetArray(key, troll, sizeof(troll)); + ApplyTroll(troll, victim, activator, modifier, silent); } -void ApplyTroll(Troll troll, int victim, int activator, trollType modifier, bool silent = false) { +void ApplyTrollByIndex(int index, int victim, int activator, trollModifier modifier, bool silent = false) { + Troll troll; + GetTrollByIndex(index, troll); + ApplyTroll(troll, victim, activator, modifier, silent); +} + +void ApplyTroll(Troll troll, int victim, int activator, trollModifier modifier, bool silent = false) { if(GetClientTeam(victim) == 1) { //Victim is spectating, find its bot victim = FindIdlePlayerBot(victim); } + if(modifier == Modifier_Auto) { + if(troll.modifiers & view_as(Modifier_Single) == view_as(Modifier_Single)) + modifier = Modifier_Single; + else if(troll.modifiers & view_as(Modifier_Repeat) == view_as(Modifier_Repeat)) + modifier = Modifier_Repeat; + else + modifier = Modifier_Constant; + } + bool isActive = troll.IsTrolled(victim); if(StrEqual(troll.id, "reset")) { @@ -202,16 +163,16 @@ void ApplyTroll(Troll troll, int victim, int activator, trollType modifier, bool int current = GetPrimaryReserveAmmo(victim); SetPrimaryReserveAmmo(victim, current / 2); } else if(StrEqual(troll.id, "uzirules", true)) { - TurnOffTrollMode(victim, Troll_NoPickup); - TurnOffTrollMode(victim, Troll_PrimaryDisable); + TurnOffTrollByKey(victim, "nopickup"); + TurnOffTrollByKey(victim, "disable"); SDKHook(victim, SDKHook_WeaponCanUse, Event_ItemPickup); } else if(StrEqual(troll.id, "disable", true)) { - TurnOffTrollMode(victim, Troll_UziRules); - TurnOffTrollMode(victim, Troll_NoPickup); + TurnOffTrollByKey(victim, "uzirules"); + TurnOffTrollByKey(victim, "nopickup"); SDKHook(victim, SDKHook_WeaponCanUse, Event_ItemPickup); - } else if(StrEqual(troll.id, "drain", true)) { - TurnOffTrollMode(victim, Troll_UziRules); - TurnOffTrollMode(victim, Troll_PrimaryDisable); + } else if(StrEqual(troll.id, "nopickup", true)) { + TurnOffTrollByKey(victim, "uzirules"); + TurnOffTrollByKey(victim, "disable"); SDKHook(victim, SDKHook_WeaponCanUse, Event_ItemPickup); } else if(StrEqual(troll.id, "clumsy", true)) { int wpn = GetClientSecondaryWeapon(victim); @@ -247,9 +208,9 @@ void ApplyTroll(Troll troll, int victim, int activator, trollType modifier, bool //TODO: Implement TrollMod_Repeat return; } else if(StrEqual(troll.id, "throwitall", true)) { - if(modifier == Type_Single) + if(modifier == Modifier_Single) ThrowAllItems(victim); - if(hThrowTimer == INVALID_HANDLE && modifier == Type_Repeat) { + if(hThrowTimer == INVALID_HANDLE && modifier == Modifier_Repeat) { hThrowTimer = CreateTimer(hThrowItemInterval.FloatValue, Timer_ThrowTimer, _, TIMER_REPEAT); } } else if(StrEqual(troll.id, "gunjam", true)) { @@ -259,9 +220,9 @@ void ApplyTroll(Troll troll, int victim, int activator, trollType modifier, bool else ReplyToCommand(activator, "Victim does not have a primary weapon."); } else if(StrEqual(troll.id, "swarm", true)) { - if(modifier == Type_Single) { + if(modifier == Modifier_Single) { FakeClientCommandEx(activator, "sm_swarm #%d", victim); - }else if(modifier == Type_Repeat) { + }else if(modifier == Modifier_Repeat) { FakeClientCommandEx(activator, "sm_swarmtoggle #%d", victim); }else{ ReplyToCommand(activator, "Invalid modifier for mode."); @@ -269,13 +230,13 @@ void ApplyTroll(Troll troll, int victim, int activator, trollType modifier, bool } } else if(StrEqual(troll.id, "vomit", true)) L4D_CTerrorPlayer_OnVomitedUpon(victim, victim); - else if(modifier != Type_Single) { + else if(modifier != Modifier_Single) { ReplyToCommand(activator, "Troll you attempted to apply does not exist."); PrintToServer("Troll \"%s\" not implemented (%s)", troll.name, troll.id); return; } - if(modifier == Type_Constant || modifier == Type_Repeat) { + if(modifier == Modifier_Constant || modifier == Modifier_Constant) { troll.SetTrolled(victim, !isActive); } @@ -283,7 +244,7 @@ void ApplyTroll(Troll troll, int victim, int activator, trollType modifier, bool if(isActive) { ShowActivity(activator, "deactivated troll \"%s\" on %N. ", troll.name, victim); }else{ - if(modifier == Type_Repeat) + if(modifier == Modifier_Repeat) ShowActivity(activator, "activated troll \"%s\" on repeat for %N. ", troll.name, victim); else ShowActivity(activator, "activated troll \"%s\" for %N. ", troll.name, victim); @@ -291,6 +252,12 @@ void ApplyTroll(Troll troll, int victim, int activator, trollType modifier, bool } } +void GetTrollByIndex(int index, Troll troll) { + char key[TROLL_NAME_MAX_LENGTH]; + trollIds.GetKey(index, key, sizeof(key)); + trolls.GetArray(key, troll, sizeof(troll)); +} + void ClearAllTrolls(int client) { Troll troll; for(int i = 0; i < trollIds.Length; i++) { @@ -299,162 +266,25 @@ void ClearAllTrolls(int client) { } } -//Applies the selected trollMode to the victim. -//Modifiers are as followed: 0 -> Both (fire instant, and timer), 1 -> Fire Once, 2 -> Start timer -//TODO: change it to only modifier at once? at least for instant fire & repeat. Menu runs ApplyMode twice -void ApplyModeToClient(int client, int victim, trollMode mode, TrollModifier modifier, bool silent = false) { - ResetClient(victim, false); - if(view_as(mode) > TROLL_MODE_COUNT || view_as(mode) < 0) { - ReplyToCommand(client, "Unknown troll mode ID '%d'. Pick a mode between 1 and %d", mode, TROLL_MODE_COUNT - 1); - return; - } - - if(GetClientTeam(victim) == 1) { - //Victim is spectating, find its bot - victim = FindIdlePlayerBot(victim); - } - - //bool activating = !HasTrollMode(victim, mode); - switch(mode) { - case Troll_iCantSpellNoMore: {} - case Troll_Honk: {} - case Troll_TankMagnet: {} - case Troll_SpecialMagnet: {} - case Troll_NoShove: {} - case Troll_SlowDrain: {} - case Troll_TempHealthQuickDrain: {} - case Troll_VomitPlayer: { - L4D_CTerrorPlayer_OnVomitedUpon(victim, victim); - } - - case Troll_Reset: { - ShowActivity(client, "reset troll effects for %N. ", victim); - g_iTrollUsers[victim] = Troll_Reset; - return; - } - case Troll_SlowSpeed: - SetEntPropFloat(victim, Prop_Send, "m_flLaggedMovementValue", 0.8); - case Troll_HigherGravity: - SetEntityGravity(victim, 1.3); - case Troll_HalfPrimaryAmmo: { - //TODO: Implement modifier code - int current = GetPrimaryReserveAmmo(victim); - SetPrimaryReserveAmmo(victim, current / 2); - } - case Troll_UziRules: { - TurnOffTrollMode(victim, Troll_NoPickup); - TurnOffTrollMode(victim, Troll_PrimaryDisable); - SDKHook(victim, SDKHook_WeaponCanUse, Event_ItemPickup); - } - case Troll_PrimaryDisable: { - TurnOffTrollMode(victim, Troll_UziRules); - TurnOffTrollMode(victim, Troll_NoPickup); - SDKHook(victim, SDKHook_WeaponCanUse, Event_ItemPickup); - } - case Troll_NoPickup: { - TurnOffTrollMode(victim, Troll_UziRules); - TurnOffTrollMode(victim, Troll_PrimaryDisable); - SDKHook(victim, SDKHook_WeaponCanUse, Event_ItemPickup); - } - case Troll_Clumsy: { - //TODO: Implement modifier code - int wpn = GetClientSecondaryWeapon(victim); - bool hasMelee = DoesClientHaveMelee(victim); - if(hasMelee) { - float pos[3]; - int clients[4]; - GetClientAbsOrigin(victim, pos); - int clientCount = GetClientsInRange(pos, RangeType_Visibility, clients, sizeof(clients)); - for(int i = 0; i < clientCount; i++) { - if(clients[i] != victim) { - float targPos[3]; - GetClientAbsOrigin(clients[i], targPos); - SDKHooks_DropWeapon(victim, wpn, targPos); - g_iTrollUsers[victim] = mode; - CreateTimer(0.2, Timer_GivePistol); - return; - } - } - SDKHooks_DropWeapon(victim, wpn); - } - } - case Troll_CameTooEarly: - //TODO: Implement modifier code - ReplyToCommand(client, "This troll mode is not implemented."); - case Troll_KillMeSoftly: { - char wpn[32]; - GetClientWeaponName(victim, 4, wpn, sizeof(wpn)); - if(StrEqual(wpn, "weapon_adrenaline") || StrEqual(wpn, "weapon_pain_pills")) { - ClientCommand(victim, "slot5"); - g_bPendingItemGive[victim] = true; - }else{ - ReplyToCommand(client, "User does not have pills or adrenaline"); - return; - } - //TODO: Implement TrollMod_Repeat - return; - } - case Troll_ThrowItAll: { - if(modifier == TrollMod_InstantFire) - ThrowAllItems(victim); - if(hThrowTimer == INVALID_HANDLE && modifier == TrollMod_Repeat) { - PrintToServer("Created new throw item timer"); - hThrowTimer = CreateTimer(hThrowItemInterval.FloatValue, Timer_ThrowTimer, _, TIMER_REPEAT); - } - } - case Troll_Swarm: { - if(modifier == TrollMod_InstantFire) { - FakeClientCommandEx(client, "sm_swarm #%d", victim); - }else if(modifier == TrollMod_Repeat) { - FakeClientCommandEx(client, "sm_swarmtoggle #%d", victim); - }else{ - ReplyToCommand(client, "Invalid modifier for mode."); - return; - } - } - case Troll_GunJam: { - int wpn = GetClientWeaponEntIndex(victim, 0); - if(wpn > -1) - SDKHook(wpn, SDKHook_Reload, Event_WeaponReload); - else - ReplyToCommand(client, "Victim does not have a primary weapon."); - } default: { - ReplyToCommand(client, "This trollMode is not implemented."); - PrintToServer("Troll Mode #%d not implemented (%s)", mode, TROLL_MODES_NAMES[mode]); - } - } - if(!silent) { - if(HasTrollMode(victim, mode)) { - ShowActivity(client, "deactivated troll \"%s\" on %N. ", TROLL_MODES_NAMES[mode], victim); - }else{ - if(modifier == TrollMod_Repeat) - ShowActivity(client, "activated troll \"%s\" on repeat for %N. ", TROLL_MODES_NAMES[mode], victim); - else - ShowActivity(client, "activated troll \"%s\" for %N. ", TROLL_MODES_NAMES[mode], victim); - } - } - //If instant fire mod not provided (aka instead of no modifiers which equals both) OR repeat turned on, set bit: - if(modifier == TrollMod_Repeat || modifier == TrollMod_None) { - g_iTrollUsers[victim] ^= 1 << view_as(mode) -1; - } +void TurnOffTrollByKey(int client, const char[] key) { + Troll troll; + trolls.GetArray(key, troll, sizeof(troll)); + troll.players[client] = false; } -bool HasTrollMode(int client, trollMode mode) { - return ((g_iTrollUsers[client] >> view_as(mode) - 1) & 1) == 1; +void TurnOffTrollByIndex(int client, int index) { + Troll troll; + GetTrollByIndex(index, troll); + troll.players[client] = false; } -void ToggleTrollMode(int client, trollMode mode) { - g_iTrollUsers[client] ^= 1 << view_as(mode) -1; -} - -void TurnOffTrollMode(int client, trollMode mode) { - if(HasTrollMode(client, mode)) { - ToggleTrollMode(client, mode); - } +bool HasTroll(int client, int index) { + Troll troll; + GetTrollByIndex(index, troll); + return troll.players[client]; } void ResetClient(int victim, bool wipe = true) { - if(wipe) g_iTrollUsers[victim] = Troll_Reset; SetEntityGravity(victim, 1.0); SetEntPropFloat(victim, Prop_Send, "m_flLaggedMovementValue", 1.0); SDKUnhook(victim, SDKHook_WeaponCanUse, Event_ItemPickup); @@ -465,13 +295,13 @@ void ResetClient(int victim, bool wipe = true) { void ActivateAutoPunish(int client) { if(hAutoPunish.IntValue & 2 == 2) - ApplyModeToClient(0, lastButtonUser, Troll_SpecialMagnet, TrollMod_None); + ApplyTrollByKey("specialmagnet", lastButtonUser, 0, Modifier_Constant); if(hAutoPunish.IntValue & 1 == 1) - ApplyModeToClient(0, lastButtonUser, Troll_TankMagnet, TrollMod_None); + ApplyTrollByKey("tankmagnet", lastButtonUser, 0, Modifier_Constant); if(hAutoPunish.IntValue & 8 == 8) - ApplyModeToClient(0, lastButtonUser, Troll_VomitPlayer, TrollMod_None); + ApplyTrollByKey("vomit", lastButtonUser, 0, Modifier_Single); else if(hAutoPunish.IntValue & 4 == 4) - ApplyModeToClient(0, lastButtonUser, Troll_Swarm, TrollMod_None); + ApplyTrollByKey("swarm", lastButtonUser, 0, Modifier_Single); if(hAutoPunishExpire.IntValue > 0) { CreateTimer(60.0 * hAutoPunishExpire.FloatValue, Timer_ResetAutoPunish, GetClientOfUserId(lastButtonUser)); diff --git a/scripting/l4d2_feedthetrolls.sp b/scripting/l4d2_feedthetrolls.sp index e2e4595..33f6445 100644 --- a/scripting/l4d2_feedthetrolls.sp +++ b/scripting/l4d2_feedthetrolls.sp @@ -118,7 +118,7 @@ public Action Event_PlayerDeath(Event event, const char[] name, bool dontBroadca } public Action Event_WeaponReload(int weapon) { int client = GetEntPropEnt(weapon, Prop_Send, "m_hOwner"); - if(HasTrollMode(client,Troll_GunJam)) { + if(HasTroll(client, Troll_GunJam)) { float dec = GetRandomFloat(0.0, 1.0); if(FloatCompare(dec, 0.50) == -1) { //10% chance gun jams return Plugin_Stop; @@ -166,7 +166,7 @@ public Action L4D2_OnChooseVictim(int attacker, int &curTarget) { 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))) { + if(class == L4D2Infected_Tank && HasTroll(i, Troll_TankMagnet) || (class != L4D2Infected_Tank && HasTroll(i, Troll_SpecialMagnet))) { GetClientAbsOrigin(i, survPos); float dist = GetVectorDistance(survPos, spPos, true); if(closestClient == -1 || dist < closestDistance) { @@ -185,13 +185,13 @@ public Action L4D2_OnChooseVictim(int attacker, int &curTarget) { 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()) { + if(client > 0 && client <= MaxClients && HasTroll(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_Honk)) { + if(HasTroll(client, Troll_Honk)) { char strings[32][7]; int words = ExplodeString(sArgs, " ", strings, sizeof(strings), 5); for(int i = 0; i < words; i++) { @@ -204,8 +204,8 @@ public Action OnClientSayCommand(int client, const char[] command, const char[] CPrintToChatAll("{blue}%N {default}: %s", client, message); PrintToServer("%N: %s", client, sArgs); return Plugin_Handled; - }else if(HasTrollMode(client, Troll_iCantSpellNoMore)) { - int type = GetRandomInt(1, TROLL_MODE_COUNT + 8); + }else if(HasTroll(client, Troll_iCantSpellNoMore)) { + int type = GetRandomInt(1, trolls.Size + 8); char letterSrc, replaceChar; switch(type) { case 1: { @@ -282,7 +282,7 @@ public Action OnClientSayCommand(int client, const char[] command, const char[] return Plugin_Continue; } public Action Event_ItemPickup(int client, int weapon) { - if(HasTrollMode(client,Troll_NoPickup)) { + if(HasTroll(client, Troll_NoPickup)) { return Plugin_Stop; }else{ char wpnName[64]; @@ -294,7 +294,7 @@ public Action Event_ItemPickup(int client, int weapon) { || StrContains(wpnName, "shotgun") > -1 ) { //If 4: Only UZI, if 5: Can't switch. - if(HasTrollMode(client,Troll_UziRules)) { + if(HasTroll(client, Troll_UziRules)) { char currentWpn[32]; GetClientWeaponName(client, 0, currentWpn, sizeof(currentWpn)); if(StrEqual(wpnName, "weapon_smg", true)) { @@ -308,7 +308,7 @@ public Action Event_ItemPickup(int client, int weapon) { SetCommandFlags("give", flags|FCVAR_CHEAT); return Plugin_Stop; } - }else if(HasTrollMode(client,Troll_PrimaryDisable)) { + }else if(HasTroll(client, Troll_PrimaryDisable)) { return Plugin_Stop; } return Plugin_Continue; @@ -337,7 +337,7 @@ public Action Event_TakeDamage(int victim, int& attacker, int& inflictor, float& return Plugin_Stop; } - if(HasTrollMode(attacker, Troll_DamageBoost)) { + if(HasTroll(attacker, Troll_DamageBoost)) { damage * 2; return Plugin_Changed; } @@ -360,10 +360,10 @@ public Action SoundHook(int[] clients, int& numClients, char sample[PLATFORM_MAX lastButtonUser = -1; }else if(numClients > 0 && entity > 0 && entity <= MaxClients) { if(StrContains(sample, "survivor/voice") > -1) { - if(HasTrollMode(entity, Troll_Honk)) { + if(HasTroll(entity, Troll_Honk)) { strcopy(sample, sizeof(sample), "player/footsteps/clown/concrete1.wav"); return Plugin_Changed; - } else if(HasTrollMode(entity, Troll_VocalizeGag)) { + } else if(HasTroll(entity, Troll_VocalizeGag)) { return Plugin_Stop; } } @@ -438,18 +438,7 @@ public Action Command_ResetUser(int client, int args) { //TODO: Add SurvivorBot magnet 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); + ReplyToCommand(client, "Please use sm_ftt for the time being"); }else{ char arg1[32], arg2[32], arg3[8]; GetCmdArg(1, arg1, sizeof(arg1)); @@ -482,7 +471,8 @@ public Action Command_ApplyUser(int client, int args) { 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, silent); + ApplyTrollByIndex(mode, target_list[i], client, Modifier_Auto, silent); + //TODO: Do a menu } } } @@ -524,7 +514,7 @@ public Action Command_ListTheTrolls(int client, int args) { public Action Command_MarkPendingTroll(int client, int args) { if(args == 0) { - Menu menu = new Menu(ChooseMarkedTroll); + Menu menu = new Menu(Menu_ChooseMarkedTroll); menu.SetTitle("Choose a troll to mark"); char userid[8], display[16]; for(int i = 1; i < MaxClients; i++) { @@ -602,7 +592,7 @@ public Action Command_ApplyTroll(int client, int args) { // MENU HANDLER /////////////////////////////////////////////////////////////////////////////// -public int ChooseMarkedTroll(Menu menu, MenuAction action, int activator, int param2) { +public int Menu_ChooseMarkedTroll(Menu menu, MenuAction action, int activator, int param2) { if (action == MenuAction_Select) { char info[16]; menu.GetItem(param2, info, sizeof(info)); @@ -612,77 +602,6 @@ public int ChooseMarkedTroll(Menu menu, MenuAction action, int activator, int pa delete menu; } -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; -} - -///NEW FTT COMMAND MENU HANDLING: public int Menu_ChoosePlayer(Menu menu, MenuAction action, int activator, int item) { if (action == MenuAction_Select) { char info[8]; @@ -732,13 +651,13 @@ public int Menu_ChooseCategory(Menu menu, MenuAction action, int activator, int int targetUserid = StringToInt(str[0]); //Check category type - trollType selectedType; + trollModifier selectedMod; if(StrEqual(str[1], "s", true)) { - selectedType = Type_Single; + selectedMod = Modifier_Single; }else if(StrEqual(str[1], "r", true)) { - selectedType = Type_Repeat; + selectedMod = Modifier_Repeat; }else if(StrEqual(str[1], "c", true)) { - selectedType = Type_Constant; + selectedMod = Modifier_Constant; }else if(StrEqual(str[1], "x", true)) { int client = GetClientOfUserId(targetUserid); ClearAllTrolls(client); @@ -755,8 +674,8 @@ public int Menu_ChooseCategory(Menu menu, MenuAction action, int activator, int Troll troll; trollIds.GetKey(i, key, sizeof(key)); trolls.GetArray(key, troll, sizeof(troll)); - if(troll.modifiers & view_as(selectedType) == view_as(selectedType)) { - Format(itemId, sizeof(itemId), "%d|%d|%d", targetUserid, i, selectedType); + if(troll.modifiers & view_as(selectedMod) == view_as(selectedMod)) { + Format(itemId, sizeof(itemId), "%d|%d|%d", targetUserid, i, selectedMod); trollsMenu.AddItem(itemId, troll.name); } } @@ -776,20 +695,20 @@ public int Menu_ChooseTroll(Menu menu, MenuAction action, int activator, int ite int targetUserid = StringToInt(str[0]); int trollIndex = StringToInt(str[1]); - trollType type = view_as(StringToInt(str[2])); + trollModifier modifier = view_as(StringToInt(str[2])); Troll troll; GetTrollByIndex(trollIndex, troll); if(targetUserid == -1) { for(int i = 1; i <= MaxClients; i++) { if(IsClientConnected(i) && IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(i) == 2) { - ApplyTroll(troll, i, activator, type); + ApplyTroll(troll, i, activator, modifier); } } }else{ int victim = GetClientOfUserId(targetUserid); if(victim > 0) - ApplyTroll(troll, victim, activator, type); + ApplyTroll(troll, victim, activator, modifier); else ReplyToCommand(activator, "That client is no longer valid."); } @@ -809,7 +728,7 @@ public void StopItemGive(int client) { public Action Timer_ThrowTimer(Handle timer) { int count = 0; for(int i = 1; i < MaxClients; i++) { - if(IsClientConnected(i) && IsClientInGame(i) && IsPlayerAlive(i) &&HasTrollMode(i,Troll_ThrowItAll)) { + if(IsClientConnected(i) && IsClientInGame(i) && IsPlayerAlive(i) && HasTroll(i, Troll_ThrowItAll)) { ThrowAllItems(i); count++; } @@ -820,14 +739,14 @@ public Action Timer_Main(Handle timer) { static int loop; for(int i = 1; i <= MaxClients; i++) { if(IsClientConnected(i) && IsClientInGame(i) && IsPlayerAlive(i)) { - if(HasTrollMode(i, Troll_SlowDrain)) { + if(HasTroll(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)) { + }else if(HasTroll(i, Troll_TempHealthQuickDrain)) { if(loop % 2 == 0) { float bufferTime = GetEntPropFloat(i, Prop_Send, "m_healthBufferTime"); float buffer = GetEntPropFloat(i, Prop_Send, "m_healthBuffer"); @@ -884,9 +803,9 @@ public Action Timer_ResetAutoPunish(Handle timer, int user) { int client = GetClientOfUserId(user); if(client) { if(hAutoPunish.IntValue & 2 == 2) - TurnOffTrollMode(client, Troll_SpecialMagnet); + TurnOffTrollByIndex(client, Troll_SpecialMagnet); if(hAutoPunish.IntValue & 1 == 1) - TurnOffTrollMode(client, Troll_TankMagnet); + TurnOffTrollByIndex(client, Troll_TankMagnet); } }