mirror of
https://github.com/Jackzmc/sourcemod-plugins.git
synced 2025-05-06 16:43:21 +00:00
l4d2_feedthetrolls: Minor cleanup
This commit is contained in:
parent
e5e7876bde
commit
e18e59689b
3 changed files with 43 additions and 57 deletions
Binary file not shown.
|
@ -56,7 +56,8 @@ char TROLL_MODES_DESCRIPTIONS[TROLL_MODE_COUNT][128] = {
|
||||||
"Prevents a player from picking up ANY (new) item. Use ThrowItAll to make them drop",
|
"Prevents a player from picking up ANY (new) item. Use ThrowItAll to make them drop",
|
||||||
"Swarms a player with zombies. Requires swarm plugin"
|
"Swarms a player with zombies. Requires swarm plugin"
|
||||||
};
|
};
|
||||||
int iTrollUsers[MAXPLAYERS+1];
|
int g_iTrollUsers[MAXPLAYERS+1];
|
||||||
|
bool g_bPendingItemGive[MAXPLAYERS+1];
|
||||||
|
|
||||||
//Applies the selected trollMode to the victim.
|
//Applies the selected trollMode to the victim.
|
||||||
//Modifiers are as followed: 0 -> Both (fire instant, and timer), 1 -> Fire Once, 2 -> Start timer
|
//Modifiers are as followed: 0 -> Both (fire instant, and timer), 1 -> Fire Once, 2 -> Start timer
|
||||||
|
@ -70,9 +71,11 @@ void ApplyModeToClient(int client, int victim, trollMode mode, TrollModifer modi
|
||||||
bool hasActivationMod = (modifiers & ~TrollMod_InstantFire & ~TrollMod_Repeat) == TrollMod_None;
|
bool hasActivationMod = (modifiers & ~TrollMod_InstantFire & ~TrollMod_Repeat) == TrollMod_None;
|
||||||
|
|
||||||
switch(mode) {
|
switch(mode) {
|
||||||
|
case Troll_iCantSpellNoMore: {}
|
||||||
|
|
||||||
case Troll_Reset: {
|
case Troll_Reset: {
|
||||||
ShowActivity(client, "reset troll effects for %N. ", victim);
|
ShowActivity(client, "reset troll effects for %N. ", victim);
|
||||||
iTrollUsers[victim] = Troll_Reset;
|
g_iTrollUsers[victim] = Troll_Reset;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case Troll_SlowSpeed:
|
case Troll_SlowSpeed:
|
||||||
|
@ -113,7 +116,7 @@ void ApplyModeToClient(int client, int victim, trollMode mode, TrollModifer modi
|
||||||
float targPos[3];
|
float targPos[3];
|
||||||
GetClientAbsOrigin(clients[i], targPos);
|
GetClientAbsOrigin(clients[i], targPos);
|
||||||
SDKHooks_DropWeapon(victim, wpn, targPos);
|
SDKHooks_DropWeapon(victim, wpn, targPos);
|
||||||
iTrollUsers[victim] = mode;
|
g_iTrollUsers[victim] = mode;
|
||||||
CreateTimer(0.2, Timer_GivePistol);
|
CreateTimer(0.2, Timer_GivePistol);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -124,6 +127,19 @@ void ApplyModeToClient(int client, int victim, trollMode mode, TrollModifer modi
|
||||||
case Troll_CameTooEarly:
|
case Troll_CameTooEarly:
|
||||||
//TODO: Implement modifier code
|
//TODO: Implement modifier code
|
||||||
ReplyToCommand(client, "This troll mode is not implemented.");
|
ReplyToCommand(client, "This troll mode is not implemented.");
|
||||||
|
case Troll_KillMeSoftly: {
|
||||||
|
char wpn[32];
|
||||||
|
GetClientWeaponName(victim, 4, wpn, sizeof(wpn));
|
||||||
|
if(StrEqual(wpn, "weapon_adrendaline") || StrEqual(wpn, "weapon_pain_pills")) {
|
||||||
|
ClientCommand(victim, "slot5");
|
||||||
|
g_bPendingItemGive[victim] = true;
|
||||||
|
}else{
|
||||||
|
ReplyToCommand(client, "User does not have pills or adrendaline");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//TODO: Implement TrollMod_Repeat
|
||||||
|
return;
|
||||||
|
}
|
||||||
case Troll_ThrowItAll: {
|
case Troll_ThrowItAll: {
|
||||||
if(!hasActivationMod || (modifiers | TrollMod_InstantFire) == TrollMod_InstantFire)
|
if(!hasActivationMod || (modifiers | TrollMod_InstantFire) == TrollMod_InstantFire)
|
||||||
ThrowAllItems(victim);
|
ThrowAllItems(victim);
|
||||||
|
@ -157,16 +173,16 @@ void ApplyModeToClient(int client, int victim, trollMode mode, TrollModifer modi
|
||||||
ShowActivity(client, "activated troll mode \"%s\" on %N. ", TROLL_MODES_NAMES[mode], victim);
|
ShowActivity(client, "activated troll mode \"%s\" on %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 instant fire mod not provided (aka instead of no modifiers which equals both) OR repeat turned on, set bit:
|
||||||
if((modifiers | TrollMod_InstantFire) != TrollMod_InstantFire || ((modifiers | TrollMod_Repeat) == TrollMod_Repeat)) {
|
if((modifiers | TrollMod_InstantFire) != TrollMod_InstantFire || ((modifiers | TrollMod_Repeat) == TrollMod_Repeat)) {
|
||||||
iTrollUsers[victim] |= 1 << (view_as<int>(mode) - 1);
|
g_iTrollUsers[victim] |= 1 << (view_as<int>(mode) - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HasTrollMode(int client, trollMode mode) {
|
bool HasTrollMode(int client, trollMode mode) {
|
||||||
return ((iTrollUsers[client] >> view_as<int>(mode) - 1) & 1) == 1;
|
return ((g_iTrollUsers[client] >> view_as<int>(mode) - 1) & 1) == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ToggleTrollMode(int client, trollMode mode) {
|
void ToggleTrollMode(int client, trollMode mode) {
|
||||||
iTrollUsers[client] ^= 1 << view_as<int>(mode) -1;
|
g_iTrollUsers[client] ^= 1 << view_as<int>(mode) -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TurnOffTrollMode(int client, trollMode mode) {
|
void TurnOffTrollMode(int client, trollMode mode) {
|
||||||
|
@ -176,7 +192,7 @@ void TurnOffTrollMode(int client, trollMode mode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResetClient(int victim, bool wipe = true) {
|
void ResetClient(int victim, bool wipe = true) {
|
||||||
if(wipe) iTrollUsers[victim] = Troll_Reset;
|
if(wipe) g_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);
|
||||||
|
|
|
@ -26,15 +26,17 @@ public Plugin myinfo =
|
||||||
version = PLUGIN_VERSION,
|
version = PLUGIN_VERSION,
|
||||||
url = ""
|
url = ""
|
||||||
};
|
};
|
||||||
|
//HANDLES
|
||||||
Handle hThrowTimer;
|
Handle hThrowTimer;
|
||||||
|
//CONVARS
|
||||||
ConVar hVictimsList, hThrowItemInterval, hAutoPunish;
|
ConVar hVictimsList, hThrowItemInterval, hAutoPunish;
|
||||||
bool bTrollTargets[MAXPLAYERS+1], lateLoaded;
|
//BOOLS
|
||||||
int itrollMode = 0; //troll mode. 0 -> Slosdown | 1 -> Higher Gravity | 2 -> CameTooEarly | 3 -> UziRules
|
bool lateLoaded; //Is plugin late loaded
|
||||||
|
bool bChooseVictimAvailable = false; //For charge player feature, is it available?
|
||||||
|
//INTEGERS
|
||||||
|
int g_iAmmoTable; //Loads the ammo table to get ammo amounts
|
||||||
|
int gChargerVictim = -1; //For charge player feature
|
||||||
|
|
||||||
int g_iAmmoTable;
|
|
||||||
int gChargerVictim = -1;
|
|
||||||
|
|
||||||
bool bChooseVictimAvailable = false;
|
|
||||||
|
|
||||||
#include "feedthetrolls.inc"
|
#include "feedthetrolls.inc"
|
||||||
|
|
||||||
|
@ -59,23 +61,28 @@ public void OnPluginStart() {
|
||||||
hVictimsList.AddChangeHook(Change_VictimList);
|
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 = 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);
|
hThrowItemInterval.AddChangeHook(Change_ThrowInterval);
|
||||||
hAutoPunish = CreateConVar("sm_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_mode", "0", "Setup automatic punishment of players. Add bits together. 0: Disabled, 1: Early Crescendos", FCVAR_NONE, true, 0.0);
|
||||||
|
|
||||||
RegAdminCmd("sm_ftl", Command_ListTheTrolls, ADMFLAG_ROOT, "Lists all the trolls currently ingame.");
|
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_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_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_fta", Command_ApplyUser, ADMFLAG_ROOT, "Apply a troll mod to a player, or shows menu if no parameters.");
|
||||||
|
|
||||||
|
AutoExecConfig(true, "l4d2_feedthetrolls");
|
||||||
|
|
||||||
if(lateLoaded) {
|
if(lateLoaded) {
|
||||||
UpdateTrollTargets();
|
|
||||||
CreateTimer(MAIN_TIMER_INTERVAL_S, Timer_Main, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
|
CreateTimer(MAIN_TIMER_INTERVAL_S, Timer_Main, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
|
||||||
|
HookEntityOutput("func_button", "OnPressed", Event_ButtonPress);
|
||||||
}
|
}
|
||||||
HookEntityOutput("func_button", "OnPressed", Event_ButtonPress);
|
|
||||||
}
|
}
|
||||||
public void OnPluginEnd() {
|
public void OnPluginEnd() {
|
||||||
UnhookEntityOutput("func_button", "OnPressed", Event_ButtonPress);
|
UnhookEntityOutput("func_button", "OnPressed", Event_ButtonPress);
|
||||||
}
|
}
|
||||||
|
public void OnMapEnd() {
|
||||||
|
UnhookEntityOutput("func_button", "OnPressed", Event_ButtonPress);
|
||||||
|
}
|
||||||
public void OnMapStart() {
|
public void OnMapStart() {
|
||||||
|
HookEntityOutput("func_button", "OnPressed", Event_ButtonPress);
|
||||||
CreateTimer(MAIN_TIMER_INTERVAL_S, Timer_Main, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
|
CreateTimer(MAIN_TIMER_INTERVAL_S, Timer_Main, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
|
||||||
}
|
}
|
||||||
public void OnClientAuthorized(int client, const char[] auth) {
|
public void OnClientAuthorized(int client, const char[] auth) {
|
||||||
|
@ -83,12 +90,8 @@ public void OnClientAuthorized(int client, const char[] auth) {
|
||||||
TestForTarget(client, auth);
|
TestForTarget(client, auth);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public void OnClientDisconnect(int client) {
|
|
||||||
bTrollTargets[client] = false;
|
|
||||||
}
|
|
||||||
// #region evrnts
|
// #region evrnts
|
||||||
public void Change_VictimList(ConVar convar, const char[] oldValue, const char[] newValue) {
|
public void Change_VictimList(ConVar convar, const char[] oldValue, const char[] newValue) {
|
||||||
UpdateTrollTargets();
|
|
||||||
}
|
}
|
||||||
public void Change_ThrowInterval(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 a throw timer exists (someone has mode 11), destroy & recreate w/ new interval
|
||||||
|
@ -125,7 +128,7 @@ public Action Command_ResetUser(int client, int args) {
|
||||||
}
|
}
|
||||||
for (int i = 0; i < target_count; i++)
|
for (int i = 0; i < target_count; i++)
|
||||||
{
|
{
|
||||||
ResetClient(target_list[i]);
|
ResetClient(target_list[i], true);
|
||||||
ShowActivity(client, "reset troll effects on \"%N\". ", target_list[i]);
|
ShowActivity(client, "reset troll effects on \"%N\". ", target_list[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -189,8 +192,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) && g_iTrollUsers[i] > 0) {
|
||||||
int modes = iTrollUsers[i], modeCount = 0;
|
int modes = g_iTrollUsers[i], modeCount = 0;
|
||||||
char modeListArr[TROLL_MODE_COUNT][32];
|
char modeListArr[TROLL_MODE_COUNT][32];
|
||||||
for(int mode = 1; mode < TROLL_MODE_COUNT; mode++) {
|
for(int mode = 1; mode < TROLL_MODE_COUNT; mode++) {
|
||||||
//If troll mode exists:
|
//If troll mode exists:
|
||||||
|
@ -453,7 +456,7 @@ public Action Timer_Main(Handle timer) {
|
||||||
static int loop;
|
static int loop;
|
||||||
for(int i = 1; i < MaxClients; i++) {
|
for(int i = 1; i < MaxClients; i++) {
|
||||||
if(IsClientConnected(i) && IsClientInGame(i) && IsPlayerAlive(i)) {
|
if(IsClientConnected(i) && IsClientInGame(i) && IsPlayerAlive(i)) {
|
||||||
switch(iTrollUsers[i]) {
|
switch(g_iTrollUsers[i]) {
|
||||||
case Troll_SlowDrain:
|
case Troll_SlowDrain:
|
||||||
if(loop % 4 == 0) {
|
if(loop % 4 == 0) {
|
||||||
int hp = GetClientHealth(i);
|
int hp = GetClientHealth(i);
|
||||||
|
@ -533,38 +536,6 @@ void ThrowAllItems(int victim) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool ApplyModeToTargets() {
|
|
||||||
int users = 0;
|
|
||||||
for(int i=1; i < MaxClients; i++) {
|
|
||||||
if(bTrollTargets[i]) {
|
|
||||||
users++;
|
|
||||||
//clear effects from previous troll:
|
|
||||||
SetEntityGravity(i, 1.0);
|
|
||||||
SetEntPropFloat(i, Prop_Send, "m_flLaggedMovementValue", 1.0);
|
|
||||||
|
|
||||||
if(itrollMode == 0) { //slow mode, apply slow down affects
|
|
||||||
SetEntPropFloat(i, Prop_Send, "m_flLaggedMovementValue", 0.8);
|
|
||||||
}else if(itrollMode == 1) { //higher gravity
|
|
||||||
SetEntityGravity(i, 1.2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//Stop loop if no one is being affected.
|
|
||||||
return (users == 0) ? true : false;
|
|
||||||
|
|
||||||
}
|
|
||||||
void UpdateTrollTargets() {
|
|
||||||
for(int i = 1; i <= MaxClients; i++) {
|
|
||||||
bTrollTargets[i] = false;
|
|
||||||
if(IsClientInGame(i) && IsClientAuthorized(i)) {
|
|
||||||
if(!IsFakeClient(i)) {
|
|
||||||
char auth[64];
|
|
||||||
GetClientAuthId(i, AuthId_Steam2, auth, sizeof(auth));
|
|
||||||
TestForTarget(i, auth);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool TestForTarget(int client, const char[] auth) {
|
bool TestForTarget(int client, const char[] auth) {
|
||||||
char targets[32][8];
|
char targets[32][8];
|
||||||
char raw_targets[64];
|
char raw_targets[64];
|
||||||
|
@ -575,7 +546,6 @@ bool TestForTarget(int client, const char[] auth) {
|
||||||
#if defined debug
|
#if defined debug
|
||||||
PrintToServer("[Debug] Troll target detected with id %d and steamid %s", client, auth);
|
PrintToServer("[Debug] Troll target detected with id %d and steamid %s", client, auth);
|
||||||
#endif
|
#endif
|
||||||
bTrollTargets[client] = true;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue