X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fecs%2Fsystems%2Fphysics.qc;h=0c18e58cf8a577335f67526aae0412c52534ad73;hb=cbca1a79315fe08c4796273a490a4d12b7d3291d;hp=f5052b376f89f4072ca33ef968b3e4bba3d66f56;hpb=4d9a40898926a8da83b788f9a862f35cdd4c8905;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/ecs/systems/physics.qc b/qcsrc/ecs/systems/physics.qc index f5052b376..0c18e58cf 100644 --- a/qcsrc/ecs/systems/physics.qc +++ b/qcsrc/ecs/systems/physics.qc @@ -15,7 +15,7 @@ void sys_phys_update(entity this, float dt) sys_in_update(this, dt); sys_phys_fix(this, dt); - if (sys_phys_override(this)) { return; } sys_phys_monitor(this); + if (sys_phys_override(this, dt)) { return; } sys_phys_monitor(this, dt); this.buttons_old = PHYS_INPUT_BUTTON_MASK(this); this.movement_old = this.movement; @@ -41,7 +41,7 @@ void sys_phys_update(entity this, float dt) // conveyors: first fix velocity if (this.conveyor.state) { this.velocity -= this.conveyor.movedir; } - MUTATOR_CALLHOOK(PlayerPhysics, this); + MUTATOR_CALLHOOK(PlayerPhysics, this, dt); if (!IS_PLAYER(this)) { sys_phys_spectator_control(this); @@ -62,6 +62,8 @@ void sys_phys_update(entity this, float dt) goto end; } + PM_check_slick(this); + if (IS_SVQC && !PHYS_FIXANGLE(this)) { this.angles = '0 1 0' * this.v_angle.y; } if (IS_PLAYER(this)) { if (IS_ONGROUND(this)) { @@ -84,7 +86,7 @@ void sys_phys_update(entity this, float dt) PHYS_TELEPORT_TIME(this) = 0; PHYS_WATERJUMP_TIME(this) = 0; } - } else if (MUTATOR_CALLHOOK(PM_Physics, this, maxspeed_mod)) { + } else if (MUTATOR_CALLHOOK(PM_Physics, this, maxspeed_mod, dt)) { // handled } else if (this.move_movetype == MOVETYPE_NOCLIP || this.move_movetype == MOVETYPE_FLY @@ -115,7 +117,7 @@ void sys_phys_update(entity this, float dt) this.com_phys_ladder = false; this.com_phys_gravity = '0 0 0'; } else if (ITEMS_STAT(this) & IT_USING_JETPACK) { - PM_jetpack(this, maxspeed_mod); + PM_jetpack(this, maxspeed_mod, dt); } else if (IS_ONGROUND(this)) { if (!WAS_ONGROUND(this)) { emit(phys_land, this); @@ -158,9 +160,6 @@ void sys_phys_update(entity this, float dt) /** for players */ void sys_phys_simulate(entity this, float dt) { - const vector g = -this.com_phys_gravity; - const bool jump = this.com_in_jump; - if (!this.com_phys_ground && !this.com_phys_air) { // noclipping // flying @@ -170,6 +169,7 @@ void sys_phys_simulate(entity this, float dt) UNSET_ONGROUND(this); if (this.com_phys_friction_air) { + const vector g = -this.com_phys_gravity; this.velocity_z += g.z / 2; this.velocity = this.velocity * (1 - dt * this.com_phys_friction); this.velocity_z += g.z / 2; @@ -179,7 +179,7 @@ void sys_phys_simulate(entity this, float dt) if (this.com_phys_water) { // water jump only in certain situations // this mimics quakeworld code - if (jump && this.waterlevel == WATERLEVEL_SWIMMING && this.velocity_z >= -180 && !this.viewloc) { + if (this.com_in_jump && this.waterlevel == WATERLEVEL_SWIMMING && this.velocity_z >= -180 && !this.viewloc) { vector yawangles = '0 1 0' * this.v_angle.y; makevectors(yawangles); vector forward = v_forward; @@ -215,7 +215,7 @@ void sys_phys_simulate(entity this, float dt) } if (this.com_phys_ladder) { if (this.viewloc) { - wishvel.z = this.oldmovement.x; + wishvel.z = this.movement_old.x; } if (this.ladder_entity.classname == "func_water") { float f = vlen(wishvel); @@ -263,7 +263,7 @@ void sys_phys_simulate(entity this, float dt) airaccel += (this.com_phys_acc_rate_air_stop - airaccel) * max(0, -(curdir * wishdir)); } // note that for straight forward jumping: - // step = accel * PHYS_INPUT_TIMELENGTH * wishspeed0; + // step = accel * dt * wishspeed0; // accel = bound(0, wishspeed - vel_xy_current, step) * accelqw + step * (1 - accelqw); // --> // dv/dt = accel * maxspeed (when slow) @@ -288,15 +288,15 @@ void sys_phys_simulate(entity this, float dt) // !CPM if (PHYS_WARSOWBUNNY_TURNACCEL(this) && accelerating && this.movement.y == 0 && this.movement.x != 0) { - PM_AirAccelerate(this, wishdir, wishspeed2); + PM_AirAccelerate(this, dt, wishdir, wishspeed2); } else { float sidefric = maxairspd ? (PHYS_AIRACCEL_SIDEWAYS_FRICTION(this) / maxairspd) : 0; - PM_Accelerate(this, wishdir, wishspeed, wishspeed0, airaccel, airaccelqw, + PM_Accelerate(this, dt, wishdir, wishspeed, wishspeed0, airaccel, airaccelqw, PHYS_AIRACCEL_QW_STRETCHFACTOR(this), sidefric, PHYS_AIRSPEEDLIMIT_NONQW(this)); } if (PHYS_AIRCONTROL(this)) { - CPM_PM_Aircontrol(this, wishdir, wishspeed2); + CPM_PM_Aircontrol(this, dt, wishdir, wishspeed2); } } } else { @@ -318,7 +318,7 @@ void sys_phys_simulate(entity this, float dt) } // holding jump button swims upward slowly - if (jump && !this.viewloc) { + if (this.com_in_jump && !this.viewloc) { // was: // lava: 50 // slime: 80 @@ -338,7 +338,7 @@ void sys_phys_simulate(entity this, float dt) } } else { // water acceleration - PM_Accelerate(this, wishdir, wishspeed, wishspeed, this.com_phys_acc_rate, 1, 0, 0, 0); + PM_Accelerate(this, dt, wishdir, wishspeed, wishspeed, this.com_phys_acc_rate, 1, 0, 0, 0); } return; } @@ -391,7 +391,7 @@ void sys_phys_simulate(entity this, float dt) } if (IS_CSQC ? PHYS_WATERJUMP_TIME(this) <= 0 : time >= PHYS_TELEPORT_TIME(this)) { - PM_Accelerate(this, wishdir, wishspeed, wishspeed, this.com_phys_acc_rate, 1, 0, 0, 0); + PM_Accelerate(this, dt, wishdir, wishspeed, wishspeed, this.com_phys_acc_rate, 1, 0, 0, 0); } } }