plugins/include/sdktools_sound.inc
author David Anderson <dvander@alliedmods.net>
Sun Jul 06 04:49:55 2008 +0000 (2008-07-06)
branchrefac-jit
changeset 2168 c24a6fa957db
child 2289 44045ead61cd
permissions -rw-r--r--
jit refactoring branch
dvander@2168
     1
/**
dvander@2168
     2
 * vim: set ts=4 :
dvander@2168
     3
 * =============================================================================
dvander@2168
     4
 * SourceMod (C)2004-2008 AlliedModders LLC.  All rights reserved.
dvander@2168
     5
 * =============================================================================
dvander@2168
     6
 *
dvander@2168
     7
 * This file is part of the SourceMod/SourcePawn SDK.
dvander@2168
     8
 *
dvander@2168
     9
 * This program is free software; you can redistribute it and/or modify it under
dvander@2168
    10
 * the terms of the GNU General Public License, version 3.0, as published by the
dvander@2168
    11
 * Free Software Foundation.
dvander@2168
    12
 * 
dvander@2168
    13
 * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@2168
    14
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@2168
    15
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
dvander@2168
    16
 * details.
dvander@2168
    17
 *
dvander@2168
    18
 * You should have received a copy of the GNU General Public License along with
dvander@2168
    19
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@2168
    20
 *
dvander@2168
    21
 * As a special exception, AlliedModders LLC gives you permission to link the
dvander@2168
    22
 * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@2168
    23
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@2168
    24
 * by the Valve Corporation.  You must obey the GNU General Public License in
dvander@2168
    25
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
dvander@2168
    26
 * this exception to all derivative works.  AlliedModders LLC defines further
dvander@2168
    27
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@2168
    28
 * or <http://www.sourcemod.net/license.php>.
dvander@2168
    29
 *
dvander@2168
    30
 * Version: $Id$
dvander@2168
    31
 */
dvander@2168
    32
dvander@2168
    33
#if defined _sdktools_sound_included
dvander@2168
    34
  #endinput
dvander@2168
    35
#endif
dvander@2168
    36
#define _sdktools_sound_included
dvander@2168
    37
dvander@2168
    38
/**
dvander@2168
    39
 * Sound should be from the target client.
dvander@2168
    40
 */
dvander@2168
    41
#define SOUND_FROM_PLAYER		-2
dvander@2168
    42
dvander@2168
    43
/**
dvander@2168
    44
 * Sound should be from the listen server player.
dvander@2168
    45
 */
dvander@2168
    46
#define SOUND_FROM_LOCAL_PLAYER	-1
dvander@2168
    47
dvander@2168
    48
/**
dvander@2168
    49
 * Sound is from the world.
dvander@2168
    50
 */
dvander@2168
    51
#define SOUND_FROM_WORLD		0
dvander@2168
    52
dvander@2168
    53
/**
dvander@2168
    54
 * Sound channels.
dvander@2168
    55
 */
dvander@2168
    56
enum
dvander@2168
    57
{
dvander@2168
    58
	SNDCHAN_REPLACE = -1,		/**< Unknown */
dvander@2168
    59
	SNDCHAN_AUTO = 0,			/**< Auto */
dvander@2168
    60
	SNDCHAN_WEAPON = 1,			/**< Weapons */
dvander@2168
    61
	SNDCHAN_VOICE = 2,			/**< Voices */
dvander@2168
    62
	SNDCHAN_ITEM = 3,			/**< Items */
dvander@2168
    63
	SNDCHAN_BODY = 4,			/**< Player? */
dvander@2168
    64
	SNDCHAN_STREAM = 5,			/**< "Stream channel from the static or dynamic area" */
dvander@2168
    65
	SNDCHAN_STATIC = 6,			/**< "Stream channel from the static area" */
dvander@2168
    66
	SNDCHAN_VOICE_BASE = 7,		/**< "Channel for network voice data" */
dvander@2168
    67
	SNDCHAN_USER_BASE = 135		/**< Anything >= this is allocated to game code */
dvander@2168
    68
};
dvander@2168
    69
dvander@2168
    70
/**
dvander@2168
    71
 * Sound flags for the sound emitter system.
dvander@2168
    72
 */
dvander@2168
    73
enum
dvander@2168
    74
{
dvander@2168
    75
	SND_NOFLAGS= 0,			/**< Nothing */
dvander@2168
    76
	SND_CHANGEVOL = 1,		/**< Change sound volume */
dvander@2168
    77
	SND_CHANGEPITCH = 2,	/**< Change sound pitch */
dvander@2168
    78
	SND_STOP = 3,			/**< Stop the sound */
dvander@2168
    79
	SND_SPAWNING = 4,		/**< Used in some cases for ambients */
dvander@2168
    80
	SND_DELAY = 5,			/**< Sound has an initial delay */
dvander@2168
    81
	SND_STOPLOOPING = 6,	/**< Stop looping all sounds on the entity */
dvander@2168
    82
	SND_SPEAKER = 7,		/**< Being played by a mic through a speaker */
dvander@2168
    83
	SND_SHOULDPAUSE = 8,	/**< Pause if game is paused */
dvander@2168
    84
};
dvander@2168
    85
dvander@2168
    86
/**
dvander@2168
    87
 * Various predefined sound levels in dB.
dvander@2168
    88
 */
dvander@2168
    89
enum
dvander@2168
    90
{
dvander@2168
    91
	SNDLEVEL_NONE = 0,			/**< None */
dvander@2168
    92
	SNDLEVEL_RUSTLE = 20,		/**< Rustling leaves */
dvander@2168
    93
	SNDLEVEL_WHISPER = 25,		/**< Whispering */
dvander@2168
    94
	SNDLEVEL_LIBRARY = 30,		/**< In a library */
dvander@2168
    95
	SNDLEVEL_FRIDGE = 45,		/**< Refridgerator */
dvander@2168
    96
	SNDLEVEL_HOME = 50,			/**< Average home (3.9 attn) */
dvander@2168
    97
	SNDLEVEL_CONVO = 60,		/**< Normal conversation (2.0 attn) */
dvander@2168
    98
	SNDLEVEL_DRYER = 60,		/**< Clothes dryer */
dvander@2168
    99
	SNDLEVEL_DISHWASHER = 65,	/**< Dishwasher/washing machine (1.5 attn) */
dvander@2168
   100
	SNDLEVEL_CAR = 70,			/**< Car or vacuum cleaner (1.0 attn) */
dvander@2168
   101
	SNDLEVEL_NORMAL = 75,		/**< Normal sound level */
dvander@2168
   102
	SNDLEVEL_TRAFFIC = 75,		/**< Busy traffic (0.8 attn) */
dvander@2168
   103
	SNDLEVEL_MINIBIKE = 80,		/**< Mini-bike, alarm clock (0.7 attn) */
dvander@2168
   104
	SNDLEVEL_SCREAMING = 90,	/**< Screaming child (0.5 attn) */
dvander@2168
   105
	SNDLEVEL_TRAIN = 100,		/**< Subway train, pneumatic drill (0.4 attn) */
dvander@2168
   106
	SNDLEVEL_HELICOPTER = 105,	/**< Helicopter */
dvander@2168
   107
	SNDLEVEL_SNOWMOBILE = 110,	/**< Snow mobile */
dvander@2168
   108
	SNDLEVEL_AIRCRAFT = 120,	/**< Auto horn, aircraft */
dvander@2168
   109
	SNDLEVEL_RAIDSIREN = 130,	/**< Air raid siren */
dvander@2168
   110
	SNDLEVEL_GUNFIRE = 140,		/**< Gunshot, jet engine (0.27 attn) */
dvander@2168
   111
	SNDLEVEL_ROCKET = 180,		/**< Rocket launching (0.2 attn) */
dvander@2168
   112
};
dvander@2168
   113
dvander@2168
   114
