]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Make CSQC use PlayerJump
authorMario <zacjardine@y7mail.com>
Fri, 12 Dec 2014 05:42:30 +0000 (16:42 +1100)
committerMario <zacjardine@y7mail.com>
Fri, 12 Dec 2014 05:42:30 +0000 (16:42 +1100)
qcsrc/common/physics.qc
qcsrc/common/physics.qh
qcsrc/common/stats.qh
qcsrc/server/autocvars.qh
qcsrc/server/mutators/mutator_multijump.qc

index 2aca4c7bb47845590a83036e5e5f68d771df2a13..24b477454bd607d59389700a20e579343369e32f 100644 (file)
@@ -1,5 +1,4 @@
 .float race_penalty;
-.float restart_jump;
 
 .float gravity;
 .float swamp_slowdown;
@@ -27,6 +26,12 @@ float AdjustAirAccelQW(float accelqw, float factor);
 .float stat_sv_maxspeed;
 .float stat_movement_highspeed;
 
+.float stat_doublejump;
+
+.float stat_jumpspeedcap_min;
+.float stat_jumpspeedcap_max;
+.float stat_jumpspeedcap_disable_onramps;
+
 .float stat_jetpack_accel_side;
 .float stat_jetpack_accel_up;
 .float stat_jetpack_antigravity;
@@ -53,6 +58,14 @@ void Physics_AddStats()
 
        // hack to fix track_canjump
        addstat(STAT_MOVEVARS_TRACK_CANJUMP, AS_INT, cvar_cl_movement_track_canjump);
+
+       // double jump
+       addstat(STAT_DOUBLEJUMP, AS_INT, stat_doublejump);
+
+       // jump speed caps
+       addstat(STAT_MOVEVARS_JUMPSPEEDCAP_MIN, AS_FLOAT, stat_jumpspeedcap_min);
+       addstat(STAT_MOVEVARS_JUMPSPEEDCAP_MIN, AS_FLOAT, stat_jumpspeedcap_min);
+       addstat(STAT_MOVEVARS_JUMPSPEEDCAP_DISABLE_ONRAMPS, AS_INT, stat_jumpspeedcap_disable_onramps);
 }
 
 void Physics_UpdateStats(float maxspd_mod)
@@ -66,12 +79,18 @@ void Physics_UpdateStats(float maxspd_mod)
        self.stat_sv_maxspeed = autocvar_sv_maxspeed * maxspd_mod; // also slow walking
        self.stat_movement_highspeed = PHYS_HIGHSPEED; // TODO: remove this!
 
+       self.stat_doublejump = PHYS_DOUBLEJUMP;
+
        self.stat_jetpack_antigravity = PHYS_JETPACK_ANTIGRAVITY;
        self.stat_jetpack_accel_up = PHYS_JETPACK_ACCEL_UP;
        self.stat_jetpack_accel_side = PHYS_JETPACK_ACCEL_SIDE;
        self.stat_jetpack_maxspeed_side = PHYS_JETPACK_MAXSPEED_SIDE;
        self.stat_jetpack_maxspeed_up = PHYS_JETPACK_MAXSPEED_UP;
        self.stat_jetpack_fuel = PHYS_JETPACK_FUEL;
+
+       self.stat_jumpspeedcap_min = PHYS_JUMPSPEEDCAP_MIN;
+       self.stat_jumpspeedcap_max = PHYS_JUMPSPEEDCAP_MAX;
+       self.stat_jumpspeedcap_disable_onramps = PHYS_JUMPSPEEDCAP_DISABLE_ONRAMPS;
 }
 #endif
 
