plugins/include/sdktools_sound.inc
author Borja Ferrer <faluco@alliedmods.net>
Sat Aug 04 00:09:10 2007 +0000 (2007-08-04)
changeset 1262 843e9ed0ff29
parent 1048 9f5605daf52d
child 1330 ab94316bb52b
permissions -rw-r--r--
fixed amb728, precache slap sounds
dvander@1047
     1
/**
dvander@1047
     2
 * vim: set ts=4 :
dvander@1047
     3
 * ===============================================================
dvander@1047
     4
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@1047
     5
 * ===============================================================
dvander@1047
     6
 *
dvander@1047
     7
 *  This file is part of the SourceMod/SourcePawn SDK.  This file may only be used 
dvander@1047
     8
 * or modified under the Terms and Conditions of its License Agreement, which is found 
dvander@1047
     9
 * in LICENSE.txt.  The Terms and Conditions for making SourceMod extensions/plugins 
dvander@1047
    10
 * may change at any time.  To view the latest information, see:
dvander@1047
    11
 *   http://www.sourcemod.net/license.php
dvander@1047
    12
 *
dvander@1047
    13
 * Version: $Id$
dvander@1047
    14
 */
dvander@1047
    15
dvander@1047
    16
#if defined _sdktools_sound_included
dvander@1047
    17
  #endinput
dvander@1047
    18
#endif
dvander@1047
    19
#define _sdktools_sound_included
dvander@1047
    20
dvander@1047
    21
/**
dvander@1048
    22
 * Sound should be from the target client.
dvander@1047
    23
 */
dvander@1048
    24
#define SOUND_FROM_PLAYER		-2
dvander@1048
    25
dvander@1048
    26
/**
dvander@1048
    27
 * Sound should be from the listen server player.
dvander@1048
    28
 */
dvander@1048
    29
#define SOUND_FROM_LOCAL_PLAYER	-1
dvander@1047
    30
dvander@1047
    31
/**
dvander@1047
    32
 * Sound is from the world.
dvander@1047
    33
 */
dvander@1047
    34
#define SOUND_FROM_WORLD		0
dvander@1047
    35
dvander@1047
    36
/**
dvander@1047
    37
 * Sound channels.
dvander@1047
    38
 */
dvander@1047
    39
enum
dvander@1047
    40
{
dvander@1047
    41
	SNDCHAN_REPLACE = -1,		/**< Unknown */
dvander@1047
    42
	SNDCHAN_AUTO = 0,			/**< Auto */
dvander@1047
    43
	SNDCHAN_WEAPON = 1,			/**< Weapons */
dvander@1047
    44
	SNDCHAN_VOICE = 2,			/**< Voices */
dvander@1047
    45
	SNDCHAN_ITEM = 3,			/**< Items */
dvander@1047
    46
	SNDCHAN_BODY = 4,			/**< Player? */
dvander@1047
    47
	SNDCHAN_STREAM = 5,			/**< "Stream channel from the static or dynamic area" */
dvander@1047
    48
	SNDCHAN_STATIC = 6,			/**< "Stream channel from the static area" */
dvander@1047
    49
	SNDCHAN_VOICE_BASE = 7,		/**< "Channel for network voice data" */
dvander@1047
    50
	SNDCHAN_USER_BASE = 135		/**< Anything >= this is allocated to game code */
dvander@1047
    51
};
dvander@1047
    52
dvander@1047
    53
/**
dvander@1047
    54
 * Sound flags for the sound emitter system.
dvander@1047
    55
 */
dvander@1047
    56
enum
dvander@1047
    57
{
dvander@1047
    58
	SND_NOFLAGS= 0,			/**< Nothing */
dvander@1047
    59
	SND_CHANGEVOL = 1,		/**< Change sound volume */
dvander@1047
    60
	SND_CHANGEPITCH = 2,	/**< Change sound pitch */
dvander@1047
    61
	SND_STOP = 3,			/**< Stop the sound */
dvander@1047
    62
	SND_SPAWNING = 4,		/**< Used in some cases for ambients */
dvander@1047
    63
	SND_DELAY = 5,			/**< Sound has an initial delay */
dvander@1047
    64
	SND_STOPLOOPING = 6,	/**< Stop looping all sounds on the entity */
dvander@1047
    65
	SND_SPEAKER = 7,		/**< Being played by a mic through a speaker */
dvander@1047
    66
	SND_SHOULDPAUSE = 8,	/**< Pause if game is paused */
dvander@1047
    67
};
dvander@1047
    68