#define SNDVOL_NORMAL		1.0		/**< Normal volume */
dvander@2168
   115
#define SNDPITCH_NORMAL		100		/**< Normal pitch */
dvander@2168
   116
#define SNDPITCH_LOW		95		/**< A low pitch */
dvander@2168
   117
#define SNDPITCH_HIGH		120		/**< A high pitch */
dvander@2168
   118
#define SNDATTN_NONE		0.0		/**< No attenuation */
dvander@2168
   119
#define SNDATTN_NORMAL		0.8		/**< Normal attenuation */
dvander@2168
   120
#define SNDATTN_STATIC		1.25	/**< Static attenuation? */
dvander@2168
   121
#define SNDATTN_RICOCHET	1.5		/**< Ricochet effect */
dvander@2168
   122
#define SNDATTN_IDLE		2.0		/**< Idle attenuation? */
dvander@2168
   123
 
dvander@2168
   124
/**
dvander@2168
   125
 * Prefetches a sound.
dvander@2168
   126
 *
dvander@2168
   127
 * @param name		Sound file name relative to the "sounds" folder.
dvander@2168
   128
 * @noreturn
dvander@2168
   129
 */
dvander@2168
   130
native PrefetchSound(const String:nane[]);
dvander@2168
   131
dvander@2168
   132
/**
dvander@2168
   133
 * This function is not known to work, and may crash.  You should 
dvander@2168
   134
 * not use it.  It is provided for backwards compatibility only.
dvander@2168
   135
 *
dvander@2168
   136
 * @param name		Sound file name relative to the "sounds" folder.
dvander@2168
   137
 * @return			Duration in seconds.
dvander@2168
   138
 */
dvander@2168
   139
#pragma deprecated Does not work, may crash.
dvander@2168
   140
native Float:GetSoundDuration(const String:name[]);
dvander@2168
   141
dvander@2168
   142
/**
dvander@2168
   143
 * Emits an ambient sound.
dvander@2168
   144
 *
dvander@2168
   145
 * @param name		Sound file name relative to the "sounds" folder.
dvander@2168
   146
 * @param pos		Origin of sound.
dvander@2168
   147
 * @param entity	Entity index to associate sound with.
dvander@2168
   148
 * @param level		Sound level (from 0 to 255).
dvander@2168
   149
 * @param flags		Sound flags.
dvander@2168
   150
 * @param vol		Volume (from 0.0 to 1.0).
dvander@2168
   151
 * @param pitch		Pitch (from 0 to 255).
dvander@2168
   152
 * @param delay		Play delay.
dvander@2168
   153
 * @noreturn
dvander@2168
   154
 */
dvander@2168
   155
native EmitAmbientSound(const String:name[],
dvander@2168
   156
						const Float:pos[3],
dvander@2168
   157
						entity = SOUND_FROM_WORLD,
dvander@2168
   158
						level = SNDLEVEL_NORMAL,
dvander@2168
   159
						flags = SND_NOFLAGS,
dvander@2168
   160
						Float:vol = SNDVOL_NORMAL,
dvander@2168
   161
						pitch = SNDPITCH_NORMAL,
dvander@2168
   162
						Float:delay = 0.0);
dvander@2168
   163
dvander@2168
   164
/**
dvander@2168
   165
 * Fades a client's volume level toward silence or a given percentage.
dvander@2168
   166
 *
dvander@2168
   167
 * @param client	Client index.
dvander@2168
   168
 * @param percent	Fade percentage.
dvander@2168
   169
 * @param outtime	Fade out time, in seconds.
dvander@2168
   170
 * @param holdtime	Hold time, in seconds.
dvander@2168
   171
 * @param intime	Fade in time, in seconds.
dvander@2168
   172
 * @noreturn
dvander@2168
   173
 * @error			Invalid client index or client not in game.
dvander@2168
   174
 */
dvander@2168
   175
native FadeClientVolume(client, Float:percent, Float:outtime, Float:holdtime, Float:intime);
dvander@2168
   176
dvander@2168
   177
