X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Feffects%2Fqc%2Fglobalsound.qh;fp=qcsrc%2Fcommon%2Feffects%2Fqc%2Fglobalsound.qh;h=44925cd510cf81c71fe4018b792de9a2f46bda22;hb=b9a9e2388087db58cb5b81d882d711f4ac3e2ded;hp=0000000000000000000000000000000000000000;hpb=4f8ca9cd9fa138061ca5112ca66c3d5fbddf1a03;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/effects/qc/globalsound.qh b/qcsrc/common/effects/qc/globalsound.qh new file mode 100644 index 000000000..44925cd51 --- /dev/null +++ b/qcsrc/common/effects/qc/globalsound.qh @@ -0,0 +1,152 @@ +#ifndef GLOBALSOUND_H +#define GLOBALSOUND_H + +#ifdef SVQC + /** Use new sound handling. TODO: use when sounds play correctly on clients */ + bool autocvar_g_debug_globalsounds = false; +#endif + +// player sounds, voice messages + +.string m_playersoundstr; +..string m_playersoundfld; + +REGISTRY(PlayerSounds, BITS(8) - 1) +#define PlayerSounds_from(i) _PlayerSounds_from(i, NULL) +#define REGISTER_PLAYERSOUND(id) \ + .string _playersound_##id; \ + REGISTER(PlayerSounds, playersound, id, m_id, new_pure(PlayerSound)) \ + { \ + this.m_playersoundstr = #id; \ + this.m_playersoundfld = _playersound_##id; \ + } +REGISTER_REGISTRY(PlayerSounds) +REGISTRY_SORT(PlayerSounds) +STATIC_INIT(PlayerSounds_renumber) +{ + FOREACH(PlayerSounds, true, it.m_id = i); +} +REGISTRY_CHECK(PlayerSounds) + +REGISTER_PLAYERSOUND(death) +REGISTER_PLAYERSOUND(drown) +REGISTER_PLAYERSOUND(fall) +REGISTER_PLAYERSOUND(falling) +REGISTER_PLAYERSOUND(gasp) +REGISTER_PLAYERSOUND(jump) +REGISTER_PLAYERSOUND(pain100) +REGISTER_PLAYERSOUND(pain25) +REGISTER_PLAYERSOUND(pain50) +REGISTER_PLAYERSOUND(pain75) + +.bool instanceOfVoiceMessage; +.int m_playersoundvt; +#define REGISTER_VOICEMSG(id, vt) \ + .string _playersound_##id; \ + REGISTER(PlayerSounds, playersound, id, m_id, new_pure(VoiceMessage)) \ + { \ + this.instanceOfVoiceMessage = true; \ + this.m_playersoundstr = #id; \ + this.m_playersoundfld = _playersound_##id; \ + this.m_playersoundvt = vt; \ + } + +const int VOICETYPE_PLAYERSOUND = 10; +const int VOICETYPE_TEAMRADIO = 11; +const int VOICETYPE_LASTATTACKER = 12; +const int VOICETYPE_LASTATTACKER_ONLY = 13; +const int VOICETYPE_AUTOTAUNT = 14; +const int VOICETYPE_TAUNT = 15; + +REGISTER_VOICEMSG(attack, VOICETYPE_TEAMRADIO) +REGISTER_VOICEMSG(attackinfive, VOICETYPE_TEAMRADIO) +REGISTER_VOICEMSG(coverme, VOICETYPE_TEAMRADIO) +REGISTER_VOICEMSG(defend, VOICETYPE_TEAMRADIO) +REGISTER_VOICEMSG(freelance, VOICETYPE_TEAMRADIO) +REGISTER_VOICEMSG(incoming, VOICETYPE_TEAMRADIO) +REGISTER_VOICEMSG(meet, VOICETYPE_TEAMRADIO) +REGISTER_VOICEMSG(needhelp, VOICETYPE_TEAMRADIO) +REGISTER_VOICEMSG(seenflag, VOICETYPE_TEAMRADIO) +REGISTER_VOICEMSG(taunt, VOICETYPE_TAUNT) +REGISTER_VOICEMSG(teamshoot, VOICETYPE_LASTATTACKER) + +// reserved sound names for the future (some models lack sounds for them): +// _VOICEMSG(flagcarriertakingdamage) +// _VOICEMSG(getflag) +// reserved sound names for the future (ALL models lack sounds for them): +// _VOICEMSG(affirmative) +// _VOICEMSG(attacking) +// _VOICEMSG(defending) +// _VOICEMSG(roaming) +// _VOICEMSG(onmyway) +// _VOICEMSG(droppedflag) +// _VOICEMSG(negative) +// _VOICEMSG(seenenemy) + +.string m_globalsoundstr; +REGISTRY(GlobalSounds, BITS(8) - 1) +#define GlobalSounds_from(i) _GlobalSounds_from(i, NULL) +#define REGISTER_GLOBALSOUND(id, str) \ + REGISTER(GlobalSounds, GS, id, m_id, new_pure(GlobalSound)) \ + { \ + this.m_globalsoundstr = str; \ + } +REGISTER_REGISTRY(GlobalSounds) +REGISTRY_SORT(GlobalSounds) +STATIC_INIT(GlobalSounds_renumber) +{ + FOREACH(GlobalSounds, true, it.m_id = i); +} +REGISTRY_CHECK(GlobalSounds) +void PrecacheGlobalSound(string samplestring); +PRECACHE(GlobalSounds) +{ + FOREACH(GlobalSounds, true, PrecacheGlobalSound(it.m_globalsoundstr)); +} + +REGISTER_GLOBALSOUND(STEP, "misc/footstep0 6") +REGISTER_GLOBALSOUND(STEP_METAL, "misc/metalfootstep0 6") +REGISTER_GLOBALSOUND(FALL, "misc/hitground 4") +REGISTER_GLOBALSOUND(FALL_METAL, "misc/metalhitground 4") + +bool GetPlayerSoundSampleField_notFound; +void PrecachePlayerSounds(string f); +//#ifdef CSQC + .string GetVoiceMessageSampleField(string type); + .string GetPlayerSoundSampleField(string type); + void ClearPlayerSounds(entity this); + float LoadPlayerSounds(entity this, string f, bool strict); + void UpdatePlayerSounds(entity this); +//#endif +entity GetVoiceMessage(string type); + +#ifdef SVQC + + void _GlobalSound(entity this, entity gs, entity ps, string sample, float chan, float voicetype, bool fake); + #define GlobalSound(this, def, chan, voicetype) _GlobalSound(this, def, NULL, string_null, chan, voicetype, false) + #define GlobalSound_string(this, def, chan, voicetype) _GlobalSound(this, NULL, NULL, def, chan, voicetype, false) + #define PlayerSound(this, def, chan, voicetype) _GlobalSound(this, NULL, def, string_null, chan, voicetype, false) + #define VoiceMessage(this, def, msg) \ + MACRO_BEGIN \ + { \ + entity VM = def; \ + int voicetype = VM.m_playersoundvt; \ + bool ownteam = (voicetype == VOICETYPE_TEAMRADIO); \ + int flood = Say(this, ownteam, NULL, msg, true); \ + bool fake; \ + if (IS_SPEC(this) || IS_OBSERVER(this) || flood < 0) fake = true; \ + else if (flood > 0) fake = false; \ + else break; \ + _GlobalSound(this, NULL, VM, string_null, CH_VOICE, voicetype, fake); \ + } MACRO_END + +#endif + +string allvoicesamples; +STATIC_INIT(allvoicesamples) +{ + FOREACH(PlayerSounds, it.instanceOfVoiceMessage, allvoicesamples = strcat(allvoicesamples, " ", it.m_playersoundstr)); + allvoicesamples = strzone(substring(allvoicesamples, 1, -1)); +} + +#endif