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