]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/t_jumppads.qc
Fix #1434
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / t_jumppads.qc
index 888b94456ff6496223698d7a2bce47054f7276d6..029bd8e5b6ed75b293cff51cf67367415b8cdfab 100644 (file)
@@ -1,7 +1,8 @@
-float PUSH_ONCE                        = 1;
-float PUSH_SILENT              = 2;
+const float PUSH_ONCE                  = 1;
+const float PUSH_SILENT                = 2;
 
 .float pushltime;
+.float istypefrag;
 .float height;
 
 void() SUB_UseTargets;
@@ -30,12 +31,14 @@ void trigger_push_use()
 
 vector trigger_push_calculatevelocity(vector org, entity tgt, float ht)
 {
-       local float grav, sdist, zdist, vs, vz, jumpheight;
-       local vector sdir, torg;
+       float grav, sdist, zdist, vs, vz, jumpheight;
+       vector sdir, torg;
 
        torg = tgt.origin + (tgt.mins + tgt.maxs) * 0.5;
 
        grav = autocvar_sv_gravity;
+       if(other.gravity)
+               grav *= other.gravity;
 
        zdist = torg_z - org_z;
        sdist = vlen(torg - org - zdist * '0 0 1');
@@ -68,7 +71,7 @@ vector trigger_push_calculatevelocity(vector org, entity tgt, float ht)
         */
 
        // push him so high...
-       vz = sqrt(2 * grav * jumpheight); // NOTE: sqrt(positive)!
+       vz = sqrt(fabs(2 * grav * jumpheight)); // NOTE: sqrt(positive)!
 
        // we start with downwards velocity only if it's a downjump and the jump apex should be outside the jump!
        if(ht < 0)
@@ -127,8 +130,6 @@ vector trigger_push_calculatevelocity(vector org, entity tgt, float ht)
 
 void trigger_push_touch()
 {
-       vector move;
-
        if (self.active == ACTIVE_NOT)
                return;
 
@@ -136,7 +137,7 @@ void trigger_push_touch()
                return;
 
        if(self.team)
-               if((self.spawnflags & 4 == 0) == (self.team != other.team))
+               if(((self.spawnflags & 4) == 0) == (self.team != other.team))
                        return;
 
        EXACTTRIGGER_TOUCH;
@@ -163,9 +164,9 @@ void trigger_push_touch()
                other.velocity = self.movedir;
        }
 
-       other.flags &~= FL_ONGROUND;
+       other.flags &= ~FL_ONGROUND;
 
-       if (other.classname == "player")
+       if (IS_PLAYER(other))
        {
                // reset tracking of oldvelocity for impact damage (sudden velocity changes)
                other.oldvelocity = other.velocity;
@@ -174,15 +175,13 @@ void trigger_push_touch()
                {
                        // flash when activated
                        pointparticles(particleeffectnum("jumppad_activate"), other.origin, other.velocity, 1);
-                       sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
+                       sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
                        self.pushltime = time + 0.2;
                }
-               local float ct;
-               ct = clienttype(other);
-               if( ct == CLIENTTYPE_REAL || ct == CLIENTTYPE_BOT)
+               if(IS_REAL_CLIENT(other) || IS_BOT_CLIENT(other))
                {
-                       local float i;
-                       local float found;
+                       float i;
+                       float found;
                        found = FALSE;
                        for(i = 0; i < other.jumppadcount && i < NUM_JUMPPADSUSED; ++i)
                                if(other.(jumppadsused[i]) == self)
@@ -193,19 +192,23 @@ void trigger_push_touch()
                                other.jumppadcount = other.jumppadcount + 1;
                        }
 
-                       if(ct == CLIENTTYPE_REAL)
+                       if(IS_REAL_CLIENT(other))
                        {
                                if(self.message)
                                        centerprint(other, self.message);
                        }
                        else
                                other.lastteleporttime = time;
+
+                       if (other.deadflag == DEAD_NO)
+                               animdecide_setaction(other, ANIMACTION_JUMP, TRUE);
                }
                else
                        other.jumppadcount = TRUE;
 
                // reset tracking of who pushed you into a hazard (for kill credit)
                other.pushltime = 0;
+               other.istypefrag = 0;
        }
 
        if(self.enemy.target)
@@ -237,18 +240,17 @@ void trigger_push_touch()
 
        if (self.spawnflags & PUSH_ONCE)
        {
-               self.touch = SUB_Null;
+               self.touch = func_null;
                self.think = SUB_Remove;
                self.nextthink = time;
        }
-};
+}
 
 .vector dest;
 void trigger_push_findtarget()
 {
-       local entity e, t;
-       local vector org;
-       local float flighttime;
+       entity e, t;
+       vector org;
 
        // first calculate a typical start point for the jump
        org = (self.absmin + self.absmax) * 0.5;
@@ -280,7 +282,7 @@ void trigger_push_findtarget()
                else if(n == 1)
                {
                        // exactly one dest - bots love that
-                       self.enemy = find(e, targetname, self.target);
+                       self.enemy = find(world, targetname, self.target);
                }
                else
                {
@@ -298,7 +300,7 @@ void trigger_push_findtarget()
                waypoint_spawnforteleporter(self, trace_endpos, vlen(trace_endpos - org) / vlen(e.velocity));
                remove(e);
        }
-};
+}
 
 /*
  * ENTITY PARAMETERS:
@@ -327,14 +329,14 @@ void spawnfunc_trigger_push()
                self.speed = 1000;
        self.movedir = self.movedir * self.speed * 10;
 
-       if not(self.noise)
+       if (!self.noise)
                self.noise = "misc/jumppad.wav";
        precache_sound (self.noise);
 
        // this must be called to spawn the teleport waypoints for bots
        InitializeEntity(self, trigger_push_findtarget, INITPRIO_FINDTARGET);
-};
+}
 
-void spawnfunc_target_push() {};
-void spawnfunc_info_notnull() {};
-void spawnfunc_target_position() {};
+void spawnfunc_target_push() {}
+void spawnfunc_info_notnull() {}
+void spawnfunc_target_position() {}