dvander@1047
    69
/**
dvander@1047
    70
 * Various predefined sound levels in dB.
dvander@1047
    71
 */
dvander@1047
    72
enum
dvander@1047
    73
{
dvander@1047
    74
	SNDLEVEL_NONE = 0,			/**< None */
dvander@1047
    75
	SNDLEVEL_RUSTLE = 20,		/**< Rustling leaves */
dvander@1047
    76
	SNDLEVEL_WHISPER = 25,		/**< Whispering */
dvander@1047
    77
	SNDLEVEL_LIBRARY = 30,		/**< In a library */
dvander@1047
    78
	SNDLEVEL_FRIDGE = 45,		/**< Refridgerator */
dvander@1047
    79
	SNDLEVEL_HOME = 50,			/**< Average home (3.9 attn) */
dvander@1047
    80
	SNDLEVEL_CONVO = 60,		/**< Normal conversation (2.0 attn) */
dvander@1047
    81
	SNDLEVEL_DRYER = 60,		/**< Clothes dryer */
dvander@1047
    82
	SNDLEVEL_DISHWASHER = 65,	/**< Dishwasher/washing machine (1.5 attn) */
dvander@1047
    83
	SNDLEVEL_CAR = 70,			/**< Car or vacuum cleaner (1.0 attn) */
dvander@1047
    84
	SNDLEVEL_NORMAL = 75,		/**< Normal sound level */
dvander@1047
    85
	SNDLEVEL_TRAFFIC = 75,		/**< Busy traffic (0.8 attn) */
dvander@1047
    86
	SNDLEVEL_MINIBIKE = 80,		/**< Mini-bike, alarm clock (0.7 attn) */
dvander@1047
    87
	SNDLEVEL_SCREAMING = 90,	/**< Screaming child (0.5 attn) */
dvander@1047
    88
	SNDLEVEL_TRAIN = 100,		/**< Subway train, pneumatic drill (0.4 attn) */
dvander@1047
    89
	SNDLEVEL_HELICOPTER = 105,	/**< Helicopter */
dvander@1047
    90
	SNDLEVEL_SNOWMOBILE = 110,	/**< Snow mobile */
dvander@1047
    91
	SNDLEVEL_AIRCRAFT = 120,	/**< Auto horn, aircraft */
dvander@1047
    92
	SNDLEVEL_RAIDSIREN = 130,	/**< Air raid siren */
dvander@1047
    93
	SNDLEVEL_GUNFIRE = 140,		/**< Gunshot, jet engine (0.27 attn) */
dvander@1047
    94
	SNDLEVEL_ROCKET = 180,		/**< Rocket launching (0.2 attn) */
dvander@1047
    95
};
dvander@1047
    96
dvander@1047
    97
#define SNDVOL_NORMAL		1.0		/**< Normal volume */
dvander@1047
    98
#define SNDPITCH_NORMAL		100		/**< Normal pitch */
dvander@1047
    99
#define SNDPITCH_LOW		95		/**< A low pitch */
dvander@1047
   100
#define SNDPITCH_HIGH		120		/**< A high pitch */
dvander@1047
   101
#define SNDATTN_NONE		0.0		/**< No attenuation */
dvander@1047
   102
#define SNDATTN_NORMAL		0.8		/**< Normal attenuation */
dvander@1047
   103
#define SNDATTN_STATIC		1.25	/**< Static attenuation? */
dvander@1047
   104
#define SNDATTN_RICOCHET	1.5		/**< Ricochet effect */
dvander@1047
   105
#define SNDATTN_IDLE		2.0		/**< Idle attenuation? */
dvander@1047
   106
 
dvander@1047
   107
/**
dvander@1047
   108
 * Prefetches a sound.
dvander@1047
   109
 *
dvander@1047
   110
 * @param name		Sound file name.
dvander@1047
   111
 * @noreturn
dvander@1047
   112
 */
dvander@1047
   113
native PrefetchSound(const String:nane[]);
dvander@1047
   114
dvander@1047
   115
/**
dvander@1047
   116
 * Gets a sound's duration (does not work for mp3s).
dvander@1047
   117
 *
dvander@1047
   118
 * @param name		Sound file name.
dvander@1047
   119
 * @return			Duration in seconds.
dvander@1047
   120
 */
dvander@1047
   121
native Float:GetSoundDuration(const String:name[]);
dvander@1047
   122
dvander@1047
   123
