From 1b2f1672f06badb535650eeef71354eec80a7eee Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Sat, 22 May 2010 19:54:09 +0200 Subject: [PATCH] new physics cvar: sv_airstrafeaccel_qw; also try to fix analog input issues with maxairstrafespeed --- physics10.cfg | 1 + physics11.cfg | 1 + physics151.cfg | 1 + physics151b.cfg | 1 + physics16rc1.cfg | 1 + physics20.cfg | 1 + physics25.cfg | 1 + physics26.cfg | 1 + physicsCPMA.cfg | 1 + physicsHavoc.cfg | 1 + physicsLeeStricklin.cfg | 1 + physicsLzd.cfg | 1 + physicsNoQWBunny.cfg | 1 + physicsQ.cfg | 1 + physicsQ2.cfg | 1 + physicsQ2a.cfg | 1 + physicsQ3.cfg | 1 + physicsQBF.cfg | 1 + physicsQBFplus.cfg | 1 + physicsSamual.cfg | 1 + physicsWarsow.cfg | 1 + physicsWarsowClassicBunny.cfg | 1 + physicsWarsowDev.cfg | 1 + physicsXPM.cfg | 1 + qcsrc/server/cl_physics.qc | 53 ++++++++++++++++++++++++----------- qcsrc/server/sv_main.qc | 1 + 26 files changed, 62 insertions(+), 16 deletions(-) diff --git a/physics10.cfg b/physics10.cfg index 4d9a118b34..16331779c3 100644 --- a/physics10.cfg +++ b/physics10.cfg @@ -16,6 +16,7 @@ sv_airaccel_qw 0 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physics11.cfg b/physics11.cfg index 8fba5746a6..1a7afbd5c5 100644 --- a/physics11.cfg +++ b/physics11.cfg @@ -16,6 +16,7 @@ sv_airaccel_qw 0 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physics151.cfg b/physics151.cfg index 59cf1de9dd..52f2536da2 100644 --- a/physics151.cfg +++ b/physics151.cfg @@ -16,6 +16,7 @@ sv_airaccel_qw 0 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physics151b.cfg b/physics151b.cfg index 6ab373ffae..325e7f6623 100644 --- a/physics151b.cfg +++ b/physics151b.cfg @@ -16,6 +16,7 @@ sv_airaccel_qw 0 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physics16rc1.cfg b/physics16rc1.cfg index e6926e4c8a..751e527df3 100644 --- a/physics16rc1.cfg +++ b/physics16rc1.cfg @@ -16,6 +16,7 @@ sv_airaccel_qw 0 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physics20.cfg b/physics20.cfg index 39d1e6af5e..cf3f9110ba 100644 --- a/physics20.cfg +++ b/physics20.cfg @@ -16,6 +16,7 @@ sv_airaccel_qw 0.93 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physics25.cfg b/physics25.cfg index 048d2bb061..ed1a85446c 100644 --- a/physics25.cfg +++ b/physics25.cfg @@ -16,6 +16,7 @@ sv_airaccel_qw 0.95 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physics26.cfg b/physics26.cfg index b28cb4f7a0..34ab3cf940 100644 --- a/physics26.cfg +++ b/physics26.cfg @@ -16,6 +16,7 @@ sv_airaccel_qw 0.95 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physicsCPMA.cfg b/physicsCPMA.cfg index 4ee66f297b..7c985bfd69 100644 --- a/physicsCPMA.cfg +++ b/physicsCPMA.cfg @@ -16,6 +16,7 @@ sv_airaccel_qw 1 sv_airstopaccelerate 2.5 sv_airstrafeaccelerate 70 sv_maxairstrafespeed 30 +sv_airstrafeaccel_qw 0 sv_aircontrol 150 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physicsHavoc.cfg b/physicsHavoc.cfg index 1731b12d4b..cc90edcecf 100644 --- a/physicsHavoc.cfg +++ b/physicsHavoc.cfg @@ -16,6 +16,7 @@ sv_airaccel_qw 0.95 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physicsLeeStricklin.cfg b/physicsLeeStricklin.cfg index c0a5e21a3a..446da86abf 100644 --- a/physicsLeeStricklin.cfg +++ b/physicsLeeStricklin.cfg @@ -17,6 +17,7 @@ sv_airaccel_qw -0.93 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physicsLzd.cfg b/physicsLzd.cfg index d408285ea7..4a73e89938 100644 --- a/physicsLzd.cfg +++ b/physicsLzd.cfg @@ -17,6 +17,7 @@ sv_airaccel_qw 0.95 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physicsNoQWBunny.cfg b/physicsNoQWBunny.cfg index 7622096a0b..5bc8a3147f 100644 --- a/physicsNoQWBunny.cfg +++ b/physicsNoQWBunny.cfg @@ -16,6 +16,7 @@ sv_airaccel_qw -0.975 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 sv_aircontrol 150 sv_aircontrol_power 2.5 sv_warsowbunny_turnaccel 0 diff --git a/physicsQ.cfg b/physicsQ.cfg index 343971ca1d..5839a61377 100644 --- a/physicsQ.cfg +++ b/physicsQ.cfg @@ -17,6 +17,7 @@ sv_airaccel_qw 1 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physicsQ2.cfg b/physicsQ2.cfg index de8ff7239c..e6c1ea3eef 100644 --- a/physicsQ2.cfg +++ b/physicsQ2.cfg @@ -16,6 +16,7 @@ sv_airaccel_qw 1 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physicsQ2a.cfg b/physicsQ2a.cfg index ff08d0784f..03e4008dc8 100644 --- a/physicsQ2a.cfg +++ b/physicsQ2a.cfg @@ -17,6 +17,7 @@ sv_airaccel_qw 1 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physicsQ3.cfg b/physicsQ3.cfg index 716728e9aa..37643ed9af 100644 --- a/physicsQ3.cfg +++ b/physicsQ3.cfg @@ -16,6 +16,7 @@ sv_airaccel_qw 1 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physicsQBF.cfg b/physicsQBF.cfg index 88e7e8f40e..8b677e6cd7 100644 --- a/physicsQBF.cfg +++ b/physicsQBF.cfg @@ -16,6 +16,7 @@ sv_airaccel_qw 1 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physicsQBFplus.cfg b/physicsQBFplus.cfg index 7c5da3f5e2..58b2a45d5a 100644 --- a/physicsQBFplus.cfg +++ b/physicsQBFplus.cfg @@ -16,6 +16,7 @@ sv_airaccel_qw 0.93 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physicsSamual.cfg b/physicsSamual.cfg index 9a3f1e113c..8d2fa30a05 100644 --- a/physicsSamual.cfg +++ b/physicsSamual.cfg @@ -16,6 +16,7 @@ sv_airaccel_qw 0.93 sv_airstopaccelerate 0 sv_airstrafeaccelerate 0 sv_maxairstrafespeed 0 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physicsWarsow.cfg b/physicsWarsow.cfg index bc53f7a676..1c87870a19 100644 --- a/physicsWarsow.cfg +++ b/physicsWarsow.cfg @@ -16,6 +16,7 @@ sv_airaccel_qw 1 sv_airstopaccelerate 2.5 sv_airstrafeaccelerate 70 sv_maxairstrafespeed 30 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 9 // activates warsow movement mode diff --git a/physicsWarsowClassicBunny.cfg b/physicsWarsowClassicBunny.cfg index 6c60724d22..e73204d662 100644 --- a/physicsWarsowClassicBunny.cfg +++ b/physicsWarsowClassicBunny.cfg @@ -16,6 +16,7 @@ sv_airaccel_qw 1 sv_airstopaccelerate 2.5 sv_airstrafeaccelerate 70 sv_maxairstrafespeed 30 +sv_airstrafeaccel_qw 0 sv_aircontrol 150 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/physicsWarsowDev.cfg b/physicsWarsowDev.cfg index 324676d2ee..f63f67e111 100644 --- a/physicsWarsowDev.cfg +++ b/physicsWarsowDev.cfg @@ -16,6 +16,7 @@ sv_airaccel_qw 1 sv_airstopaccelerate 2 sv_airstrafeaccelerate 70 sv_maxairstrafespeed 30 +sv_airstrafeaccel_qw 0 sv_aircontrol 0 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 6 // activates warsow movement mode diff --git a/physicsXPM.cfg b/physicsXPM.cfg index da81a24ee2..1737f1aeaf 100644 --- a/physicsXPM.cfg +++ b/physicsXPM.cfg @@ -20,6 +20,7 @@ sv_airaccel_qw 0.95 sv_airstopaccelerate 2.5 sv_airstrafeaccelerate 70 sv_maxairstrafespeed 30 +sv_airstrafeaccel_qw 1 sv_aircontrol 150 sv_aircontrol_power 2 sv_warsowbunny_turnaccel 0 diff --git a/qcsrc/server/cl_physics.qc b/qcsrc/server/cl_physics.qc index ff5fbaa37e..defb1f9392 100644 --- a/qcsrc/server/cl_physics.qc +++ b/qcsrc/server/cl_physics.qc @@ -13,6 +13,7 @@ float sv_airaccel_qw; float sv_airstopaccelerate; float sv_airstrafeaccelerate; float sv_maxairstrafespeed; +float sv_airstrafeaccel_qw; float sv_aircontrol; float sv_aircontrol_power; float sv_warsowbunny_airforwardaccel; @@ -386,7 +387,7 @@ float IsMoveInDirection(vector mv, float angle) // key mix factor { if(mv_x == 0 && mv_y == 0) return 0; // avoid division by zero - angle = RAD2DEG * atan2(mv_y, mv_x); + angle -= RAD2DEG * atan2(mv_y, mv_x); angle = remainder(angle, 360) / 45; if(angle > 1) return 0; @@ -395,6 +396,25 @@ float IsMoveInDirection(vector mv, float angle) // key mix factor return 1 - fabs(angle); } +float GeomLerp(float a, float lerp, float b) +{ + if(a == 0) + { + if(lerp < 1) + return 0; + else + return b; + } + if(b == 0) + { + if(lerp > 0) + return 0; + else + return a; + } + return a * pow(fabs(b / a), lerp); +} + void CPM_PM_Aircontrol(vector wishdir, float wishspeed) { float zspeed, xyspeed, dot, k; @@ -1138,6 +1158,7 @@ void SV_PlayerPhysics() float accelerating; float wishspeed2; float airaccelqw; + float strafity; airaccelqw = sv_airaccel_qw; accelerating = (self.velocity * wishdir > 0); @@ -1150,21 +1171,21 @@ void SV_PlayerPhysics() // this doesn't play well with analog input, but can't r // fixed like the AirControl can. So, don't set the maxa // cvars when you want to support analog input. - if(self.movement_x == 0 && self.movement_y != 0) - { - if(sv_maxairstrafespeed) - { - wishspeed = min(wishspeed, sv_maxairstrafespeed*maxspd_mod); - if(sv_maxairstrafespeed < sv_maxairspeed) - airaccelqw = 1; - } - if(sv_airstrafeaccelerate) - { - airaccel = sv_airstrafeaccelerate*maxspd_mod; - if(sv_airstrafeaccelerate > sv_airaccelerate) - airaccelqw = 1; - } - } + // note that for straight forward jumping: + // step = accel * frametime * wishspeed0; + // accel = bound(0, wishspeed - vel_xy_current, step) * accelqw + step * (1 - accelqw); + // --> + // dv/dt = accel * maxspeed (when slow) + // dv/dt = accel * maxspeed * (1 - accelqw) (when fast) + // log dv/dt = logaccel + logmaxspeed (when slow) + // log dv/dt = logaccel + logmaxspeed + log(1 - accelqw) (when fast) + strafity = IsMoveInDirection(self.movement, -90) + IsMoveInDirection(self.movement, +90); // if one is nonzero, other is always zero + if(sv_maxairstrafespeed) + wishspeed = min(wishspeed, GeomLerp(sv_maxairspeed*maxspd_mod, strafity, sv_maxairstrafespeed*maxspd_mod)); + if(sv_airstrafeaccelerate) + airaccel = GeomLerp(airaccel, strafity, sv_airstrafeaccelerate*maxspd_mod); + if(sv_airstrafeaccel_qw) + airaccelqw = sign((strafity > 0.5) ? sv_airstrafeaccel_qw : sv_airaccel_qw) * (1-GeomLerp(1-fabs(airaccelqw), strafity, 1-fabs(sv_airstrafeaccel_qw))); // !CPM if(sv_warsowbunny_turnaccel && accelerating && self.movement_y == 0 && self.movement_x != 0) diff --git a/qcsrc/server/sv_main.qc b/qcsrc/server/sv_main.qc index 603aad7fd0..0212fce8a4 100644 --- a/qcsrc/server/sv_main.qc +++ b/qcsrc/server/sv_main.qc @@ -190,6 +190,7 @@ void StartFrame (void) sv_airstopaccelerate = cvar("sv_airstopaccelerate"); sv_airstrafeaccelerate = cvar("sv_airstrafeaccelerate"); sv_maxairstrafespeed = cvar("sv_maxairstrafespeed"); + sv_airstrafeaccel_qw = cvar("sv_airstrafeaccel_qw"); sv_aircontrol = cvar("sv_aircontrol"); sv_aircontrol_power = cvar("sv_aircontrol_power"); sv_warsowbunny_airforwardaccel = cvar("sv_warsowbunny_airforwardaccel"); -- 2.39.2