plugins/include/sdktools_sound.inc
author David Anderson <dvander@alliedmods.net>
Wed Oct 31 05:09:07 2007 +0000 (2007-10-31)
changeset 1657 2487db52a7fb
parent 1330 ab94316bb52b
child 1733 61f9b414c2d1
permissions -rw-r--r--
fixed build
dvander@1047
     1
/**
dvander@1047
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
dvander@1047
     4
 * SourceMod (C)2004-2007 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@1047
   127
 * @param name		Sound file name.
dvander@1047
   128
 * @noreturn
dvander@1047
   129
 */
dvander@1047
   130
native PrefetchSound(const String:nane[]);
dvander@1047
   131
dvander@1047
   132
/**
dvander@1047
   133
 * Gets a sound's duration (does not work for mp3s).
dvander@1047
   134
 *
dvander@1047
   135
 * @param name		Sound file name.
dvander@1047
   136
 * @return			Duration in seconds.
dvander@1047
   137
 */
dvander@1047
   138
native Float:GetSoundDuration(const String:name[]);
dvander@1047
   139
dvander@1047
   140
/**
dvander@1047
   141
 * Emits an ambient sound.
dvander@1047
   142
 *
dvander@1047
   143
 * @param entity	Entity index to associate sound with.
dvander@1047
   144
 * @param pos		Origin of sound.
dvander@1047
   145
 * @param name		Sound file name.
dvander@1047
   146
 * @param level		Sound level (from 0 to 255).
dvander@1047
   147
 * @param flags		Sound flags.
dvander@1047
   148
 * @param vol		Volume (from 0.0 to 1.0).
dvander@1047
   149
 * @param pitch		Pitch (from 0 to 255).
dvander@1047
   150
 * @param delay		Play delay.
dvander@1047
   151
 * @noreturn
dvander@1047
   152
 */
dvander@1047
   153
native EmitAmbientSound(const String:name[],
dvander@1047
   154
						const Float:pos[3],
dvander@1047
   155
						entity = SOUND_FROM_WORLD,
dvander@1047
   156
						level = SNDLEVEL_NORMAL,
dvander@1047
   157
						flags = SND_NOFLAGS,
dvander@1047
   158
						Float:vol = SNDVOL_NORMAL,
dvander@1047
   159
						pitch = SNDPITCH_NORMAL,
dvander@1047
   160
						Float:delay = 0.0);
dvander@1047
   161
dvander@1047
   162
/**
dvander@1047
   163
 * Fades a client's volume level toward silence or a given percentage.
dvander@1047
   164
 *
dvander@1047
   165
 * @param client	Client index.
dvander@1047
   166
 * @param percent	Fade percentage.
dvander@1047
   167
 * @param outtime	Fade out time, in seconds.
dvander@1047
   168
 * @param holdtime	Hold time, in seconds.
dvander@1047
   169
 * @param intime	Fade in time, in seconds.
dvander@1047
   170
 * @noreturn
dvander@1047
   171
 * @error			Invalid client index or client not in game.
dvander@1047
   172
 */
dvander@1047
   173
native FadeClientVolume(client, Float:percent, Float:outtime, Float:holdtime, Float:intime);
dvander@1047
   174
dvander@1047
   175
/**
dvander@1047
   176
 * Stops a sound.
dvander@1047
   177
 *
dvander@1047
   178
 * @param entity	Entity index.
dvander@1047
   179
 * @param channel	Channel number.
dvander@1047
   180
 * @param name		Sound name.
dvander@1047
   181
 * @noreturn
dvander@1047
   182
 */
dvander@1047
   183
native StopSound(entity, channel, const String:name[]);
dvander@1047
   184
dvander@1047
   185
/**
dvander@1047
   186
 * Emits a sound to a list of clients.
dvander@1047
   187
 *
dvander@1047
   188
 * @param clients		Array of client indexes.
dvander@1047
   189
 * @param numClients	Number of clients in the array.
dvander@1047
   190
 * @param entity		Entity to emit from.
dvander@1047
   191
 * @param channel		Channel to emit with.
dvander@1047
   192
 * @param sample		Sound name.
dvander@1047
   193
 * @param level			Sound level.
dvander@1047
   194
 * @param flags			Sound flags.
dvander@1047
   195
 * @param volume		Sound volume.
dvander@1047
   196
 * @param pitch			Sound pitch.
dvander@1047
   197
 * @param speakerentity	Unknown.
dvander@1047
   198
 * @param origin		Sound origin.
dvander@1047
   199
 * @param dir			Sound direction.
dvander@1047
   200
 * @param updatePos		Unknown (updates positions?)
dvander@1047
   201
 * @param soundtime		Alternate time to play sound for.
dvander@1047
   202
 * @param ...			Optional list of Float[3] arrays to specify additional origins.
dvander@1047
   203
 * @noreturn
dvander@1047
   204
 * @error				Invalid client index.
dvander@1047
   205
 */
