X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fecs%2Fsystems%2Fphysics.qc;h=8896b5a442ba42d78c4420ee3c0332dacb2956c6;hb=38c2e33f2b643b4e9d1878ceb3330cc05406edcc;hp=c0a47e39b2a4aff558c3c53af50d49694d6c01f7;hpb=0019a7a892b7f986e74a0d4e202a96d208494f3e;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/ecs/systems/physics.qc b/qcsrc/ecs/systems/physics.qc index c0a47e39b..8896b5a44 100644 --- a/qcsrc/ecs/systems/physics.qc +++ b/qcsrc/ecs/systems/physics.qc @@ -15,11 +15,14 @@ void sys_phys_update(entity this, float dt) sys_in_update(this, dt); sys_phys_fix(this, dt); - if (sys_phys_override(this, dt)) { return; } sys_phys_monitor(this, dt); + 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; - this.v_angle_old = this.v_angle; + PHYS_CS(this).movement_old = PHYS_CS(this).movement; + PHYS_CS(this).v_angle_old = this.v_angle; + PHYS_CS(this).buttons_old = PHYS_INPUT_BUTTON_MASK(this); sys_phys_ai(this); @@ -40,19 +43,20 @@ 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)) { sys_phys_spectator_control(this); - maxspeed_mod = this.spectatorspeed; + maxspeed_mod = STAT(SPECTATORSPEED, this); } sys_phys_fixspeed(this, maxspeed_mod); if (IS_DEAD(this)) { // handle water here vector midpoint = ((this.absmin + this.absmax) * 0.5); - if (pointcontents(midpoint) == CONTENT_WATER) { + int cont = pointcontents(midpoint); + if (cont == CONTENT_WATER || cont == CONTENT_LAVA || cont == CONTENT_SLIME) { this.velocity = this.velocity * 0.5; // do we want this? @@ -62,6 +66,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)) { @@ -102,6 +108,7 @@ void sys_phys_update(entity this, float dt) this.com_phys_water = true; sys_phys_simulate(this, dt); this.com_phys_water = false; + this.jumppadcount = 0; } else if (time < this.ladder_time) { this.com_phys_friction = PHYS_FRICTION(this); this.com_phys_vel_max = PHYS_MAXSPEED(this) * maxspeed_mod; @@ -149,7 +156,7 @@ void sys_phys_update(entity this, float dt) LABEL(end) 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; @@ -158,9 +165,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 +174,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 +184,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; @@ -199,10 +204,10 @@ 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 * this.movement.x + v_right * this.movement.y + v_up * this.movement.z; - vector wishvel = v_forward * this.movement.x - + v_right * this.movement.y - + '0 0 1' * this.movement.z * (this.com_phys_vel_2d ? 0 : 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 + + '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)) { wishvel.z = -PHYS_MAXSPEED(this); @@ -215,7 +220,7 @@ void sys_phys_simulate(entity this, float dt) } if (this.com_phys_ladder) { if (this.viewloc) { - wishvel.z = this.oldmovement.x; + wishvel.z = PHYS_CS(this).movement_old.x; } if (this.ladder_entity.classname == "func_water") { float f = vlen(wishvel); @@ -270,7 +275,7 @@ void sys_phys_simulate(entity this, float dt) // 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) - float strafity = IsMoveInDirection(this.movement, -90) + IsMoveInDirection(this.movement, +90); // if one is nonzero, other is always zero + float strafity = IsMoveInDirection(PHYS_CS(this).movement, -90) + IsMoveInDirection(PHYS_CS(this).movement, +90); // if one is nonzero, other is always zero if (PHYS_MAXAIRSTRAFESPEED(this)) { wishspeed = min(wishspeed, @@ -287,7 +292,7 @@ void sys_phys_simulate(entity this, float dt) } // !CPM - if (PHYS_WARSOWBUNNY_TURNACCEL(this) && accelerating && this.movement.y == 0 && this.movement.x != 0) { + if (PHYS_WARSOWBUNNY_TURNACCEL(this) && accelerating && PHYS_CS(this).movement.y == 0 && PHYS_CS(this).movement.x != 0) { PM_AirAccelerate(this, dt, wishdir, wishspeed2); } else { float sidefric = maxairspd ? (PHYS_AIRACCEL_SIDEWAYS_FRICTION(this) / maxairspd) : 0; @@ -318,7 +323,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