/**
dvander@1047
   124
 * Emits an ambient sound.
dvander@1047
   125
 *
dvander@1047
   126
 * @param entity	Entity index to associate sound with.
dvander@1047
   127
 * @param pos		Origin of sound.
dvander@1047
   128
 * @param name		Sound file name.
dvander@1047
   129
 * @param level		Sound level (from 0 to 255).
dvander@1047
   130
 * @param flags		Sound flags.
dvander@1047
   131
 * @param vol		Volume (from 0.0 to 1.0).
dvander@1047
   132
 * @param pitch		Pitch (from 0 to 255).
dvander@1047
   133
 * @param delay		Play delay.
dvander@1047
   134
 * @noreturn
dvander@1047
   135
 */
dvander@1047
   136
native EmitAmbientSound(const String:name[],
dvander@1047
   137
						const Float:pos[3],
dvander@1047
   138
						entity = SOUND_FROM_WORLD,
dvander@1047
   139
						level = SNDLEVEL_NORMAL,
dvander@1047
   140
						flags = SND_NOFLAGS,
dvander@1047
   141
						Float:vol = SNDVOL_NORMAL,
dvander@1047
   142
						pitch = SNDPITCH_NORMAL,
dvander@1047
   143
						Float:delay = 0.0);
dvander@1047
   144
dvander@1047
   145
/**
dvander@1047
   146
 * Fades a client's volume level toward silence or a given percentage.
dvander@1047
   147
 *
dvander@1047
   148
 * @param client	Client index.
dvander@1047
   149
 * @param percent	Fade percentage.
dvander@1047
   150
 * @param outtime	Fade out time, in seconds.
dvander@1047
   151
 * @param holdtime	Hold time, in seconds.
dvander@1047
   152
 * @param intime	Fade in time, in seconds.
dvander@1047
   153
 * @noreturn
dvander@1047
   154
 * @error			Invalid client index or client not in game.
dvander@1047
   155
 */
dvander@1047
   156
native FadeClientVolume(client, Float:percent, Float:outtime, Float:holdtime, Float:intime);
dvander@1047
   157
dvander@1047
   158
/**
dvander@1047
   159
 * Stops a sound.
dvander@1047
   160
 *
dvander@1047
   161
 * @param entity	Entity index.
dvander@1047
   162
 * @param channel	Channel number.
dvander@1047
   163
 * @param name		Sound name.
dvander@1047
   164
 * @noreturn
dvander@1047
   165
 */
dvander@1047
   166
native StopSound(entity, channel, const String:name[]);
dvander@1047
   167
dvander@1047
   168
/**
dvander@1047
   169
 * Emits a sound to a list of clients.
dvander@1047
   170
 *
dvander@1047
   171
 * @param clients		Array of client indexes.
dvander@1047
   172
 * @param numClients	Number of clients in the array.
dvander@1047
   173
 * @param entity		Entity to emit from.
dvander@1047
   174
 * @param channel		Channel to emit with.
dvander@1047
   175
 * @param sample		Sound name.
dvander@1047
   176
 * @param level			Sound level.
dvander@1047
   177
 * @param flags			Sound flags.
dvander@1047
   178
 * @param volume		Sound volume.
dvander@1047
   179
 * @param pitch			Sound pitch.
dvander@1047
   180
 * @param speakerentity	Unknown.
dvander@1047
   181
 * @param origin		Sound origin.
dvander@1047
   182
 * @param dir			Sound direction.
dvander@1047
   183
 * @param updatePos		Unknown (updates positions?)
dvander@1047
   184
 * @param soundtime		Alternate time to play sound for.
dvander@1047
   185
 * @param ...			Optional list of Float[3] arrays to specify additional origins.
dvander@1047
   186
 * @noreturn
dvander@1047
   187
 * @error				Invalid client index.
dvander@1047
   188
 */
dvander@1047
   189
native EmitSound(const clients[],
dvander@1047
   190
				 numClients,
dvander@1047
   191
				 const String:sample[],
dvander@1048
   192
				 entity = SOUND_FROM_PLAYER,
dvander@1047
   193
				 channel = SNDCHAN_AUTO,
dvander@1047
   194
				 level = SNDLEVEL_NORMAL,
dvander@1047
   195
				 flags = SND_NOFLAGS,
dvander@1047
   196
				 Float:volume = SNDVOL_NORMAL,
dvander@1047
   197
				 pitch = SNDPITCH_NORMAL,
dvander@1047
   198
				 speakerentity = -1,
dvander@1047
   199
				 const Float:origin[3] = NULL_VECTOR,
dvander@1047
   200
				 const Float:dir[3] = NULL_VECTOR,
dvander@1047
   201
				 bool:updatePos = true,
dvander@1047
   202
				 Float:soundtime = 0.0,
dvander@1047
   203
				 any:...);