dvander@1047
   206
native EmitSound(const clients[],
dvander@1047
   207
				 numClients,
dvander@1047
   208
				 const String:sample[],
dvander@1048
   209
				 entity = SOUND_FROM_PLAYER,
dvander@1047
   210
				 channel = SNDCHAN_AUTO,
dvander@1047
   211
				 level = SNDLEVEL_NORMAL,
dvander@1047
   212
				 flags = SND_NOFLAGS,
dvander@1047
   213
				 Float:volume = SNDVOL_NORMAL,
dvander@1047
   214
				 pitch = SNDPITCH_NORMAL,
dvander@1047
   215
				 speakerentity = -1,
dvander@1047
   216
				 const Float:origin[3] = NULL_VECTOR,
dvander@1047
   217
				 const Float:dir[3] = NULL_VECTOR,
dvander@1047
   218
				 bool:updatePos = true,
dvander@1047
   219
				 Float:soundtime = 0.0,
dvander@1047
   220
				 any:...);
dvander@1047
   221
dvander@1047
   222
/**
dvander@1047
   223
 * Emits a sentence to a list of clients.
dvander@1047
   224
 *
dvander@1047
   225
 * @param clients		Array of client indexes.
dvander@1047
   226
 * @param numClients	Number of clients in the array.
dvander@1047
   227
 * @param entity		Entity to emit from.
dvander@1047
   228
 * @param channel		Channel to emit with.
dvander@1047
   229
 * @param sentence		Sentence index (from PrecacheSenteFile).
dvander@1047
   230
 * @param level			Sound level.
dvander@1047
   231
 * @param flags			Sound flags.
dvander@1047
   232
 * @param volume		Sound volume.
dvander@1047
   233
 * @param pitch			Sound pitch.
dvander@1047
   234
 * @param speakerentity	Unknown.
dvander@1047
   235
 * @param origin		Sound origin.
dvander@1047
   236
 * @param dir			Sound direction.
dvander@1047
   237
 * @param updatePos		Unknown (updates positions?)
dvander@1047
   238
 * @param soundtime		Alternate time to play sound for.
dvander@1047
   239
 * @param ...			Optional list of Float[3] arrays to specify additional origins.
dvander@1047
   240
 * @noreturn
dvander@1047
   241
 * @error				Invalid client index.
dvander@1047
   242
 */
dvander@1047
   243
native EmitSentence(const clients[],
dvander@1047
   244
				 numClients,
dvander@1047
   245
				 sentence,
dvander@1048
   246
				 entity,
dvander@1047
   247
				 channel = SNDCHAN_AUTO,
dvander@1047
   248
				 level = SNDLEVEL_NORMAL,
dvander@1047
   249
				 flags = SND_NOFLAGS,
dvander@1047
   250
				 Float:volume = SNDVOL_NORMAL,
dvander@1047
   251
				 pitch = SNDPITCH_NORMAL,
dvander@1047
   252
				 speakerentity = -1,
dvander@1047
   253
				 const Float:origin[3] = NULL_VECTOR,
dvander@1047
   254
				 const Float:dir[3] = NULL_VECTOR,
dvander@1047
   255
				 bool:updatePos = true,
dvander@1047
   256
				 Float:soundtime = 0.0,
dvander@1047
   257
				 any:...);
dvander@1047
   258
dvander@1047
   259
				 
dvander@1047
   260
/**
dvander@1047
   261
 * Wrapper to emit sound to one client.
dvander@1047
   262
 *
dvander@1047
   263
 * @param client		Client index.
dvander@1047
   264
 * @param entity		Entity to emit from.
dvander@1047
   265
 * @param channel		Channel to emit with.
dvander@1047
   266
 * @param sample		Sound name.
dvander@1047
   267
 * @param level			Sound level.
dvander@1047
   268
 * @param flags			Sound flags.
dvander@1047
   269
 * @param volume		Sound volume.
dvander@1047
   270
 * @param pitch			Sound pitch.
dvander@1047
   271
 * @param speakerentity	Unknown.
dvander@1047
   272
 * @param origin		Sound origin.
dvander@1047
   273
 * @param dir			Sound direction.
dvander@1047
   274
 * @param updatePos		Unknown (updates positions?)
dvander@1047
   275
 * @param soundtime		Alternate time to play sound for.
dvander@1047
   276
 * @noreturn
dvander@1047
   277
 * @error				Invalid client index.
dvander@1047
   278
 */
dvander@1047
   279
