.float multijump_ready;
.float prevjumpbutton;
-.float prevtopspeed; // store the top speed during the last 0.25 seconds to make dodging at full speeds easier
-.float prevtopspeed_time;
+.float nexspeed;
/*
=============
self.multijump_ready = FALSE;
}
- if(self.multijump_ready && self.multijump_count < cvar("g_multijump") && self.velocity_z > cvar("g_multijump_speed"))
+ if(!doublejump && self.multijump_ready && self.multijump_count < cvar("g_multijump") && self.velocity_z > cvar("g_multijump_speed"))
{
+ // doublejump = FALSE; // checked above in the if
if (cvar("g_multijump") > 0)
{
if (cvar("g_multijump_add") == 0) // in this case we make the z velocity == jumpvelocity
- self.velocity_z = 0;
-
- float curspeed;
- curspeed = vlen(self.velocity);
- local vector wishvel, wishdir;
- makevectors(self.v_angle);
- wishvel = v_forward * self.movement_x + v_right * self.movement_y;
- wishdir = normalize(wishvel);
- if(wishdir_x != 0 && wishdir_y != 0) // don't remove all speed if player isnt pressing any movement keys
{
- self.velocity_x = wishdir_x * max(curspeed, self.prevtopspeed); // allow "dodging" at a multijump
- self.velocity_y = wishdir_y * max(curspeed, self.prevtopspeed);
+ if (self.velocity_z < mjumpheight)
+ {
+ doublejump = TRUE;
+ self.velocity_z = 0;
+ }
+ }
+ else
+ doublejump = TRUE;
+
+ if(doublejump)
+ {
+ if(self.movement_x != 0 || self.movement_y != 0) // don't remove all speed if player isnt pressing any movement keys
+ {
+ float curspeed;
+ vector wishvel, wishdir;
+
+ curspeed = max(
+ vlen(vec2(self.velocity)), // current xy speed
+ vlen(vec2(antilag_takebackavgvelocity(self, max(self.lastteleporttime + sys_frametime, time - 0.25), time))) // average xy topspeed over the last 0.25 secs
+ );
+ makevectors(self.v_angle_y * '0 1 0');
+ wishvel = v_forward * self.movement_x + v_right * self.movement_y;
+ wishdir = normalize(wishvel);
+
+ self.velocity_x = wishdir_x * curspeed; // allow "dodging" at a multijump
+ self.velocity_y = wishdir_y * curspeed;
+ // keep velocity_z unchanged!
+ }
+ self.multijump_count += 1;
}
- self.multijump_count += 1;
}
self.multijump_ready = FALSE; // require releasing and pressing the jump button again for the next jump
}
- else if (!doublejump)
+
+ if (!doublejump)
if (!(self.flags & FL_ONGROUND))
return;
float mt;
rigvel_z -= frametime * sv_gravity; // 4x gravity plays better
- rigvel_xy = rigvel;
- rigvel_xy_z = 0;
+ rigvel_xy = vec2(rigvel);
if(g_bugrigs_planar_movement_car_jumping && !g_touchexplode) // touchexplode is a better way to handle collisions
mt = MOVE_NORMAL;
vel_straight = self.velocity * wishdir;
vel_z = self.velocity_z;
- vel_xy = self.velocity - vel_z * '0 0 1';
+ vel_xy = vec2(self.velocity);
vel_perpend = vel_xy - vel_straight * wishdir;
step = accel * frametime * wishspeed0;
self.multijump_count = -2; // the cvar value for infinite jumps is -1, so this needs to be smaller
}
- if(vlen(self.velocity) >= self.prevtopspeed || time - self.prevtopspeed_time > 0.25)
- {
- self.prevtopspeed_time = time;
- self.prevtopspeed = vlen('1 0 0' * self.velocity_x + '0 1 0' * self.velocity_y);
- }
-
if (self.BUTTON_JUMP)
PlayerJump ();
else
}
}
}
+
+ float f;
+ float xyspeed;
+ f = cvar("g_balance_nex_velocitydependent_falloff_factor");
+ xyspeed = vlen('1 0 0' * self.velocity_x + '0 1 0' * self.velocity_y);
+ if(xyspeed > self.nexspeed)
+ self.nexspeed = min(xyspeed, cvar("g_balance_nex_velocitydependent_maxspeed"));
+ else
+ self.nexspeed = (1 - f) * self.nexspeed;
:end
if(self.flags & FL_ONGROUND)
self.lastground = time;