]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Fix water movement and add a networked stat for the tiny movement while frozen
authorMario <zacjardine@y7mail.com>
Tue, 9 Dec 2014 23:53:48 +0000 (10:53 +1100)
committerMario <zacjardine@y7mail.com>
Tue, 9 Dec 2014 23:53:48 +0000 (10:53 +1100)
qcsrc/common/physics.qc
qcsrc/common/stats.qh
qcsrc/server/defs.qh
qcsrc/server/g_world.qc

index 45664ed7383d0aaec15eb89bce1464c6cc1d41f6..2ebfbd9fb383631588a4376e2b9fd2df5cbb9539 100644 (file)
@@ -85,6 +85,8 @@
 
        #define PHYS_BUTTON_HOOK(s)                                     (input_buttons & 32)
 
+       #define PHYS_DODGING_FROZEN                                     getstati(STAT_DODGING_FROZEN)
+
 #elif defined(SVQC)
 
        #define PHYS_INPUT_ANGLES(s)                            s.v_angle
 
        #define PHYS_BUTTON_HOOK(s)                                     s.BUTTON_HOOK
 
+       #define PHYS_DODGING_FROZEN                                     autocvar_sv_dodging_frozen
+
 #endif
 
 float IsMoveInDirection(vector mv, float angle) // key mix factor
@@ -506,7 +510,7 @@ When you press the jump key
 void PlayerJump (void)
 {
 #ifdef SVQC
-       if (self.frozen)
+       if (PHYS_FROZEN(self))
                return; // no jumping in freezetag when frozen
 
        if (self.player_blocked)
@@ -1033,12 +1037,16 @@ void PM_check_spider(void)
 #endif
 }
 
+// predict frozen movement, as frozen players CAN move in some cases
 void PM_check_frozen(void)
 {
-#ifdef SVQC
-       if (!self.frozen)
+       if (!PHYS_FROZEN(self))
                return;
-       if (autocvar_sv_dodging_frozen && IS_REAL_CLIENT(self))
+       if (PHYS_DODGING_FROZEN
+#ifdef SVQC
+       && IS_REAL_CLIENT(self)
+#endif
+       )
        {
                PHYS_INPUT_MOVEVALUES(self)_x = bound(-5, PHYS_INPUT_MOVEVALUES(self).x, 5);
                PHYS_INPUT_MOVEVALUES(self)_y = bound(-5, PHYS_INPUT_MOVEVALUES(self).y, 5);
@@ -1046,7 +1054,6 @@ void PM_check_frozen(void)
        }
        else
                PHYS_INPUT_MOVEVALUES(self) = '0 0 0';
-       self.disableclientprediction = 1;
 
        vector midpoint = ((self.absmin + self.absmax) * 0.5);
        if (pointcontents(midpoint) == CONTENT_WATER)
@@ -1056,7 +1063,6 @@ void PM_check_frozen(void)
                if (pointcontents(midpoint + '0 0 16') == CONTENT_WATER)
                        self.velocity_z = 200;
        }
-#endif
 }
 
 void PM_check_blocked(void)
@@ -1174,13 +1180,12 @@ void PM_swim(float maxspd_mod)
        if (GAMEPLAYFIX_GRAVITYUNAFFECTEDBYTICRATE)
                if (!IS_ONGROUND(self) || !(GAMEPLAYFIX_NOGRAVITYONGROUND))
                        self.velocity_z -= g * 0.5;
-#else
-       if (time >= self.teleport_time)
-               PM_Accelerate(wishdir, wishspeed, wishspeed, PHYS_ACCELERATE * maxspd_mod, 1, 0, 0, 0);
 #endif
 
+#ifdef SVQC
        // water acceleration
-       //PM_Accelerate(wishdir, wishspeed, wishspeed, PHYS_ACCELERATE * maxspd_mod, 1, 0, 0, 0);
+       PM_Accelerate(wishdir, wishspeed, wishspeed, PHYS_ACCELERATE * maxspd_mod, 1, 0, 0, 0);
+#endif
 }
 
 void PM_ladder(float maxspd_mod)
@@ -1402,6 +1407,11 @@ void PM_walk(float buttons_prev, float maxspd_mod)
        wishspeed = min(wishspeed, PHYS_MAXSPEED(self) * maxspd_mod);
        if (IS_DUCKED(self))
                wishspeed *= 0.5;
