Removed debug test commands from previous commit, added ambientsounds module, removed old, and removed some unused translations phrases.

This commit is contained in:
Greyscale 2009-04-17 01:09:52 +02:00
parent ee9d3a9f39
commit d5e29b883c
16 changed files with 1103 additions and 926 deletions

View File

@ -646,40 +646,6 @@
"ru" "Команда не используется для консоли." "ru" "Команда не используется для консоли."
} }
"Restrict weapon mapstart"
{
"#format" "{1:s}"
"en" "Restricted weapon: {1}"
"ru" "Запрещенное оружие: {1}"
}
"Restrict weapon group mapstart"
{
"#format" "{1:s}"
"en" "Restricted group: {1}"
"ru" "Запрещенная группа: {1}"
}
"Ambient sound load failed"
{
"#format" "{1:s}"
"en" "Invalid sound file: {1}"
"ru" "Неправильный звуковой файл: {1}"
}
"Class limit"
{
"#format" "{1:d}"
"en" "The max amount of classes have been exceeded, only loading first {1}."
"ru" "Превышено максимальное количество классов, загружаются только первые {1}."
}
"Class auto-disable"
{
"en" "No classes defined in \"{1}\", disabling classes."
"ru" "В \"{1}\" отсутствуют определения классов, классы отключены."
}
"Models loaded" "Models loaded"
{ {
"en" "--- Models Loaded ---" "en" "--- Models Loaded ---"

View File

@ -22,16 +22,12 @@
#include "zr/cvars" #include "zr/cvars"
#include "zr/translation" #include "zr/translation"
#include "zr/offsets" #include "zr/offsets"
#include "zr/ambience"
#include "zr/models" #include "zr/models"
#include "zr/overlays" #include "zr/overlays"
// Class system // Class system
#include "zr/playerclasses/playerclasses" #include "zr/playerclasses/playerclasses"
// Antistick
#include "zr/antistick"
#include "zr/anticamp" #include "zr/anticamp"
#include "zr/teleport" #include "zr/teleport"
#include "zr/zombie" #include "zr/zombie"
@ -44,6 +40,9 @@
// Sound effects // Sound effects
#include "zr/soundeffects/soundeffects" #include "zr/soundeffects/soundeffects"
// Antistick
#include "zr/antistick"
// Hitgroups // Hitgroups
#include "zr/hitgroups" #include "zr/hitgroups"
@ -146,12 +145,14 @@ public OnMapStart()
// Forward event to modules. // Forward event to modules.
ClassLoad(); ClassLoad();
WeaponsLoad(); WeaponsLoad();
SEffectsOnMapStart();
HitgroupsLoad(); HitgroupsLoad();
Anticamp_Startup(); Anticamp_Startup();
} }
public OnMapEnd() public OnMapEnd()
{ {
// Forward event to modules.
Anticamp_Disable(); Anticamp_Disable();
} }
@ -176,7 +177,9 @@ public OnConfigsExecuted()
} }
FindMapSky(); FindMapSky();
LoadAmbienceData();
// Forward event to modules.
SEffectsLoad();
} }
public OnClientPutInServer(client) public OnClientPutInServer(client)
@ -185,14 +188,12 @@ public OnClientPutInServer(client)
// Forward event to modules. // Forward event to modules.
ClassClientInit(client); ClassClientInit(client);
ZombieSoundsClientInit(client); SEffectsClientInit(client);
WeaponsClientInit(client); WeaponsClientInit(client);
SpawnProtectClientInit(client); SpawnProtectClientInit(client);
RespawnClientInit(client); RespawnClientInit(client);
ZHPClientInit(client); ZHPClientInit(client);
if (!IsFakeClient(client)) AmbienceStart(client);
ClientHookAttack(client); ClientHookAttack(client);
FindClientDXLevel(client); FindClientDXLevel(client);
@ -214,7 +215,6 @@ public OnClientDisconnect(client)
ClassOnClientDisconnect(client); ClassOnClientDisconnect(client);
WeaponsOnClientDisconnect(client); WeaponsOnClientDisconnect(client);
ZTeleResetClient(client); ZTeleResetClient(client);
AmbienceStop(client);
for (new x = 0; x < MAXTIMERS; x++) for (new x = 0; x < MAXTIMERS; x++)
{ {
@ -232,7 +232,6 @@ MapChangeCleanup()
{ {
tRound = INVALID_HANDLE; tRound = INVALID_HANDLE;
tInfect = INVALID_HANDLE; tInfect = INVALID_HANDLE;
AmbienceStopAll();
AntiStickReset(); AntiStickReset();
// x = client index. // x = client index.

View File

@ -1,139 +0,0 @@
/**
* ====================
* Zombie:Reloaded
* File: ambience.inc
* Author: Greyscale
* ====================
*/
// TODO: Move skybox and lightning functions into this file.
new bool:AmbienceLoaded = false;
new String:AmbienceSound[64];
new Float:AmbienceVolume;
new Handle:tAmbience[MAXPLAYERS + 1] = {INVALID_HANDLE, ...};
LoadAmbienceData()
{
new bool:ambience = GetConVarBool(gCvars[CVAR_AMBIENCE]);
if (!ambience)
{
return;
}
decl String:sound[64];
GetConVarString(gCvars[CVAR_AMBIENCE_FILE], AmbienceSound, sizeof(AmbienceSound));
Format(sound, sizeof(sound), "sound/%s", AmbienceSound);
AmbienceLoaded = FileExists(sound, true);
if (AmbienceLoaded)
{
AddFileToDownloadsTable(sound);
PrecacheSound(AmbienceSound);
AmbienceVolume = GetConVarFloat(gCvars[CVAR_AMBIENCE_VOLUME]);
if (AmbienceVolume <= 0.0)
{
// No reason to play ambience sound if it's muted.
AmbienceLoaded = false;
if (LogFlagCheck(LOG_CORE_EVENTS, LOG_MODULE_AMBIENCE)) ZR_LogMessageFormatted(-1, "ambience", "startup", "Ambience volume is muted or invalid.", LOG_FORMAT_TYPE_ERROR);
}
if (LogFlagCheck(LOG_DEBUG, LOG_MODULE_AMBIENCE)) ZR_LogMessageFormatted(-1, "ambience", "startup", "Ambience sound loaded.");
}
else
{
if (LogFlagCheck(LOG_CORE_EVENTS, LOG_MODULE_AMBIENCE))
{
decl String:log_message[256];
ZR_TranslateMessage(log_message, sizeof(log_message), "Ambience sound load failed", sound);
ZR_LogMessageFormatted(-1, "ambience", "startup", log_message, true);
}
}
}
AmbienceStart(client)
{
if (!AmbienceLoaded)
{
return;
}
new bool:ambience = GetConVarBool(gCvars[CVAR_AMBIENCE]);
if (!ambience)
{
return;
}
new Float:delay = GetConVarFloat(gCvars[CVAR_AMBIENCE_LENGTH]);
if (delay <= 0.0)
{
return;
}
if (!IsClientConnected(client) || !IsClientInGame(client))
{
return;
}
if (LogFlagCheck(LOG_DEBUG, LOG_MODULE_AMBIENCE)) ZR_LogMessageFormatted(client, "ambience", "start", "Starting ambience on client %d...", _, client);
AmbiencePlay(client);
tAmbience[client] = CreateTimer(delay, AmbienceTimer, client, TIMER_FLAG_NO_MAPCHANGE | TIMER_REPEAT);
}
AmbienceStop(client)
{
if (tAmbience[client] != INVALID_HANDLE)
{
KillTimer(tAmbience[client]);
tAmbience[client] = INVALID_HANDLE;
if (IsClientConnected(client) && IsClientInGame(client))
{
StopSound(client, SNDCHAN_AUTO, AmbienceSound);
}
}
}
AmbienceStopAll()
{
// x = client index.
for (new x = 1; x < MaxClients; x++)
{
AmbienceStop(x);
}
}
AmbienceRestart(client)
{
AmbienceStop(client);
AmbienceStart(client);
}
AmbienceRestartAll()
{
// x = client index.
for (new x = 1; x < MaxClients; x++)
{
AmbienceRestart(x);
}
}
public Action:AmbienceTimer(Handle:timer, any:client)
{
new bool:ambience = GetConVarBool(gCvars[CVAR_AMBIENCE]);
if (!ambience || !AmbienceLoaded)
{
KillTimer(tAmbience[client]);
tAmbience[client] = INVALID_HANDLE;
return;
}
AmbiencePlay(client);
}
AmbiencePlay(client)
{
EmitSoundToClient(client, AmbienceSound, SOUND_FROM_PLAYER, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, AmbienceVolume, SNDPITCH_NORMAL, -1, NULL_VECTOR, NULL_VECTOR, true, 0.0);
if (LogFlagCheck(LOG_DEBUG, LOG_MODULE_AMBIENCE)) ZR_LogMessageFormatted(client, "ambience", "play", "Playing ambience sound on client %d.", _, client);
}

View File

@ -21,6 +21,15 @@
*/ */
new Handle:tAntiStick = INVALID_HANDLE; new Handle:tAntiStick = INVALID_HANDLE;
/**
* The round is starting.
*/
AntiStickOnRoundStart()
{
// Restart antistick timer.
AntiStickRestart();
}
/** /**
* Restarts the AntiStickTimer function. * Restarts the AntiStickTimer function.
*/ */
@ -97,8 +106,7 @@ AntiStickIsStuck(client)
} }
/** /**
* Repeated timer function. * Timer callback, automatically unsticks players that are stuck together.
* Automatically unsticks players that are stuck together.
*/ */
public Action:AntiStickTimer(Handle:timer) public Action:AntiStickTimer(Handle:timer)
{ {

View File

@ -311,7 +311,7 @@ public Action:Command_LogFlags(client, argc)
ReplyToCommand(client, message); ReplyToCommand(client, message);
message[0] = 0; message[0] = 0;
StrCat(message, sizeof(message), "LOG_MODULE_AMBIENCE (2048) - ambience.inc\n"); StrCat(message, sizeof(message), "LOG_MODULE_AMBIENTSOUNDS (2048) - ambientsounds.inc\n");
StrCat(message, sizeof(message), "LOG_MODULE_OVERLAYS (4096) - overlays.inc\n"); StrCat(message, sizeof(message), "LOG_MODULE_OVERLAYS (4096) - overlays.inc\n");
StrCat(message, sizeof(message), "LOG_MODULE_SAYTRIGGERS (8192) - sayhooks.inc\n"); StrCat(message, sizeof(message), "LOG_MODULE_SAYTRIGGERS (8192) - sayhooks.inc\n");
StrCat(message, sizeof(message), "LOG_MODULE_TELEPORT (16384) - teleport.inc\n"); StrCat(message, sizeof(message), "LOG_MODULE_TELEPORT (16384) - teleport.inc\n");

View File

@ -11,10 +11,10 @@ enum ZRSettings
Handle:CVAR_ENABLE, Handle:CVAR_ENABLE,
Handle:CVAR_LOG, Handle:CVAR_LOG,
Handle:CVAR_ALLOW_PLAYER_TEAM, Handle:CVAR_ALLOW_PLAYER_TEAM,
Handle:CVAR_AMBIENCE, Handle:CVAR_AMBIENTSOUNDS,
Handle:CVAR_AMBIENCE_FILE, Handle:CVAR_AMBIENTSOUNDS_FILE,
Handle:CVAR_AMBIENCE_LENGTH, Handle:CVAR_AMBIENTSOUNDS_LENGTH,
Handle:CVAR_AMBIENCE_VOLUME, Handle:CVAR_AMBIENTSOUNDS_VOLUME,
Handle:CVAR_SOUNDEFFECTS_MOAN, Handle:CVAR_SOUNDEFFECTS_MOAN,
Handle:CVAR_SOUNDEFFECTS_GROAN, Handle:CVAR_SOUNDEFFECTS_GROAN,
Handle:CVAR_SOUNDEFFECTS_DEATH, Handle:CVAR_SOUNDEFFECTS_DEATH,
@ -101,10 +101,10 @@ CreateCvars()
gCvars[CVAR_ENABLE] = CreateConVar("zr_enable", "1", "Enable zombie gameplay (0: Disable)"); gCvars[CVAR_ENABLE] = CreateConVar("zr_enable", "1", "Enable zombie gameplay (0: Disable)");
gCvars[CVAR_LOG] = CreateConVar("zr_log", "331", "Logging flags. Log messages to sourcemod logs, server console or client console. Use zr_log_flags to see a list of flags. (0: Disable)"); gCvars[CVAR_LOG] = CreateConVar("zr_log", "331", "Logging flags. Log messages to sourcemod logs, server console or client console. Use zr_log_flags to see a list of flags. (0: Disable)");
gCvars[CVAR_ALLOW_PLAYER_TEAM] = CreateConVar("zr_allow_player_team", "0", "This will allow the player_team event to be fired on first team join, enable when using mani model menu (0: Disable)"); gCvars[CVAR_ALLOW_PLAYER_TEAM] = CreateConVar("zr_allow_player_team", "0", "This will allow the player_team event to be fired on first team join, enable when using mani model menu (0: Disable)");
gCvars[CVAR_AMBIENCE] = CreateConVar("zr_ambience", "1", "Enable creepy ambience to be played throughout the game (0: Disable)"); gCvars[CVAR_AMBIENTSOUNDS] = CreateConVar("zr_ambientsounds", "1", "Enable creepy ambience to be played throughout the game (0: Disable)");
gCvars[CVAR_AMBIENCE_FILE] = CreateConVar("zr_ambience_file", "ambient/zr/zr_ambience.mp3", "Path to ambient sound file that will be played throughout the game, when zr_ambience is 1"); gCvars[CVAR_AMBIENTSOUNDS_FILE] = CreateConVar("zr_ambientsounds_file", "ambient/zr/zr_ambience.mp3", "Path to ambient sound file that will be played throughout the game, when zr_ambience is 1");
gCvars[CVAR_AMBIENCE_LENGTH] = CreateConVar("zr_ambience_length", "60.0", "The length, in seconds, of the ambient sound file"); gCvars[CVAR_AMBIENTSOUNDS_LENGTH] = CreateConVar("zr_ambientsounds_length", "60.0", "The length, in seconds, of the ambient sound file");
gCvars[CVAR_AMBIENCE_VOLUME] = CreateConVar("zr_ambience_volume", "0.6", "Volume of ambient sounds when zr_ambience is 1 (0.0: Unhearable, 1.0: Max volume)"); gCvars[CVAR_AMBIENTSOUNDS_VOLUME] = CreateConVar("zr_ambientsounds_volume", "1.0", "Volume of ambient sounds when zr_ambience is 1 (0.0: Unhearable, 1.0: Max volume)");
gCvars[CVAR_SOUNDEFFECTS_MOAN] = CreateConVar("zr_soundeffects_moan", "50", "How often, in seconds, a zombie moans (0: Disable)"); gCvars[CVAR_SOUNDEFFECTS_MOAN] = CreateConVar("zr_soundeffects_moan", "50", "How often, in seconds, a zombie moans (0: Disable)");
gCvars[CVAR_SOUNDEFFECTS_GROAN] = CreateConVar("zr_soundeffects_groan", "5", "Chance factor a zombie will groan when shot (Lower: More often, 0: Disable)"); gCvars[CVAR_SOUNDEFFECTS_GROAN] = CreateConVar("zr_soundeffects_groan", "5", "Chance factor a zombie will groan when shot (Lower: More often, 0: Disable)");
gCvars[CVAR_SOUNDEFFECTS_DEATH] = CreateConVar("zr_soundeffects_death", "1", "Zombie will emit a death sound when killed 0: Disable)"); gCvars[CVAR_SOUNDEFFECTS_DEATH] = CreateConVar("zr_soundeffects_death", "1", "Zombie will emit a death sound when killed 0: Disable)");

View File

@ -33,10 +33,12 @@ UnhookEvents()
public Action:RoundStart(Handle:event, const String:name[], bool:dontBroadcast) public Action:RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{ {
ChangeLightStyle(); ChangeLightStyle();
AmbienceRestartAll();
AntiStickRestart();
RefreshList(); RefreshList();
// Forward event to sub-modules.
SEffectsOnRoundStart();
AntiStickOnRoundStart();
if (tRound != INVALID_HANDLE) if (tRound != INVALID_HANDLE)
{ {
KillTimer(tRound); KillTimer(tRound);
@ -74,6 +76,7 @@ public Action:RoundFreezeEnd(Handle:event, const String:name[], bool:dontBroadca
new Float:randlen = GetRandomFloat(min, max); new Float:randlen = GetRandomFloat(min, max);
tInfect = CreateTimer(randlen, MotherZombie, _, TIMER_FLAG_NO_MAPCHANGE); tInfect = CreateTimer(randlen, MotherZombie, _, TIMER_FLAG_NO_MAPCHANGE);
// Forward events to modules.
ZTeleEnable(); ZTeleEnable();
} }
@ -193,7 +196,7 @@ public Action:PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
// Forward event to modules. // Forward event to modules.
ClassOnClientSpawn(index); ClassOnClientSpawn(index);
ZombieSoundsOnClientSpawn(index); SEffectsOnClientSpawn(index);
SpawnProtectOnClientSpawn(index); SpawnProtectOnClientSpawn(index);
RespawnOnClientSpawn(index); RespawnOnClientSpawn(index);
ZHPOnClientSpawn(index); ZHPOnClientSpawn(index);
@ -241,7 +244,7 @@ public Action:PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast)
// Forward event to modules. // Forward event to modules.
ClassAlphaUpdate(index); ClassAlphaUpdate(index);
ZombieSoundsOnClientHurt(index); SEffectsOnClientHurt(index);
KnockbackOnClientHurt(index, attacker, weapon, hitgroup, dmg_health); KnockbackOnClientHurt(index, attacker, weapon, hitgroup, dmg_health);
ZHPOnPlayerHurt(index); ZHPOnPlayerHurt(index);
} }
@ -308,7 +311,7 @@ public Action:PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
// Forward event to modules. // Forward event to modules.
ClassOnClientDeath(index); ClassOnClientDeath(index);
ZombieSoundsOnClientDeath(index); SEffectsOnClientDeath(index);
SpawnProtectOnClientDeath(index); SpawnProtectOnClientDeath(index);
RespawnOnClientDeath(index, attacker, weapon); RespawnOnClientDeath(index, attacker, weapon);
ZHPOnClientDeath(index); ZHPOnClientDeath(index);

View File

@ -16,57 +16,67 @@
*/ */
KnockbackOnClientHurt(client, attacker, const String:weapon[], hitgroup, dmg_health) KnockbackOnClientHurt(client, attacker, const String:weapon[], hitgroup, dmg_health)
{ {
// Check if the attacker is a player. // If attacker is invalid, then stop.
if (attacker != 0) if (!ZRIsValidClient(attacker))
{ {
// Check if a human attacks a zombie. return;
if (IsPlayerZombie(client) && IsPlayerHuman(attacker)) }
// Client is a human, then stop.
if (IsPlayerHuman(client))
{
return;
}
// If attacker is a zombie, then stop.
if (IsPlayerZombie(attacker))
{
return;
}
// Get zombie knockback value.
new Float:knockback = ClassGetKnockback(client);
new Float:clientloc[3];
new Float:attackerloc[3];
GetClientAbsOrigin(client, clientloc);
// Check if a grenade was thrown.
if (StrEqual(weapon, "hegrenade"))
{
// Get the location of the grenade.
if (KnockbackFindExplodingGrenade(attackerloc) == -1)
{ {
// Get zombie knockback value. // If the grenade wasn't found, then stop.
new Float:knockback = ClassGetKnockback(client); return;
new Float:clientloc[3];
new Float:attackerloc[3];
GetClientAbsOrigin(client, clientloc);
// Check if a grenade was thrown.
if (StrEqual(weapon, "hegrenade"))
{
// Get the location of the grenade.
if (KnockbackFindExplodingGrenade(attackerloc) == -1)
{
// If the grenade wasn't found, then stop.
return;
}
}
else
{
// Get attackers eye position.
GetPlayerEyePosition(attacker, attackerloc);
// Get attackers eye angles.
new Float:attackerang[3];
GetPlayerEyeAngles(attacker, attackerang);
// Calculate knockback end-vector.
TR_TraceRayFilter(attackerloc, attackerang, MASK_ALL, RayType_Infinite, KnockbackTRFilter);
TR_GetEndPosition(clientloc);
}
// Retrieve weapon knockback boost.
new Float:boostWeapon = WeaponGetWeaponKnockback(weapon);
// Retrieve hitgroup knockback boost.
new Float:boostHitgroup = HitgroupsGetHitgroupKnockback(hitgroup);
// Apply all knockback multipliers.
knockback *= float(dmg_health) * boostWeapon * boostHitgroup;
// Apply knockback.
KnockbackSetVelocity(client, attackerloc, clientloc, knockback);
} }
} }
else
{
// Get attackers eye position.
GetPlayerEyePosition(attacker, attackerloc);
// Get attackers eye angles.
new Float:attackerang[3];
GetPlayerEyeAngles(attacker, attackerang);
// Calculate knockback end-vector.
TR_TraceRayFilter(attackerloc, attackerang, MASK_ALL, RayType_Infinite, KnockbackTRFilter);
TR_GetEndPosition(clientloc);
}
// Retrieve weapon knockback boost.
new Float:boostWeapon = WeaponGetWeaponKnockback(weapon);
// Retrieve hitgroup knockback boost.
new Float:boostHitgroup = HitgroupsGetHitgroupKnockback(hitgroup);
// Apply all knockback multipliers.
knockback *= float(dmg_health) * boostWeapon * boostHitgroup;
// Apply knockback.
KnockbackSetVelocity(client, attackerloc, clientloc, knockback);
} }
/** /**

View File

@ -75,14 +75,6 @@ public Action:SayCommand(client, argc)
{ {
ZR_PrintToChat(client, "!ztele stuck"); ZR_PrintToChat(client, "!ztele stuck");
} }
else if (StrEqual(args, "play", false))
{
SEffectsEmitAmbientSound("ambient/machines/heli_pass_distant1.wav");
}
else if (StrEqual(args, "stop", false))
{
SEffectsStopAmbientSound("ambient/machines/heli_pass_distant1.wav");
}
return Plugin_Continue; return Plugin_Continue;
} }

View File

@ -0,0 +1,214 @@
/*
* ============================================================================
*
* Zombie:Reloaded
*
* File: ambientsounds.inc
* Description: Plays ambient sounds to clients.
*
* ============================================================================
*/
/**
* Global variable that tells if ambient sound cvar data was loaded successfully.
*/
new bool:g_bAmbientSounds;
/**
* Global variable to store ambient sounds timer handle.
*/
new Handle:tAmbientSounds = INVALID_HANDLE;
/**
* Array for flagging client to play sound.
*/
new bool:bAmbientSoundsIsPlaying[MAXPLAYERS + 1];
/**
* Load ambient sound data.
*/
AmbientSoundsLoad()
{
// Validate cvars.
g_bAmbientSounds = AmbientSoundsValidateConfig();
}
/**
* Client is joining the server.
*
* @param client The client index.
*/
AmbientSoundsClientInit(client)
{
// Reset flag to play sound on client.
bAmbientSoundsIsPlaying[client] = false;
}
/**
* Validate ambient sounds cvars.
*/
bool:AmbientSoundsValidateConfig()
{
// If ambience is disabled, then stop.
new bool:ambience = GetConVarBool(gCvars[CVAR_AMBIENTSOUNDS]);
if (!ambience)
{
return false;
}
// If logging is disabled for ambient sounds, then stop.
if (!LogFlagCheck(LOG_CORE_EVENTS, LOG_MODULE_AMBIENTSOUNDS))
{
return false;
}
// Get ambient sound file.
decl String:sound[SOUND_MAX_PATH];
GetConVarString(gCvars[CVAR_AMBIENTSOUNDS_FILE], sound, sizeof(sound));
Format(sound, sizeof(sound), "sound/%s", sound);
// If file doesn't exist, then log error and stop.
if (!FileExists(sound, true))
{
// Log invalid sound file error.
ZR_LogMessageFormatted(-1, "Ambient Sounds", "Config Validation", "Invalid sound file specified in zr_ambientsounds_file.", LOG_FORMAT_TYPE_ERROR);
return false;
}
// If volume is muted or invalid, then log error and stop.
new Float:ambientvolume = GetConVarFloat(gCvars[CVAR_AMBIENTSOUNDS_VOLUME]);
if (ambientvolume <= 0.0)
{
// Log invalid ambient sound volume error.
ZR_LogMessageFormatted(-1, "Ambient Sounds", "Config Validation", "Ambient sound is either muted or invalid.", LOG_FORMAT_TYPE_ERROR);
return false;
}
// If length is invalid, then log error and stop.
new Float:ambientlength = GetConVarFloat(gCvars[CVAR_AMBIENTSOUNDS_LENGTH]);
if (ambientlength <= 0.0)
{
// Log invalid ambient sound length error.
ZR_LogMessageFormatted(-1, "Ambient Sounds", "Config Validation", "Ambient sound length is invalid.", LOG_FORMAT_TYPE_ERROR);
return false;
}
// Add sound file to downloads table.
AddFileToDownloadsTable(sound);
return true;
}
/**
* Map is starting.
*/
AmbientSoundsOnMapStart()
{
// Reset timer handle.
tAmbientSounds = INVALID_HANDLE;
}
/**
* The round is starting.
*/
AmbientSoundsOnRoundStart()
{
// Restart ambient sound for all clients.
AmbientSoundsRestart();
}
/**
* Client is spawning into the game.
*
* @param client The client index.
*/
AmbientSoundsOnClientSpawn(client)
{
// If ambience is disabled, then stop.
if (!g_bAmbientSounds)
{
return;
}
// If flag is enabled, then stop.
if (bAmbientSoundsIsPlaying[client])
{
return;
}
// Get ambient sound file.
decl String:sound[SOUND_MAX_PATH];
GetConVarString(gCvars[CVAR_AMBIENTSOUNDS_FILE], sound, sizeof(sound));
// Get ambient sound volume.
new Float:ambientvolume = GetConVarFloat(gCvars[CVAR_AMBIENTSOUNDS_VOLUME]);
// Emit ambient sound.
SEffectsEmitAmbientSound(sound, ambientvolume, client);
}
/**
* Restart ambient sound for all clients.
*/
AmbientSoundsRestart()
{
// If timer is running, kill it.
if (tAmbientSounds != INVALID_HANDLE)
{
KillTimer(tAmbientSounds);
}
// If ambience is disabled, then stop.
if (!g_bAmbientSounds)
{
return;
}
// x = client index
for (new x = 1; x <= MaxClients; x++)
{
// If client isn't in-game, then stop.
if (!IsClientInGame(x))
{
continue;
}
bAmbientSoundsIsPlaying[x] = false;
}
// Get ambient sound length.
new Float:ambientlength = GetConVarFloat(gCvars[CVAR_AMBIENTSOUNDS_LENGTH]);
// Start ambient sounds timer.
tAmbientSounds = CreateTimer(ambientlength, AmbientSoundsTimer, _, TIMER_FLAG_NO_MAPCHANGE);
}
/**
* Timer callback, Replays ambient sound on all clients.
*
* @param timer The timer handle.
*/
public Action:AmbientSoundsTimer(Handle:timer)
{
// If ambience is disabled, then stop.
if (!g_bAmbientSounds)
{
return;
}
// Get ambient sound file.
decl String:sound[SOUND_MAX_PATH];
GetConVarString(gCvars[CVAR_AMBIENTSOUNDS_FILE], sound, sizeof(sound));
// Get ambient sound volume.
new Float:ambientvolume = GetConVarFloat(gCvars[CVAR_AMBIENTSOUNDS_VOLUME]);
// Emit ambient sound.
SEffectsEmitAmbientSound(sound, ambientvolume);
// Get ambient sound length.
new Float:ambientlength = GetConVarFloat(gCvars[CVAR_AMBIENTSOUNDS_LENGTH]);
// Start new timer with sound length as delay.
tAmbientSounds = CreateTimer(ambientlength, AmbientSoundsTimer, _, TIMER_FLAG_NO_MAPCHANGE);
}

View File

@ -19,22 +19,139 @@
*/ */
#define SOUND_AMBIENT_CHANNEL 8 #define SOUND_AMBIENT_CHANNEL 8
#include "zr/soundeffects/ambientsounds"
#include "zr/soundeffects/zombiesounds" #include "zr/soundeffects/zombiesounds"
/** /**
* Emits an ambient sound * Load sound effects data.
*/ */
SEffectsEmitAmbientSound(const String:sound[], Float:soundvolume = 1.0) SEffectsLoad()
{
// Load ambient sound cvars.
AmbientSoundsLoad();
}
/**
* Map is starting.
*/
SEffectsOnMapStart()
{
// Forward event to sub-modules.
AmbientSoundsOnMapStart();
}
/**
* Client is joining the server.
*
* @param client The client index.
*/
SEffectsClientInit(client)
{
// Forward event to sub-modules.
AmbientSoundsClientInit(client);
ZombieSoundsClientInit(client);
}
/**
* The round is starting.
*/
SEffectsOnRoundStart()
{
// Forward event to sub-modules.
AmbientSoundsOnRoundStart();
}
/**
* Client is spawning into the game.
*
* @param client The client index.
*/
SEffectsOnClientSpawn(client)
{
// Forward event to sub-modules.
AmbientSoundsOnClientSpawn(client);
ZombieSoundsOnClientSpawn(client);
}
/**
* Client has been killed.
*
* @param client The client index.
*/
SEffectsOnClientDeath(client)
{
// Forward event to sub-modules.
ZombieSoundsOnClientDeath(client);
}
/**
* Client has been hurt.
*
* @param client The client index.
*/
SEffectsOnClientHurt(client)
{
// Forward event to sub-modules.
ZombieSoundsOnClientHurt(client);
}
/**
* Client has been infected.
*
* @param client The client index.
*/
SEffectsOnClientInfected(client)
{
// Forward event to sub-modules.
ZombieSoundsOnClientInfected(client);
}
/**
* Emits an ambient sound
*
* @param sound The path to the sound file (relative to sounds/)
* @param soundvolume The volume of the sound (0.0 - 1.0)
* @param client (Optional) Client index to play sound to.
*/
SEffectsEmitAmbientSound(const String:sound[], Float:ambientvolume = 1.0, client = -1)
{ {
// Precache sound before playing. // Precache sound before playing.
PrecacheSound(sound); PrecacheSound(sound);
// Emit ambient sound. // Stop sound before playing again.
EmitSoundToAll(sound, SOUND_FROM_PLAYER, SOUND_AMBIENT_CHANNEL, _, _, soundvolume); SEffectsStopAmbientSound(sound);
if (ZRIsValidClient(client))
{
// Emit ambient sound.
EmitSoundToClient(client, sound, SOUND_FROM_PLAYER, SOUND_AMBIENT_CHANNEL, _, _, ambientvolume);
// Flag client that sound is playing.
bAmbientSoundsIsPlaying[client] = true;
}
else
{
for (new x = 1; x <= MaxClients; x++)
{
// If client isn't in-game, then stop.
if (!IsClientInGame(x))
{
continue;
}
// Emit ambient sound.
EmitSoundToClient(x, sound, SOUND_FROM_PLAYER, SOUND_AMBIENT_CHANNEL, _, _, ambientvolume);
// Flag client that sound is playing.
bAmbientSoundsIsPlaying[x] = true;
}
}
} }
/** /**
* Stop an ambient sound * Stop an ambient sound
*
* @param sound The path to the sound file (relative to sounds/)
*/ */
SEffectsStopAmbientSound(const String:sound[]) SEffectsStopAmbientSound(const String:sound[])
{ {
@ -52,6 +169,12 @@ SEffectsStopAmbientSound(const String:sound[])
} }
} }
/**
* Replay an ambient sound
*
* @param sound The path to the sound file (relative to sounds/)
*/
/** /**
* Emits a sound from a client. * Emits a sound from a client.
* *

View File

@ -176,7 +176,8 @@ ZombieSoundsOnClientInfected(client)
/** /**
* Gets a random zombie sound from hl2 folder. * Gets a random zombie sound from hl2 folder.
* *
* @param sound The randomly picked moan sound. * @param sound The randomly picked sound.
* @param soundtype The type of sound to get. (See enum ZombieSounds)
* @return True if sound was successfully picked, false otherwise. * @return True if sound was successfully picked, false otherwise.
*/ */
bool:ZombieSoundsGetRandomSound(String:sound[], ZombieSounds:soundtype) bool:ZombieSoundsGetRandomSound(String:sound[], ZombieSounds:soundtype)

View File

@ -514,7 +514,7 @@ ZRLogFlagsMenu(client)
decl String:z_log_ignore_console[64]; decl String:z_log_ignore_console[64];
decl String:z_log_modules_enabled[64]; decl String:z_log_modules_enabled[64];
decl String:z_log_module_zombie[64]; decl String:z_log_module_zombie[64];
decl String:z_log_module_ambience[64]; decl String:z_log_module_ambientsounds[64];
decl String:z_log_module_overlays[64]; decl String:z_log_module_overlays[64];
decl String:z_log_module_saytriggers[64]; decl String:z_log_module_saytriggers[64];
decl String:z_log_module_teleport[64]; decl String:z_log_module_teleport[64];
@ -537,7 +537,7 @@ ZRLogFlagsMenu(client)
Format(z_log_ignore_console, sizeof(z_log_ignore_console), "Don't log messages from the console (%d)", LogHasFlag(LOG_IGNORE_CONSOLE)); Format(z_log_ignore_console, sizeof(z_log_ignore_console), "Don't log messages from the console (%d)", LogHasFlag(LOG_IGNORE_CONSOLE));
Format(z_log_modules_enabled, sizeof(z_log_modules_enabled), "Module based log control (%d)", LogHasFlag(LOG_MODULES_ENABLED)); Format(z_log_modules_enabled, sizeof(z_log_modules_enabled), "Module based log control (%d)", LogHasFlag(LOG_MODULES_ENABLED));
Format(z_log_module_zombie, sizeof(z_log_module_zombie), "Zombie (%d)", LogHasFlag(LOG_MODULE_ZOMBIE)); Format(z_log_module_zombie, sizeof(z_log_module_zombie), "Zombie (%d)", LogHasFlag(LOG_MODULE_ZOMBIE));
Format(z_log_module_ambience, sizeof(z_log_module_ambience), "Ambience (%d)", LogHasFlag(LOG_MODULE_AMBIENCE)); Format(z_log_module_ambientsounds, sizeof(z_log_module_ambientsounds), "Ambient Sounds (%d)", LogHasFlag(LOG_MODULE_AMBIENTSOUNDS));
Format(z_log_module_overlays, sizeof(z_log_module_overlays), "Overlays (%d)", LogHasFlag(LOG_MODULE_OVERLAYS)); Format(z_log_module_overlays, sizeof(z_log_module_overlays), "Overlays (%d)", LogHasFlag(LOG_MODULE_OVERLAYS));
Format(z_log_module_saytriggers, sizeof(z_log_module_saytriggers), "Chat commands (%d)", LogHasFlag(LOG_MODULE_SAYTRIGGERS)); Format(z_log_module_saytriggers, sizeof(z_log_module_saytriggers), "Chat commands (%d)", LogHasFlag(LOG_MODULE_SAYTRIGGERS));
Format(z_log_module_teleport, sizeof(z_log_module_teleport), "Teleporter (%d)", LogHasFlag(LOG_MODULE_TELEPORT)); Format(z_log_module_teleport, sizeof(z_log_module_teleport), "Teleporter (%d)", LogHasFlag(LOG_MODULE_TELEPORT));
@ -560,7 +560,7 @@ ZRLogFlagsMenu(client)
AddMenuItem(menu_log_flags, z_log_ignore_console, z_log_ignore_console, item_state); AddMenuItem(menu_log_flags, z_log_ignore_console, z_log_ignore_console, item_state);
AddMenuItem(menu_log_flags, z_log_modules_enabled, z_log_modules_enabled, item_state); AddMenuItem(menu_log_flags, z_log_modules_enabled, z_log_modules_enabled, item_state);
AddMenuItem(menu_log_flags, z_log_module_zombie, z_log_module_zombie, item_state); AddMenuItem(menu_log_flags, z_log_module_zombie, z_log_module_zombie, item_state);
AddMenuItem(menu_log_flags, z_log_module_ambience, z_log_module_ambience, item_state); AddMenuItem(menu_log_flags, z_log_module_ambientsounds, z_log_module_ambientsounds, item_state);
AddMenuItem(menu_log_flags, z_log_module_overlays, z_log_module_overlays, item_state); AddMenuItem(menu_log_flags, z_log_module_overlays, z_log_module_overlays, item_state);
AddMenuItem(menu_log_flags, z_log_module_saytriggers, z_log_module_saytriggers, item_state); AddMenuItem(menu_log_flags, z_log_module_saytriggers, z_log_module_saytriggers, item_state);
AddMenuItem(menu_log_flags, z_log_module_teleport, z_log_module_teleport, item_state); AddMenuItem(menu_log_flags, z_log_module_teleport, z_log_module_teleport, item_state);
@ -638,7 +638,7 @@ public ZRLogFlagsMenuHandle(Handle:menu_log_flags, MenuAction:action, client, sl
} }
case 11: case 11:
{ {
ToggleLogFlag(LOG_MODULE_AMBIENCE); ToggleLogFlag(LOG_MODULE_AMBIENTSOUNDS);
ZRLogFlagsMenu(client); ZRLogFlagsMenu(client);
} }
case 12: case 12:

View File

@ -202,7 +202,7 @@ InfectPlayer(client, attacker = -1, bool:motherinfect = false)
// Forward event to modules. // Forward event to modules.
ClassOnClientInfected(client, motherinfect); ClassOnClientInfected(client, motherinfect);
ZombieSoundsOnClientInfected(client); SEffectsOnClientInfected(client);
ZHPOnClientInfected(client); ZHPOnClientInfected(client);
AbortTeleport(client); AbortTeleport(client);

View File

@ -51,7 +51,7 @@ enum ZTeam
#define LOG_MODULE_CLASSES 4096 /** Class system - playerclasses/ *.inc */ #define LOG_MODULE_CLASSES 4096 /** Class system - playerclasses/ *.inc */
#define LOG_MODULE_ZOMBIE 8192 /** zombie.inc */ #define LOG_MODULE_ZOMBIE 8192 /** zombie.inc */
#define LOG_MODULE_SAYTRIGGERS 16384 /** sayhooks.inc */ #define LOG_MODULE_SAYTRIGGERS 16384 /** sayhooks.inc */
#define LOG_MODULE_AMBIENCE 32768 /** ambience.inc */ #define LOG_MODULE_AMBIENTSOUNDS 32768 /** ambientsounds.inc */
#define LOG_MODULE_OVERLAYS 65536 /** overlays.inc */ #define LOG_MODULE_OVERLAYS 65536 /** overlays.inc */
#define LOG_MODULE_TELEPORT 131072 /** teleport.inc */ #define LOG_MODULE_TELEPORT 131072 /** teleport.inc */
#define LOG_MODULE_WEAPONS 262144 /** Weapons module - weapons/ *.inc */ #define LOG_MODULE_WEAPONS 262144 /** Weapons module - weapons/ *.inc */