From 527bb9be4481451951c606103b3895553126df6d Mon Sep 17 00:00:00 2001 From: richard Date: Sun, 15 Feb 2009 22:25:17 +0100 Subject: [PATCH] Fixed ambience sound not always playing. Improved logging function. --- changelog.txt | 4 ++ src/zombiereloaded.sp | 4 +- src/zr/ambience.inc | 136 ++++++++++++++++++++++++++--------------- src/zr/event.inc | 4 +- src/zr/translation.inc | 41 +++++++++---- 5 files changed, 125 insertions(+), 64 deletions(-) diff --git a/changelog.txt b/changelog.txt index 3677281..0ad5135 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,7 @@ +2009.02.15 - 2.5.1.x + * Fixed ambience sound not always playing. Changed ambience module to play a ambience sound per client, when they connect. + * Improved logging function. + 2009.02.13 - 2.5.1.27 * Fixed bug in formatted log messages when client is negative or 0 (console). * Simplified log formatting style. diff --git a/src/zombiereloaded.sp b/src/zombiereloaded.sp index 402c344..660568a 100644 --- a/src/zombiereloaded.sp +++ b/src/zombiereloaded.sp @@ -172,6 +172,7 @@ public OnClientPutInServer(client) } RefreshList(); + if (!IsFakeClient(client)) AmbienceStart(client); } public OnClientDisconnect(client) @@ -181,6 +182,7 @@ public OnClientDisconnect(client) PlayerLeft(client); ZTeleResetClient(client); + AmbienceStop(client); for (new x = 0; x < MAXTIMERS; x++) { @@ -200,7 +202,7 @@ MapChangeCleanup() tRound = INVALID_HANDLE; tInfect = INVALID_HANDLE; - tAmbience = INVALID_HANDLE; + AmbienceStopAll(); for (new client = 1; client <= maxclients; client++) { diff --git a/src/zr/ambience.inc b/src/zr/ambience.inc index 91f3a61..bd59d0e 100644 --- a/src/zr/ambience.inc +++ b/src/zr/ambience.inc @@ -6,9 +6,10 @@ * ==================== */ -new bool:soundValid = false; - -new Handle:tAmbience = INVALID_HANDLE; +new bool:AmbienceLoaded = false; +new String:AmbienceSound[64]; +new Float:AmbienceVolume; +new Handle:tAmbience[MAXPLAYERS + 1] = {INVALID_HANDLE, ...}; LoadAmbienceData() { @@ -19,79 +20,116 @@ LoadAmbienceData() } decl String:sound[64]; - GetConVarString(gCvars[CVAR_AMBIENCE_FILE], sound, sizeof(sound)); - Format(sound, sizeof(sound), "sound/%s", sound); + GetConVarString(gCvars[CVAR_AMBIENCE_FILE], AmbienceSound, sizeof(AmbienceSound)); + Format(sound, sizeof(sound), "sound/%s", AmbienceSound); - soundValid = FileExists(sound, true); + AmbienceLoaded = FileExists(sound, true); - if (soundValid) + 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 { - ZR_LogMessage("Ambient sound load failed", sound); + 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); + } } } -RestartAmbience() +AmbienceStart(client) { - if (tAmbience != INVALID_HANDLE) - { - CloseHandle(tAmbience); - } - - CreateTimer(0.0, AmbienceLoop, _, TIMER_FLAG_NO_MAPCHANGE); -} - -public Action:AmbienceLoop(Handle:timer) -{ - new bool:ambience = GetConVarBool(gCvars[CVAR_AMBIENCE]); - - if (!ambience || !soundValid) + if (!AmbienceLoaded) { return; } - decl String:sound[64]; - GetConVarString(gCvars[CVAR_AMBIENCE_FILE], sound, sizeof(sound)); - - EmitAmbience(sound); - - new Float:delay = GetConVarFloat(gCvars[CVAR_AMBIENCE_LENGTH]); - tAmbience = CreateTimer(delay, AmbienceLoop, _, TIMER_FLAG_NO_MAPCHANGE); -} - -StopAmbience() -{ new bool:ambience = GetConVarBool(gCvars[CVAR_AMBIENCE]); - if (!ambience) { return; } - decl String:sound[64]; - GetConVarString(gCvars[CVAR_AMBIENCE_FILE], sound, sizeof(sound)); - - new maxplayers = GetMaxClients(); - for (new x = 1; x <= maxplayers; x++) + new Float:delay = GetConVarFloat(gCvars[CVAR_AMBIENCE_LENGTH]); + if (delay <= 0.0) { - if (!IsClientInGame(x)) + 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)) { - continue; + StopSound(client, SNDCHAN_AUTO, AmbienceSound); } - - StopSound(x, SNDCHAN_AUTO, sound); } } -EmitAmbience(const String:sound[]) +AmbienceStopAll() { - PrecacheSound(sound); + for (new client = 1; client < maxclients; client++) + { + AmbienceStop(client); + } +} + +AmbienceRestart(client) +{ + AmbienceStop(client); + AmbienceStart(client); +} + +AmbienceRestartAll() +{ + for (new client = 1; client < maxclients; client++) + { + AmbienceRestart(client); + } +} + +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; + } - StopAmbience(); - - new Float:volume = GetConVarFloat(gCvars[CVAR_AMBIENCE_VOLUME]); - EmitSoundToAll(sound, SOUND_FROM_PLAYER, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, volume, SNDPITCH_NORMAL, -1, NULL_VECTOR, NULL_VECTOR, true, 0.0); + 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); } \ No newline at end of file diff --git a/src/zr/event.inc b/src/zr/event.inc index 904e1e6..38d8626 100644 --- a/src/zr/event.inc +++ b/src/zr/event.inc @@ -33,9 +33,7 @@ UnhookEvents() public Action:RoundStart(Handle:event, const String:name[], bool:dontBroadcast) { ChangeLightStyle(); - - RestartAmbience(); - + AmbienceRestartAll(); RefreshList(); if (tRound != INVALID_HANDLE) diff --git a/src/zr/translation.inc b/src/zr/translation.inc index c1b2e3c..6dd5326 100644 --- a/src/zr/translation.inc +++ b/src/zr/translation.inc @@ -6,6 +6,10 @@ * ==================== */ +#define LOG_FORMAT_TYPE_SIMPLE 0 // Simple log message, no module or block info. +#define LOG_FORMAT_TYPE_FULL 1 // Full log message, with module and block info. +#define LOG_FORMAT_TYPE_ERROR 2 // Full log message, but log to error log instead. + FormatTextString(String:text[], maxlen) { Format(text, maxlen, "@green[%t] @default%s", "ZR", text); @@ -105,7 +109,13 @@ stock ZR_LogMessage(any:...) LogMessage(phrase); } -stock ZR_LogMessageFormatted(client, const String:module[], const String:block[], const String:message[], bool:full = false, any:...) +stock ZR_TranslateMessage(String:buffer[], maxlen, any:...) +{ + SetGlobalTransTarget(LANG_SERVER); + VFormat(buffer, maxlen, "%t", 3); +} + +stock ZR_LogMessageFormatted(client, const String:module[], const String:block[], const String:message[], type = LOG_FORMAT_TYPE_FULL, any:...) { decl String:buffer[2048]; decl String:text[2048]; @@ -115,15 +125,26 @@ stock ZR_LogMessageFormatted(client, const String:module[], const String:block[] return; } - if (full) + switch (type) { - VFormat(buffer, sizeof(buffer), message, 6); - Format(text, sizeof(text), "Log (%s : %s) -- %s", module, block, buffer); - } - else - { - VFormat(buffer, sizeof(buffer), message, 6); - Format(text, sizeof(text), "Log -- %s", message); + case LOG_FORMAT_TYPE_SIMPLE: + { + VFormat(buffer, sizeof(buffer), message, 6); + Format(text, sizeof(text), "Log -- %s", message); + LogMessage(text); + } + case LOG_FORMAT_TYPE_FULL: + { + VFormat(buffer, sizeof(buffer), message, 6); + Format(text, sizeof(text), "Log (%s : %s) -- %s", module, block, buffer); + LogMessage(text); + } + case LOG_FORMAT_TYPE_ERROR: + { + VFormat(buffer, sizeof(buffer), message, 6); + Format(text, sizeof(text), "Log (%s : %s) -- %s", module, block, buffer); + LogError(text); + } } if (LogHasFlag(LOG_TO_ADMINS)) @@ -134,8 +155,6 @@ stock ZR_LogMessageFormatted(client, const String:module[], const String:block[] { PrintToConsole(client, "[ZR] %s", text); } - - LogMessage(text); } stock ZR_ReplyToCommand(client, any:...)