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;
+ PHYS_CS(this).movement_old = PHYS_CS(this).movement;
this.v_angle_old = this.v_angle;
sys_phys_ai(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);
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?
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)) {
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
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;
}
}
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);
}
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);
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)
// 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,
}
// !CPM
- if (PHYS_WARSOWBUNNY_TURNACCEL(this) && accelerating && this.movement.y == 0 && this.movement.x != 0) {
- PM_AirAccelerate(this, wishdir, wishspeed2);
+ 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;
- 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 {
}
// holding jump button swims upward slowly
- if (jump && !this.viewloc) {
+ if (this.com_in_jump && !this.viewloc) {
// was:
// lava: 50
// slime: 80
}
} 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;
}
}
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);
}
}
}