Imported feature from dev: 688:03dd044dcdd3 - Made scream and moan commands for zombies, with spam protection.
This commit is contained in:
parent
9ec9a121da
commit
bac3384520
|
@ -523,6 +523,14 @@ zr_seffects_groan "5"
|
||||||
// Default: "1"
|
// Default: "1"
|
||||||
zr_seffects_death "1"
|
zr_seffects_death "1"
|
||||||
|
|
||||||
|
// Number of sound commands allowed within the time span, or total limit if time span is disabled. ['0' = Disable sound command limit]
|
||||||
|
// Default: "4"
|
||||||
|
zr_seffects_command_limit "4"
|
||||||
|
|
||||||
|
// Time span for sound command limiter (in seconds). ['0' = Disable time span check | positive number = Time span]
|
||||||
|
// Default: "10"
|
||||||
|
zr_seffects_command_timespan "10"
|
||||||
|
|
||||||
// Ambient Sounds
|
// Ambient Sounds
|
||||||
|
|
||||||
// Play an ambient sound to all players during gameplay.
|
// Play an ambient sound to all players during gameplay.
|
||||||
|
|
|
@ -45,6 +45,7 @@ CommandsInit()
|
||||||
ZTeleOnCommandsCreate();
|
ZTeleOnCommandsCreate();
|
||||||
ZHPOnCommandsCreate();
|
ZHPOnCommandsCreate();
|
||||||
VolOnCommandsCreate();
|
VolOnCommandsCreate();
|
||||||
|
ZombieSoundsOnCommandsCreate();
|
||||||
|
|
||||||
#if defined ADD_VERSION_INFO
|
#if defined ADD_VERSION_INFO
|
||||||
VersionOnCommandsCreate();
|
VersionOnCommandsCreate();
|
||||||
|
|
|
@ -132,6 +132,8 @@ enum CvarsList
|
||||||
Handle:CVAR_SEFFECTS_MOAN,
|
Handle:CVAR_SEFFECTS_MOAN,
|
||||||
Handle:CVAR_SEFFECTS_GROAN,
|
Handle:CVAR_SEFFECTS_GROAN,
|
||||||
Handle:CVAR_SEFFECTS_DEATH,
|
Handle:CVAR_SEFFECTS_DEATH,
|
||||||
|
Handle:CVAR_SEFFECTS_COMMAND_LIMIT,
|
||||||
|
Handle:CVAR_SEFFECTS_COMMAND_TIMESPAN,
|
||||||
Handle:CVAR_AMBIENTSOUNDS,
|
Handle:CVAR_AMBIENTSOUNDS,
|
||||||
Handle:CVAR_AMBIENTSOUNDS_FILE,
|
Handle:CVAR_AMBIENTSOUNDS_FILE,
|
||||||
Handle:CVAR_AMBIENTSOUNDS_LENGTH,
|
Handle:CVAR_AMBIENTSOUNDS_LENGTH,
|
||||||
|
@ -410,9 +412,11 @@ CvarsCreate()
|
||||||
g_hCvarsList[CVAR_VOICE_ZOMBIES_MUTE] = CreateConVar("zr_voice_zombies_mute", "0", "(Incomplete) Only allow humans to communicate, block verbal zombie communication.");
|
g_hCvarsList[CVAR_VOICE_ZOMBIES_MUTE] = CreateConVar("zr_voice_zombies_mute", "0", "(Incomplete) Only allow humans to communicate, block verbal zombie communication.");
|
||||||
|
|
||||||
// Zombie Sounds
|
// Zombie Sounds
|
||||||
g_hCvarsList[CVAR_SEFFECTS_MOAN] = CreateConVar("zr_seffects_moan", "30.0", "Time between emission of a moan sound from a zombie.");
|
g_hCvarsList[CVAR_SEFFECTS_MOAN] = CreateConVar("zr_seffects_moan", "30.0", "Time between emission of a moan sound from a zombie.");
|
||||||
g_hCvarsList[CVAR_SEFFECTS_GROAN] = CreateConVar("zr_seffects_groan", "5", "The probability that a groan sound will be emitted from a zombie when shot. ['100' = 1% chance | '50' = 2% chance | '1' = 100% chance]");
|
g_hCvarsList[CVAR_SEFFECTS_GROAN] = CreateConVar("zr_seffects_groan", "5", "The probability that a groan sound will be emitted from a zombie when shot. ['100' = 1% chance | '50' = 2% chance | '1' = 100% chance]");
|
||||||
g_hCvarsList[CVAR_SEFFECTS_DEATH] = CreateConVar("zr_seffects_death", "1", "Emit a death sound when a zombie dies.");
|
g_hCvarsList[CVAR_SEFFECTS_DEATH] = CreateConVar("zr_seffects_death", "1", "Emit a death sound when a zombie dies.");
|
||||||
|
g_hCvarsList[CVAR_SEFFECTS_COMMAND_LIMIT] = CreateConVar("zr_seffects_command_limit", "4", "Number of sound commands allowed within the time span, or total limit if time span is disabled. ['0' = Disable sound command limit]");
|
||||||
|
g_hCvarsList[CVAR_SEFFECTS_COMMAND_TIMESPAN] = CreateConVar("zr_seffects_command_timespan", "10", "Time span for sound command limiter (in seconds). ['0' = Disable time span check | positive number = Time span]");
|
||||||
|
|
||||||
// Ambient Sounds
|
// Ambient Sounds
|
||||||
g_hCvarsList[CVAR_AMBIENTSOUNDS] = CreateConVar("zr_ambientsounds", "1", "Play an ambient sound to all players during gameplay.");
|
g_hCvarsList[CVAR_AMBIENTSOUNDS] = CreateConVar("zr_ambientsounds", "1", "Play an ambient sound to all players during gameplay.");
|
||||||
|
|
|
@ -749,14 +749,8 @@ InfectFireEffects(client)
|
||||||
VEffectsCreateExplosion(clientloc, flags);
|
VEffectsCreateExplosion(clientloc, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If cvar contains path, then continue.
|
// Emit scream sound if enabled.
|
||||||
decl String:sound[PLATFORM_MAX_PATH];
|
ZombieSoundsScream(client);
|
||||||
GetConVarString(g_hCvarsList[CVAR_INFECT_SOUND], sound, sizeof(sound));
|
|
||||||
if (sound[0])
|
|
||||||
{
|
|
||||||
// Emit infect sound from infected client.
|
|
||||||
SEffectsEmitSoundFromClient(client, sound, SNDLEVEL_SCREAMING);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If energy splash effect is enabled, then continue.
|
// If energy splash effect is enabled, then continue.
|
||||||
new bool:esplash = GetConVarBool(g_hCvarsList[CVAR_INFECT_ESPLASH]);
|
new bool:esplash = GetConVarBool(g_hCvarsList[CVAR_INFECT_ESPLASH]);
|
||||||
|
|
|
@ -87,6 +87,7 @@ SEffectsOnRoundEnd()
|
||||||
// Forward event to sub-modules.
|
// Forward event to sub-modules.
|
||||||
VoiceOnRoundEnd();
|
VoiceOnRoundEnd();
|
||||||
AmbientSoundsOnRoundEnd();
|
AmbientSoundsOnRoundEnd();
|
||||||
|
ZombieSoundsOnRoundEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -70,6 +70,16 @@ enum ZombieSounds
|
||||||
*/
|
*/
|
||||||
new Handle:tSEffectsMoan[MAXPLAYERS + 1];
|
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.
|
* Client is joining the server.
|
||||||
*
|
*
|
||||||
|
@ -79,6 +89,10 @@ ZombieSoundsClientInit(client)
|
||||||
{
|
{
|
||||||
// Reset timer handle.
|
// Reset timer handle.
|
||||||
tSEffectsMoan[client] = INVALID_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.
|
// Reset timer handle.
|
||||||
tSEffectsMoan[client] = INVALID_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.
|
// Reset timer handle.
|
||||||
tSEffectsMoan[client] = INVALID_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 player isn't a zombie, then stop.
|
||||||
if (!InfectIsClientInfected(client))
|
if (!InfectIsClientInfected(client))
|
||||||
{
|
{
|
||||||
|
@ -189,6 +211,21 @@ ZombieSoundsOnClientInfected(client)
|
||||||
tSEffectsMoan[client] = CreateTimer(interval, ZombieSoundsMoanTimer, client, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT);
|
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.
|
* Gets a random zombie sound from hl2 folder.
|
||||||
*
|
*
|
||||||
|
@ -270,13 +307,147 @@ public Action:ZombieSoundsMoanTimer(Handle:timer, any:client)
|
||||||
return Plugin_Stop;
|
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.
|
// Get random moan sound.
|
||||||
decl String:sound[SOUND_MAX_PATH];
|
decl String:sound[SOUND_MAX_PATH];
|
||||||
ZombieSoundsGetRandomSound(sound, Moan);
|
ZombieSoundsGetRandomSound(sound, Moan);
|
||||||
|
|
||||||
// Emit sound from client.
|
// Emit sound from client.
|
||||||
SEffectsEmitSoundFromClient(client, sound, SNDLEVEL_SCREAMING);
|
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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,6 +106,50 @@ stock ZRCreateEligibleClientList(&Handle:arrayEligibleClients, bool:team = false
|
||||||
return GetArraySize(arrayEligibleClients);
|
return GetArraySize(arrayEligibleClients);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a timer is currently running.
|
||||||
|
*
|
||||||
|
* @param timer The timer handle.
|
||||||
|
*/
|
||||||
|
stock bool:ZRIsTimerRunning(Handle:timer)
|
||||||
|
{
|
||||||
|
// Return true if the handle isn't empty.
|
||||||
|
return (timer != INVALID_HANDLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper functions for KilLTimer.
|
||||||
|
* Ends a timer if running, and resets its timer handle variable.
|
||||||
|
*
|
||||||
|
* @param timer The timer handle.
|
||||||
|
* @param kill True to kill the timer and reset the variable, false to only reset the variable.
|
||||||
|
* Using false is useful when calling from the timer callback, because the timer is already killed.
|
||||||
|
*
|
||||||
|
* @return True if the handle wasn't INVALID_HANDLE, false if the handle wasn't valid.
|
||||||
|
*/
|
||||||
|
stock bool:ZREndTimer(&Handle:timer, bool:kill = true)
|
||||||
|
{
|
||||||
|
// If the timer is running, then kill it.
|
||||||
|
if (ZRIsTimerRunning(timer))
|
||||||
|
{
|
||||||
|
// Kill if caller says to.
|
||||||
|
if (kill)
|
||||||
|
{
|
||||||
|
KillTimer(timer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset variable.
|
||||||
|
timer = INVALID_HANDLE;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset variable.
|
||||||
|
timer = INVALID_HANDLE;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if a client index is a valid player.
|
* Check if a client index is a valid player.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue
Block a user