Можете помочь, страф не работает даже когда sv_quantize... на 0
&
C++:
void c_movement::fix_cmd_buttons(c_user_cmd* user_cmd)
{
if (!user_cmd) return;
user_cmd->m_button_state.m_button_state &= ~(IN_FORWARD | IN_BACK | IN_MOVELEFT | IN_MOVERIGHT);
if (user_cmd->pb.mutable_base()->forwardmove() > 0.f)
user_cmd->m_button_state.m_button_state |= IN_FORWARD;
else if (user_cmd->pb.mutable_base()->forwardmove() < 0.f)
user_cmd->m_button_state.m_button_state |= IN_BACK;
if (user_cmd->pb.mutable_base()->leftmove() > 0.f)
user_cmd->m_button_state.m_button_state |= IN_MOVELEFT;
else if (user_cmd->pb.mutable_base()->leftmove() < 0.f)
user_cmd->m_button_state.m_button_state |= IN_MOVERIGHT;
}
void c_movement::bunnyhop(c_user_cmd* user_cmd)
{
if (!g_cfg->misc.m_bunny_hop || g_interfaces->m_var->get_by_name(xorstr_("sv_autobunnyhopping"))->get_int())
return;
if (!(user_cmd->m_button_state.m_button_state & IN_JUMP))
return;
if (!(g_ctx->m_local_pawn->m_flags() & FL_ONGROUND))
{
user_cmd->m_button_state.m_button_state &= ~IN_JUMP;
user_cmd->m_button_state.m_button_state2 &= ~IN_JUMP;
user_cmd->m_button_state.m_button_state3 &= ~IN_JUMP;
}
else
{
auto cmd_push = g_protobuf->add_subtick_move_step(user_cmd);
cmd_push->set_button(IN_JUMP);
cmd_push->set_pressed(true);
cmd_push->set_when(0.999f);
auto cmd_release = g_protobuf->add_subtick_move_step(user_cmd);
cmd_release->set_button(IN_JUMP);
cmd_release->set_pressed(false);
cmd_release->set_when(0.999f);
}
}
void c_movement::auto_strafe(c_user_cmd* user_cmd, float old_yaw)
{
if (!g_cfg->misc.m_auto_strafe)
return;
if (!g_ctx->m_local_pawn || (g_ctx->m_local_pawn->m_flags() & FL_ONGROUND))
return;
if (!user_cmd || !user_cmd->pb.mutable_base() || !user_cmd->pb.mutable_base()->mutable_viewangles())
return;
auto base_cmd = user_cmd->pb.mutable_base();
vec3_t velocity = g_ctx->m_local_pawn->m_vec_abs_velocity();
float speed_2d = velocity.length_2d();
bool move_forward = user_cmd->m_button_state.m_button_state & IN_FORWARD;
bool move_backward = user_cmd->m_button_state.m_button_state & IN_BACK;
bool move_left = user_cmd->m_button_state.m_button_state & IN_MOVELEFT;
bool move_right = user_cmd->m_button_state.m_button_state & IN_MOVERIGHT;
if (speed_2d < 2.f && !move_forward && !move_backward && !move_left && !move_right)
return;
float ideal_rotation = speed_2d > 0.f ? (std::min)(RAD2DEG * std::asinf(15.f / speed_2d), 90.f) : 90.f;
float sign = base_cmd->legacy_command_number() % 2 ? 1.f : -1.f;
base_cmd->set_forwardmove(450.f);
vec3_t movement_angle{
base_cmd->viewangles().x(),
base_cmd->viewangles().y(),
base_cmd->viewangles().z()
};
if (move_forward)
movement_angle.y += move_left ? 45.f : move_right ? -45.f : 0.f;
else if (move_backward)
movement_angle.y += move_left ? 135.f : move_right ? -135.f : 180.f;
else if (move_left || move_right)
movement_angle.y += move_left ? 90.f : -90.f;
float yaw_delta = std::remainder(movement_angle.y - old_yaw, 360.f);
float abs_yaw_delta = std::abs(yaw_delta);
if (yaw_delta > 0.f)
base_cmd->set_leftmove(-450.f);
else if (yaw_delta < 0.f)
base_cmd->set_leftmove(450.f);
if (abs_yaw_delta <= ideal_rotation || abs_yaw_delta >= 30.f)
{
float vel_ang = RAD2DEG * std::atan2(velocity.y, velocity.x);
float vel_delta = std::remainder(movement_angle.y - vel_ang, 360.f);
float retrack_speed = ideal_rotation * ((g_cfg->misc.m_strafe_smooth / 100.f) * 3.f);
if (vel_delta <= retrack_speed || speed_2d <= 15.f)
{
if (-retrack_speed <= vel_delta || speed_2d <= 15.f)
{
movement_angle.y += ideal_rotation * sign;
base_cmd->set_leftmove(sign * 450.f);
}
else
{
movement_angle.y = vel_ang - retrack_speed;
base_cmd->set_leftmove(450.f);
}
}
else
{
movement_angle.y = vel_ang + retrack_speed;
base_cmd->set_leftmove(-450.f);
}
}
const float rotation = DEG2RAD * (base_cmd->viewangles().y() - movement_angle.y);
const float new_forward = std::cos(rotation) * base_cmd->forwardmove() - std::sin(rotation) * base_cmd->leftmove();
const float new_side = std::sin(rotation) * base_cmd->forwardmove() + std::cos(rotation) * base_cmd->leftmove();
base_cmd->set_forwardmove(std::clamp(new_forward, -450.f, 450.f));
base_cmd->set_leftmove(std::clamp(new_side, -450.f, 450.f));
fix_cmd_buttons(user_cmd);
}
&
C++:
void c_movement::movement_fix(c_user_cmd* user_cmd, vec3_t angle)
{
vec3_t wish_angle{
user_cmd->pb.mutable_base()->viewangles().x(),
user_cmd->pb.mutable_base()->viewangles().y(),
user_cmd->pb.mutable_base()->viewangles().z()
};
int sign = wish_angle.x > 90.f ? -1.f : 1.f;
wish_angle.clamp();
vec3_t forward, right, up, old_forward, old_right, old_up;
vec3_t view_angles = angle;
g_math->angle_vectors(wish_angle, forward, right, up);
forward.z = right.z = up.x = up.y = 0.f;
forward.normalize_in_place();
right.normalize_in_place();
up.normalize_in_place();
g_math->angle_vectors(view_angles, old_forward, old_right, old_up);
old_forward.z = old_right.z = old_up.x = old_up.y = 0.f;
old_forward.normalize_in_place();
old_right.normalize_in_place();
old_up.normalize_in_place();
forward *= user_cmd->pb.mutable_base()->forwardmove();
right *= user_cmd->pb.mutable_base()->leftmove();
up *= user_cmd->pb.mutable_base()->upmove();
float fixed_forward_move = old_forward.dot(right) + old_forward.dot(forward) + old_forward.dot(up, true);
float fixed_side_move = old_right.dot(right) + old_right.dot(forward) + old_right.dot(up, true);
float fixed_up_move = old_up.dot(right, true) + old_up.dot(forward, true) + old_up.dot(up);
user_cmd->pb.mutable_base()->set_forwardmove(fixed_forward_move);
user_cmd->pb.mutable_base()->set_leftmove(fixed_side_move);
user_cmd->pb.mutable_base()->set_upmove(fixed_up_move);
fixed_forward_move = sign * (old_forward.dot(right) + old_forward.dot(forward));
fixed_side_move = old_right.dot(right) + old_right.dot(forward);
user_cmd->pb.mutable_base()->set_forwardmove(std::clamp(fixed_forward_move, -450.f, 450.f));
user_cmd->pb.mutable_base()->set_leftmove(std::clamp(fixed_side_move, -450.f, 450.f));
}