]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/g_triggers.qc
Merge remote branch 'refs/remotes/origin/diabolik/lodplayers'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / g_triggers.qc
index 241d30164a72b8247564c6c6bd0117d0d27353b3..c31352ed5dec0e3f517d30198211d143db2cdcba 100644 (file)
@@ -533,59 +533,113 @@ void spawnfunc_trigger_heal()
 //
 //////////////////////////////////////////////////////////////
 
-.float triggergravity;
 .entity trigger_gravity_check;
+void trigger_gravity_remove(entity own)
+{
+       if(own.trigger_gravity_check.owner == own)
+       {
+               UpdateCSQCProjectile(own);
+               own.gravity = own.trigger_gravity_check.gravity;
+               remove(own.trigger_gravity_check);
+       }
+       else
+               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.cnt is set to 2 by trigger_gravity_touch() and decreased by 1 here.
+       // 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.cnt <= 0)
+       if(self.count <= 0)
        {
-               dprint("XXXXXXXXXXXXXXXXXXXXXXXXXX "); // temporary execution test
-               self.owner.gravity = 0;
-               self.owner.triggergravity = 0;
-               remove(self);
+               if(self.owner.trigger_gravity_check == self)
+                       trigger_gravity_remove(self.owner);
+               else
+                       remove(self);
+               return;
        }
        else
        {
-               self.cnt -= 1;
+               self.count -= 1;
                self.nextthink = time;
        }
-}
+};
+
+void trigger_gravity_use()
+{
+       self.state = !self.state;
+};
 
 void trigger_gravity_touch()
 {
+       float g;
+
+       if(self.state != TRUE)
+               return;
+
        EXACTTRIGGER_TOUCH;
 
-       if(!other.triggergravity)
+       g = self.gravity;
+
+       if not(self.spawnflags & 1)
        {
-               other.triggergravity = 1;
+               if(other.trigger_gravity_check)
+               {
+                       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;
        }
-       other.trigger_gravity_check.cnt = 2;
 
-       if (other.gravity != self.gravity)
+       if (other.gravity != g)
        {
-               other.gravity = self.gravity;
+               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);}