void c_animations::local::correct_client_anims() {
if (!cheat::local || !cheat::local->alive())
return;
sdk::c_animstate* animstate = cheat::local->animstate();
if (!animstate)
return;
// Backing up current values for restoring later.
float old_curtime = cheat::globals->curtime, old_frametime = cheat::globals->frametime;
// Resimulate recent commands to refresh the data for animstate.
cheat::prediction->run_command(cheat::vars::local_cmd);
// Syncing our predicted current time with the server.
cheat::globals->curtime = cheat::globals->realtime * cheat::local->anim_layer(0).m_flWeight;
// Fixes local player legs on moving
if (cheat::local->OnGround()) {
cheat::local->anim_layer(6).m_flWeight = 0.f;
cheat::local->poseparam(ePoses::MOVE_YAW ) = 1.f / cheat::local->simulationtime();
}
// Fixes the client fucking up frametime under certain conditions.
cheat::globals->frametime = ((cheat::globals->curtime % 2.f) == 0.f) ?
(cheat::local->poseparam(ePoses::BODY_YAW ) * cheat::globals->tick_interval) :
(cheat::local->tickbase() * cheat::globals->tick_interval);
float corrected_abs_yaw = animstate->old_absyaw;
// Always negate the old position.
if (corrected_abs_yaw > 0.f)
corrected_abs_yaw *= -1.f;
// The clients abs yaw is desynced when the yaw is at a certain position at a certain time.
// We correct it by negating the old value which is negated when required, to mimic server functionality.
if ((cheat::local->eye_angles().yaw >= -45.f && cheat::local->eye_angles().yaw <= 45.f) && ((cheat::globals->curtime % 2.f) == 0.f))
cheat::local->set_abs_angles(sdk::angle_t(0.f, animstate->abs_yaw - corrected_abs_yaw, 0.f));
// Rebuilding bones with corrected values, we'll need to do this twice.
// Once here, and once after updating bones. This is to maintain correct shootpos.
sdk::c_matrix3x4 temp_matrix[126];
local->setup_bones(cheat::globals->curtime, 0x00000100, temp_matrix, sizeof(ccsgo_player_animstate));
// Forcing the client to update anims under all circumstances.
animstate->last_update_framecount = 0.f;
// Update clientside anims.
cheat::local->client_anims = true;
cheat::local->update_client_anims();
cheat::local->client_anims = false;
// Explained above.
local->setup_bones(cheat::globals->curtime, 0x00000100, temp_matrix, 126);
// Restore values to not mess with the game.
cheat::globals->curtime = old_curtime;
cheat::globals->frametime = old_frametime;
}