dvander@1047
   204
dvander@1047
   205
/**
dvander@1047
   206
 * Emits a sentence to a list of clients.
dvander@1047
   207
 *
dvander@1047
   208
 * @param clients		Array of client indexes.
dvander@1047
   209
 * @param numClients	Number of clients in the array.
dvander@1047
   210
 * @param entity		Entity to emit from.
dvander@1047
   211
 * @param channel		Channel to emit with.
dvander@1047
   212
 * @param sentence		Sentence index (from PrecacheSenteFile).
dvander@1047
   213
 * @param level			Sound level.
dvander@1047
   214
 * @param flags			Sound flags.
dvander@1047
   215
 * @param volume		Sound volume.
dvander@1047
   216
 * @param pitch			Sound pitch.
dvander@1047
   217
 * @param speakerentity	Unknown.
dvander@1047
   218
 * @param origin		Sound origin.
dvander@1047
   219
 * @param dir			Sound direction.
dvander@1047
   220
 * @param updatePos		Unknown (updates positions?)
dvander@1047
   221
 * @param soundtime		Alternate time to play sound for.
dvander@1047
   222
 * @param ...			Optional list of Float[3] arrays to specify additional origins.
dvander@1047
   223
 * @noreturn
dvander@1047
   224
 * @error				Invalid client index.
dvander@1047
   225
 */
dvander@1047
   226
native EmitSentence(const clients[],
dvander@1047
   227
				 numClients,
dvander@1047
   228
				 sentence,
dvander@1048
   229
				 entity,
dvander@1047
   230
				 channel = SNDCHAN_AUTO,
dvander@1047
   231
				 level = SNDLEVEL_NORMAL,
dvander@1047
   232
				 flags = SND_NOFLAGS,
dvander@1047
   233
				 Float:volume = SNDVOL_NORMAL,
dvander@1047
   234
				 pitch = SNDPITCH_NORMAL,
dvander@1047
   235
				 speakerentity = -1,
dvander@1047
   236
				 const Float:origin[3] = NULL_VECTOR,
dvander@1047
   237
				 const Float:dir[3] = NULL_VECTOR,
dvander@1047
   238
				 bool:updatePos = true,
dvander@1047
   239
				 Float:soundtime = 0.0,
dvander@1047
   240
				 any:...);
dvander@1047
   241
dvander@1047
   242
				 
dvander@1047
   243
/**
dvander@1047
   244
 * Wrapper to emit sound to one client.
dvander@1047
   245
 *
dvander@1047
   246
 * @param client		Client index.
dvander@1047
   247
 * @param entity		Entity to emit from.
dvander@1047
   248
 * @param channel		Channel to emit with.
dvander@1047
   249
 * @param sample		Sound name.
dvander@1047
   250
 * @param level			Sound level.
dvander@1047
   251
 * @param flags			Sound flags.
dvander@1047
   252
 * @param volume		Sound volume.
dvander@1047
   253
 * @param pitch			Sound pitch.
dvander@1047
   254
 * @param speakerentity	Unknown.
dvander@1047
   255
 * @param origin		Sound origin.
dvander@1047
   256
 * @param dir			Sound direction.
dvander@1047
   257
 * @param updatePos		Unknown (updates positions?)
dvander@1047
   258
 * @param soundtime		Alternate time to play sound for.
dvander@1047
   259
 * @noreturn
dvander@1047
   260
 * @error				Invalid client index.
dvander@1047
   261
 */
dvander@1047
   262
stock EmitSoundToClient(client,
dvander@1047
   263
				 const String:sample[],
dvander@1047
   264
				 entity = SOUND_FROM_PLAYER,
dvander@1047
   265
				 channel = SNDCHAN_AUTO,
dvander@1047
   266
				 level = SNDLEVEL_NORMAL,
dvander@1047
   267
				 flags = SND_NOFLAGS,
dvander@1047
   268
				 Float:volume = SNDVOL_NORMAL,
dvander@1047
   269
				 pitch = SNDPITCH_NORMAL,
dvander@1047
   270
				 speakerentity = -1,
dvander@1047
   271
				 const Float:origin[3] = NULL_VECTOR,
dvander@1047
   272
				 const Float:dir[3] = NULL_VECTOR,
dvander@1047
   273
				 bool:updatePos = true,
dvander@1047
   274
				 Float:soundtime = 0.0)