stock EmitSoundToClient(client,
dvander@1047
   280
				 const String:sample[],
dvander@1047
   281
				 entity = SOUND_FROM_PLAYER,
dvander@1047
   282
				 channel = SNDCHAN_AUTO,
dvander@1047
   283
				 level = SNDLEVEL_NORMAL,
dvander@1047
   284
				 flags = SND_NOFLAGS,
dvander@1047
   285
				 Float:volume = SNDVOL_NORMAL,
dvander@1047
   286
				 pitch = SNDPITCH_NORMAL,
dvander@1047
   287
				 speakerentity = -1,
dvander@1047
   288
				 const Float:origin[3] = NULL_VECTOR,
dvander@1047
   289
				 const Float:dir[3] = NULL_VECTOR,
dvander@1047
   290
				 bool:updatePos = true,
dvander@1047
   291
				 Float:soundtime = 0.0)
dvander@1047
   292
{
dvander@1047
   293
	new clients[1];
dvander@1047
   294
	clients[0] = client;
dvander@1047
   295
	/* Save some work for SDKTools and remove SOUND_FROM_PLAYER references */
dvander@1047
   296
	entity = (entity == SOUND_FROM_PLAYER) ? client : entity;
dvander@1047
   297
	EmitSound(clients, 1, sample, entity, channel, 
dvander@1047
   298
		level, flags, volume, pitch, speakerentity,
dvander@1047
   299
		origin, dir, updatePos, soundtime);
dvander@1047
   300
}
dvander@1047
   301
dvander@1047
   302
/**
dvander@1047
   303
 * Wrapper to emit sound to all clients.
dvander@1047
   304
 *
dvander@1047
   305
 * @param entity		Entity to emit from.
dvander@1047
   306
 * @param channel		Channel to emit with.
dvander@1047
   307
 * @param sample		Sound name.
dvander@1047
   308
 * @param level			Sound level.
dvander@1047
   309
 * @param flags			Sound flags.
dvander@1047
   310
 * @param volume		Sound volume.
dvander@1047
   311
 * @param pitch			Sound pitch.
dvander@1047
   312
 * @param speakerentity	Unknown.
dvander@1047
   313
 * @param origin		Sound origin.
dvander@1047
   314
 * @param dir			Sound direction.
dvander@1047
   315
 * @param updatePos		Unknown (updates positions?)
dvander@1047
   316
 * @param soundtime		Alternate time to play sound for.
dvander@1047
   317
 * @noreturn
dvander@1047
   318
 * @error				Invalid client index.
dvander@1047
   319
 */
dvander@1047
   320
stock EmitSoundToAll(const String:sample[],
dvander@1047
   321
				 entity = SOUND_FROM_PLAYER,
dvander@1047
   322
				 channel = SNDCHAN_AUTO,
dvander@1047
   323
				 level = SNDLEVEL_NORMAL,
dvander@1047
   324
				 flags = SND_NOFLAGS,
dvander@1047
   325
				 Float:volume = SNDVOL_NORMAL,
dvander@1047
   326
				 pitch = SNDPITCH_NORMAL,
dvander@1047
   327
				 speakerentity = -1,
dvander@1047
   328
				 const Float:origin[3] = NULL_VECTOR,
dvander@1047
   329
				 const Float:dir[3] = NULL_VECTOR,
dvander@1047
   330
				 bool:updatePos = true,
dvander@1047
   331
				 Float:soundtime = 0.0)
dvander@1047
   332
{
dvander@1047
   333
	new maxClients = GetMaxClients();
dvander@1047
   334
	new clients[maxClients];
dvander@1047
   335
	new total = 0;
dvander@1047
   336
	
dvander@1047
   337
	for (new i=1; i<=maxClients; i++)
dvander@1047
   338
	{
dvander@1047
   339
		if (IsClientInGame(i))
dvander@1047
   340
		{
dvander@1047
   341
			clients[total++] = i;
dvander@1047
   342
		}
dvander@1047
   343
	}
dvander@1047
   344
	
dvander@1047
   345
	if (!total)
dvander@1047
   346
	{
dvander@1047
   347
		return;
dvander@1047
   348
	}
dvander@1047
   349
	
dvander@1047
   350
	EmitSound(clients, total, sample, entity, channel, 
dvander@1047
   351
		level, flags, volume, pitch, speakerentity,
dvander@1047
   352
		origin, dir, updatePos, soundtime);
dvander@1047
   353
}
dvander@1047
   354
dvander@1047
   355
/**
dvander@1047
   356
 * Converts an attenuation value to a sound level.  
dvander@1047
   357
 * This function is from the HL2SDK.
dvander@1047
   358
 *
dvander@1047
   359
 * @param attn		Attenuation value.
dvander@1047
   360
 * @return			Integer sound level.
dvander@1047
   361
 */
dvander@1047
   362
stock ATTN_TO_SNDLEVEL(Float:attn)
dvander@1047
   363
{
dvander@1047
   364
	if (attn > 0.0)
dvander@1047
   365
	{
dvander@1047
   366
		return RoundFloat(50.0 + (20.0 / attn));
dvander@1047
   367
	}
dvander@1047
   368
	return 0;
dvander@1047
   369
}