#ifdef SVQC // TODO add a way to do looped sounds with sound(); then complete this entity void target_speaker_use_off(); void target_speaker_use_activator() { if (!IS_REAL_CLIENT(activator)) return; string snd; if(substring(self.noise, 0, 1) == "*") { var .string sample; sample = GetVoiceMessageSampleField(substring(self.noise, 1, -1)); if(GetPlayerSoundSampleField_notFound) snd = "misc/null.wav"; else if(activator.sample == "") snd = "misc/null.wav"; else { tokenize_console(activator.sample); float n; n = stof(argv(1)); if(n > 0) snd = strcat(argv(0), ftos(floor(random() * n + 1)), ".wav"); // randomization else snd = strcat(argv(0), ".wav"); // randomization } } else snd = self.noise; msg_entity = activator; soundto(MSG_ONE, self, CH_TRIGGER, snd, VOL_BASE * self.volume, self.atten); } void target_speaker_use_on() { string snd; if(substring(self.noise, 0, 1) == "*") { var .string sample; sample = GetVoiceMessageSampleField(substring(self.noise, 1, -1)); if(GetPlayerSoundSampleField_notFound) snd = "misc/null.wav"; else if(activator.sample == "") snd = "misc/null.wav"; else { tokenize_console(activator.sample); float n; n = stof(argv(1)); if(n > 0) snd = strcat(argv(0), ftos(floor(random() * n + 1)), ".wav"); // randomization else snd = strcat(argv(0), ".wav"); // randomization } } else snd = self.noise; sound(self, CH_TRIGGER_SINGLE, snd, VOL_BASE * self.volume, self.atten); if(self.spawnflags & 3) self.use = target_speaker_use_off; } void target_speaker_use_off() { sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASE * self.volume, self.atten); self.use = target_speaker_use_on; } void target_speaker_reset() { if(self.spawnflags & 1) // LOOPED_ON { if(self.use == target_speaker_use_on) target_speaker_use_on(); } else if(self.spawnflags & 2) { if(self.use == target_speaker_use_off) target_speaker_use_off(); } } void spawnfunc_target_speaker() { // TODO: "*" prefix to sound file name // TODO: wait and random (just, HOW? random is not a field) if(self.noise) precache_sound (self.noise); if(!self.atten && !(self.spawnflags & 4)) { IFTARGETED self.atten = ATTEN_NORM; else self.atten = ATTEN_STATIC; } else if(self.atten < 0) self.atten = 0; if(!self.volume) self.volume = 1; IFTARGETED { if(self.spawnflags & 8) // ACTIVATOR self.use = target_speaker_use_activator; else if(self.spawnflags & 1) // LOOPED_ON { target_speaker_use_on(); self.reset = target_speaker_reset; } else if(self.spawnflags & 2) // LOOPED_OFF { self.use = target_speaker_use_on; self.reset = target_speaker_reset; } else self.use = target_speaker_use_on; } else if(self.spawnflags & 1) // LOOPED_ON { ambientsound (self.origin, self.noise, VOL_BASE * self.volume, self.atten); remove(self); } else if(self.spawnflags & 2) // LOOPED_OFF { objerror("This sound entity can never be activated"); } else { // Quake/Nexuiz fallback ambientsound (self.origin, self.noise, VOL_BASE * self.volume, self.atten); remove(self); } } #endif