@@ -424,25 +443,31 @@ When you press the jump key
 */
 void PlayerJump (void)
 {
-#ifdef SVQC
        if (PHYS_FROZEN(self))
                return; // no jumping in freezetag when frozen
 
+#ifdef SVQC
        if (self.player_blocked)
                return; // no jumping while blocked
+#endif
 
        float doublejump = FALSE;
        float mjumpheight = PHYS_JUMPVELOCITY;
 
        player_multijump = doublejump;
        player_jumpheight = mjumpheight;
+#ifdef SVQC
        if (MUTATOR_CALLHOOK(PlayerJump))
                return;
+#elif defined(CSQC)
+       if(PM_multijump_checkjump())
+               return;
+#endif
 
        doublejump = player_multijump;
        mjumpheight = player_jumpheight;
 
-       if (autocvar_sv_doublejump)
+       if (PHYS_DOUBLEJUMP)
        {
                tracebox(self.origin + '0 0 0.01', self.mins, self.maxs, self.origin - '0 0 0.01', MOVE_NORMAL, self);
                if (trace_fraction < 1 && trace_plane_normal_z > 0.7)
@@ -475,28 +500,29 @@ void PlayerJump (void)
        // velocity bounds.  Final velocity is bound between (jumpheight *
        // min + jumpheight) and (jumpheight * max + jumpheight);
 
-       if (autocvar_sv_jumpspeedcap_min != "")
+       if(PHYS_JUMPSPEEDCAP_MIN)
        {
-               float minjumpspeed = mjumpheight * stof(autocvar_sv_jumpspeedcap_min);
+               float minjumpspeed = mjumpheight * PHYS_JUMPSPEEDCAP_MIN;
 
                if (self.velocity_z < minjumpspeed)
                        mjumpheight += minjumpspeed - self.velocity_z;
        }
 
-       if (autocvar_sv_jumpspeedcap_max != "")
+       if(PHYS_JUMPSPEEDCAP_MAX)
        {
                // don't do jump speedcaps on ramps to preserve old xonotic ramjump style
                tracebox(self.origin + '0 0 0.01', self.mins, self.maxs, self.origin - '0 0 0.01', MOVE_NORMAL, self);
 
-               if (!(trace_fraction < 1 && trace_plane_normal_z < 0.98 && autocvar_sv_jumpspeedcap_max_disable_on_ramps))
+               if (!(trace_fraction < 1 && trace_plane_normal_z < 0.98 && PHYS_JUMPSPEEDCAP_DISABLE_ONRAMPS))
                {
-                       float maxjumpspeed = mjumpheight * stof(autocvar_sv_jumpspeedcap_max);
+                       float maxjumpspeed = mjumpheight * PHYS_JUMPSPEEDCAP_MAX;
 
                        if (self.velocity_z > maxjumpspeed)
                                mjumpheight -= self.velocity_z - maxjumpspeed;
                }
        }
 
+#ifdef SVQC
        if (!(self.lastflags & FL_ONGROUND))
        {
                if (autocvar_speedmeter)
@@ -510,19 +536,21 @@ void PlayerJump (void)
                        dprint(strcat(ftos(self.jumppadcount), "x jumppad combo\n"));
                self.jumppadcount = 0;
        }
+#endif
 
-       self.oldvelocity_z = self.velocity_z += mjumpheight;
+       self.velocity_z += mjumpheight;
 
        UNSET_ONGROUND(self);
        SET_JUMP_HELD(self);
 
+#ifdef SVQC
+
+       self.oldvelocity_z = self.velocity_z;
+
        animdecide_setaction(self, ANIMACTION_JUMP, TRUE);
 
        if (autocvar_g_jump_grunt)
                PlayerSound(playersound_jump, CH_PLAYER, VOICETYPE_PLAYERSOUND);
-
-       self.restart_jump = -1; // restart jump anim next time
-       // value -1 is used to not use the teleport bit (workaround for tiny hitch when re-jumping)
 #endif
 }
 
@@ -556,30 +584,11 @@ void CheckWaterJump()
 
 void CheckPlayerJump()
 {
-#ifdef SVQC
-       if (self.BUTTON_JUMP)
+       if(PHYS_INPUT_BUTTON_JUMP(self))
                PlayerJump();
        else
                UNSET_JUMP_HELD(self);
 
-#endif
-#ifdef CSQC
-               // jump if on ground with jump button pressed but only if it has been
-               // released at least once since the last jump
-               if (PHYS_INPUT_BUTTON_JUMP(self))
-               {
-                       pm_multijump = FALSE;
-                       PM_multijump_checkjump();
-                       if((IS_ONGROUND(self) || pm_multijump) && (!IS_JUMP_HELD(self) || !PHYS_TRACK_CANJUMP(self)))
-                       {
-                               self.velocity_z += PHYS_JUMPVELOCITY;
-                               UNSET_ONGROUND(self);
-                               SET_JUMP_HELD(self); // canjump = false
-                       }
-               }
-               else
-                       UNSET_JUMP_HELD(self); // canjump = true
-#endif
        if (self.waterlevel == WATERLEVEL_SWIMMING)
                CheckWaterJump();
 }
index fa140ef2cb79f472a1769b17bea5414209bcae76..612dd9b8c6c295d9fd98d6c6f5f9c651d08f4a60 100644 (file)
@@ -2,7 +2,8 @@
 
 #ifdef CSQC
 
-       float pm_multijump;
+       float player_multijump;
+       float player_jumpheight;
 
        #define PHYS_INPUT_ANGLES(s)                            input_angles
 // TODO
 
        #define PHYS_FROZEN(s)                                          getstati(STAT_FROZEN)
 
+       #define PHYS_DOUBLEJUMP                                         getstati(STAT_DOUBLEJUMP)
+
+       #define PHYS_JUMPSPEEDCAP_MIN                           getstatf(STAT_MOVEVARS_JUMPSPEEDCAP_MIN)
+       #define PHYS_JUMPSPEEDCAP_MAX                           getstatf(STAT_MOVEVARS_JUMPSPEEDCAP_MAX)
+       #define PHYS_JUMPSPEEDCAP_DISABLE_ONRAMPS       getstati(STAT_MOVEVARS_JUMPSPEEDCAP_DISABLE_ONRAMPS)
+
        #define PHYS_TRACK_CANJUMP(s)                           getstati(STAT_MOVEVARS_TRACK_CANJUMP)
        #define PHYS_ACCELERATE                                         getstatf(STAT_MOVEVARS_ACCELERATE)
        #define PHYS_AIRACCEL_QW(s)                                     getstatf(STAT_MOVEVARS_AIRACCEL_QW)
 
        #define PHYS_FROZEN(s)                                          s.frozen
 
+       #define PHYS_DOUBLEJUMP                                         autocvar_sv_doublejump
+
+       #define PHYS_JUMPSPEEDCAP_MIN                           autocvar_sv_jumpspeedcap_min
+       #define PHYS_JUMPSPEEDCAP_MAX                           autocvar_sv_jumpspeedcap_max
+       #define PHYS_JUMPSPEEDCAP_DISABLE_ONRAMPS       autocvar_sv_jumpspeedcap_max_disable_on_ramps
+
        #define PHYS_TRACK_CANJUMP(s)                           s.cvar_cl_movement_track_canjump
        #define PHYS_ACCELERATE                                         autocvar_sv_accelerate
        #define PHYS_AIRACCEL_QW(s)                                     s.stat_sv_airaccel_qw
index c07abf8830acb6b76e589fa9b7c7460a1f80d8b3..3b92105df95238820a2bfe31c41cabfefc13d386 100644 (file)
@@ -225,10 +225,10 @@ const float STAT_REVIVE_PROGRESS        = 106;
 // 190 empty?
 // 191 empty?
 // 192 empty?
-// 193 empty?
-// 194 empty?
-// 195 empty?
-// 196 empty?
+const float STAT_MOVEVARS_JUMPSPEEDCAP_DISABLE_ONRAMPS  = 193;
+const float STAT_MOVEVARS_JUMPSPEEDCAP_MAX              = 194;
+const float STAT_MOVEVARS_JUMPSPEEDCAP_MIN              = 195;
+const float STAT_DOUBLEJUMP                             = 196;
 const float STAT_MOVEVARS_TRACK_CANJUMP                 = 197;
 const float STAT_MULTIJUMP_ADD                          = 198;
 const float STAT_MULTIJUMP_SPEED                        = 199;
index bb14c1315e87d4be246bdb4a3b2df6b1fa09bff3..47c3f588a3de2989301dfb031e814ef4d194b733 100644 (file)
@@ -637,9 +637,9 @@ float autocvar_sv_gameplayfix_q2airaccelerate;
 float autocvar_sv_gentle;
 #define autocvar_sv_gravity cvar("sv_gravity")
 string autocvar_sv_intermission_cdtrack;
-string autocvar_sv_jumpspeedcap_max;
+float autocvar_sv_jumpspeedcap_max;
 float autocvar_sv_jumpspeedcap_max_disable_on_ramps;
-string autocvar_sv_jumpspeedcap_min;
+float autocvar_sv_jumpspeedcap_min;
 float autocvar_sv_jumpvelocity;
 float autocvar_sv_logscores_bots;
 float autocvar_sv_logscores_console;
index 439552f25977f0f5c001ee2b99f7ab987bf40990..0d9c53c6d8c7a2bd693862d4faf2d10b1e086507 100644 (file)
@@ -3,14 +3,12 @@
 
 #ifdef CSQC
 
-#define PHYS_MOVE_MULTIJUMP                    pm_multijump
 #define PHYS_MULTIJUMP                                 getstati(STAT_MULTIJUMP)
 #define PHYS_MULTIJUMP_SPEED           getstatf(STAT_MULTIJUMP_SPEED)
 #define PHYS_MULTIJUMP_ADD                     getstati(STAT_MULTIJUMP_ADD)
 
 #elif defined(SVQC)
 
-#define PHYS_MOVE_MULTIJUMP                    player_multijump
 #define PHYS_MULTIJUMP                                 autocvar_g_multijump
 #define PHYS_MULTIJUMP_SPEED           autocvar_g_multijump_speed
 #define PHYS_MULTIJUMP_ADD                     autocvar_g_multijump_add
@@ -62,7 +60,7 @@ float PM_multijump_checkjump()
        else
                self.multijump_ready = FALSE;
 
-       if(!PHYS_MOVE_MULTIJUMP && self.multijump_ready && self.multijump_count < PHYS_MULTIJUMP && self.velocity_z > PHYS_MULTIJUMP_SPEED)
+       if(!player_multijump && self.multijump_ready && self.multijump_count < PHYS_MULTIJUMP && self.velocity_z > PHYS_MULTIJUMP_SPEED)
        {
                if (PHYS_MULTIJUMP)
                {
@@ -70,14 +68,14 @@ float PM_multijump_checkjump()
                        {
                                if (self.velocity_z < PHYS_JUMPVELOCITY)
                                {
-                                       PHYS_MOVE_MULTIJUMP = TRUE;
+                                       player_multijump = TRUE;
                                        self.velocity_z = 0;
                                }
                        }
                        else
-                               PHYS_MOVE_MULTIJUMP = TRUE;
+                               player_multijump = TRUE;
 
-                       if(PHYS_MOVE_MULTIJUMP)
+                       if(player_multijump)
                        {
                                if(PHYS_INPUT_MOVEVALUES(self)_x != 0 || PHYS_INPUT_MOVEVALUES(self)_y != 0) // don't remove all speed if player isnt pressing any movement keys
                                {