Imported feature from dev: 688:03dd044dcdd3 - Made scream and moan commands for zombies, with spam protection.

This commit is contained in:
Richard Helgeby
2010-04-05 01:36:32 +02:00
parent 9ec9a121da
commit bac3384520
7 changed files with 237 additions and 14 deletions

View File

@ -70,6 +70,16 @@ enum ZombieSounds
*/
new Handle:tSEffectsMoan[MAXPLAYERS + 1];
/**
* Number of sound commands executed by the player.
*/
new g_SEffectsCommandCount[MAXPLAYERS + 1];
/**
* Timers for resetting sound command counters.
*/
new Handle:g_hSEffectsCommandTimer[MAXPLAYERS + 1];
/**
* Client is joining the server.
*
@ -79,6 +89,10 @@ ZombieSoundsClientInit(client)
{
// Reset timer handle.
tSEffectsMoan[client] = INVALID_HANDLE;
// Reset command counter and make sure there's no timer running.
g_SEffectsCommandCount[client] = 0;
ZREndTimer(g_hSEffectsCommandTimer[client]);
}
/**
@ -96,6 +110,10 @@ ZombieSoundsOnClientSpawn(client)
// Reset timer handle.
tSEffectsMoan[client] = INVALID_HANDLE;
// Reset command counter and kill timer.
g_SEffectsCommandCount[client] = 0;
ZREndTimer(g_hSEffectsCommandTimer[client]);
}
/**
@ -114,6 +132,10 @@ ZombieSoundsOnClientDeath(client)
// Reset timer handle.
tSEffectsMoan[client] = INVALID_HANDLE;
// Reset command counter and kill timer.
g_SEffectsCommandCount[client] = 0;
ZREndTimer(g_hSEffectsCommandTimer[client]);
// If player isn't a zombie, then stop.
if (!InfectIsClientInfected(client))
{
@ -189,6 +211,21 @@ ZombieSoundsOnClientInfected(client)
tSEffectsMoan[client] = CreateTimer(interval, ZombieSoundsMoanTimer, client, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT);
}
/**
* Round ended.
*/
ZombieSoundsOnRoundEnd()
{
ZombieSoundsResetCmdCounters();
ZombieSoundsResetCmdTimers();
}
ZombieSoundsOnCommandsCreate()
{
RegConsoleCmd("scream", ZombieSoundsScreamCommand, "Emits a scream sound, if the player is a zombie.");
RegConsoleCmd("moan", ZombieSoundsMoanCommand, "Emits a moan sound, if the player is a zombie.");
}
/**
* Gets a random zombie sound from hl2 folder.
*
@ -270,13 +307,147 @@ public Action:ZombieSoundsMoanTimer(Handle:timer, any:client)
return Plugin_Stop;
}
// Emit moan sound.
ZombieSoundsMoan(client);
// Allow timer to continue.
return Plugin_Continue;
}
/**
* Emits a moan sound from the specified client.
*
* @param client Client index.
*/
ZombieSoundsMoan(client)
{
// Get random moan sound.
decl String:sound[SOUND_MAX_PATH];
ZombieSoundsGetRandomSound(sound, Moan);
// Emit sound from client.
SEffectsEmitSoundFromClient(client, sound, SNDLEVEL_SCREAMING);
// Allow timer to continue.
return Plugin_Continue;
}
/**
* Emits the scream sound (on infection) from the specified client.
*
* @param client Client index.
*/
ZombieSoundsScream(client)
{
decl String:sound[PLATFORM_MAX_PATH];
GetConVarString(g_hCvarsList[CVAR_INFECT_SOUND], sound, sizeof(sound));
// If cvar contains path, then continue.
if (sound[0])
{
// Emit infect sound from infected client.
SEffectsEmitSoundFromClient(client, sound, SNDLEVEL_SCREAMING);
}
}
/**
* Starts a reset timer for the client's command counter if not already started.
*
* @param client Client index.
*/
ZombieSoundsCmdTimerCheck(client)
{
// Only create timer if it doesn't exist.
if (g_hSEffectsCommandTimer[client] == INVALID_HANDLE)
{
new Float:timespan = GetConVarFloat(g_hCvarsList[CVAR_SEFFECTS_COMMAND_TIMESPAN]);
// Only create timer if time span is enabled.
if (timespan > 0.0)
{
g_hSEffectsCommandTimer[client] = CreateTimer(timespan, ZombieSoundsCmdTimer, client, TIMER_FLAG_NO_MAPCHANGE | TIMER_REPEAT);
}
}
}
/**
* Resets all command counters.
*/
ZombieSoundsResetCmdCounters()
{
for (new client = 0; client <= MAXPLAYERS; client++)
{
g_SEffectsCommandCount[client] = 0;
}
}
/**
* Stops all command counter timers.
*/
ZombieSoundsResetCmdTimers()
{
for (new client = 0; client <= MAXPLAYERS; client++)
{
ZREndTimer(g_hSEffectsCommandTimer[client]);
}
}
/**
* Returns whether a player is allowed to play a zombie sound or not.
*
* @param client Client index.
* @return True if allowed, false otherwise.
*/
bool:ZombieSoundsCommandAllowed(client)
{
new limit = GetConVarInt(g_hCvarsList[CVAR_SEFFECTS_COMMAND_LIMIT]);
if (limit <= 0 ||
g_SEffectsCommandCount[client] < limit)
{
return true;
}
return false;
}
/**
* Scream command handler.
*/
public Action:ZombieSoundsScreamCommand(client, argc)
{
if (IsClientInGame(client) &&
IsPlayerAlive(client) &&
InfectIsClientInfected(client) &&
ZombieSoundsCommandAllowed(client))
{
ZombieSoundsScream(client);
g_SEffectsCommandCount[client]++;
ZombieSoundsCmdTimerCheck(client);
}
return Plugin_Handled;
}
/**
* Moan command handler.
*/
public Action:ZombieSoundsMoanCommand(client, argc)
{
if (IsClientInGame(client) &&
IsPlayerAlive(client) &&
InfectIsClientInfected(client) &&
ZombieSoundsCommandAllowed(client))
{
ZombieSoundsMoan(client);
g_SEffectsCommandCount[client]++;
ZombieSoundsCmdTimerCheck(client);
}
return Plugin_Handled;
}
/**
* Command counter reset timer.
*/
public Action:ZombieSoundsCmdTimer(Handle:timer, any:client)
{
g_SEffectsCommandCount[client] = 0;
}