X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Ftriggers%2Ftarget%2Fmusic.qc;h=b57d483f23e254486359b84cc6525f2365346c10;hp=33261eabdbefc82206a2165da4d382053acddf4b;hb=301702fff6cd39f10c89eef9880cd9a85fe5c53e;hpb=a95e5467c6e1e20a886b19bd6464ec2b005ff53f diff --git a/qcsrc/common/triggers/target/music.qc b/qcsrc/common/triggers/target/music.qc index 33261eabd..b57d483f2 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: @@ -18,54 +20,63 @@ // fade_rate // 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) -{SELFPARAM(); - WriteByte(to, SVC_TEMPENTITY); - WriteByte(to, TE_CSQC_TARGET_MUSIC); - WriteShort(to, num_for_edict(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_sendto(entity this, int to, bool is) +{ + WriteHeader(to, TE_CSQC_TARGET_MUSIC); + WriteShort(to, etof(this)); + WriteByte(to, this.volume * 255.0 * is); + WriteByte(to, this.fade_time * 16.0); + WriteByte(to, this.fade_rate * 16.0); + WriteByte(to, this.lifetime); + WriteString(to, this.noise); } -void target_music_reset() -{SELFPARAM(); - if(self.targetname == "") - target_music_sendto(MSG_ALL, 1); +void target_music_reset(entity this) +{ + if (this.targetname == "") target_music_sendto(this, MSG_ALL, 1); } -void target_music_use() +void target_music_kill() { - if(!activator) + FOREACH_ENTITY_CLASS("target_music", true, { + it.volume = 0; + if (it.targetname == "") + WITHSELF(it, target_music_sendto(it, MSG_ALL, 1)); + else + WITHSELF(it, target_music_sendto(it, MSG_ALL, 0)); + }); +} +void target_music_use(entity this, entity actor, entity trigger) +{ + if(!actor) return; - if(IS_REAL_CLIENT(activator)) + if(IS_REAL_CLIENT(actor)) { - msg_entity = activator; - target_music_sendto(MSG_ONE, 1); + msg_entity = actor; + target_music_sendto(this, 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 == actor, { + msg_entity = it; + target_music_sendto(this, MSG_ONE, 1); + }); } -void spawnfunc_target_music() -{SELFPARAM(); - self.use = target_music_use; - self.reset = target_music_reset; - if(!self.volume) - self.volume = 1; - if(self.targetname == "") - target_music_sendto(MSG_INIT, 1); +spawnfunc(target_music) +{ + this.use = target_music_use; + this.reset = target_music_reset; + if(!this.volume) + this.volume = 1; + if(this.targetname == "") + target_music_sendto(this, MSG_INIT, 1); else - target_music_sendto(MSG_INIT, 0); + target_music_sendto(this, MSG_INIT, 0); } void TargetMusic_RestoreGame() {SELFPARAM(); for(entity e = world; (e = find(e, classname, "target_music")); ) { - setself(e); - if(self.targetname == "") - target_music_sendto(MSG_INIT, 1); + if(e.targetname == "") + target_music_sendto(e, MSG_INIT, 1); else - target_music_sendto(MSG_INIT, 0); + target_music_sendto(e, MSG_INIT, 0); } } // values: @@ -76,145 +87,131 @@ void TargetMusic_RestoreGame() // spawnflags: // 1 = START_OFF // when triggered, it is disabled/enabled for everyone -float trigger_music_SendEntity(entity to, float sf) -{SELFPARAM(); - WriteByte(MSG_ENTITY, ENT_CLIENT_TRIGGER_MUSIC); +bool trigger_music_SendEntity(entity this, entity to, float sf) +{ + WriteHeader(MSG_ENTITY, ENT_CLIENT_TRIGGER_MUSIC); sf &= ~0x80; - if(self.cnt) + if(this.cnt) sf |= 0x80; WriteByte(MSG_ENTITY, sf); if(sf & 4) { - WriteCoord(MSG_ENTITY, self.origin.x); - WriteCoord(MSG_ENTITY, self.origin.y); - WriteCoord(MSG_ENTITY, self.origin.z); + WriteCoord(MSG_ENTITY, this.origin.x); + WriteCoord(MSG_ENTITY, this.origin.y); + WriteCoord(MSG_ENTITY, this.origin.z); } if(sf & 1) { - if(self.model != "null") + if(this.model != "null") { - WriteShort(MSG_ENTITY, self.modelindex); - WriteCoord(MSG_ENTITY, self.mins.x); - WriteCoord(MSG_ENTITY, self.mins.y); - WriteCoord(MSG_ENTITY, self.mins.z); - WriteCoord(MSG_ENTITY, self.maxs.x); - WriteCoord(MSG_ENTITY, self.maxs.y); - WriteCoord(MSG_ENTITY, self.maxs.z); + WriteShort(MSG_ENTITY, this.modelindex); + WriteCoord(MSG_ENTITY, this.mins.x); + WriteCoord(MSG_ENTITY, this.mins.y); + WriteCoord(MSG_ENTITY, this.mins.z); + WriteCoord(MSG_ENTITY, this.maxs.x); + WriteCoord(MSG_ENTITY, this.maxs.y); + WriteCoord(MSG_ENTITY, this.maxs.z); } else { WriteShort(MSG_ENTITY, 0); - WriteCoord(MSG_ENTITY, self.maxs.x); - WriteCoord(MSG_ENTITY, self.maxs.y); - WriteCoord(MSG_ENTITY, self.maxs.z); + WriteCoord(MSG_ENTITY, this.maxs.x); + WriteCoord(MSG_ENTITY, this.maxs.y); + WriteCoord(MSG_ENTITY, this.maxs.z); } - WriteByte(MSG_ENTITY, self.volume * 255.0); - WriteByte(MSG_ENTITY, self.fade_time * 16.0); - WriteByte(MSG_ENTITY, self.fade_rate * 16.0); - WriteString(MSG_ENTITY, self.noise); + WriteByte(MSG_ENTITY, this.volume * 255.0); + WriteByte(MSG_ENTITY, this.fade_time * 16.0); + WriteByte(MSG_ENTITY, this.fade_rate * 16.0); + WriteString(MSG_ENTITY, this.noise); } return 1; } -void trigger_music_reset() -{SELFPARAM(); - self.cnt = !(self.spawnflags & 1); - self.SendFlags |= 0x80; +void trigger_music_reset(entity this) +{ + this.cnt = !(this.spawnflags & 1); + this.SendFlags |= 0x80; } -void trigger_music_use() -{SELFPARAM(); - self.cnt = !self.cnt; - self.SendFlags |= 0x80; +void trigger_music_use(entity this, entity actor, entity trigger) +{ + this.cnt = !this.cnt; + this.SendFlags |= 0x80; } -void spawnfunc_trigger_music() -{SELFPARAM(); - if(self.model != "") - _setmodel(self, self.model); - if(!self.volume) - self.volume = 1; - if(!self.modelindex) +spawnfunc(trigger_music) +{ + 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) @@ -223,7 +220,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); @@ -271,8 +268,8 @@ void Ent_TriggerMusic_Remove() self.noise = string_null; } -void Ent_ReadTriggerMusic() -{SELFPARAM(); +NET_HANDLE(ENT_CLIENT_TRIGGER_MUSIC, bool isnew) +{ int f = ReadByte(); if(f & 4) { @@ -310,7 +307,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); @@ -325,6 +322,7 @@ void Ent_ReadTriggerMusic() self.cnt = 1; self.think = Ent_TriggerMusic_Think; self.nextthink = time; + return true; } #endif