]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/physics.qc
Merge branch 'master' into Mario/bulldozer
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / physics.qc
index b3db77143b375f4bdb315e22a1a3c0d057aecd38..a49f79df833d9d1652cae099adada98937d134a7 100644 (file)
@@ -1,6 +1,5 @@
 #include "physics.qh"
-#include "triggers/trigger/swamp.qh"
-#include "triggers/trigger/jumppads.qh"
+#include "triggers/include.qh"
 #include "viewloc.qh"
 
 #ifdef SVQC
 // client side physics
 bool Physics_Valid(string thecvar)
 {
-       if(!autocvar_g_physics_clientselect) { return false; }
-
-       string l = strcat(" ", autocvar_g_physics_clientselect_options, " ");
-
-       if(strstrofs(l, strcat(" ", thecvar, " "), 0) >= 0)
-               return true;
-
-       return false;
+       return autocvar_g_physics_clientselect && strhasword(autocvar_g_physics_clientselect_options, thecvar);
 }
 
 float Physics_ClientOption(entity pl, string option)
 {
        if(Physics_Valid(pl.cvar_cl_physics))
        {
-               string var = sprintf("g_physics_%s_%s", pl.cvar_cl_physics, option);
-               if(cvar_type(var) & CVAR_TYPEFLAG_EXISTS)
-                       return cvar(var);
+               string s = sprintf("g_physics_%s_%s", pl.cvar_cl_physics, option);
+               if(cvar_type(s) & CVAR_TYPEFLAG_EXISTS)
+                       return cvar(s);
        }
        if(autocvar_g_physics_clientselect && autocvar_g_physics_clientselect_default)
        {
-               string var = sprintf("g_physics_%s_%s", autocvar_g_physics_clientselect_default, option);
-               if(cvar_type(var) & CVAR_TYPEFLAG_EXISTS)
-                       return cvar(var);
+               string s = sprintf("g_physics_%s_%s", autocvar_g_physics_clientselect_default, option);
+               if(cvar_type(s) & CVAR_TYPEFLAG_EXISTS)
+                       return cvar(s);
        }
        return cvar(strcat("sv_", option));
 }
@@ -78,7 +70,8 @@ void Physics_AddStats()
        addstat(STAT_JETPACK_MAXSPEED_SIDE, AS_FLOAT, stat_jetpack_maxspeed_side);
 
        // hack to fix track_canjump
-       addstat(STAT_MOVEVARS_TRACK_CANJUMP, AS_INT, cvar_cl_movement_track_canjump);
+       addstat(STAT_MOVEVARS_CL_TRACK_CANJUMP, AS_INT, cvar_cl_movement_track_canjump);
+       addstat(STAT_MOVEVARS_TRACK_CANJUMP, AS_INT, stat_sv_track_canjump);
 
        // double jump
        addstat(STAT_DOUBLEJUMP, AS_INT, stat_doublejump);
@@ -175,6 +168,8 @@ void Physics_UpdateStats(float maxspd_mod)
        self.stat_sv_airstopaccelerate = Physics_ClientOption(self, "airstopaccelerate");
        self.stat_sv_jumpvelocity = Physics_ClientOption(self, "jumpvelocity");
 
+       self.stat_sv_track_canjump = Physics_ClientOption(self, "track_canjump");
+
        self.stat_gameplayfix_upvelocityclearsonground = UPWARD_VELOCITY_CLEARS_ONGROUND;
 }
 #endif
@@ -540,7 +535,7 @@ When you press the jump key
 returns true if handled
 =============
 */
-bool PlayerJump (void)
+bool PlayerJump ()
 {SELFPARAM();
        if (PHYS_FROZEN(self))
                return true; // no jumping in freezetag when frozen
@@ -591,7 +586,11 @@ bool PlayerJump (void)
                if (!IS_ONGROUND(self))
                        return IS_JUMP_HELD(self);
 
-       if (PHYS_TRACK_CANJUMP(self))
+       bool track_jump = PHYS_CL_TRACK_CANJUMP(self);
+       if(PHYS_TRACK_CANJUMP(self))
+               track_jump = true;
+
+       if (track_jump)
                if (IS_JUMP_HELD(self))
                        return true;
 
@@ -976,17 +975,6 @@ void SpecialCommand()
 #endif
 }
 
-void PM_check_race_movetime(void)
-{SELFPARAM();
-#ifdef SVQC
-       self.race_movetime_frac += PHYS_INPUT_TIMELENGTH;
-       float f = floor(self.race_movetime_frac);
-       self.race_movetime_frac -= f;
-       self.race_movetime_count += f;
-       self.race_movetime = self.race_movetime_frac + self.race_movetime_count;
-#endif
-}
-
 float PM_check_specialcommand(float buttons)
 {SELFPARAM();
 #ifdef SVQC
@@ -1024,7 +1012,7 @@ float PM_check_specialcommand(float buttons)
        return false;
 }
 
-void PM_check_nickspam(void)
+void PM_check_nickspam()
 {SELFPARAM();
 #ifdef SVQC
        if (time >= self.nickspamtime)
@@ -1069,7 +1057,7 @@ void PM_check_punch()
 #endif
 }
 
