mal sehen.
eiface.h definiert
Code:
void (*pfnEmitSound) (edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch);
enginecallback.h definiert das makro
Code:
#define EMIT_SOUND_DYN2 (*g_engfuncs.pfnEmitSound)
nützlich sind auch folgende definitionen aus const.h
Code:
// channels
#define CHAN_AUTO 0
#define CHAN_WEAPON 1
#define CHAN_VOICE 2
#define CHAN_ITEM 3
#define CHAN_BODY 4
#define CHAN_STREAM 5 // allocate stream channel from the static or dynamic area
#define CHAN_STATIC 6 // allocate channel from the static area
#define CHAN_NETWORKVOICE_BASE 7 // voice data coming across the network
#define CHAN_NETWORKVOICE_END 500 // network voice data reserves slots (CHAN_NETWORKVOICE_BASE through CHAN_NETWORKVOICE_END).
// attenuation values
#define ATTN_NONE 0
#define ATTN_NORM (float)0.8
#define ATTN_IDLE (float)2
#define ATTN_STATIC (float)1.25
// pitch values
#define PITCH_NORM 100 // non-pitch shifted
#define PITCH_LOW 95 // other values are possible - 0-255, where 255 is very high
#define PITCH_HIGH 120
// volume values
#define VOL_NORM 1.0
ausgehend davon bauen wir uns als erstes eine playsound-funktion:
Code:
inline void UTIL_Playsound(edict_t* pPlayerEdict, const char* sound) {
EMIT_SOUND_DYN2(pPlayerEdict, CHAN_VOICE, sound, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
}
weiterhin brauchen wir eine funktion, die zu jedem spieler den edict-pointer findet:
Code:
edict_t* UTIL_EntityByIndex( int playerIndex ){
edict_t* pPlayerEdict = NULL;
if ( playerIndex > 0 && playerIndex <= gpGlobals->maxClients ) {
pPlayerEdict = INDEXENT( playerIndex );
if ( !pPlayerEdict || pPlayerEdict->free ) {
pPlayerEdict = NULL;
}
}
return pPlayerEdict;
}
zuletzt noch:
Code:
void UTIL_PlaysoundAll(const char* sound) {
edict_t* pPlayerEdict;
int i;
for(i = 1; i <= gpGlobals->maxClients; i++) {
if((pPlayerEdict = UTIL_EntityByIndex(i)) != NULL) {
UTIL_Playsound(pPlayerEdict, sound);
}
}
}
jetzt haben wir eine funktion, die den sound bei allen clients abspielt. nun müssen wir noch entscheiden, wann welcher sound abgespielt werden soll. ich nutze hierzu ein array, bei denen die anzahl der kills als index verwendet wird:
Code:
const char* killsounds[] = {
NULL,
NULL,
"misc/doublekill.wav",
"misc/multikill.wav",
"misc/megakill.wav",
"misc/ultrakill.wav",
"misc/monsterkill.wav",
"misc/loudacriskill.wav",
"misc/holyshit.wav"
};
nun kann man in die StartFrame-Funktion eintragen:
Code:
UTIL_PlaysoundAll(killsounds[min(8, client->m_iKillsThisFrame)]);
weiterhin müssen alle sounds, die verwendet werden sollen, auf den clients "precached" werden.
das geschieht in der Funktion Spawn, die wahrscheinlich von bubblemod schon implementiert ist, und nur erweitert werden muss:
Code:
int Spawn( edict_t*) {
[...]
for(int i = 2; i <= 8; i++) {
PRECACHE_SOUND(killsounds[i]);
}
[...]
}
das sollte eigentlich alles sein