X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Feffects%2Fqc%2Fglobalsound.qc;h=a2653238e7ebea30ad5a22f26203adf9156c66e1;hb=6a611fb362129440369cb09a590023d6292102e9;hp=413df981fda771b968c9fbcc1ae28336954451c7;hpb=2d79d9ed30444579f4a1e3205280eec945201b9f;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/effects/qc/globalsound.qc b/qcsrc/common/effects/qc/globalsound.qc index 413df981f..a2653238e 100644 --- a/qcsrc/common/effects/qc/globalsound.qc +++ b/qcsrc/common/effects/qc/globalsound.qc @@ -1,33 +1,49 @@ #include "globalsound.qh" -#include "../common/ent_cs.qh" +#include #ifdef IMPLEMENTATION - #include "../../animdecide.qh" + #include #ifdef SVQC - #include "../../../server/cl_player.qh" + #include #endif REGISTER_NET_TEMP(globalsound) REGISTER_NET_TEMP(playersound) + string GlobalSound_sample(string pair, float r); + #ifdef SVQC /** * @param from the source entity, its position is sent * @param gs the global sound def * @param r a random number in 0..1 */ - void globalsound(int channel, entity from, entity gs, float r, int chan, float vol, float atten) + void globalsound(int channel, entity from, entity gs, float r, int chan, float _vol, float _atten) { + //assert(IS_PLAYER(from), eprint(from)); if (channel == MSG_ONE && !IS_REAL_CLIENT(msg_entity)) return; + if (!autocvar_g_debug_globalsounds) { + string sample = GlobalSound_sample(gs.m_globalsoundstr, r); + switch (channel) { + case MSG_ONE: + soundto(channel, from, chan, sample, _vol, _atten); + break; + case MSG_ALL: + _sound(from, chan, sample, _vol, _atten); + break; + } + return; + } WriteHeader(channel, globalsound); WriteByte(channel, gs.m_id); WriteByte(channel, r * 255); WriteByte(channel, etof(from)); - WriteByte(channel, fabs(chan)); - WriteByte(channel, floor(vol * 255)); - WriteByte(channel, floor(atten * 64)); + WriteByte(channel, chan); + WriteByte(channel, floor(_vol * 255)); + WriteByte(channel, floor(_atten * 64)); + entcs_force_origin(from); vector o = from.origin + 0.5 * (from.mins + from.maxs); WriteCoord(channel, o.x); WriteCoord(channel, o.y); @@ -39,16 +55,31 @@ * @param ps the player sound def * @param r a random number in 0..1 */ - void playersound(int channel, entity from, entity ps, float r, int chan, float vol, float atten) + void playersound(int channel, entity from, entity ps, float r, int chan, float _vol, float _atten) { + //assert(IS_PLAYER(from), eprint(from)); if (channel == MSG_ONE && !IS_REAL_CLIENT(msg_entity)) return; + if (!autocvar_g_debug_globalsounds) { + //UpdatePlayerSounds(from); + string s = from.(ps.m_playersoundfld); + string sample = GlobalSound_sample(s, r); + switch (channel) { + case MSG_ONE: + soundto(channel, from, chan, sample, _vol, _atten); + break; + case MSG_ALL: + _sound(from, chan, sample, _vol, _atten); + break; + } + return; + } WriteHeader(channel, playersound); WriteByte(channel, ps.m_id); WriteByte(channel, r * 255); WriteByte(channel, etof(from)); - WriteByte(channel, fabs(chan)); - WriteByte(channel, floor(vol * 255)); - WriteByte(channel, floor(atten * 64)); + WriteByte(channel, chan); + WriteByte(channel, floor(_vol * 255)); + WriteByte(channel, floor(_atten * 64)); entcs_force_origin(from); vector o = from.origin + 0.5 * (from.mins + from.maxs); WriteCoord(channel, o.x); @@ -57,8 +88,6 @@ } #endif - string GlobalSound_sample(string pair, float r); - #ifdef CSQC NET_HANDLE(globalsound, bool isnew) @@ -67,25 +96,26 @@ float r = ReadByte() / 255; string sample = GlobalSound_sample(gs.m_globalsoundstr, r); int who = ReadByte(); - int chan = ReadByte(); + entity e = entcs_receiver(who - 1); + int chan = ReadSByte(); float vol = ReadByte() / 255; float atten = ReadByte() / 64; vector o; o.x = ReadCoord(); o.y = ReadCoord(); o.z = ReadCoord(); - if (who == player_currententnum) + // TODO: is this really what we want to be doing? Footsteps that follow the player at head height? + if (who == player_currententnum) e = findfloat(NULL, entnum, who); // play at camera position for full volume + else if (e) e.origin = o; + if (e) { - // client knows better, play at current position to unlag - entity e = findfloat(world, entnum, who); sound7(e, chan, sample, vol, atten, 0, 0); } else { - entity e = new(globalsound); - e.origin = o; + // Can this happen? + LOG_WARNINGF("Missing entcs data for player %d\n", who); sound8(e, o, chan, sample, vol, atten, 0, 0); - remove(e); // debug with: e.think = SUB_Remove; e.nextthink = time + 1; } return true; } @@ -95,31 +125,29 @@ entity ps = PlayerSounds_from(ReadByte()); float r = ReadByte() / 255; int who = ReadByte(); - entity e = entcs_receiver[who - 1]; + entity e = entcs_receiver(who - 1); UpdatePlayerSounds(e); string s = e.(ps.m_playersoundfld); string sample = GlobalSound_sample(s, r); - int chan = ReadByte(); + int chan = ReadSByte(); float vol = ReadByte() / 255; float atten = ReadByte() / 64; vector o; o.x = ReadCoord(); o.y = ReadCoord(); o.z = ReadCoord(); + if (who == player_currententnum) e = findfloat(NULL, entnum, who); // play at camera position for full volume + else if (e) e.origin = o; if (e) { // TODO: for non-visible players, origin should probably continue to be updated as long as the sound is playing - e.origin = o; sound7(e, chan, sample, vol, atten, 0, 0); } else { - LOG_WARNINGF("Missing entcs data for player %i\n", e); - // Can this happen? - entity e = new(playersound); - e.origin = o; + // Can this happen? + LOG_WARNINGF("Missing entcs data for player %d\n", who); sound8(e, o, chan, sample, vol, atten, 0, 0); - remove(e); // debug with: e.think = SUB_Remove; e.nextthink = time + 1; } return true; } @@ -162,25 +190,16 @@ entity GetVoiceMessage(string type) { - FOREACH(PlayerSounds, it.m_playersoundstr == type && it.instanceOfVoiceMessage == true, LAMBDA(return it)); + FOREACH(PlayerSounds, it.m_playersoundstr == type && it.instanceOfVoiceMessage == true, return it); return NULL; } entity GetPlayerSound(string type) { - FOREACH(PlayerSounds, it.m_playersoundstr == type && it.instanceOfVoiceMessage == false, LAMBDA(return it)); + FOREACH(PlayerSounds, it.m_playersoundstr == type && it.instanceOfVoiceMessage == false, return it); return NULL; } - string allvoicesamples; - STATIC_INIT(allvoicesamples) - { - FOREACH(PlayerSounds, it.instanceOfVoiceMessage, LAMBDA( - allvoicesamples = strcat(allvoicesamples, " ", it.m_playersoundstr) - )); - allvoicesamples = strzone(substring(allvoicesamples, 1, -1)); - } - .string _GetPlayerSoundSampleField(string type, bool voice) { GetPlayerSoundSampleField_notFound = false; @@ -218,7 +237,7 @@ fclose(fh); } - #ifdef CSQC + //#ifdef CSQC .string GetPlayerSoundSampleField(string type) { @@ -227,14 +246,14 @@ void ClearPlayerSounds(entity this) { - FOREACH(PlayerSounds, true, LAMBDA( + FOREACH(PlayerSounds, true, { .string fld = it.m_playersoundfld; if (this.(fld)) - { - strunzone(this.(fld)); - this.(fld) = string_null; - } - )); + { + strunzone(this.(fld)); + this.(fld) = string_null; + } + }); } bool LoadPlayerSounds(entity this, string f, bool strict) @@ -283,19 +302,24 @@ this.skin_for_playersound = this.skin; ClearPlayerSounds(this); LoadPlayerSounds(this, "sound/player/default.sounds", true); - if (this.model == "null" || autocvar_g_debug_defaultsounds) return; + if (this.model == "null" + #ifdef SVQC + && autocvar_g_debug_globalsounds + #endif + ) return; + if (autocvar_g_debug_defaultsounds) return; if (LoadPlayerSounds(this, get_model_datafilename(this.model, this.skin, "sounds"), false)) return; LoadPlayerSounds(this, get_model_datafilename(this.model, 0, "sounds"), true); } - #endif + //#endif #ifdef SVQC - void _GlobalSound(entity gs, entity ps, string sample, int chan, int voicetype, bool fake) + void _GlobalSound(entity this, entity gs, entity ps, string sample, int chan, int voicetype, bool fake) { - SELFPARAM(); if (gs == NULL && ps == NULL && sample == "") return; + if(this.classname == "body") return; float r = random(); if (sample != "") sample = GlobalSound_sample(sample, r); switch (voicetype) @@ -328,22 +352,21 @@ case VOICETYPE_TEAMRADIO: { #define X() \ - do \ + MACRO_BEGIN \ { \ float atten = (msg_entity.cvar_cl_voice_directional == 1) ? ATTEN_MIN : ATTEN_NONE; \ if (gs) globalsound(MSG_ONE, this, gs, r, chan, VOL_BASEVOICE, atten); \ else if (ps) playersound(MSG_ONE, this, ps, r, chan, VOL_BASEVOICE, atten); \ else soundto(MSG_ONE, this, chan, sample, VOL_BASEVOICE, atten); \ - } \ - while (0) + } MACRO_END if (fake) { msg_entity = this; X(); } else { - FOR_EACH_REALCLIENT(msg_entity) - { - if (!teamplay || msg_entity.team == this.team) X(); - } + FOREACH_CLIENT(IS_REAL_CLIENT(it) && (!teamplay || msg_entity.team == this.team), { + msg_entity = it; + X(); + }); } #undef X break; @@ -352,14 +375,14 @@ case VOICETYPE_TAUNT: { if (voicetype == VOICETYPE_AUTOTAUNT) if (!sv_autotaunt) { break; }else {} - else if (IS_PLAYER(this) && this.deadflag == DEAD_NO) animdecide_setaction(this, ANIMACTION_TAUNT, + else if (IS_PLAYER(this) && !IS_DEAD(this)) animdecide_setaction(this, ANIMACTION_TAUNT, true); if (!sv_taunt) break; if (autocvar_sv_gentle) break; float tauntrand = 0; if (voicetype == VOICETYPE_AUTOTAUNT) tauntrand = random(); #define X() \ - do \ + MACRO_BEGIN \ { \ if (voicetype != VOICETYPE_AUTOTAUNT || tauntrand < msg_entity.cvar_cl_autotaunt) \ { \ @@ -371,8 +394,7 @@ else if (ps) playersound(MSG_ONE, this, ps, r, chan, VOL_BASEVOICE, atten); \ else soundto(MSG_ONE, this, chan, sample, VOL_BASEVOICE, atten); \ } \ - } \ - while (0) + } MACRO_END if (fake) { msg_entity = this; @@ -380,10 +402,10 @@ } else { - FOR_EACH_REALCLIENT(msg_entity) - { + FOREACH_CLIENT(IS_REAL_CLIENT(it), { + msg_entity = it; X(); - } + }); } #undef X break;