/**
dvander@2168
   178
 * Stops a sound.
dvander@2168
   179
 *
dvander@2168
   180
 * @param entity	Entity index.
dvander@2168
   181
 * @param channel	Channel number.
dvander@2168
   182
 * @param name		Sound file name relative to the "sounds" folder.
dvander@2168
   183
 * @noreturn
dvander@2168
   184
 */
dvander@2168
   185
native StopSound(entity, channel, const String:name[]);
dvander@2168
   186
dvander@2168
   187
/**
dvander@2168
   188
 * Emits a sound to a list of clients.
dvander@2168
   189
 *
dvander@2168
   190
 * @param clients		Array of client indexes.
dvander@2168
   191
 * @param numClients	Number of clients in the array.
dvander@2168
   192
 * @param sample		Sound file name relative to the "sounds" folder.
dvander@2168
   193
 * @param entity		Entity to emit from.
dvander@2168
   194
 * @param channel		Channel to emit with.
dvander@2168
   195
 * @param level			Sound level.
dvander@2168
   196
 * @param flags			Sound flags.
dvander@2168
   197
 * @param volume		Sound volume.
dvander@2168
   198
 * @param pitch			Sound pitch.
dvander@2168
   199
 * @param speakerentity	Unknown.
dvander@2168
   200
 * @param origin		Sound origin.
dvander@2168
   201
 * @param dir			Sound direction.
dvander@2168
   202
 * @param updatePos		Unknown (updates positions?)
dvander@2168
   203
 * @param soundtime		Alternate time to play sound for.
dvander@2168
   204
 * @param ...			Optional list of Float[3] arrays to specify additional origins.
dvander@2168
   205
 * @noreturn
dvander@2168
   206
 * @error				Invalid client index.
dvander@2168
   207
 */
dvander@2168
   208
native EmitSound(const clients[],
dvander@2168
   209
				 numClients,
dvander@2168
   210
				 const String:sample[],
dvander@2168
   211
				 entity = SOUND_FROM_PLAYER,
dvander@2168
   212
				 channel = SNDCHAN_AUTO,
dvander@2168
   213
				 level = SNDLEVEL_NORMAL,
dvander@2168
   214
				 flags = SND_NOFLAGS,
dvander@2168
   215
				 Float:volume = SNDVOL_NORMAL,
dvander@2168
   216
				 pitch = SNDPITCH_NORMAL,
dvander@2168
   217
				 speakerentity = -1,
dvander@2168
   218
				 const Float:origin[3] = NULL_VECTOR,
dvander@2168
   219
				 const Float:dir[3] = NULL_VECTOR,
dvander@2168
   220
				 bool:updatePos = true,
dvander@2168
   221
				 Float:soundtime = 0.0,
dvander@2168
   222
				 any:...);
dvander@2168
   223
dvander@2168
   224
/**
dvander@2168
   225
 * Emits a sentence to a list of clients.
dvander@2168
   226
 *
dvander@2168
   227
 * @param clients		Array of client indexes.
dvander@2168
   228
 * @param numClients	Number of clients in the array.
dvander@2168
   229
 * @param sentence		Sentence index (from PrecacheSenteFile).
dvander@2168
   230
 * @param entity		Entity to emit from.
dvander@2168
   231
 * @param channel		Channel to emit with.
dvander@2168
   232
 * @param level			Sound level.
dvander@2168
   233
 * @param flags			Sound flags.
dvander@2168
   234
 * @param volume		Sound volume.
dvander@2168
   235
 * @param pitch			Sound pitch.
dvander@2168
   236
 * @param speakerentity	Unknown.
dvander@2168
   237
 * @param origin		Sound origin.
dvander@2168
   238
 * @param dir			Sound direction.
dvander@2168
   239
 * @param updatePos		Unknown (updates positions?)
dvander@2168
   240
 * @param soundtime		Alternate time to play sound for.
dvander@2168
   241
 * @param ...			Optional list of Float[3] arrays to specify additional origins.
dvander@2168
   242
 * @noreturn
dvander@2168
   243
 * @error				Invalid client index.
dvander@2168
   244
 */
