X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fg_triggers.qc;h=0a70de75f802fb13561c7ccf6eb259788b901023;hp=20372ec9e16de7ecf123ba9f3b87a41baf1977ce;hb=dcaa708cee1093798a651369d9fd46ad5074121e;hpb=2a10a37a7da4bc47b1d7f757991178cc22e7e5e6 diff --git a/qcsrc/server/g_triggers.qc b/qcsrc/server/g_triggers.qc index 20372ec9e..0a70de75f 100644 --- a/qcsrc/server/g_triggers.qc +++ b/qcsrc/server/g_triggers.qc @@ -51,6 +51,9 @@ void SUB_UseTargets() t.message = self.message; t.killtarget = self.killtarget; t.target = self.target; + t.target2 = self.target2; + t.target3 = self.target3; + t.target4 = self.target4; return; } @@ -186,14 +189,12 @@ void multi_use() void multi_touch() { if not(self.spawnflags & 2) - { if not(other.iscreature) return; - if(self.team) - if(self.team == other.team) + if(self.team) + if((self.spawnflags & 4 == 0) == (self.team != other.team)) return; - } // if the trigger has an angles field, check player's facing direction if (self.movedir != '0 0 0') @@ -516,7 +517,7 @@ void trigger_heal_touch() if (other.health < self.max_health) { other.health = min(other.health + self.health, self.max_health); - other.pauserothealth_finished = max(other.pauserothealth_finished, time + cvar("g_balance_pause_health_rot")); + other.pauserothealth_finished = max(other.pauserothealth_finished, time + autocvar_g_balance_pause_health_rot); sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM); } } @@ -656,31 +657,134 @@ void spawnfunc_trigger_gravity() // TODO add a way to do looped sounds with sound(); then complete this entity .float volume, atten; -void target_speaker_use() {sound(self, CHAN_TRIGGER, self.noise, VOL_BASE * self.volume, self.atten);} +void target_speaker_use_off(); +void target_speaker_use_activator() +{ + if(clienttype(activator) != CLIENTTYPE_REAL) + 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, CHAN_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, CHAN_TRIGGER, snd, VOL_BASE * self.volume, self.atten); + if(self.spawnflags & 3) + self.use = target_speaker_use_off; +} +void target_speaker_use_off() +{ + sound(self, CHAN_TRIGGER, "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); - IFTARGETED + + if(!self.atten && !(self.spawnflags & 4)) { - if(!self.atten) + IFTARGETED self.atten = ATTN_NORM; - else if(self.atten < 0) - self.atten = 0; - if(!self.volume) - self.volume = 1; - self.use = target_speaker_use; + else + self.atten = ATTN_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 { - if(!self.atten) - self.atten = ATTN_STATIC; - else if(self.atten < 0) - self.atten = 0; - if(!self.volume) - self.volume = 1; + // Quake/Nexuiz fallback ambientsound (self.origin, self.noise, VOL_BASE * self.volume, self.atten); + remove(self); } }; @@ -1079,7 +1183,7 @@ void misc_laser_think() if(self.dmg) { if(self.team) - if((self.spawnflags & 4 == 0) == (self.team != hitent.team)) + if((self.spawnflags & 8 == 0) == (self.team != hitent.team)) return; if(hitent.takedamage) Damage(hitent, self, self, ((self.dmg < 0) ? 100000 : (self.dmg * frametime)), DEATH_HURTTRIGGER, hitloc, '0 0 0'); @@ -1400,7 +1504,7 @@ void spawnfunc_trigger_impulse() EXACTTRIGGER_INIT; if(self.radius) { - if(!self.strength) self.strength = 2000 * cvar("g_triggerimpulse_radial_multiplier"); + if(!self.strength) self.strength = 2000 * autocvar_g_triggerimpulse_radial_multiplier; setorigin(self, self.origin); setsize(self, '-1 -1 -1' * self.radius,'1 1 1' * self.radius); self.touch = trigger_impulse_touch3; @@ -1409,13 +1513,13 @@ void spawnfunc_trigger_impulse() { if(self.target) { - if(!self.strength) self.strength = 950 * cvar("g_triggerimpulse_directional_multiplier"); + if(!self.strength) self.strength = 950 * autocvar_g_triggerimpulse_directional_multiplier; self.touch = trigger_impulse_touch1; } else { if(!self.strength) self.strength = 0.9; - self.strength = pow(self.strength, cvar("g_triggerimpulse_accel_power")) * cvar("g_triggerimpulse_accel_multiplier"); + self.strength = pow(self.strength, autocvar_g_triggerimpulse_accel_power) * autocvar_g_triggerimpulse_accel_multiplier; self.touch = trigger_impulse_touch2; } }