-void PM_check_spider(void)
+void PM_check_spider()
 {SELFPARAM();
 #ifdef SVQC
        if (time >= self.spider_slowness)
@@ -1082,7 +1070,7 @@ void PM_check_spider(void)
 }
 
 // predict frozen movement, as frozen players CAN move in some cases
-void PM_check_frozen(void)
+void PM_check_frozen()
 {SELFPARAM();
        if (!PHYS_FROZEN(self))
                return;
@@ -1127,16 +1115,16 @@ void PM_check_hitground()
                        if (!(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOSTEPS))
                        {
                                if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_METALSTEPS)
-                                       GlobalSound(globalsound_metalfall, CH_PLAYER, VOICETYPE_PLAYERSOUND);
+                                       GlobalSound(GS_FALL_METAL, CH_PLAYER, VOICETYPE_PLAYERSOUND);
                                else
-                                       GlobalSound(globalsound_fall, CH_PLAYER, VOICETYPE_PLAYERSOUND);
+                                       GlobalSound(GS_FALL, CH_PLAYER, VOICETYPE_PLAYERSOUND);
                        }
                }
        }
 #endif
 }
 
-void PM_check_blocked(void)
+void PM_check_blocked()
 {SELFPARAM();
 #ifdef SVQC
        if (!self.player_blocked)
@@ -1146,41 +1134,7 @@ void PM_check_blocked(void)
 #endif
 }
 
-#ifdef SVQC
-float speedaward_lastsent;
-float speedaward_lastupdate;
-#endif
-void PM_check_race(void)
-{SELFPARAM();
-#ifdef SVQC
-       if(!(g_cts || g_race))
-               return;
-       if (vlen(self.velocity - self.velocity_z * '0 0 1') > speedaward_speed)
-       {
-               speedaward_speed = vlen(self.velocity - self.velocity_z * '0 0 1');
-               speedaward_holder = self.netname;
-               speedaward_uid = self.crypto_idfp;
-               speedaward_lastupdate = time;
-       }
-       if (speedaward_speed > speedaward_lastsent && time - speedaward_lastupdate > 1)
-       {
-               string rr = (g_cts) ? CTS_RECORD : RACE_RECORD;
-               race_send_speedaward(MSG_ALL);
-               speedaward_lastsent = speedaward_speed;
-               if (speedaward_speed > speedaward_alltimebest && speedaward_uid != "")
-               {
-                       speedaward_alltimebest = speedaward_speed;
-                       speedaward_alltimebest_holder = speedaward_holder;
-                       speedaward_alltimebest_uid = speedaward_uid;
-                       db_put(ServerProgsDB, strcat(GetMapname(), rr, "speed/speed"), ftos(speedaward_alltimebest));
-                       db_put(ServerProgsDB, strcat(GetMapname(), rr, "speed/crypto_idfp"), speedaward_alltimebest_uid);
-                       race_send_speedaward_alltimebest(MSG_ALL);
-               }
-       }
-#endif
-}
-
-void PM_check_vortex(void)
+void PM_check_vortex()
 {SELFPARAM();
 #ifdef SVQC
        // WEAPONTODO
@@ -1676,7 +1630,6 @@ void PM_Main()
                        return;
 #endif
 
-       PM_check_race_movetime();
 #ifdef SVQC
        anticheat_physics();
 #endif
@@ -1709,17 +1662,7 @@ void PM_Main()
        if (IS_PLAYER(self))
 #endif
        {
-#ifdef SVQC
-               if (self.race_penalty)
-                       if (time > self.race_penalty)
-                               self.race_penalty = 0;
-#endif
-
                bool not_allowed_to_move = false;
-#ifdef SVQC
-               if (self.race_penalty)
-                       not_allowed_to_move = true;
-#endif
 #ifdef SVQC
                if (time < game_starttime)
                        not_allowed_to_move = true;
@@ -1876,7 +1819,7 @@ void PM_Main()
                RaceCarPhysics();
 #endif
 
-       else if (self.movetype == MOVETYPE_NOCLIP || self.movetype == MOVETYPE_FLY || self.movetype == MOVETYPE_FLY_WORLDONLY || (BUFFS_STAT(self) & BUFF_FLIGHT.m_itemid))
+       else if (self.movetype == MOVETYPE_NOCLIP || self.movetype == MOVETYPE_FLY || self.movetype == MOVETYPE_FLY_WORLDONLY || MUTATOR_CALLHOOK(IsFlying, self))
                PM_fly(maxspeed_mod);
 
        else if (self.waterlevel >= WATERLEVEL_SWIMMING)
@@ -1894,10 +1837,6 @@ void PM_Main()
        else
                PM_air(buttons_prev, maxspeed_mod);
 
-#ifdef SVQC
-       if (!IS_OBSERVER(self))
-               PM_check_race();
-#endif
        PM_check_vortex();
 
 :end
@@ -1919,9 +1858,9 @@ void PM_Main()
 }
 
 #ifdef SVQC
-void SV_PlayerPhysics(void)
+void SV_PlayerPhysics()
 #elif defined(CSQC)
-void CSQC_ClientMovement_PlayerMove_Frame(void)
+void CSQC_ClientMovement_PlayerMove_Frame()
 #endif
 {SELFPARAM();
        PM_Main();