dvander@2168
   245
native EmitSentence(const clients[],
dvander@2168
   246
				 numClients,
dvander@2168
   247
				 sentence,
dvander@2168
   248
				 entity,
dvander@2168
   249
				 channel = SNDCHAN_AUTO,
dvander@2168
   250
				 level = SNDLEVEL_NORMAL,
dvander@2168
   251
				 flags = SND_NOFLAGS,
dvander@2168
   252
				 Float:volume = SNDVOL_NORMAL,
dvander@2168
   253
				 pitch = SNDPITCH_NORMAL,
dvander@2168
   254
				 speakerentity = -1,
dvander@2168
   255
				 const Float:origin[3] = NULL_VECTOR,
dvander@2168
   256
				 const Float:dir[3] = NULL_VECTOR,
dvander@2168
   257
				 bool:updatePos = true,
dvander@2168
   258
				 Float:soundtime = 0.0,
dvander@2168
   259
				 any:...);
dvander@2168
   260
dvander@2168
   261
/**
dvander@2168
   262
 * Called when an ambient sound is about to be emitted to one or more clients.
dvander@2168
   263
 *
dvander@2168
   264
 * NOTICE: all parameters can be overwritten to modify the default behavior.
dvander@2168
   265
 *
dvander@2168
   266
 * @param sample	Sound file name relative to the "sounds" folder.
dvander@2168
   267
 * @param entity	Entity index associated to the sound.
dvander@2168
   268
 * @param volume	Volume (from 0.0 to 1.0).
dvander@2168
   269
 * @param level		Sound level (from 0 to 255).
dvander@2168
   270
 * @param pitch		Pitch (from 0 to 255).
dvander@2168
   271
 * @param pos		Origin of sound.
dvander@2168
   272
 * @param flags		Sound flags.
dvander@2168
   273
 * @param delay		Play delay.
dvander@2168
   274
 * @return		Plugin_Continue to allow the sound to be played, Plugin_Stop to block it, 
dvander@2168
   275
 *			  Plugin_Changed when any parameter has been modified.
dvander@2168
   276
 */
dvander@2168
   277
functag AmbientSHook Action:public(String:sample[PLATFORM_MAX_PATH], &entity, &Float:volume, &level, &pitch, Float:pos[3], &flags, &Float:delay);
dvander@2168
   278
dvander@2168
   279
/**
dvander@2168
   280
 * Called when a sound is going to be emitted to one or more clients.
dvander@2168
   281
 * NOTICE: all params can be overwritten to modify the default behaviour.
dvander@2168
   282
 *
dvander@2168
   283
 * @param clients		Array of client indexes.
dvander@2168
   284
 * @param numClients		Number of clients in the array (modify this value if you add/remove elements from the client array).
dvander@2168
   285
 * @param sample		Sound file name relative to the "sounds" folder.
dvander@2168
   286
 * @param entity		Entity emitting the sound.
dvander@2168
   287
 * @param channel		Channel emitting the sound.
dvander@2168
   288
 * @param volume		Sound volume.
dvander@2168
   289
 * @param level			Sound level.
dvander@2168
   290
 * @param pitch			Sound pitch.
dvander@2168
   291
 * @param flags			Sound flags.
dvander@2168
   292
 * @return			Plugin_Continue to allow the sound to be played, Plugin_Stop to block it, 
dvander@2168
   293
 *				  Plugin_Changed when any parameter has been modified.
dvander@2168
   294
 */
dvander@2168
   295
functag NormalSHook Action:public(clients[64], &numClients, String:sample[PLATFORM_MAX_PATH], &entity, &channel, &Float:volume, &level, &pitch, &flags);
dvander@2168
   296
dvander@2168
   297
/**
dvander@2168
   298
 * Hooks all played ambient sounds.
dvander@2168
   299
 *
dvander@2168
   300
 * @param hook		Function to use as a hook.
dvander@2168
   301
 * @noreturn
dvander@2168
   302
 * @error		Invalid function hook.
dvander@2168
   303
 */