dvander@1047
   275
{
dvander@1047
   276
	new clients[1];
dvander@1047
   277
	clients[0] = client;
dvander@1047
   278
	/* Save some work for SDKTools and remove SOUND_FROM_PLAYER references */
dvander@1047
   279
	entity = (entity == SOUND_FROM_PLAYER) ? client : entity;
dvander@1047
   280
	EmitSound(clients, 1, sample, entity, channel, 
dvander@1047
   281
		level, flags, volume, pitch, speakerentity,
dvander@1047
   282
		origin, dir, updatePos, soundtime);
dvander@1047
   283
}
dvander@1047
   284
dvander@1047
   285
/**
dvander@1047
   286
 * Wrapper to emit sound to all clients.
dvander@1047
   287
 *
dvander@1047
   288
 * @param entity		Entity to emit from.
dvander@1047
   289
 * @param channel		Channel to emit with.
dvander@1047
   290
 * @param sample		Sound name.
dvander@1047
   291
 * @param level			Sound level.
dvander@1047
   292
 * @param flags			Sound flags.
dvander@1047
   293
 * @param volume		Sound volume.
dvander@1047
   294
 * @param pitch			Sound pitch.
dvander@1047
   295
 * @param speakerentity	Unknown.
dvander@1047
   296
 * @param origin		Sound origin.
dvander@1047
   297
 * @param dir			Sound direction.
dvander@1047
   298
 * @param updatePos		Unknown (updates positions?)
dvander@1047
   299
 * @param soundtime		Alternate time to play sound for.
dvander@1047
   300
 * @noreturn
dvander@1047
   301
 * @error				Invalid client index.
dvander@1047
   302
 */
dvander@1047
   303
stock EmitSoundToAll(const String:sample[],
dvander@1047
   304
				 entity = SOUND_FROM_PLAYER,
dvander@1047
   305
				 channel = SNDCHAN_AUTO,
dvander@1047
   306
				 level = SNDLEVEL_NORMAL,
dvander@1047
   307
				 flags = SND_NOFLAGS,
dvander@1047
   308
				 Float:volume = SNDVOL_NORMAL,
dvander@1047
   309
				 pitch = SNDPITCH_NORMAL,
dvander@1047
   310
				 speakerentity = -1,
dvander@1047
   311
				 const Float:origin[3] = NULL_VECTOR,
dvander@1047
   312
				 const Float:dir[3] = NULL_VECTOR,
dvander@1047
   313
				 bool:updatePos = true,
dvander@1047
   314
				 Float:soundtime = 0.0)
dvander@1047
   315
{
dvander@1047
   316
	new maxClients = GetMaxClients();
dvander@1047
   317
	new clients[maxClients];
dvander@1047
   318
	new total = 0;
dvander@1047
   319
	
dvander@1047
   320
	for (new i=1; i<=maxClients; i++)
dvander@1047
   321
	{
dvander@1047
   322
		if (IsClientInGame(i))
dvander@1047
   323
		{
dvander@1047
   324
			clients[total++] = i;
dvander@1047
   325
		}
dvander@1047
   326
	}
dvander@1047
   327
	
dvander@1047
   328
	if (!total)
dvander@1047
   329
	{
dvander@1047
   330
		return;
dvander@1047
   331
	}
dvander@1047
   332
	
dvander@1047
   333
	EmitSound(clients, total, sample, entity, channel, 
dvander@1047
   334
		level, flags, volume, pitch, speakerentity,
dvander@1047
   335
		origin, dir, updatePos, soundtime);
dvander@1047
   336
}
dvander@1047
   337
dvander@1047
   338
/**
dvander@1047
   339
 * Converts an attenuation value to a sound level.  
dvander@1047
   340
 * This function is from the HL2SDK.
dvander@1047
   341
 *
dvander@1047
   342
 * @param attn		Attenuation value.
dvander@1047
   343
 * @return			Integer sound level.
dvander@1047
   344
 */
dvander@1047
   345
stock ATTN_TO_SNDLEVEL(Float:attn)
dvander@1047
   346
{
dvander@1047
   347
	if (attn > 0.0)
dvander@1047
   348
	{
dvander@1047
   349
		return RoundFloat(50.0 + (20.0 / attn));
dvander@1047
   350
	}
dvander@1047
   351
	return 0;
dvander@1047
   352
}