l4d2_feedthetrolls: Refactor into full enum usage. Hopefully it doesnt explode

This commit is contained in:
Jackzie 2020-12-30 17:33:31 -06:00
parent 9eb2f6c576
commit a474a3c1fc
No known key found for this signature in database
GPG key ID: 1E834FE36520537A
2 changed files with 50 additions and 16 deletions

Binary file not shown.

View file

@ -28,8 +28,8 @@
11 -> ThrowItAll (Makes player just throw all their items at a nearby player, and periodically) 11 -> ThrowItAll (Makes player just throw all their items at a nearby player, and periodically)
*/ */
#define TROLL_MODE_COUNT 13 #define TROLL_MODE_COUNT 13
enum TROLL_MODE { enum TrollMode {
Troll_ResetUser, //0 Troll_Reset, //0
Troll_SlowSpeed, //1 Troll_SlowSpeed, //1
Troll_HigherGravity, //2 Troll_HigherGravity, //2
Troll_HalfPrimaryAmmo, //3 Troll_HalfPrimaryAmmo, //3
@ -88,7 +88,7 @@ bool bTrollTargets[MAXPLAYERS+1], lateLoaded;
int iTrollMode = 0; //troll mode. 0 -> Slosdown | 1 -> Higher Gravity | 2 -> CameTooEarly | 3 -> UziRules int iTrollMode = 0; //troll mode. 0 -> Slosdown | 1 -> Higher Gravity | 2 -> CameTooEarly | 3 -> UziRules
int g_iAmmoTable; int g_iAmmoTable;
int iTrollUsers[MAXPLAYERS+1]; TrollMode iTrollUsers[MAXPLAYERS+1];
int gChargerVictim = -1; int gChargerVictim = -1;
bool bChooseVictimAvailable = false; bool bChooseVictimAvailable = false;
@ -227,7 +227,7 @@ public Action Command_ApplyUser(int client, int args) {
for (int i = 0; i < target_count; i++) for (int i = 0; i < target_count; i++)
{ {
if(GetClientTeam(target_list[i]) == 2) if(GetClientTeam(target_list[i]) == 2)
ApplyModeToClient(client, target_list[i], mode, false); ApplyModeToClient(client, target_list[i], view_as<TrollMode>(mode), false);
} }
} }
} }
@ -242,8 +242,8 @@ public Action Command_ListModes(int client, int args) {
public Action Command_ListTheTrolls(int client, int args) { public Action Command_ListTheTrolls(int client, int args) {
int count = 0; int count = 0;
for(int i = 1; i < MaxClients; i++) { for(int i = 1; i < MaxClients; i++) {
if(IsClientConnected(i) && IsPlayerAlive(i) && iTrollUsers[i] > 0) { if(IsClientConnected(i) && IsPlayerAlive(i) && view_as<int>(iTrollUsers[i]) > 0) {
int mode = iTrollUsers[i]; TrollMode mode = iTrollUsers[i];
ReplyToCommand(client, "%N | Mode %s (#%d)", i, TROLL_MODES_NAMES[mode], mode); ReplyToCommand(client, "%N | Mode %s (#%d)", i, TROLL_MODES_NAMES[mode], mode);
count++; count++;
} }
@ -280,11 +280,43 @@ public int ChooseModeMenuHandler(Menu menu, MenuAction action, int param1, int p
char str[2][8]; char str[2][8];
ExplodeString(info, "|", str, 2, 8, false); ExplodeString(info, "|", str, 2, 8, false);
int client = GetClientOfUserId(StringToInt(str[0])); int client = GetClientOfUserId(StringToInt(str[0]));
int mode = StringToInt(str[1]); TrollMode mode = view_as<TrollMode>(StringToInt(str[1]));
ApplyModeToClient(param1, client, mode, false); //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
) {
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");
Format(multiUse, sizeof(multiUse), "%d|%d|2");
Format(bothUse, sizeof(bothUse), "%d|%d|0");
menu.AddItem(singleUse, "Activate once");
menu.AddItem(multiUse, "Activate Periodically");
menu.AddItem(bothUse, "Activate Periodically & Instantly");
modiferMenu.ExitButton = true;
modiferMenu.Display(param1, 0);
} else {
ApplyModeToClient(param1, client, mode, 0);
}
} else if (action == MenuAction_End) } else if (action == MenuAction_End)
delete menu; 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<TrollMode>(StringToInt(str[1]));
int modifier = StringToInt(str[2]);
ApplyModeToClient(param1, client, mode, modifier);
} else if (action == MenuAction_End)
delete menu;
}
public Action Event_ItemPickup(int client, int weapon) { public Action Event_ItemPickup(int client, int weapon) {
char wpnName[64]; char wpnName[64];
GetEdictClassname(weapon, wpnName, sizeof(wpnName)); GetEdictClassname(weapon, wpnName, sizeof(wpnName));
@ -295,7 +327,7 @@ public Action Event_ItemPickup(int client, int weapon) {
|| StrContains(wpnName, "shotgun") > -1 || StrContains(wpnName, "shotgun") > -1
) { ) {
//If 4: Only UZI, if 5: Can't switch. //If 4: Only UZI, if 5: Can't switch.
if(iTrollUsers[client] == view_as<int>(Troll_UziRules)) { if(iTrollUsers[client] == Troll_UziRules) {
char currentWpn[32]; char currentWpn[32];
GetClientWeaponName(client, 0, currentWpn, sizeof(currentWpn)); GetClientWeaponName(client, 0, currentWpn, sizeof(currentWpn));
if(StrEqual(wpnName, "weapon_smg", true)) { if(StrEqual(wpnName, "weapon_smg", true)) {
@ -309,7 +341,7 @@ public Action Event_ItemPickup(int client, int weapon) {
SetCommandFlags("give", flags|FCVAR_CHEAT); SetCommandFlags("give", flags|FCVAR_CHEAT);
return Plugin_Stop; return Plugin_Stop;
} }
}else if(iTrollUsers[client] == view_as<int>(Troll_PrimaryDisable)) { }else if(iTrollUsers[client] == Troll_PrimaryDisable) {
return Plugin_Stop; return Plugin_Stop;
} }
return Plugin_Continue; return Plugin_Continue;
@ -319,7 +351,7 @@ public Action Event_ItemPickup(int client, int weapon) {
} }
public Action Event_WeaponReload(int weapon) { public Action Event_WeaponReload(int weapon) {
int client = GetEntPropEnt(weapon, Prop_Send, "m_hOwner"); int client = GetEntPropEnt(weapon, Prop_Send, "m_hOwner");
if(iTrollUsers[client] == view_as<int>(Troll_GunJam)) { if(iTrollUsers[client] == Troll_GunJam) {
float dec = GetRandomFloat(0.0, 1.0); float dec = GetRandomFloat(0.0, 1.0);
if(FloatCompare(dec, 0.10) == -1) { //10% chance gun jams if(FloatCompare(dec, 0.10) == -1) { //10% chance gun jams
return Plugin_Stop; return Plugin_Stop;
@ -332,7 +364,7 @@ public Action Event_WeaponReload(int weapon) {
public Action Timer_ThrowTimer(Handle timer) { public Action Timer_ThrowTimer(Handle timer) {
int count = 0; int count = 0;
for(int i = 1; i < MaxClients; i++) { for(int i = 1; i < MaxClients; i++) {
if(IsClientConnected(i) && IsClientInGame(i) && IsPlayerAlive(i) && iTrollUsers[i] == 11) { if(IsClientConnected(i) && IsClientInGame(i) && IsPlayerAlive(i) && iTrollUsers[i] == Troll_ThrowItAll) {
ThrowAllItems(i); ThrowAllItems(i);
count++; count++;
} }
@ -359,9 +391,11 @@ public Action Timer_Main(Handle timer) {
} }
return Plugin_Continue; return Plugin_Continue;
} }
void ApplyModeToClient(int client, int victim, int mode, bool single) { //Applies the selected TrollMode to the victim.
//Modifiers are as followed: 0 -> Both (fire instant, and timer), 1 -> Fire Once, 2 -> Start timer
void ApplyModeToClient(int client, int victim, TrollMode mode, int modifier) {
ResetClient(victim); ResetClient(victim);
if(mode > TROLL_MODE_COUNT || mode < 0) { if(view_as<int>(mode) > TROLL_MODE_COUNT || view_as<int>(mode) < 0) {
ReplyToCommand(client, "Unknown troll mode ID '%d'. Pick a mode between 1 and %d", mode, TROLL_MODE_COUNT - 1); ReplyToCommand(client, "Unknown troll mode ID '%d'. Pick a mode between 1 and %d", mode, TROLL_MODE_COUNT - 1);
return; return;
} }
@ -404,7 +438,7 @@ void ApplyModeToClient(int client, int victim, int mode, bool single) {
ReplyToCommand(client, "This troll mode is not implemented."); ReplyToCommand(client, "This troll mode is not implemented.");
case Troll_ThrowItAll: { case Troll_ThrowItAll: {
ThrowAllItems(victim); ThrowAllItems(victim);
if(hThrowTimer == INVALID_HANDLE && !single) { if(hThrowTimer == INVALID_HANDLE && modifier != 2) {
PrintToServer("Created new throw item timer"); PrintToServer("Created new throw item timer");
hThrowTimer = CreateTimer(hThrowItemInterval.FloatValue, Timer_ThrowTimer, _, TIMER_REPEAT); hThrowTimer = CreateTimer(hThrowItemInterval.FloatValue, Timer_ThrowTimer, _, TIMER_REPEAT);
} }
@ -457,7 +491,7 @@ public Action Timer_ThrowWeapon(Handle timer, Handle pack) {
} }
void ResetClient(int victim) { void ResetClient(int victim) {
iTrollUsers[victim] = 0; iTrollUsers[victim] = Troll_Reset;
SetEntityGravity(victim, 1.0); SetEntityGravity(victim, 1.0);
SetEntPropFloat(victim, Prop_Send, "m_flLaggedMovementValue", 1.0); SetEntPropFloat(victim, Prop_Send, "m_flLaggedMovementValue", 1.0);
SDKUnhook(victim, SDKHook_WeaponCanUse, Event_ItemPickup); SDKUnhook(victim, SDKHook_WeaponCanUse, Event_ItemPickup);