dvander@2168
   304
native AddAmbientSoundHook(AmbientSHook:hook);
dvander@2168
   305
dvander@2168
   306
/**
dvander@2168
   307
 * Hooks all played normal sounds.
dvander@2168
   308
 *
dvander@2168
   309
 * @param hook		Function to use as a hook.
dvander@2168
   310
 * @noreturn
dvander@2168
   311
 * @error		Invalid function hook.
dvander@2168
   312
 */
dvander@2168
   313
native AddNormalSoundHook(NormalSHook:hook);
dvander@2168
   314
dvander@2168
   315
/**
dvander@2168
   316
 * Unhooks all played ambient sounds.
dvander@2168
   317
 *
dvander@2168
   318
 * @param hook		Function used for the hook.
dvander@2168
   319
 * @noreturn
dvander@2168
   320
 * @error		Invalid function hook.
dvander@2168
   321
 */
dvander@2168
   322
native RemoveAmbientSoundHook(AmbientSHook:hook);
dvander@2168
   323
dvander@2168
   324
/**
dvander@2168
   325
 * Unhooks all played normal sounds.
dvander@2168
   326
 *
dvander@2168
   327
 * @param hook		Function used for the hook.
dvander@2168
   328
 * @noreturn
dvander@2168
   329
 * @error		Invalid function hook.
dvander@2168
   330
 */
dvander@2168
   331
native RemoveNormalSoundHook(NormalSHook:hook);
dvander@2168
   332
				 
dvander@2168
   333
/**
dvander@2168
   334
 * Wrapper to emit sound to one client.
dvander@2168
   335
 *
dvander@2168
   336
 * @param client		Client index.
dvander@2168
   337
 * @param sample		Sound file name relative to the "sounds" folder.
dvander@2168
   338
 * @param entity		Entity to emit from.
dvander@2168
   339
 * @param channel		Channel to emit with.
dvander@2168
   340
 * @param level			Sound level.
dvander@2168
   341
 * @param flags			Sound flags.
dvander@2168
   342
 * @param volume		Sound volume.
dvander@2168
   343
 * @param pitch			Sound pitch.
dvander@2168
   344
 * @param speakerentity	Unknown.
dvander@2168
   345
 * @param origin		Sound origin.
dvander@2168
   346
 * @param dir			Sound direction.
dvander@2168
   347
 * @param updatePos		Unknown (updates positions?)
dvander@2168
   348
 * @param soundtime		Alternate time to play sound for.
dvander@2168
   349
 * @noreturn
dvander@2168
   350
 * @error				Invalid client index.
dvander@2168
   351
 */
dvander@2168
   352
stock EmitSoundToClient(client,
dvander@2168
   353
				 const String:sample[],
dvander@2168
   354
				 entity = SOUND_FROM_PLAYER,
dvander@2168
   355
				 channel = SNDCHAN_AUTO,
dvander@2168
   356
				 level = SNDLEVEL_NORMAL,
dvander@2168
   357
				 flags = SND_NOFLAGS,
dvander@2168
   358
				 Float:volume = SNDVOL_NORMAL,
dvander@2168
   359
				 pitch = SNDPITCH_NORMAL,
dvander@2168
   360
				 speakerentity = -1,
dvander@2168
   361
				 const Float:origin[3] = NULL_VECTOR,
dvander@2168
   362
				 const Float:dir[3] = NULL_VECTOR,
dvander@2168
   363
				 bool:updatePos = true,
dvander@2168
   364
				 Float:soundtime = 0.0)
dvander@2168
   365
{
dvander@2168
   366
	new clients[1];
dvander@2168
   367
	clients[0] = client;
dvander@2168
   368
	/* Save some work for SDKTools and remove SOUND_FROM_PLAYER references */
dvander@2168
   369
	entity = (entity == SOUND_FROM_PLAYER) ? client : entity;
dvander@2168
   370
	EmitSound(clients, 1, sample, entity, channel, 
dvander@2168
   371
		level, flags, volume, pitch, speakerentity,
dvander@2168
   372
		origin, dir, updatePos, soundtime);
dvander@2168
   373
}
dvander@2168
   374
