1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
|
/**
* vim: set ts=4 :
* =============================================================================
* SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This file is part of the SourceMod/SourcePawn SDK.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#if defined _sdktools_sound_included
#endinput
#endif
#define _sdktools_sound_included
/**
* Sound should be from the target client.
*/
#define SOUND_FROM_PLAYER -2
/**
* Sound should be from the listen server player.
*/
#define SOUND_FROM_LOCAL_PLAYER -1
/**
* Sound is from the world.
*/
#define SOUND_FROM_WORLD 0
/**
* Sound channels.
*/
enum
{
SNDCHAN_REPLACE = -1, /**< Unknown */
SNDCHAN_AUTO = 0, /**< Auto */
SNDCHAN_WEAPON = 1, /**< Weapons */
SNDCHAN_VOICE = 2, /**< Voices */
SNDCHAN_ITEM = 3, /**< Items */
SNDCHAN_BODY = 4, /**< Player? */
SNDCHAN_STREAM = 5, /**< "Stream channel from the static or dynamic area" */
SNDCHAN_STATIC = 6, /**< "Stream channel from the static area" */
SNDCHAN_VOICE_BASE = 7, /**< "Channel for network voice data" */
SNDCHAN_USER_BASE = 135 /**< Anything >= this is allocated to game code */
};
/**
* Sound flags for the sound emitter system.
*/
enum
{
SND_NOFLAGS= 0, /**< Nothing */
SND_CHANGEVOL = 1, /**< Change sound volume */
SND_CHANGEPITCH = 2, /**< Change sound pitch */
SND_STOP = 3, /**< Stop the sound */
SND_SPAWNING = 4, /**< Used in some cases for ambients */
SND_DELAY = 5, /**< Sound has an initial delay */
SND_STOPLOOPING = 6, /**< Stop looping all sounds on the entity */
SND_SPEAKER = 7, /**< Being played by a mic through a speaker */
SND_SHOULDPAUSE = 8 /**< Pause if game is paused */
};
/**
* Various predefined sound levels in dB.
*/
enum
{
SNDLEVEL_NONE = 0, /**< None */
SNDLEVEL_RUSTLE = 20, /**< Rustling leaves */
SNDLEVEL_WHISPER = 25, /**< Whispering */
SNDLEVEL_LIBRARY = 30, /**< In a library */
SNDLEVEL_FRIDGE = 45, /**< Refrigerator */
SNDLEVEL_HOME = 50, /**< Average home (3.9 attn) */
SNDLEVEL_CONVO = 60, /**< Normal conversation (2.0 attn) */
SNDLEVEL_DRYER = 60, /**< Clothes dryer */
SNDLEVEL_DISHWASHER = 65, /**< Dishwasher/washing machine (1.5 attn) */
SNDLEVEL_CAR = 70, /**< Car or vacuum cleaner (1.0 attn) */
SNDLEVEL_NORMAL = 75, /**< Normal sound level */
SNDLEVEL_TRAFFIC = 75, /**< Busy traffic (0.8 attn) */
SNDLEVEL_MINIBIKE = 80, /**< Mini-bike, alarm clock (0.7 attn) */
SNDLEVEL_SCREAMING = 90, /**< Screaming child (0.5 attn) */
SNDLEVEL_TRAIN = 100, /**< Subway train, pneumatic drill (0.4 attn) */
SNDLEVEL_HELICOPTER = 105, /**< Helicopter */
SNDLEVEL_SNOWMOBILE = 110, /**< Snow mobile */
SNDLEVEL_AIRCRAFT = 120, /**< Auto horn, aircraft */
SNDLEVEL_RAIDSIREN = 130, /**< Air raid siren */
SNDLEVEL_GUNFIRE = 140, /**< Gunshot, jet engine (0.27 attn) */
SNDLEVEL_ROCKET = 180 /**< Rocket launching (0.2 attn) */
};
#define SNDVOL_NORMAL 1.0 /**< Normal volume */
#define SNDPITCH_NORMAL 100 /**< Normal pitch */
#define SNDPITCH_LOW 95 /**< A low pitch */
#define SNDPITCH_HIGH 120 /**< A high pitch */
#define SNDATTN_NONE 0.0 /**< No attenuation */
#define SNDATTN_NORMAL 0.8 /**< Normal attenuation */
#define SNDATTN_STATIC 1.25 /**< Static attenuation? */
#define SNDATTN_RICOCHET 1.5 /**< Ricochet effect */
#define SNDATTN_IDLE 2.0 /**< Idle attenuation? */
/**
* Prefetches a sound.
*
* @param name Sound file name relative to the "sound" folder.
*/
native void PrefetchSound(const char[] name);
/**
* This function is not known to work, and may crash. You should
* not use it. It is provided for backwards compatibility only.
*
* @param name Sound file name relative to the "sound" folder.
* @return Duration in seconds.
* @deprecated Does not work, may crash.
*/
#pragma deprecated Does not work, may crash.
native float GetSoundDuration(const char[] name);
/**
* Emits an ambient sound.
*
* @param name Sound file name relative to the "sound" folder.
* @param pos Origin of sound.
* @param entity Entity index to associate sound with.
* @param level Sound level (from 0 to 255).
* @param flags Sound flags.
* @param vol Volume (from 0.0 to 1.0).
* @param pitch Pitch (from 0 to 255).
* @param delay Play delay.
*/
native void EmitAmbientSound(const char[] name,
const float pos[3],
int entity = SOUND_FROM_WORLD,
int level = SNDLEVEL_NORMAL,
int flags = SND_NOFLAGS,
float vol = SNDVOL_NORMAL,
int pitch = SNDPITCH_NORMAL,
float delay = 0.0);
/**
* Fades a client's volume level toward silence or a given percentage.
*
* @param client Client index.
* @param percent Fade percentage.
* @param outtime Fade out time, in seconds.
* @param holdtime Hold time, in seconds.
* @param intime Fade in time, in seconds.
* @error Invalid client index or client not in game.
*/
native void FadeClientVolume(int client, float percent, float outtime, float holdtime, float intime);
/**
* Stops a sound.
*
* @param entity Entity index.
* @param channel Channel number.
* @param name Sound file name relative to the "sound" folder.
*/
native void StopSound(int entity, int channel, const char[] name);
/**
* Emits a sound to a list of clients.
*
* @param clients Array of client indexes.
* @param numClients Number of clients in the array.
* @param sample Sound file name relative to the "sound" folder.
* @param entity Entity to emit from.
* @param channel Channel to emit with.
* @param level Sound level.
* @param flags Sound flags.
* @param volume Sound volume.
* @param pitch Sound pitch.
* @param speakerentity Unknown.
* @param origin Sound origin.
* @param dir Sound direction.
* @param updatePos Unknown (updates positions?)
* @param soundtime Alternate time to play sound for.
* @param ... Optional list of Float[3] arrays to specify additional origins.
* @error Invalid client index or client not in game.
*/
native void EmitSound(const int[] clients,
int numClients,
const char[] sample,
int entity = SOUND_FROM_PLAYER,
int channel = SNDCHAN_AUTO,
int level = SNDLEVEL_NORMAL,
int flags = SND_NOFLAGS,
float volume = SNDVOL_NORMAL,
int pitch = SNDPITCH_NORMAL,
int speakerentity = -1,
const float origin[3] = NULL_VECTOR,
const float dir[3] = NULL_VECTOR,
bool updatePos = true,
float soundtime = 0.0,
any ...);
/**
* Emits a sound or game sound to a list of clients using the latest version of the engine sound interface.
* This native is only available in engines that are greater than or equal to Portal 2.
*
* @param clients Array of client indexes.
* @param numClients Number of clients in the array.
* @param soundEntry Sound entry name.
* @param sample Sound file name relative to the "sound" folder.
* @param entity Entity to emit from.
* @param channel Channel to emit with.
* @param level Sound level.
* @param seed Sound seed.
* @param flags Sound flags.
* @param volume Sound volume.
* @param pitch Sound pitch.
* @param speakerentity Unknown.
* @param origin Sound origin.
* @param dir Sound direction.
* @param updatePos Unknown (updates positions?)
* @param soundtime Alternate time to play sound for.
* @param ... Optional list of Float[3] arrays to specify additional origins.
* @error Invalid client index, client not in game, or lack of mod support.
*/
native void EmitSoundEntry(const int[] clients,
int numClients,
const char[] soundEntry,
const char[] sample,
int entity = SOUND_FROM_PLAYER,
int channel = SNDCHAN_AUTO,
int level = SNDLEVEL_NORMAL,
int seed = 0,
int flags = SND_NOFLAGS,
float volume = SNDVOL_NORMAL,
int pitch = SNDPITCH_NORMAL,
int speakerentity = -1,
const float origin[3] = NULL_VECTOR,
const float dir[3] = NULL_VECTOR,
bool updatePos = true,
float soundtime = 0.0,
any ...);
/**
* Emits a sentence to a list of clients.
*
* @param clients Array of client indexes.
* @param numClients Number of clients in the array.
* @param sentence Sentence index (from PrecacheSentenceFile).
* @param entity Entity to emit from.
* @param channel Channel to emit with.
* @param level Sound level.
* @param flags Sound flags.
* @param volume Sound volume.
* @param pitch Sound pitch.
* @param speakerentity Unknown.
* @param origin Sound origin.
* @param dir Sound direction.
* @param updatePos Unknown (updates positions?)
* @param soundtime Alternate time to play sound for.
* @param ... Optional list of Float[3] arrays to specify additional origins.
* @error Invalid client index or client not in game.
*/
native void EmitSentence(const int[] clients,
int numClients,
int sentence,
int entity,
int channel = SNDCHAN_AUTO,
int level = SNDLEVEL_NORMAL,
int flags = SND_NOFLAGS,
float volume = SNDVOL_NORMAL,
int pitch = SNDPITCH_NORMAL,
int speakerentity = -1,
const float origin[3] = NULL_VECTOR,
const float dir[3] = NULL_VECTOR,
bool updatePos = true,
float soundtime = 0.0,
any ...);
/**
* Calculates gain of sound on given distance with given sound level in decibel
*
* @param soundlevel decibel of sound, like SNDLEVEL_NORMAL or integer value
* @param distance distance of sound to calculate, not meter or feet, but Source Engine`s normal Coordinate unit
* @return gain of sound. you can multiply this with original sound`s volume to calculate volume on given distance
*/
native float GetDistGainFromSoundLevel(int soundlevel, float distance);
/**
* Called when an ambient sound is about to be emitted to one or more clients.
*
* NOTICE: all parameters can be overwritten to modify the default behavior.
*
* @param sample Sound file name relative to the "sound" folder.
* @param entity Entity index associated to the sound.
* @param volume Volume (from 0.0 to 1.0).
* @param level Sound level (from 0 to 255).
* @param pitch Pitch (from 0 to 255).
* @param pos Origin of sound.
* @param flags Sound flags.
* @param delay Play delay.
* @return Plugin_Continue to allow the sound to be played, Plugin_Stop to block it,
* Plugin_Changed when any parameter has been modified.
*/
typedef AmbientSHook = function Action (
char sample[PLATFORM_MAX_PATH],
int &entity,
float &volume,
int &level,
int &pitch,
float pos[3],
int &flags,
float &delay
);
typeset NormalSHook
{
// Called when a sound is going to be emitted to one or more clients.
// NOTICE: all params can be overwritten to modify the default behavior.
//
// @param clients Array of client indexes.
// @param numClients Number of clients in the array (modify this value if you add/remove elements from the client array).
// @param sample Sound file name relative to the "sound" folder.
// @param entity Entity emitting the sound.
// @param channel Channel emitting the sound.
// @param volume Sound volume.
// @param level Sound level.
// @param pitch Sound pitch.
// @param flags Sound flags.
// @param soundEntry Game sound entry name. (Used in engines newer than Portal 2)
// @param seed Sound seed. (Used in engines newer than Portal 2)
// @return Plugin_Continue to allow the sound to be played, Plugin_Stop to block it,
// Plugin_Changed when any parameter has been modified.
function Action (int clients[MAXPLAYERS], int &numClients, char sample[PLATFORM_MAX_PATH],
int &entity, int &channel, float &volume, int &level, int &pitch, int &flags,
char soundEntry[PLATFORM_MAX_PATH], int &seed);
// Deprecated. Use other prototype.
function Action (int clients[64], int &numClients, char sample[PLATFORM_MAX_PATH],
int &entity, int &channel, float &volume, int &level, int &pitch, int &flags,
char soundEntry[PLATFORM_MAX_PATH], int &seed);
// Deprecated. Use other prototype.
function Action (int clients[64], int &numClients, char sample[PLATFORM_MAX_PATH],
int &entity, int &channel, float &volume, int &level, int &pitch, int &flags);
};
/**
* Hooks all played ambient sounds.
*
* @param hook Function to use as a hook.
* @error Invalid function hook.
*/
native void AddAmbientSoundHook(AmbientSHook hook);
/**
* Hooks all played normal sounds.
*
* @param hook Function to use as a hook.
* @error Invalid function hook.
*/
native void AddNormalSoundHook(NormalSHook hook);
/**
* Unhooks all played ambient sounds.
*
* @param hook Function used for the hook.
* @error Invalid function hook.
*/
native void RemoveAmbientSoundHook(AmbientSHook hook);
/**
* Unhooks all played normal sounds.
*
* @param hook Function used for the hook.
* @error Invalid function hook.
*/
native void RemoveNormalSoundHook(NormalSHook hook);
/**
* Wrapper to emit sound to one client.
*
* @param client Client index.
* @param sample Sound file name relative to the "sound" folder.
* @param entity Entity to emit from.
* @param channel Channel to emit with.
* @param level Sound level.
* @param flags Sound flags.
* @param volume Sound volume.
* @param pitch Sound pitch.
* @param speakerentity Unknown.
* @param origin Sound origin.
* @param dir Sound direction.
* @param updatePos Unknown (updates positions?)
* @param soundtime Alternate time to play sound for.
* @error Invalid client index or client not in game.
*/
stock void EmitSoundToClient(int client,
const char[] sample,
int entity = SOUND_FROM_PLAYER,
int channel = SNDCHAN_AUTO,
int level = SNDLEVEL_NORMAL,
int flags = SND_NOFLAGS,
float volume = SNDVOL_NORMAL,
int pitch = SNDPITCH_NORMAL,
int speakerentity = -1,
const float origin[3] = NULL_VECTOR,
const float dir[3] = NULL_VECTOR,
bool updatePos = true,
float soundtime = 0.0)
{
int clients[1];
clients[0] = client;
/* Save some work for SDKTools and remove SOUND_FROM_PLAYER references */
entity = (entity == SOUND_FROM_PLAYER) ? client : entity;
EmitSound(clients, 1, sample, entity, channel,
level, flags, volume, pitch, speakerentity,
origin, dir, updatePos, soundtime);
}
/**
* Wrapper to emit sound to all clients.
*
* @param sample Sound file name relative to the "sound" folder.
* @param entity Entity to emit from.
* @param channel Channel to emit with.
* @param level Sound level.
* @param flags Sound flags.
* @param volume Sound volume.
* @param pitch Sound pitch.
* @param speakerentity Unknown.
* @param origin Sound origin.
* @param dir Sound direction.
* @param updatePos Unknown (updates positions?)
* @param soundtime Alternate time to play sound for.
* @error Invalid client index.
*/
stock void EmitSoundToAll(const char[] sample,
int entity = SOUND_FROM_PLAYER,
int channel = SNDCHAN_AUTO,
int level = SNDLEVEL_NORMAL,
int flags = SND_NOFLAGS,
float volume = SNDVOL_NORMAL,
int pitch = SNDPITCH_NORMAL,
int speakerentity = -1,
const float origin[3] = NULL_VECTOR,
const float dir[3] = NULL_VECTOR,
bool updatePos = true,
float soundtime = 0.0)
{
int[] clients = new int[MaxClients];
int total = 0;
for (int i=1; i<=MaxClients; i++)
{
if (IsClientInGame(i))
{
clients[total++] = i;
}
}
if (total)
{
EmitSound(clients, total, sample, entity, channel,
level, flags, volume, pitch, speakerentity,
origin, dir, updatePos, soundtime);
}
}
/**
* Converts an attenuation value to a sound level.
* This function is from the HL2SDK.
*
* @param attn Attenuation value.
* @return Integer sound level.
*/
stock int ATTN_TO_SNDLEVEL(float attn)
{
if (attn > 0.0)
{
return RoundFloat(50.0 + (20.0 / attn));
}
return 0;
}
/**
* Retrieves the parameters for a game sound.
*
* Game sounds are found in a game's scripts/game_sound.txt or other files
* referenced from it
*
* Note that if a game sound has a rndwave section, one of them will be returned
* at random.
*
* @param gameSound Name of game sound.
* @param channel Channel to emit with.
* @param level Sound level.
* @param volume Sound volume.
* @param pitch Sound pitch.
* @param sample Sound file name relative to the "sound" folder.
* @param maxlength Maximum length of sample string buffer.
* @param entity Entity the sound is being emitted from.
* @return True if the sound was successfully retrieved, false if it
* was not found
*/
native bool GetGameSoundParams(const char[] gameSound,
int &channel,
int &soundLevel,
float &volume,
int &pitch,
char[] sample,
int maxlength,
int entity=SOUND_FROM_PLAYER);
/**
* Emits a game sound to a list of clients.
*
* Game sounds are found in a game's scripts/game_sound.txt or other files
* referenced from it
*
* Note that if a game sound has a rndwave section, one of them will be returned
* at random.
*
* @param clients Array of client indexes.
* @param numClients Number of clients in the array.
* @param gameSound Name of game sound.
* @param entity Entity to emit from.
* @param flags Sound flags.
* @param speakerentity Unknown.
* @param origin Sound origin.
* @param dir Sound direction.
* @param updatePos Unknown (updates positions?)
* @param soundtime Alternate time to play sound for.
* @return True if the sound was played successfully, false if it failed
* @error Invalid client index or client not in game.
*/
stock bool EmitGameSound(const int[] clients,
int numClients,
const char[] gameSound,
int entity = SOUND_FROM_PLAYER,
int flags = SND_NOFLAGS,
int speakerentity = -1,
const float origin[3] = NULL_VECTOR,
const float dir[3] = NULL_VECTOR,
bool updatePos = true,
float soundtime = 0.0)
{
int channel;
int level;
float volume;
int pitch;
char sample[PLATFORM_MAX_PATH];
if (GetGameSoundParams(gameSound, channel, level, volume, pitch, sample, sizeof(sample), entity))
{
EmitSound(clients, numClients, sample, entity, channel, level, flags, volume, pitch, speakerentity, origin, dir, updatePos, soundtime);
return true;
}
return false;
}
/**
* Emits an ambient game sound.
*
* Game sounds are found in a game's scripts/game_sound.txt or other files
* referenced from it
*
* Note that if a game sound has a rndwave section, one of them will be returned
* at random.
*
* @param gameSound Name of game sound.
* @param pos Origin of sound.
* @param entity Entity index to associate sound with.
* @param flags Sound flags.
* @param delay Play delay.
*/
stock bool EmitAmbientGameSound(const char[] gameSound,
const float pos[3],
int entity = SOUND_FROM_WORLD,
int flags = SND_NOFLAGS,
float delay = 0.0)
{
int channel; // This is never actually used for Ambients, but it's a mandatory field to GetGameSoundParams
int level;
float volume;
int pitch;
char sample[PLATFORM_MAX_PATH];
if (GetGameSoundParams(gameSound, channel, level, volume, pitch, sample, sizeof(sample), entity))
{
EmitAmbientSound(sample, pos, entity, level, flags, volume, pitch, delay);
return true;
}
return false;
}
/**
* Wrapper to emit a game sound to one client.
*
* Game sounds are found in a game's scripts/game_sound.txt or other files
* referenced from it
*
* Note that if a game sound has a rndwave section, one of them will be returned
* at random.
*
* @param client Client index.
* @param gameSound Name of game sound.
* @param entity Entity to emit from.
* @param flags Sound flags.
* @param speakerentity Unknown.
* @param origin Sound origin.
* @param dir Sound direction.
* @param updatePos Unknown (updates positions?)
* @param soundtime Alternate time to play sound for.
* @error Invalid client index or client not in game.
*/
stock bool EmitGameSoundToClient(int client,
const char[] gameSound,
int entity = SOUND_FROM_PLAYER,
int flags = SND_NOFLAGS,
int speakerentity = -1,
const float origin[3] = NULL_VECTOR,
const float dir[3] = NULL_VECTOR,
bool updatePos = true,
float soundtime = 0.0)
{
int clients[1];
clients[0] = client;
/* Save some work for SDKTools and remove SOUND_FROM_PLAYER references */
entity = (entity == SOUND_FROM_PLAYER) ? client : entity;
return EmitGameSound(clients, 1, gameSound, entity, flags,
speakerentity, origin, dir, updatePos, soundtime);
}
/**
* Wrapper to emit game sound to all clients.
*
* Game sounds are found in a game's scripts/game_sound.txt or other files
* referenced from it
*
* Note that if a game sound has a rndwave section, one of them will be returned
* at random.
*
* @param gameSound Name of game sound.
* @param entity Entity to emit from.
* @param flags Sound flags.
* @param speakerentity Unknown.
* @param origin Sound origin.
* @param dir Sound direction.
* @param updatePos Unknown (updates positions?)
* @param soundtime Alternate time to play sound for.
* @error Invalid client index.
*/
stock bool EmitGameSoundToAll(const char[] gameSound,
int entity = SOUND_FROM_PLAYER,
int flags = SND_NOFLAGS,
int speakerentity = -1,
const float origin[3] = NULL_VECTOR,
const float dir[3] = NULL_VECTOR,
bool updatePos = true,
float soundtime = 0.0)
{
int[] clients = new int[MaxClients];
int total = 0;
for (int i=1; i<=MaxClients; i++)
{
if (IsClientInGame(i))
{
clients[total++] = i;
}
}
if (!total)
{
return false;
}
return EmitGameSound(clients, total, gameSound, entity, flags,
speakerentity, origin, dir, updatePos, soundtime);
}
/**
* Precache a game sound.
*
* Most games will precache all game sounds on map start, but this is not guaranteed...
* Team Fortress 2 is known to not pre-cache MvM game mode sounds on non-MvM maps.
*
* Due to the above, this native should be called before any calls to GetGameSoundParams,
* EmitGameSound*, or EmitAmbientGameSound.
*
* It should be safe to pass already precached game sounds to this function.
*
* Note: It precaches all files for a game sound.
*
* @param soundname Game sound to precache
* @return True if the game sound was found, false if sound did not exist
* or had no files
*/
native bool PrecacheScriptSound(const char[] soundname);
|