void CreateSound(client) {
if (isValidClientForBlaze(client)) {
sndLife = 120;
gEmitSoundPath = "music/flu/concert/onebadman.wav"; // music/flu/concert/onebadman.wav
PrintToChatAll("CreateSound %N", client);
CreateTimer(0.3, Timer_updateBlazeSound,GetClientUserId(client),TIMER_REPEAT);
EmitSoundToAll(gEmitSoundPath, SOUND_FROM_PLAYER, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_NOFLAGS, 0.0, SNDPITCH_NORMAL, -1, NULL_VECTOR, NULL_VECTOR, true, 0.0);
int clients[1];
clients[0] = client;
EmitSound(clients, 1, gEmitSoundPath, SOUND_FROM_PLAYER, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_CHANGEVOL, 1.0, SNDPITCH_NORMAL, -1, NULL_VECTOR, NULL_VECTOR, true, 0.0);
}
}
public Action Timer_updateBlazeSound(Handle timer, any userid) {
int client = GetClientOfUserId(userid);
sndLife -=1;
if (isValidClientForBlaze(client) && sndLife > 0) {
updateEmitSoundtoAllFrom(client,70.0, 400.0);
return Plugin_Continue;
}
sndLife = 0;
StopEmitSound();
PrintToChatAll("StopEmitSound");
return Plugin_Stop;
}
void updateEmitSoundtoAllFrom(int fromClient, float distHighVolume, float distLowVolume) {
int clients[1];
for (int i=1; i<=MaxClients; i++) {
if (IsClientInGame(i) && !IsFakeClient(i) && GetClientTeam(i) != 3) {
if (fromClient != i) {
clients[0] = i;
float volume = getVolume(fromClient, i, distHighVolume, distLowVolume);
//PrintToChatAll("%N=%f = %f",i,dist,volume);
EmitSound(clients, 1, gEmitSoundPath, SOUND_FROM_PLAYER, SNDCHAN_AUTO, SNDLEVEL_NORMAL, SND_CHANGEVOL, volume, SNDPITCH_NORMAL, -1, NULL_VECTOR, NULL_VECTOR, true, 0.0);
}
}
}
}
float getVolume(int fromClient, int client,float distHighVolume, float distLowVolume) {
float dist = getPlayerDistance(fromClient, client);
if (dist < distHighVolume) return 1.0;
if (dist > distLowVolume) {
if (dist > 800.0) {
if (dist > 1200.0) return 0.1;
return 0.15;
}
return 0.2;
}
float volume = 1.0 - (1.0 * (100.0 * (dist-distHighVolume) / (distLowVolume - distHighVolume) / 100.0));
if (volume < 0.2) return 0.2;
return volume;
}
float getPlayerDistance(int clientDest, int client) {
float pos[3];
float pos2[3];
GetClientAbsOrigin(clientDest, pos);
GetClientAbsOrigin(client, pos2);
return GetVectorDistance(pos,pos2);
}
bool isValidClientForBlaze(int client) {
if (client && IsClientInGame(client) && !IsFakeClient(client) && GetClientTeam(client) == 2 && IsPlayerAlive(client)) return true;
return false;
}
void StopEmitSound() {
for(int i = 1; i <= MaxClients; i++) {
if (!IsClientInGame(i)) StopSound(i, SNDCHAN_AUTO, gEmitSoundPath);
else if (!IsFakeClient(i) && GetClientTeam(i) != 3) StopSound(i, SNDCHAN_AUTO, gEmitSoundPath);
}
}
Если есть предложения по улучшению кода пишите =)
------------------------------------------------------------------------------------------------------------------
все что здесь надо настроить, это аргументы функции updateEmitSoundtoAllFrom(client,70.0, 400.0);
1 аргумент - клиент, который является источником звука
2 аргумент - дистанция до которой громкость звука на 100%
3 аргумент - дистанция на которой будет слышно примерно 1% громкости звука
кому надо можете переделать эти параметры под квары
дальше внутри функции идет ограничение дистанцию 800, после нее громкость будет 0.15, и последняя дистанция 1200 на ней звук полностью не слышен, если нужно корректируйте или убирайте эти ограничения сами.