X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;ds=inline;f=qcsrc%2Fcommon%2Ftriggers%2Ftarget%2Fmusic.qc;h=5a4e86c48b370d0dd65baa1f0553abfc433eefb0;hb=65f79cc103dac145eebf7c179a16408935c176b9;hp=b3a5a24330763d13152eb088cecb0dfd9ff445df;hpb=1556aa4ea70b3b275afb1cb4587e555fb44f71c3;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/triggers/target/music.qc b/qcsrc/common/triggers/target/music.qc index b3a5a2433..5a4e86c48 100644 --- a/qcsrc/common/triggers/target/music.qc +++ b/qcsrc/common/triggers/target/music.qc @@ -1,12 +1,14 @@ #if defined(CSQC) #elif defined(MENUQC) #elif defined(SVQC) - #include "../../../server/_all.qh" - #include "../../constants.qh" - #include "../../../server/constants.qh" - #include "../../../server/defs.qh" + #include + #include + #include #endif +REGISTER_NET_TEMP(TE_CSQC_TARGET_MUSIC) +REGISTER_NET_LINKED(ENT_CLIENT_TRIGGER_MUSIC) + #ifdef SVQC // values: @@ -19,20 +21,28 @@ // when triggered, the music is overridden for activator until lifetime (or forever, if lifetime is 0) // when targetname is not set, THIS ONE is default void target_music_sendto(float to, float is) -{ - WriteByte(to, SVC_TEMPENTITY); - WriteByte(to, TE_CSQC_TARGET_MUSIC); - WriteShort(to, num_for_edict(self)); +{SELFPARAM(); + WriteHeader(to, TE_CSQC_TARGET_MUSIC); + WriteShort(to, etof(self)); WriteByte(to, self.volume * 255.0 * is); WriteByte(to, self.fade_time * 16.0); WriteByte(to, self.fade_rate * 16.0); WriteByte(to, self.lifetime); WriteString(to, self.noise); } -void target_music_reset() +void target_music_reset(entity this) { - if(self.targetname == "") - target_music_sendto(MSG_ALL, 1); + if (this.targetname == "") target_music_sendto(MSG_ALL, 1); +} +void target_music_kill() +{ + FOREACH_ENTITY_CLASS("target_music", true, { + it.volume = 0; + if (it.targetname == "") + WITHSELF(it, target_music_sendto(MSG_ALL, 1)); + else + WITHSELF(it, target_music_sendto(MSG_ALL, 0)); + }); } void target_music_use() { @@ -43,10 +53,12 @@ void target_music_use() msg_entity = activator; target_music_sendto(MSG_ONE, 1); } - entity head; - FOR_EACH_SPEC(head) if(head.enemy == activator) { msg_entity = head; target_music_sendto(MSG_ONE, 1); } + FOREACH_CLIENT(IS_SPEC(it) && it.enemy == activator, { + msg_entity = it; + target_music_sendto(MSG_ONE, 1); + }); } -void spawnfunc_target_music() +spawnfunc(target_music) { self.use = target_music_use; self.reset = target_music_reset; @@ -58,9 +70,10 @@ void spawnfunc_target_music() target_music_sendto(MSG_INIT, 0); } void TargetMusic_RestoreGame() -{ - for(self = world; (self = find(self, classname, "target_music")); ) +{SELFPARAM(); + for(entity e = world; (e = find(e, classname, "target_music")); ) { + setself(e); if(self.targetname == "") target_music_sendto(MSG_INIT, 1); else @@ -75,9 +88,9 @@ void TargetMusic_RestoreGame() // spawnflags: // 1 = START_OFF // when triggered, it is disabled/enabled for everyone -float trigger_music_SendEntity(entity to, float sf) +bool trigger_music_SendEntity(entity this, entity to, float sf) { - WriteByte(MSG_ENTITY, ENT_CLIENT_TRIGGER_MUSIC); + WriteHeader(MSG_ENTITY, ENT_CLIENT_TRIGGER_MUSIC); sf &= ~0x80; if(self.cnt) sf |= 0x80; @@ -114,106 +127,92 @@ float trigger_music_SendEntity(entity to, float sf) } return 1; } -void trigger_music_reset() +void trigger_music_reset(entity this) { - self.cnt = !(self.spawnflags & 1); - self.SendFlags |= 0x80; + this.cnt = !(this.spawnflags & 1); + this.SendFlags |= 0x80; } void trigger_music_use() -{ +{SELFPARAM(); self.cnt = !self.cnt; self.SendFlags |= 0x80; } -void spawnfunc_trigger_music() +spawnfunc(trigger_music) { - if(self.model != "") - setmodel(self, self.model); - if(!self.volume) - self.volume = 1; - if(!self.modelindex) + if(this.model != "") _setmodel(this, this.model); + if(!this.volume) this.volume = 1; + if(!this.modelindex) { - setorigin(self, self.origin + self.mins); - setsize(self, '0 0 0', self.maxs - self.mins); + setorigin(this, this.origin + this.mins); + setsize(this, '0 0 0', this.maxs - this.mins); } - trigger_music_reset(); + trigger_music_reset(this); - self.use = trigger_music_use; - self.reset = trigger_music_reset; + this.use = trigger_music_use; + this.reset = trigger_music_reset; - Net_LinkEntity(self, false, 0, trigger_music_SendEntity); + Net_LinkEntity(this, false, 0, trigger_music_SendEntity); } #elif defined(CSQC) +entity TargetMusic_list; +STATIC_INIT(TargetMusic_list) +{ + TargetMusic_list = LL_NEW(); +} + void TargetMusic_Advance() { // run AFTER all the thinks! - entity best, e; - float vol, vol0; - best = music_default; - if(music_target && time < music_target.lifetime) - best = music_target; - if(music_trigger) - best = music_trigger; - for(e = world; (e = findfloat(e, enttype, ENT_CLIENT_TRIGGER_MUSIC)); ) if(e.noise) - { - vol0 = e.lastvol; - if(getsoundtime(e, CH_BGM_SINGLE) < 0) - { - vol0 = -1; - } - if(e == best) + entity best = music_default; + if (music_target && time < music_target.lifetime) best = music_target; + if (music_trigger) best = music_trigger; + LL_EACH(TargetMusic_list, it.noise, { + const float vol0 = (getsoundtime(it, CH_BGM_SINGLE) >= 0) ? it.lastvol : -1; + if (it == best) { // increase volume - if(e.fade_time > 0) - e.state = bound(0, e.state + frametime / e.fade_time, 1); - else - e.state = 1; + it.state = (it.fade_time > 0) ? bound(0, it.state + frametime / it.fade_time, 1) : 1; } else { // decrease volume - if(e.fade_rate > 0) - e.state = bound(0, e.state - frametime / e.fade_rate, 1); - else - e.state = 0; + it.state = (it.fade_rate > 0) ? bound(0, it.state - frametime / it.fade_rate, 1) : 0; } - vol = e.state * e.volume * autocvar_bgmvolume; - if(vol != vol0) + const float vol = it.state * it.volume * autocvar_bgmvolume; + if (vol != vol0) { if(vol0 < 0) - sound(e, CH_BGM_SINGLE, e.noise, vol, ATTEN_NONE); // restart + _sound(it, CH_BGM_SINGLE, it.noise, vol, ATTEN_NONE); // restart else - sound(e, CH_BGM_SINGLE, "", vol, ATTEN_NONE); - e.lastvol = vol; + _sound(it, CH_BGM_SINGLE, "", vol, ATTEN_NONE); + it.lastvol = vol; } - } + }); music_trigger = world; + bgmtime = (best) ? getsoundtime(best, CH_BGM_SINGLE) : gettime(GETTIME_CDTRACK); +} - if(best) - bgmtime = getsoundtime(best, CH_BGM_SINGLE); - else - bgmtime = gettime(GETTIME_CDTRACK); +NET_HANDLE(TE_CSQC_TARGET_MUSIC, bool isNew) +{ + Net_TargetMusic(); + return true; } void Net_TargetMusic() { - int id = ReadShort(); - float vol = ReadByte() / 255.0; - float fai = ReadByte() / 16.0; - float fao = ReadByte() / 16.0; - float tim = ReadByte(); - string noi = ReadString(); + const int id = ReadShort(); + const float vol = ReadByte() / 255.0; + const float fai = ReadByte() / 16.0; + const float fao = ReadByte() / 16.0; + const float tim = ReadByte(); + const string noi = ReadString(); - entity e; - for(e = world; (e = findfloat(e, enttype, ENT_CLIENT_TRIGGER_MUSIC)); ) + entity e = NULL; + LL_EACH(TargetMusic_list, it.count == id, { e = it; break; }); + if (!e) { - if(e.count == id) - break; - } - if(!e) - { - e = spawn(); - e.enttype = ENT_CLIENT_TRIGGER_MUSIC; + LL_PUSH(TargetMusic_list, e = new_pure(TargetMusic)); e.count = id; } if(e.noise != noi) @@ -222,7 +221,7 @@ void Net_TargetMusic() strunzone(e.noise); e.noise = strzone(noi); precache_sound(e.noise); - sound(e, CH_BGM_SINGLE, e.noise, 0, ATTEN_NONE); + _sound(e, CH_BGM_SINGLE, e.noise, 0, ATTEN_NONE); if(getsoundtime(e, CH_BGM_SINGLE) < 0) { LOG_TRACEF("Cannot initialize sound %s\n", e.noise); @@ -255,7 +254,7 @@ void Net_TargetMusic() } void Ent_TriggerMusic_Think() -{ +{SELFPARAM(); if(WarpZoneLib_BoxTouchesBrush(view_origin, view_origin, self, world)) { music_trigger = self; @@ -264,13 +263,13 @@ void Ent_TriggerMusic_Think() } void Ent_TriggerMusic_Remove() -{ +{SELFPARAM(); if(self.noise) strunzone(self.noise); self.noise = string_null; } -void Ent_ReadTriggerMusic() +NET_HANDLE(ENT_CLIENT_TRIGGER_MUSIC, bool isnew) { int f = ReadByte(); if(f & 4) @@ -309,7 +308,7 @@ void Ent_ReadTriggerMusic() if(self.noise != s) { precache_sound(self.noise); - sound(self, CH_BGM_SINGLE, self.noise, 0, ATTEN_NONE); + _sound(self, CH_BGM_SINGLE, self.noise, 0, ATTEN_NONE); if(getsoundtime(self, CH_BGM_SINGLE) < 0) { LOG_TRACEF("Cannot initialize sound %s\n", self.noise); @@ -324,6 +323,7 @@ void Ent_ReadTriggerMusic() self.cnt = 1; self.think = Ent_TriggerMusic_Think; self.nextthink = time; + return true; } #endif