X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fg_triggers.qc;h=c31352ed5dec0e3f517d30198211d143db2cdcba;hb=4016ae2e098748cfdb992175fcc3a583915f09ce;hp=7ee0b37c49d90a46b68a171fd2c0346b2031ce40;hpb=51107f44ad1f6443f791c4e74883bbf64feaeb0a;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/g_triggers.qc b/qcsrc/server/g_triggers.qc index 7ee0b37c4..c31352ed5 100644 --- a/qcsrc/server/g_triggers.qc +++ b/qcsrc/server/g_triggers.qc @@ -533,61 +533,113 @@ void spawnfunc_trigger_heal() // ////////////////////////////////////////////////////////////// -.float triggergravity, triggergravitytime, oldgravity; .entity trigger_gravity_check; -void trigger_gravity_check_think() +void trigger_gravity_remove(entity own) { - // Entity that spawns when you enter a gravity zone, and checks if you left it - if(self.owner.triggergravitytime < time - 0.1) // need to figure out a correct formula here + if(own.trigger_gravity_check.owner == own) { - dprint("XXXXXXXXXXXXXXXXXXXXXXXXXX "); - self.owner.gravity = self.owner.oldgravity; - self.owner.triggergravity = 0; - remove(self); + UpdateCSQCProjectile(own); + own.gravity = own.trigger_gravity_check.gravity; + remove(own.trigger_gravity_check); } else - self.nextthink = time + 0.01; + backtrace("Removing a trigger_gravity_check with no valid owner"); + own.trigger_gravity_check = world; } +void trigger_gravity_check_think() +{ + // This spawns when a player enters the gravity zone and checks if he left. + // Each frame, self.count is set to 2 by trigger_gravity_touch() and decreased by 1 here. + // It the player has left the gravity trigger, this will be allowed to reach 0 and indicate that. + if(self.count <= 0) + { + if(self.owner.trigger_gravity_check == self) + trigger_gravity_remove(self.owner); + else + remove(self); + return; + } + else + { + self.count -= 1; + self.nextthink = time; + } +}; + +void trigger_gravity_use() +{ + self.state = !self.state; +}; void trigger_gravity_touch() { - if(sv_gravity != 800) + float g; + + if(self.state != TRUE) return; - // only do the EXACTTRIGGER_TOUCH checks when really needed (saves some cpu) - if (other.triggergravitytime < time) - { - EXACTTRIGGER_TOUCH; - other.triggergravitytime = time + 0.1; - if(!other.triggergravity) - { - other.triggergravity = 1; - other.trigger_gravity_check = spawn(); - other.trigger_gravity_check.owner = other; - other.trigger_gravity_check.think = trigger_gravity_check_think; - other.trigger_gravity_check.nextthink = time; - } + EXACTTRIGGER_TOUCH; + + g = self.gravity; - if (other.gravity != self.gravity) + if not(self.spawnflags & 1) + { + if(other.trigger_gravity_check) { - other.oldgravity = other.gravity; - other.gravity = self.gravity; - if(self.noise != "") - sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM); + if(self == other.trigger_gravity_check.enemy) + { + // same? + other.trigger_gravity_check.count = 2; // gravity one more frame... + return; + } + + // compare prio + if(self.cnt > other.trigger_gravity_check.enemy.cnt) + trigger_gravity_remove(other); + else + return; } + other.trigger_gravity_check = spawn(); + other.trigger_gravity_check.enemy = self; + other.trigger_gravity_check.owner = other; + other.trigger_gravity_check.gravity = other.gravity; + other.trigger_gravity_check.think = trigger_gravity_check_think; + other.trigger_gravity_check.nextthink = time; + other.trigger_gravity_check.count = 2; + if(other.gravity) + g *= other.gravity; + } + + if (other.gravity != g) + { + other.gravity = g; + if(self.noise != "") + sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM); + UpdateCSQCProjectile(self.owner); } }; void spawnfunc_trigger_gravity() { - if(!self.gravity) + if(self.gravity == 1) return; + EXACTTRIGGER_INIT; self.touch = trigger_gravity_touch; if(self.noise != "") precache_sound(self.noise); + + self.state = TRUE; + IFTARGETED + { + self.use = trigger_gravity_use; + if(self.spawnflags & 2) + self.state = FALSE; + } }; +//============================================================================= + // 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);}