From 7775004b581e717d1534585789d1a5af6765e2e8 Mon Sep 17 00:00:00 2001 From: div0 Date: Thu, 7 May 2009 08:28:53 +0000 Subject: [PATCH] Wsw-like physics modes (needs current engine from svn) git-svn-id: svn://svn.icculus.org/nexuiz/trunk@6680 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/physics15.cfg | 4 + data/physics151.cfg | 6 +- data/physics151b.cfg | 4 + data/physics16rc1.cfg | 6 +- data/physics25.cfg | 4 + data/physicsCPMA.cfg | 3 + data/physicsHavoc.cfg | 4 + data/physicsQ.cfg | 4 + data/physicsQ3.cfg | 3 + data/physicsQBF.cfg | 4 + data/physicsQBFplus.cfg | 4 + data/physicsQBR.cfg | 4 + data/physicsWarsow.cfg | 19 +++++ data/physicsWarsowClassicBunny.cfg | 19 +++++ data/qcsrc/server/cl_physics.qc | 119 +++++++++++++++++++++++------ data/qcsrc/server/sv_main.qc | 5 ++ 16 files changed, 188 insertions(+), 24 deletions(-) create mode 100644 data/physicsWarsow.cfg create mode 100644 data/physicsWarsowClassicBunny.cfg diff --git a/data/physics15.cfg b/data/physics15.cfg index 7faa7f854..ed198022f 100644 --- a/data/physics15.cfg +++ b/data/physics15.cfg @@ -1,3 +1,4 @@ +// Nexuiz 1.5 physics sv_maxspeed 400 sv_maxairspeed 50 sv_accelerate 5.5 @@ -6,10 +7,13 @@ sv_friction 5 edgefriction 1 sv_stepheight 34 sv_jumpvelocity 300 +sv_wateraccelerate -1 +sv_waterfriction -1 sv_airaccel_sideways_friction 0 sv_airaccel_qw 0 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 sv_aircontrol 0 +sv_warsowbunny_turnaccel 0 set sv_friction_on_land 0.25 diff --git a/data/physics151.cfg b/data/physics151.cfg index 2b95eed1e..de2563c7a 100644 --- a/data/physics151.cfg +++ b/data/physics151.cfg @@ -1,3 +1,4 @@ +// experimental post-Nexuiz 1.5 physics (never released) sv_maxspeed 400 sv_maxairspeed 50 sv_accelerate 5.5 @@ -6,10 +7,13 @@ sv_friction 5 edgefriction 1 sv_stepheight 34 sv_jumpvelocity 300 +sv_wateraccelerate -1 +sv_waterfriction -1 sv_airaccel_sideways_friction 0 sv_airaccel_qw 0 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 sv_aircontrol 0 -sv_friction_on_land 0 +sv_warsowbunny_turnaccel 0 +set sv_friction_on_land 0 diff --git a/data/physics151b.cfg b/data/physics151b.cfg index 1bf7427a5..874effd3b 100644 --- a/data/physics151b.cfg +++ b/data/physics151b.cfg @@ -1,3 +1,4 @@ +// experimental post-Nexuiz 1.5 physics (never released) sv_maxspeed 400 sv_maxairspeed 25 sv_accelerate 5.5 @@ -6,10 +7,13 @@ sv_friction 5 edgefriction 1 sv_stepheight 34 sv_jumpvelocity 300 +sv_wateraccelerate -1 +sv_waterfriction -1 sv_airaccel_sideways_friction 0 sv_airaccel_qw 0 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 sv_aircontrol 0 +sv_warsowbunny_turnaccel 0 set sv_friction_on_land 0 diff --git a/data/physics16rc1.cfg b/data/physics16rc1.cfg index 559430bb5..49f8e6326 100644 --- a/data/physics16rc1.cfg +++ b/data/physics16rc1.cfg @@ -1,3 +1,4 @@ +// experimental post-Nexuiz 1.5 physics (never released) sv_maxspeed 400 sv_maxairspeed 50 sv_accelerate 5.5 @@ -6,10 +7,13 @@ sv_friction 5 edgefriction 1 sv_stepheight 34 sv_jumpvelocity 300 +sv_wateraccelerate -1 +sv_waterfriction -1 sv_airaccel_sideways_friction 0 sv_airaccel_qw 0 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 sv_aircontrol 0 -sv_friction_on_land 0.2 +sv_warsowbunny_turnaccel 0 +set sv_friction_on_land 0.2 diff --git a/data/physics25.cfg b/data/physics25.cfg index 72f89c80e..d87ef67ea 100644 --- a/data/physics25.cfg +++ b/data/physics25.cfg @@ -1,3 +1,4 @@ +// Nexuiz 2.5 physics sv_maxspeed 400 sv_maxairspeed 220 sv_accelerate 8 @@ -6,10 +7,13 @@ sv_friction 7 edgefriction 1 sv_stepheight 34 sv_jumpvelocity 300 +sv_wateraccelerate -1 +sv_waterfriction -1 sv_airaccel_sideways_friction 0.35 sv_airaccel_qw 0.95 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 sv_aircontrol 0 +sv_warsowbunny_turnaccel 0 set sv_friction_on_land 0 diff --git a/data/physicsCPMA.cfg b/data/physicsCPMA.cfg index 4f56e2652..1f77875e9 100644 --- a/data/physicsCPMA.cfg +++ b/data/physicsCPMA.cfg @@ -7,10 +7,13 @@ sv_friction 8 edgefriction 1 sv_stepheight 18 sv_jumpvelocity 270 +sv_wateraccelerate -1 +sv_waterfriction -1 sv_airaccel_sideways_friction 0 sv_airaccel_qw 1 sv_airstopaccelerate 2.5 sv_airstrafeaccelerate 70 sv_maxairstrafespeed 30 sv_aircontrol 150 +sv_warsowbunny_turnaccel 0 set sv_friction_on_land 0 diff --git a/data/physicsHavoc.cfg b/data/physicsHavoc.cfg index 282da83a7..d2c3dd188 100644 --- a/data/physicsHavoc.cfg +++ b/data/physicsHavoc.cfg @@ -1,3 +1,4 @@ +// Nexuiz Havoc physics (work in progress) sv_maxspeed 400 sv_maxairspeed 220 sv_accelerate 8 @@ -6,10 +7,13 @@ sv_friction 7 edgefriction 1 sv_stepheight 34 sv_jumpvelocity 300 +sv_wateraccelerate -1 +sv_waterfriction -1 sv_airaccel_sideways_friction 0.65 sv_airaccel_qw 0.95 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 sv_aircontrol 0 +sv_warsowbunny_turnaccel 0 set sv_friction_on_land 0 diff --git a/data/physicsQ.cfg b/data/physicsQ.cfg index 3dde9066c..5cdead35a 100644 --- a/data/physicsQ.cfg +++ b/data/physicsQ.cfg @@ -1,3 +1,4 @@ +// Quake 1 sv_maxspeed 400 sv_maxairspeed 250 sv_accelerate 5.5 @@ -6,10 +7,13 @@ sv_friction 5 edgefriction 1 sv_stepheight 34 sv_jumpvelocity 300 +sv_wateraccelerate -1 +sv_waterfriction -1 sv_airaccel_sideways_friction 0 sv_airaccel_qw 1 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 sv_aircontrol 0 +sv_warsowbunny_turnaccel 0 set sv_friction_on_land 0 diff --git a/data/physicsQ3.cfg b/data/physicsQ3.cfg index 79725b5ee..08db2fe3e 100644 --- a/data/physicsQ3.cfg +++ b/data/physicsQ3.cfg @@ -7,10 +7,13 @@ sv_friction 6 edgefriction 1 sv_stepheight 18 sv_jumpvelocity 270 +sv_wateraccelerate -1 +sv_waterfriction -1 sv_airaccel_sideways_friction 0 sv_airaccel_qw 1 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 sv_aircontrol 0 +sv_warsowbunny_turnaccel 0 set sv_friction_on_land 0 diff --git a/data/physicsQBF.cfg b/data/physicsQBF.cfg index 69de10645..0f4d44d03 100644 --- a/data/physicsQBF.cfg +++ b/data/physicsQBF.cfg @@ -1,3 +1,4 @@ +// Quake, Bunny Fixed (feels very slow) sv_maxspeed 400 sv_maxairspeed 250 sv_accelerate 5.5 @@ -6,10 +7,13 @@ sv_friction 5 edgefriction 1 sv_stepheight 34 sv_jumpvelocity 300 +sv_wateraccelerate -1 +sv_waterfriction -1 sv_airaccel_sideways_friction 0.8 sv_airaccel_qw 1 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 sv_aircontrol 0 +sv_warsowbunny_turnaccel 0 set sv_friction_on_land 0 diff --git a/data/physicsQBFplus.cfg b/data/physicsQBFplus.cfg index 108bf591d..3d6908e9d 100644 --- a/data/physicsQBFplus.cfg +++ b/data/physicsQBFplus.cfg @@ -1,3 +1,4 @@ +// Quake, Bunny Fixed Plus (faster using forward hopping) sv_maxspeed 400 sv_maxairspeed 220 sv_accelerate 5.5 @@ -6,10 +7,13 @@ sv_friction 5 edgefriction 1 sv_stepheight 34 sv_jumpvelocity 300 +sv_wateraccelerate -1 +sv_waterfriction -1 sv_airaccel_sideways_friction 0.5 sv_airaccel_qw 0.93 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 sv_aircontrol 0 +sv_warsowbunny_turnaccel 0 set sv_friction_on_land 0 diff --git a/data/physicsQBR.cfg b/data/physicsQBR.cfg index 6677f1a4e..4b9d28e80 100644 --- a/data/physicsQBR.cfg +++ b/data/physicsQBR.cfg @@ -1,3 +1,4 @@ +// Quake, Bunny Reintroduced (Nexuiz 2.0 to 2.4.2 physics) sv_maxspeed 400 sv_maxairspeed 220 sv_accelerate 5.5 @@ -6,10 +7,13 @@ sv_friction 5 edgefriction 1 sv_stepheight 34 sv_jumpvelocity 300 +sv_wateraccelerate -1 +sv_waterfriction -1 sv_airaccel_sideways_friction 0.3 sv_airaccel_qw 0.93 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 sv_aircontrol 0 +sv_warsowbunny_turnaccel 0 set sv_friction_on_land 0 diff --git a/data/physicsWarsow.cfg b/data/physicsWarsow.cfg new file mode 100644 index 000000000..13b8e6610 --- /dev/null +++ b/data/physicsWarsow.cfg @@ -0,0 +1,19 @@ +// these values match Warsow 0.42 +sv_maxspeed 320 +sv_maxairspeed $sv_maxspeed +sv_accelerate 15 +sv_airaccelerate 1 +sv_friction 8 +edgefriction 1 +sv_stepheight 18 +sv_jumpvelocity 280 +sv_wateraccelerate 10 +sv_waterfriction 1 +sv_airaccel_sideways_friction 0 +sv_airaccel_qw 1 +sv_airstopaccelerate 2.5 +sv_airstrafeaccelerate 70 +sv_maxairstrafespeed 30 +sv_aircontrol 150 +sv_warsowbunny_turnaccel 9 // activates warsow movement mode +set sv_friction_on_land 0 diff --git a/data/physicsWarsowClassicBunny.cfg b/data/physicsWarsowClassicBunny.cfg new file mode 100644 index 000000000..6bc0c444f --- /dev/null +++ b/data/physicsWarsowClassicBunny.cfg @@ -0,0 +1,19 @@ +// these values match Warsow 0.42 GS_CLASSICBUNNY +sv_maxspeed 320 +sv_maxairspeed $sv_maxspeed +sv_accelerate 15 +sv_airaccelerate 1 +sv_friction 8 +edgefriction 1 +sv_stepheight 18 +sv_jumpvelocity 280 +sv_wateraccelerate 10 +sv_waterfriction 1 +sv_airaccel_sideways_friction 0 +sv_airaccel_qw 1 +sv_airstopaccelerate 2.5 +sv_airstrafeaccelerate 70 +sv_maxairstrafespeed 30 +sv_aircontrol 150 +sv_warsowbunny_turnaccel 0 +set sv_friction_on_land 0 diff --git a/data/qcsrc/server/cl_physics.qc b/data/qcsrc/server/cl_physics.qc index 4273b10c5..9a866b4cd 100644 --- a/data/qcsrc/server/cl_physics.qc +++ b/data/qcsrc/server/cl_physics.qc @@ -11,6 +11,12 @@ float sv_airstopaccelerate; float sv_airstrafeaccelerate; float sv_maxairstrafespeed; float sv_aircontrol; +float sv_warsowbunny_airforwardaccel; +float sv_warsowbunny_accel; +float sv_warsowbunny_topspeed; +float sv_warsowbunny_turnaccel; +float sv_warsowbunny_backtosideratio; + .float ladder_time; .entity ladder_entity; .float gravity; @@ -395,6 +401,46 @@ void PM_Accelerate(vector wishdir, float wishspeed, float accel, float accelqw, self.velocity = vel_straight * wishdir + vel_z * '0 0 1' + vel_perpend; } +void PM_AirAccelerate(vector wishdir, float wishspeed) +{ + vector curvel, wishvel, acceldir, curdir; + float addspeed, accelspeed, curspeed, f; + float dot; + + if(wishspeed == 0) + return; + + curvel = self.velocity; + curvel_z = 0; + curspeed = vlen(curvel); + + if(wishspeed > curspeed * 1.01) + { + wishspeed = min(wishspeed, curspeed + sv_warsowbunny_airforwardaccel * sv_maxspeed * frametime); + } + else + { + f = max(0, (sv_warsowbunny_topspeed - curspeed) / (sv_warsowbunny_topspeed - sv_maxspeed)); + wishspeed = max(curspeed, sv_maxspeed) + sv_warsowbunny_accel * f * sv_maxspeed * frametime; + } + wishvel = wishdir * wishspeed; + acceldir = wishvel - curvel; + addspeed = vlen(acceldir); + acceldir = normalize(acceldir); + + accelspeed = min(addspeed, sv_warsowbunny_turnaccel * sv_maxspeed * frametime); + + if(sv_warsowbunny_backtosideratio < 1) + { + curdir = normalize(curvel); + dot = acceldir * curdir; + if(dot < 0) + acceldir = acceldir - (1 - sv_warsowbunny_backtosideratio) * dot * curdir; + } + + self.velocity += accelspeed * acceldir; +} + .vector movement_old; .float buttons_old; .vector v_angle_old; @@ -874,30 +920,59 @@ void SV_PlayerPhysics() wishspeed = wishspeed * 0.5; if (time >= self.teleport_time) { - // CPM: air control - float wishspeed2; - wishspeed2 = wishspeed; - if(sv_airstopaccelerate) - if(self.velocity * wishdir < 0) - airaccel = sv_airstopaccelerate; - if(self.movement_x == 0 && self.movement_y != 0) + if(sv_warsowbunny_turnaccel) + { + float accelerating, decelerating, aircontrol; + float wishspeed2; + + accelerating = (self.velocity * wishdir > 0); + decelerating = (self.velocity * wishdir < 0); + aircontrol = FALSE; + wishspeed2 = wishspeed; + + if(accelerating && self.movement_y == 0 && self.movement_x != 0) + { + PM_AirAccelerate(wishdir, wishspeed); + } + else + { + if(sv_airstopaccelerate) + if(self.velocity * wishdir < 0) + airaccel = sv_airstopaccelerate; + if(self.movement_x == 0 && self.movement_y != 0) + { + if(sv_maxairstrafespeed) + wishspeed = min(wishspeed, sv_maxairstrafespeed); + if(sv_airstrafeaccelerate) + airaccel = sv_airstrafeaccelerate; + if(sv_aircontrol) + aircontrol = TRUE; + } + + PM_Accelerate(wishdir, wishspeed, airaccel, sv_airaccel_qw, sv_airaccel_sideways_friction / maxairspd); + if(aircontrol) + CPM_PM_Aircontrol(wishdir, wishspeed2); + } + } + else { - if(sv_maxairstrafespeed) - wishspeed = min(wishspeed, sv_maxairstrafespeed); - if(sv_airstrafeaccelerate) - airaccel = sv_airstrafeaccelerate; + // CPM: air control + if(sv_airstopaccelerate) + if(self.velocity * wishdir < 0) + airaccel = sv_airstopaccelerate; + if(self.movement_x == 0 && self.movement_y != 0) + { + if(sv_maxairstrafespeed) + wishspeed = min(wishspeed, sv_maxairstrafespeed); + if(sv_airstrafeaccelerate) + airaccel = sv_airstrafeaccelerate; + } + // !CPM + + PM_Accelerate(wishdir, wishspeed, airaccel, sv_airaccel_qw, sv_airaccel_sideways_friction / maxairspd); + if(sv_aircontrol) + CPM_PM_Aircontrol(wishdir, wishspeed2); } - // !CPM - - PM_Accelerate(wishdir, wishspeed, airaccel, sv_airaccel_qw, sv_airaccel_sideways_friction / maxairspd); - if(sv_aircontrol) - CPM_PM_Aircontrol(wishdir, wishspeed2); - - /* - f = wishspeed;// - (self.velocity * wishdir); - if (f > 0) - self.velocity = self.velocity + wishdir * min(f, airaccel * frametime * wishspeed); - */ } } diff --git a/data/qcsrc/server/sv_main.qc b/data/qcsrc/server/sv_main.qc index f1f8aa6f3..5e4f5020d 100644 --- a/data/qcsrc/server/sv_main.qc +++ b/data/qcsrc/server/sv_main.qc @@ -163,6 +163,11 @@ void StartFrame (void) sv_airstrafeaccelerate = cvar("sv_airstrafeaccelerate"); sv_maxairstrafespeed = cvar("sv_maxairstrafespeed"); sv_aircontrol = cvar("sv_aircontrol"); + sv_warsowbunny_airforwardaccel = cvar("sv_warsowbunny_airforwardaccel"); + sv_warsowbunny_accel = cvar("sv_warsowbunny_accel"); + sv_warsowbunny_topspeed = cvar("sv_warsowbunny_topspeed"); + sv_warsowbunny_turnaccel = cvar("sv_warsowbunny_turnaccel"); + sv_warsowbunny_backtosideratio = cvar("sv_warsowbunny_backtosideratio"); teamplay = cvar ("teamplay"); if(teams_matter && !teamplay) -- 2.39.2