void Movement::FixMove(CUserCmd* cmd, const ang_t& wish_angles) {
if (hasShot) {
g_notify.add(tfm::format(XOR("movefix!\n")));
return;
}
vec3_t move, dir;
float delta, len;
ang_t move_angle;
// roll nospread fix.
if (!(g_cl.m_flags & FL_ONGROUND) && cmd->m_view_angles.z != 0.f)
cmd->m_side_move = 0.f;
// convert movement to vector.
move = { cmd->m_forward_move, cmd->m_side_move, 0.f };
// get move length and ensure we're using a unit vector ( vector with length of 1 ).
len = move.normalize();
if (!len)
return;
// convert move to an angle.
math::VectorAngles(move, move_angle);
// calculate yaw delta.
delta = (cmd->m_view_angles.y - wish_angles.y);
// accumulate yaw delta.
move_angle.y += delta;
// calculate our new move direction.
// dir = move_angle_forward * move_length
math::AngleVectors(move_angle, &dir);
// scale to og movement.
dir *= len;
// strip old flags.
g_cl.m_cmd->m_buttons &= ~(IN_FORWARD | IN_BACK | IN_MOVELEFT | IN_MOVERIGHT);
// fix ladder and noclip.
if (g_cl.m_local->m_MoveType() == MOVETYPE_LADDER) {
// invert directon for up and down.
if (cmd->m_view_angles.x >= 45.f && wish_angles.x < 45.f && std::abs(delta) <= 65.f)
dir.x = -dir.x;
// write to movement.
cmd->m_forward_move = dir.x;
cmd->m_side_move = dir.y;
// set new button flags.
if (cmd->m_forward_move > 200.f)
cmd->m_buttons |= IN_FORWARD;
else if (cmd->m_forward_move < -200.f)
cmd->m_buttons |= IN_BACK;
if (cmd->m_side_move > 200.f)
cmd->m_buttons |= IN_MOVERIGHT;
else if (cmd->m_side_move < -200.f)
cmd->m_buttons |= IN_MOVELEFT;
}
// we are moving normally.
else {
// we must do this for pitch angles that are out of bounds.
if (cmd->m_view_angles.x < -90.f || cmd->m_view_angles.x > 90.f)
dir.x = -dir.x;
// set move.
cmd->m_forward_move = dir.x;
cmd->m_side_move = dir.y;
// set new button flags.
if (cmd->m_forward_move > 0.f)
cmd->m_buttons |= IN_FORWARD;
else if (cmd->m_forward_move < 0.f)
cmd->m_buttons |= IN_BACK;
if (cmd->m_side_move > 0.f)
cmd->m_buttons |= IN_MOVERIGHT;
else if (cmd->m_side_move < 0.f)
cmd->m_buttons |= IN_MOVELEFT;
}
}
void Movement::AutoPeek() {
auto localPlayer = g_csgo.m_entlist->GetClientEntity< Player* >(g_csgo.m_engine->GetLocalPlayer());
if (!localPlayer || localPlayer->dormant() || !localPlayer->alive()) return;
if (g_input.GetKeyState(g_menu.main.movement.autopeek.get())) {
if (quickpeekstartpos == vec3_t{ 0, 0, 0 }) {
quickpeekstartpos = g_cl.m_local->GetAbsOrigin();
g_notify.add(tfm::format(XOR("quickpeekstartpos!\n")));
}
else {
if (g_cl.m_old_shot && !hasShot) {
hasShot = true;
g_notify.add(tfm::format(XOR("hasShot = true!\n")));
}
if (hasShot) {
if (quickpeekstartpos == g_cl.m_local->GetAbsOrigin()) {
hasShot = false;
}
else {
gotoStart();
g_notify.add(tfm::format(XOR("started gotoStart\n")));
}
}
}
}
else {
hasShot = false;
quickpeekstartpos = vec3_t{ 0, 0, 0 };
}
}
void Movement::gotoStart() {
auto localPlayer = g_csgo.m_entlist->GetClientEntity< Player* >(g_csgo.m_engine->GetLocalPlayer());
if (!localPlayer || localPlayer->dormant() || !localPlayer->alive()) return;
float yaw = g_cl.m_cmd->m_view_angles.y;
vec3_t VecForward = g_cl.m_local->GetAbsOrigin() - quickpeekstartpos;
vec3_t translatedVelocity = vec3_t{
(float)(VecForward[0] * cos(yaw / 180 * (float)M_PI) + VecForward[1] * sin(yaw / 180 * (float)M_PI)),
(float)(VecForward[1] * cos(yaw / 180 * (float)M_PI) - VecForward[0] * sin(yaw / 180 * (float)M_PI)),
VecForward[2]
};
g_cl.m_cmd->m_forward_move = -translatedVelocity[0] * 20.f;
g_cl.m_cmd->m_side_move = translatedVelocity[1] * 20.f;
if (-translatedVelocity[0] * translatedVelocity[1] == 0)
g_notify.add(tfm::format(XOR("0")));
}