From 6ae076c07bb4ad9718c50adb5a5fce4183c934ca Mon Sep 17 00:00:00 2001 From: div0 Date: Fri, 26 May 2006 17:52:56 +0000 Subject: [PATCH] generalized physics to have Quake-style and Nexuiz-style air control in the same code path; retuned QBF+ git-svn-id: svn://svn.icculus.org/nexuiz/trunk@1445 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/physics15.cfg | 4 +-- data/physics151.cfg | 4 +-- data/physics151b.cfg | 4 +-- data/physics16rc1.cfg | 4 +-- data/physicsQ.cfg | 5 ++- data/physicsQBF.cfg | 5 ++- data/physicsQBFplus.cfg | 7 ++--- data/qcsrc/server/gamec/cl_client.c | 2 ++ data/qcsrc/server/gamec/cl_physics.c | 46 ++++++++++++++++------------ data/qcsrc/server/gamec/sv_main.c | 3 ++ 10 files changed, 46 insertions(+), 38 deletions(-) diff --git a/data/physics15.cfg b/data/physics15.cfg index 79176134c..774c6ae7b 100644 --- a/data/physics15.cfg +++ b/data/physics15.cfg @@ -1,5 +1,5 @@ -set sv_playerphysicsqc 1 set sv_maxspeed 400 set sv_maxairspeed 50 -set sv_physicsdiv0 0 set sv_friction_on_land 0.25 +set sv_airaccel_sideways_friction 0 +set sv_airaccel_qw 0 diff --git a/data/physics151.cfg b/data/physics151.cfg index 846c47ceb..7fc6b5069 100644 --- a/data/physics151.cfg +++ b/data/physics151.cfg @@ -1,5 +1,5 @@ -set sv_playerphysicsqc 1 set sv_maxspeed 400 set sv_maxairspeed 50 -set sv_physicsdiv0 0 set sv_friction_on_land 0 +set sv_airaccel_sideways_friction 0 +set sv_airaccel_qw 0 diff --git a/data/physics151b.cfg b/data/physics151b.cfg index 123f3b549..b6759aabb 100644 --- a/data/physics151b.cfg +++ b/data/physics151b.cfg @@ -1,5 +1,5 @@ -set sv_playerphysicsqc 1 set sv_maxspeed 400 set sv_maxairspeed 25 -set sv_physicsdiv0 0 set sv_friction_on_land 0 +set sv_airaccel_sideways_friction 0 +set sv_airaccel_qw 0 diff --git a/data/physics16rc1.cfg b/data/physics16rc1.cfg index 41b566cd4..e50f98a59 100644 --- a/data/physics16rc1.cfg +++ b/data/physics16rc1.cfg @@ -1,5 +1,5 @@ -set sv_playerphysicsqc 1 set sv_maxspeed 400 set sv_maxairspeed 50 -set sv_physicsdiv0 0 set sv_friction_on_land 0.2 +set sv_airaccel_sideways_friction 0 +set sv_airaccel_qw 0 diff --git a/data/physicsQ.cfg b/data/physicsQ.cfg index 90f501be1..f243fecd1 100644 --- a/data/physicsQ.cfg +++ b/data/physicsQ.cfg @@ -1,6 +1,5 @@ -set sv_playerphysicsqc 1 set sv_maxspeed 400 set sv_maxairspeed 250 -set sv_physicsdiv0 1 -set sv_physicsdiv0_friction 0 set sv_friction_on_land 0 +set sv_airaccel_sideways_friction 0 +set sv_airaccel_qw 1 diff --git a/data/physicsQBF.cfg b/data/physicsQBF.cfg index f37d4fc06..630a4da64 100644 --- a/data/physicsQBF.cfg +++ b/data/physicsQBF.cfg @@ -1,6 +1,5 @@ -set sv_playerphysicsqc 1 set sv_maxspeed 400 set sv_maxairspeed 250 -set sv_physicsdiv0 1 -set sv_physicsdiv0_friction 0.8 set sv_friction_on_land 0 +set sv_airaccel_sideways_friction 0.8 +set sv_airaccel_qw 1 diff --git a/data/physicsQBFplus.cfg b/data/physicsQBFplus.cfg index a174e0619..a155dc623 100644 --- a/data/physicsQBFplus.cfg +++ b/data/physicsQBFplus.cfg @@ -1,6 +1,5 @@ -set sv_playerphysicsqc 1 -set sv_maxairspeed 250 set sv_maxspeed 400 -set sv_physicsdiv0 1 -set sv_physicsdiv0_friction 0.5 +set sv_maxairspeed 250 set sv_friction_on_land 0 +set sv_airaccel_sideways_friction 0.5 +set sv_airaccel_qw 0.93 diff --git a/data/qcsrc/server/gamec/cl_client.c b/data/qcsrc/server/gamec/cl_client.c index e9ad630cd..e4103a17f 100644 --- a/data/qcsrc/server/gamec/cl_client.c +++ b/data/qcsrc/server/gamec/cl_client.c @@ -711,6 +711,8 @@ void ClientConnect (void) stuffcmd(self, strcat("cl_movement_jumpvelocity ", ftos(cvar("g_balance_jumpheight")), "\n")); stuffcmd(self, strcat("cl_movement_stepheight ", ftos(cvar("sv_stepheight")), "\n")); stuffcmd(self, strcat("set cl_movement_friction_on_land ", ftos(cvar("sv_friction_on_land")), "\n")); + stuffcmd(self, strcat("set cl_movement_airaccel_qw ", ftos(cvar("sv_airaccel_qw")), "\n")); + stuffcmd(self, strcat("set cl_movement_airaccel_sideways_friction ", ftos(cvar("sv_airaccel_sideways_friction")), "\n")); stuffcmd(self, strcat("cl_movement_edgefriction 0\n")); // Wazat's grappling hook SetGrappleHookBindings(); diff --git a/data/qcsrc/server/gamec/cl_physics.c b/data/qcsrc/server/gamec/cl_physics.c index b23b154ca..48d141841 100644 --- a/data/qcsrc/server/gamec/cl_physics.c +++ b/data/qcsrc/server/gamec/cl_physics.c @@ -4,6 +4,8 @@ float sv_friction; float sv_maxspeed; float sv_stopspeed; float sv_gravity; +float sv_airaccel_sideways_friction; +float sv_airaccel_qw; .float ladder_time; .entity ladder_entity; .float gravity; @@ -264,29 +266,33 @@ void SV_PlayerPhysics() wishspeed = wishspeed * 0.5; if (time >= self.teleport_time) { - if(cvar("sv_physicsdiv0")) - { - float vel_straight; - float vel_z; - vector vel_perpend; - vel_straight = self.velocity * wishdir; - vel_z = self.velocity_z; - vel_perpend = self.velocity - vel_straight * wishdir - vel_z * '0 0 1'; + // NOTE: this does the same as the commented out old code if: + // sv_airaccel_qw 0 + // sv_airaccel_sideways_friction 0 + + float vel_straight; + float vel_z; + vector vel_perpend; + vel_straight = self.velocity * wishdir; + vel_z = self.velocity_z; + vel_perpend = self.velocity - vel_straight * wishdir - vel_z * '0 0 1'; - f = wishspeed - vel_straight; - if (f > 0) - vel_straight = vel_straight + min(f, airaccel * frametime * wishspeed); + f = wishspeed - vel_straight; + if(f > 0) + vel_straight = vel_straight + min(f, airaccel * frametime * wishspeed) * sv_airaccel_qw; + if(wishspeed > 0) + vel_straight = vel_straight + min(wishspeed, airaccel * frametime * wishspeed) * (1 - sv_airaccel_qw); - vel_perpend = vel_perpend * (1 - frametime * (wishspeed / maxairspd) * cvar("sv_physicsdiv0_friction")); + // anti-sideways friction to fix QW-style bunnyhopping + vel_perpend = vel_perpend * (1 - frametime * (wishspeed / maxairspd) * sv_airaccel_sideways_friction); - self.velocity = vel_straight * wishdir + vel_z * '0 0 1' + vel_perpend; - } - else - { - f = wishspeed;// - (self.velocity * wishdir); - if (f > 0) - self.velocity = self.velocity + wishdir * min(f, airaccel * frametime * wishspeed); - } + self.velocity = vel_straight * wishdir + vel_z * '0 0 1' + vel_perpend; + + /* + f = wishspeed;// - (self.velocity * wishdir); + if (f > 0) + self.velocity = self.velocity + wishdir * min(f, airaccel * frametime * wishspeed); + */ } } diff --git a/data/qcsrc/server/gamec/sv_main.c b/data/qcsrc/server/gamec/sv_main.c index 56c921bfd..f19c9f0aa 100644 --- a/data/qcsrc/server/gamec/sv_main.c +++ b/data/qcsrc/server/gamec/sv_main.c @@ -150,6 +150,9 @@ void StartFrame (void) sv_maxspeed = cvar ("sv_maxspeed"); sv_friction = cvar ("sv_friction"); sv_accelerate = cvar ("sv_accelerate"); + sv_airaccel_sideways_friction = cvar("sv_airaccel_sideways_friction"); + sv_airaccel_qw = cvar("sv_airaccel_qw"); + sv_stopspeed = cvar ("sv_stopspeed"); teamplay = cvar ("teamplay"); skill = cvar("skill"); -- 2.39.2