dvander@2168
   375
/**
dvander@2168
   376
 * Wrapper to emit sound to all clients.
dvander@2168
   377
 *
dvander@2168
   378
 * @param sample		Sound file name relative to the "sounds" folder.
dvander@2168
   379
 * @param entity		Entity to emit from.
dvander@2168
   380
 * @param channel		Channel to emit with.
dvander@2168
   381
 * @param level			Sound level.
dvander@2168
   382
 * @param flags			Sound flags.
dvander@2168
   383
 * @param volume		Sound volume.
dvander@2168
   384
 * @param pitch			Sound pitch.
dvander@2168
   385
 * @param speakerentity	Unknown.
dvander@2168
   386
 * @param origin		Sound origin.
dvander@2168
   387
 * @param dir			Sound direction.
dvander@2168
   388
 * @param updatePos		Unknown (updates positions?)
dvander@2168
   389
 * @param soundtime		Alternate time to play sound for.
dvander@2168
   390
 * @noreturn
dvander@2168
   391
 * @error				Invalid client index.
dvander@2168
   392
 */
dvander@2168
   393
stock EmitSoundToAll(const String:sample[],
dvander@2168
   394
				 entity = SOUND_FROM_PLAYER,
dvander@2168
   395
				 channel = SNDCHAN_AUTO,
dvander@2168
   396
				 level = SNDLEVEL_NORMAL,
dvander@2168
   397
				 flags = SND_NOFLAGS,
dvander@2168
   398
				 Float:volume = SNDVOL_NORMAL,
dvander@2168
   399
				 pitch = SNDPITCH_NORMAL,
dvander@2168
   400
				 speakerentity = -1,
dvander@2168
   401
				 const Float:origin[3] = NULL_VECTOR,
dvander@2168
   402
				 const Float:dir[3] = NULL_VECTOR,
dvander@2168
   403
				 bool:updatePos = true,
dvander@2168
   404
				 Float:soundtime = 0.0)
dvander@2168
   405
{
dvander@2168
   406
	new maxClients = GetMaxClients();
dvander@2168
   407
	new clients[maxClients];
dvander@2168
   408
	new total = 0;
dvander@2168
   409
	
dvander@2168
   410
	for (new i=1; i<=maxClients; i++)
dvander@2168
   411
	{
dvander@2168
   412
		if (IsClientInGame(i))
dvander@2168
   413
		{
dvander@2168
   414
			clients[total++] = i;
dvander@2168
   415
		}
dvander@2168
   416
	}
dvander@2168
   417
	
dvander@2168
   418
	if (!total)
dvander@2168
   419
	{
dvander@2168
   420
		return;
dvander@2168
   421
	}
dvander@2168
   422
	
dvander@2168
   423
	EmitSound(clients, total, sample, entity, channel, 
dvander@2168
   424
		level, flags, volume, pitch, speakerentity,
dvander@2168
   425
		origin, dir, updatePos, soundtime);
dvander@2168
   426
}
dvander@2168
   427
dvander@2168
   428
/**
dvander@2168
   429
 * Converts an attenuation value to a sound level.  
dvander@2168
   430
 * This function is from the HL2SDK.
dvander@2168
   431
 *
dvander@2168
   432
 * @param attn		Attenuation value.
dvander@2168
   433
 * @return			Integer sound level.
dvander@2168
   434
 */
dvander@2168
   435
stock ATTN_TO_SNDLEVEL(Float:attn)
dvander@2168
   436
{
dvander@2168
   437
	if (attn > 0.0)
dvander@2168
   438
	{
dvander@2168
   439
		return RoundFloat(50.0 + (20.0 / attn));
dvander@2168
   440
	}
dvander@2168
   441
	return 0;
dvander@2168
   442
}