X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fphysics%2Fplayer.qc;h=2dbc7bbcd1f6a59cd6fe01c5ddd3893aa00073ba;hb=d5634fe916916ac8c4ab0984240ac1bf0547e1b3;hp=93ddb1e1b3f1329a1312af482a2dc268f0eccef6;hpb=50d8efb863874f811bdcc118d7e873836902e453;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/physics/player.qc b/qcsrc/common/physics/player.qc index 93ddb1e1b..2dbc7bbcd 100644 --- a/qcsrc/common/physics/player.qc +++ b/qcsrc/common/physics/player.qc @@ -10,20 +10,20 @@ // client side physics bool Physics_Valid(string thecvar) { - return autocvar_g_physics_clientselect && strhasword(autocvar_g_physics_clientselect_options, thecvar); + return autocvar_g_physics_clientselect && thecvar != "" && thecvar && thecvar != "default" && strhasword(autocvar_g_physics_clientselect_options, thecvar); } float Physics_ClientOption(entity this, string option, float defaultval) { - if(Physics_Valid(this.cvar_cl_physics)) + if(IS_REAL_CLIENT(this) && Physics_Valid(this.cvar_cl_physics)) { - string s = sprintf("g_physics_%s_%s", this.cvar_cl_physics, option); + string s = strcat("g_physics_", this.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 s = sprintf("g_physics_%s_%s", autocvar_g_physics_clientselect_default, option); + string s = strcat("g_physics_", autocvar_g_physics_clientselect_default, "_", option); if(cvar_type(s) & CVAR_TYPEFLAG_EXISTS) return cvar(s); } @@ -57,6 +57,7 @@ void Physics_UpdateStats(entity this, float maxspd_mod) STAT(MOVEVARS_AIRCONTROL, this) = Physics_ClientOption(this, "aircontrol", autocvar_sv_aircontrol); STAT(MOVEVARS_AIRCONTROL_POWER, this) = Physics_ClientOption(this, "aircontrol_power", autocvar_sv_aircontrol_power); STAT(MOVEVARS_AIRCONTROL_BACKWARDS, this) = Physics_ClientOption(this, "aircontrol_backwards", autocvar_sv_aircontrol_backwards); + STAT(MOVEVARS_AIRCONTROL_SIDEWARDS, this) = Physics_ClientOption(this, "aircontrol_sidewards", autocvar_sv_aircontrol_sidewards); STAT(MOVEVARS_AIRCONTROL_PENALTY, this) = Physics_ClientOption(this, "aircontrol_penalty", autocvar_sv_aircontrol_penalty); STAT(MOVEVARS_WARSOWBUNNY_AIRFORWARDACCEL, this) = Physics_ClientOption(this, "warsowbunny_airforwardaccel", autocvar_sv_warsowbunny_airforwardaccel); STAT(MOVEVARS_WARSOWBUNNY_TOPSPEED, this) = Physics_ClientOption(this, "warsowbunny_topspeed", autocvar_sv_warsowbunny_topspeed); @@ -85,7 +86,7 @@ float GeomLerp(float a, float _lerp, float b) { return a == 0 ? (_lerp < 1 ? 0 : b) : b == 0 ? (_lerp > 0 ? 0 : a) - : a * pow(fabs(b / a), _lerp); + : a * (fabs(b / a) ** _lerp); } void PM_ClientMovement_UpdateStatus(entity this) @@ -137,6 +138,11 @@ void CPM_PM_Aircontrol(entity this, float dt, vector wishdir, float wishspeed) float movity = IsMoveInDirection(this.movement, 0); if(PHYS_AIRCONTROL_BACKWARDS(this)) movity += IsMoveInDirection(this.movement, 180); + if(PHYS_AIRCONTROL_SIDEWARDS(this)) + { + movity += IsMoveInDirection(this.movement, 90); + movity += IsMoveInDirection(this.movement, -90); + } float k = 32 * (2 * movity - 1); if (k <= 0) @@ -153,7 +159,7 @@ void CPM_PM_Aircontrol(entity this, float dt, vector wishdir, float wishspeed) if (dot > 0) // we can't change direction while slowing down { - k *= pow(dot, PHYS_AIRCONTROL_POWER(this)) * dt; + k *= (dot ** PHYS_AIRCONTROL_POWER(this)) * dt; xyspeed = max(0, xyspeed - PHYS_AIRCONTROL_PENALTY(this) * sqrt(max(0, 1 - dot*dot)) * k/32); k *= PHYS_AIRCONTROL(this); this.velocity = normalize(this.velocity * xyspeed + wishdir * k); @@ -292,6 +298,7 @@ bool PlayerJump(entity this) bool doublejump = false; float mjumpheight = PHYS_JUMPVELOCITY(this); + bool track_jump = PHYS_CL_TRACK_CANJUMP(this); if (MUTATOR_CALLHOOK(PlayerJump, this, mjumpheight, doublejump)) return true; @@ -305,6 +312,7 @@ bool PlayerJump(entity this) { doublejump = true; mjumpheight *= 0.7; + track_jump = true; } else { @@ -317,7 +325,6 @@ bool PlayerJump(entity this) if (!IS_ONGROUND(this) && !IS_ONSLICK(this)) return IS_JUMP_HELD(this); - bool track_jump = PHYS_CL_TRACK_CANJUMP(this); if(PHYS_TRACK_CANJUMP(this)) track_jump = true; @@ -703,14 +710,14 @@ void PM_jetpack(entity this, float maxspd_mod, float dt) float a_up = PHYS_JETPACK_ACCEL_UP(this); float a_add = PHYS_JETPACK_ANTIGRAVITY(this) * PHYS_GRAVITY(this); - if(PHYS_JETPACK_REVERSE_THRUST(this) && PHYS_INPUT_BUTTON_CROUCH(self)) { a_up = PHYS_JETPACK_REVERSE_THRUST(this); } + if(PHYS_JETPACK_REVERSE_THRUST(this) && PHYS_INPUT_BUTTON_CROUCH(this)) { a_up = PHYS_JETPACK_REVERSE_THRUST(this); } wishvel_x *= a_side; wishvel_y *= a_side; wishvel_z *= a_up; wishvel_z += a_add; - if(PHYS_JETPACK_REVERSE_THRUST(this) && PHYS_INPUT_BUTTON_CROUCH(self)) { wishvel_z *= -1; } + if(PHYS_JETPACK_REVERSE_THRUST(this) && PHYS_INPUT_BUTTON_CROUCH(this)) { wishvel_z *= -1; } float best = 0; ////////////////////////////////////////////////////////////////////////////////////// @@ -811,10 +818,15 @@ void SV_PlayerPhysics(entity this) void CSQC_ClientMovement_PlayerMove_Frame(entity this) #endif { +#ifdef SVQC + // needs to be called before physics are run! + PM_UpdateButtons(this); +#endif + sys_phys_update(this, PHYS_INPUT_TIMELENGTH); #ifdef SVQC - this.pm_frametime = frametime; + CS(this).pm_frametime = frametime; #elif defined(CSQC) if((ITEMS_STAT(this) & IT_USING_JETPACK) && !IS_DEAD(this) && !intermission) this.csqcmodel_modelflags |= MF_ROCKET;