X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fecs%2Fsystems%2Fphysics.qc;h=b9eca8ca8e971859d2385633cad132de62ee1fd7;hp=c8b459962eb0102247c4f308459d680e2965cf76;hb=265179b9de7cd25a2c4375434b6b9568e362c866;hpb=26d2cece1d88a2fad9e0a2f8069c3924496698c1 diff --git a/qcsrc/ecs/systems/physics.qc b/qcsrc/ecs/systems/physics.qc index c8b459962e..b9eca8ca8e 100644 --- a/qcsrc/ecs/systems/physics.qc +++ b/qcsrc/ecs/systems/physics.qc @@ -6,6 +6,8 @@ void sys_phys_simulate(entity this, float dt); void sys_phys_simulate_simple(entity this, float dt); +void sys_phys_postupdate(entity this); + void sys_phys_update(entity this, float dt) { if (!IS_CLIENT(this)) { @@ -43,7 +45,7 @@ void sys_phys_update(entity this, float dt) float maxspeed_mod = (!this.in_swamp) ? 1 : this.swamp_slowdown; // cvar("g_balance_swamp_moverate"); // conveyors: first fix velocity - if (this.conveyor.state) { this.velocity -= this.conveyor.movedir; } + if (this.conveyor.active) { this.velocity -= this.conveyor.movedir; } MUTATOR_CALLHOOK(PlayerPhysics, this, dt); if (!IS_PLAYER(this)) { @@ -63,7 +65,8 @@ void sys_phys_update(entity this, float dt) // if(pointcontents(midpoint + '0 0 2') == CONTENT_WATER) // { this.velocity_z = 70; } } - goto end; + sys_phys_postupdate(this); + return; } PM_check_slick(this); @@ -123,7 +126,7 @@ void sys_phys_update(entity this, float dt) this.com_phys_gravity = '0 0 0'; } else if (ITEMS_STAT(this) & IT_USING_JETPACK) { PM_jetpack(this, maxspeed_mod, dt); - } else if (IS_ONGROUND(this)) { + } else if (IS_ONGROUND(this) && (!IS_ONSLICK(this) || !PHYS_SLICK_APPLYGRAVITY(this))) { if (!WAS_ONGROUND(this)) { emit(phys_land, this); if (this.lastground < time - 0.3) { @@ -153,10 +156,14 @@ void sys_phys_update(entity this, float dt) this.com_phys_air = false; } - LABEL(end) + sys_phys_postupdate(this); +} + +void sys_phys_postupdate(entity this) +{ if (IS_ONGROUND(this)) { this.lastground = time; } // conveyors: then break velocity again - if (this.conveyor.state) { this.velocity += this.conveyor.movedir; } + if (this.conveyor.active) { this.velocity += this.conveyor.movedir; } this.lastflags = this.flags; this.lastclassname = this.classname; @@ -186,8 +193,8 @@ void sys_phys_simulate(entity this, float dt) // this mimics quakeworld code 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; + vector forward, right, up; + MAKE_VECTORS(yawangles, forward, right, up); vector spot = this.origin + 24 * forward; spot_z += 8; traceline(spot, spot, MOVE_NOMONSTERS, this); @@ -203,10 +210,12 @@ void sys_phys_simulate(entity this, float dt) } } } - makevectors(vmul(this.v_angle, (this.com_phys_vel_2d ? '0 1 0' : '1 1 1'))); - // wishvel = v_forward * PHYS_CS(this).movement.x + v_right * PHYS_CS(this).movement.y + v_up * PHYS_CS(this).movement.z; - vector wishvel = v_forward * PHYS_CS(this).movement.x - + v_right * PHYS_CS(this).movement.y + + vector forward, right, up; + MAKE_VECTORS(vmul(this.v_angle, (this.com_phys_vel_2d ? '0 1 0' : '1 1 1')), forward, right, up); + // wishvel = forward * PHYS_CS(this).movement.x + right * PHYS_CS(this).movement.y + up * PHYS_CS(this).movement.z; + vector wishvel = forward * PHYS_CS(this).movement.x + + right * PHYS_CS(this).movement.y + '0 0 1' * PHYS_CS(this).movement.z * (this.com_phys_vel_2d ? 0 : 1); if (this.com_phys_water) { if (PHYS_INPUT_BUTTON_CROUCH(this)) { @@ -351,11 +360,9 @@ void sys_phys_simulate(entity this, float dt) // apply edge friction const float f2 = vlen2(vec2(this.velocity)); if (f2 > 0) { - trace_dphitq3surfaceflags = 0; - tracebox(this.origin, this.mins, this.maxs, this.origin - '0 0 1', MOVE_NOMONSTERS, this); // TODO: apply edge friction // apply ground friction - const int realfriction = (trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK) + const int realfriction = (IS_ONSLICK(this)) ? PHYS_FRICTION_SLICK(this) : PHYS_FRICTION(this);