+#ifdef SVQC
+       if (time >= self.teleport_time)
+               PM_Accelerate(wishdir, wishspeed, wishspeed, PHYS_ACCELERATE * maxspd_mod, 1, 0, 0, 0);
+#endif
+
 #ifdef CSQC
        float addspeed = wishspeed - dotproduct(self.velocity, wishdir);
        if (addspeed > 0)
@@ -1417,9 +1427,6 @@ void PM_walk(float buttons_prev, float maxspd_mod)
        if (GAMEPLAYFIX_GRAVITYUNAFFECTEDBYTICRATE)
                if (!IS_ONGROUND(self) || !(GAMEPLAYFIX_NOGRAVITYONGROUND))
                        self.velocity_z -= g * 0.5;
-#else
-       if (time >= self.teleport_time)
-               PM_Accelerate(wishdir, wishspeed, wishspeed, PHYS_ACCELERATE * maxspd_mod, 1, 0, 0, 0);
 #endif
 }
 
@@ -1498,10 +1505,10 @@ void PM_air(float buttons_prev, float maxspd_mod)
 #endif
 }
 
-// Copied from server/g_damage.qc, why is it even in there?
+// used for calculating airshots
 float PM_is_flying()
 {
-       if (self.flags & FL_ONGROUND)
+       if (IS_ONGROUND(self))
                return 0;
        if (self.waterlevel >= WATERLEVEL_SWIMMING)
                return 0;
@@ -1536,7 +1543,7 @@ void PM_Main()
                self.stat_sv_airstrafeaccel_qw = 0;
        self.stat_sv_airspeedlimit_nonqw = autocvar_sv_airspeedlimit_nonqw * maxspeed_mod;
        self.stat_sv_maxspeed = autocvar_sv_maxspeed * maxspeed_mod; // also slow walking
-       self.stat_movement_highspeed = autocvar_g_movement_highspeed;
+       self.stat_movement_highspeed = autocvar_g_movement_highspeed; // TODO: remove this!
 
        self.stat_jetpack_antigravity = autocvar_g_jetpack_antigravity;
        self.stat_jetpack_accel_up = autocvar_g_jetpack_acceleration_up;
index 9b11379cb69540bea63a2155e7c78ec9e83c8237..055db05b79548b951a630e8ce5f089b2e689176a 100644 (file)
@@ -244,7 +244,7 @@ const float STAT_REVIVE_PROGRESS        = 106;
 // 209 empty?
 // 210 empty?
 // 211 empty?
-// 212 empty?
+const float STAT_DODGING_FROZEN                         = 212;
 const float STAT_JETPACK_MAXSPEED_UP                    = 213;
 const float STAT_JETPACK_MAXSPEED_SIDE                  = 214;
 const float STAT_JETPACK_FUEL                           = 215;
index dfd0e2fc546bd737d46a4bf215b782326de02c9c..6d3a1d7051141726786997ef695e44e671f5e553 100644 (file)
@@ -593,6 +593,8 @@ float serverflags;
 .entity iceblock;
 .entity frozen_by; // for ice fields
 
+.float stat_dodging_frozen;
+
 .entity muzzle_flash;
 .float misc_bulletcounter;     // replaces uzi & hlac bullet counter.
 
index b9b2a176153e6e2182437d033575e24f459cbf6b..3fea207eea8ef45678df0a1c17ae1e4ef452bc45 100644 (file)
@@ -814,6 +814,9 @@ void spawnfunc_worldspawn (void)
        addstat(STAT_JETPACK_MAXSPEED_UP, AS_FLOAT, stat_jetpack_maxspeed_up);
        addstat(STAT_JETPACK_MAXSPEED_SIDE, AS_FLOAT, stat_jetpack_maxspeed_side);
 
+       // dodging
+       addstat(STAT_DODGING_FROZEN, AS_INT, stat_dodging_frozen);
+
        // secrets
        addstat(STAT_SECRETS_TOTAL, AS_FLOAT, stat_secrets_total);
        addstat(STAT_SECRETS_FOUND, AS_FLOAT, stat_secrets_found);