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;
sys_phys_pregame_hold(this);
if (IS_SVQC) {
- if (PHYS_MOVETYPE(this) == MOVETYPE_NONE) { return; }
+ if (this.move_movetype == MOVETYPE_NONE) { return; }
// when we get here, disableclientprediction cannot be 2
- this.disableclientprediction = 0;
+ this.disableclientprediction = (this.move_qcphysics) ? -1 : 0;
}
viewloc_PlayerPhysics(this);
// 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);
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)) {
if (this.flags & FL_WATERJUMP) {
this.velocity_x = this.movedir.x;
this.velocity_y = this.movedir.y;
- if (time > PHYS_TELEPORT_TIME(this)
- || this.waterlevel == WATERLEVEL_NONE
+ if (this.waterlevel == WATERLEVEL_NONE
+ || time > PHYS_TELEPORT_TIME(this)
|| PHYS_WATERJUMP_TIME(this) <= 0
) {
this.flags &= ~FL_WATERJUMP;
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 (PHYS_MOVETYPE(this) == MOVETYPE_NOCLIP
- || PHYS_MOVETYPE(this) == MOVETYPE_FLY
- || PHYS_MOVETYPE(this) == MOVETYPE_FLY_WORLDONLY
+ } else if (this.move_movetype == MOVETYPE_NOCLIP
+ || this.move_movetype == MOVETYPE_FLY
+ || this.move_movetype == MOVETYPE_FLY_WORLDONLY
|| MUTATOR_CALLHOOK(IsFlying, this)) {
this.com_phys_friction = PHYS_FRICTION(this);
this.com_phys_vel_max = PHYS_MAXSPEED(this) * maxspeed_mod;
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);
/** 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
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;
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;
if (!trace_startsolid) {
this.velocity = forward * 50;
this.velocity_z = 310;
- if (IS_CSQC) { PHYS_WATERJUMP_TIME(this) = 2; }
UNSET_ONGROUND(this);
SET_JUMP_HELD(this);
}
+ v_right * this.movement.y
+ '0 0 1' * 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);
+ }
if (this.viewloc) {
wishvel.z = -160; // drift anyway
} else if (wishvel == '0 0 0') {
}
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);
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)
// !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 {
- if (this.com_phys_ground || this.com_phys_water) {
- if (IS_DUCKED(this)) { wishspeed *= 0.5; }
- }
+ if (this.com_phys_ground && IS_DUCKED(this)) { wishspeed *= 0.5; }
if (this.com_phys_water) {
wishspeed *= 0.7;
}
// holding jump button swims upward slowly
- if (jump && !this.viewloc) {
+ if (this.com_in_jump && !this.viewloc) {
// was:
// lava: 50
// slime: 80
// water: 100
// idea: double those
this.velocity_z = 200;
+ if (this.waterlevel >= WATERLEVEL_SUBMERGED) {
+ this.velocity_z = PHYS_MAXSPEED(this) * 0.7;
+ }
}
}
if (this.viewloc) {
}
} else {
// water acceleration
- PM_Accelerate(this, wishdir, wishspeed, wishspeed, this.com_phys_acc_rate, 1, 0, 0, 0);
- PM_ClientMovement_Move(this);
+ PM_Accelerate(this, dt, wishdir, wishspeed, wishspeed, this.com_phys_acc_rate, 1, 0, 0, 0);
}
return;
}
const float accelspeed = min(PHYS_ACCELERATE(this) * dt * wishspeed, addspeed);
this.velocity += accelspeed * wishdir;
}
- if (IS_CSQC && vdist(this.velocity, >, 0)) {
- PM_ClientMovement_Move(this);
- }
return;
}
- if (IS_CSQC || time >= PHYS_TELEPORT_TIME(this)) {
- PM_Accelerate(this, wishdir, wishspeed, wishspeed, this.com_phys_acc_rate, 1, 0, 0, 0);
+ if (IS_CSQC ? PHYS_WATERJUMP_TIME(this) <= 0 : time >= PHYS_TELEPORT_TIME(this)) {
+ PM_Accelerate(this, dt, wishdir, wishspeed, wishspeed, this.com_phys_acc_rate, 1, 0, 0, 0);
}
}
- PM_ClientMovement_Move(this);
}
.entity groundentity;
trace_dphitcontents = 0;
trace_dphitq3surfaceflags = 0;
trace_dphittexturename = string_null;
- gettouch(it)((other = this, it));
+ gettouch(it)(this, it);
vel = this.velocity;
}
});
if (hit && this.solid >= SOLID_TRIGGER && (!IS_ONGROUND(this) || this.groundentity != ent)) {
// SV_Impact (ent, trace);
tracebox(p0, mn, mx, p1, MOVE_NORMAL, this);
- void(entity) touched = gettouch(this);
+ void(entity, entity) touched = gettouch(this);
if (touched && this.solid != SOLID_NOT) {
- touched((other = ent, this));
+ touched(ent, this);
}
- void(entity) touched2 = gettouch(ent);
+ void(entity, entity) touched2 = gettouch(ent);
if (this && ent && touched2 && ent.solid != SOLID_NOT) {
trace_endpos = ent.origin;
trace_plane_normal *= -1;
trace_dphitcontents = 0;
trace_dphitq3surfaceflags = 0;
trace_dphittexturename = string_null;
- touched2((other = this, ent));
+ touched2(this, ent);
}
}
}