namespace features { namespace antiaim { void predict_lby( ) { static float spawn_time; m_in_lby_update = false; m_in_balance_update = false; m_can_micro_move = false; if ( !g::local->valid( ) ) { return; } const auto state = g::local->animstate( ); if ( !state ) return; if ( g::local->spawn_time( ) != spawn_time ) { spawn_time = g::local->spawn_time( ); m_lby_update_time = spawn_time; } if ( g::local->vel( ).length_2d( ) > 0.1f ) m_lby_update_time = csgo::i::globals->m_curtime + 0.22f; else if ( csgo::i::globals->m_curtime >= m_lby_update_time ) { m_in_lby_update = true; m_lby_update_time = csgo::i::globals->m_curtime + 1.1f; } if ( m_lby_update_time - csgo::i::globals->m_ipt < csgo::i::globals->m_curtime ) m_in_balance_update = true; /* https://www.unknowncheats.me/forum/2628078-post10.html used for micro movements while not already moving */ if ( csgo::i::client_state->choked( ) <= 0 && !m_in_lby_update ) { m_can_micro_move = true; } } void run( ucmd_t* cmd ) { /* find menu vars */ FIND( bool, enable_antiaim, "anti-aim", "basic", "enable", oxui::object_type::object_checkbox ); if ( g::local->valid( ) ) { /* set view angles to local view */ vec3_t local_view; csgo::i::engine->get_viewangles( local_view ); cmd->m_angs = local_view; /* choke only 1 tick if we don't have anti-aim enabled or do fakelag */ { if ( !enable_antiaim ) { g::send_packet = csgo::i::client_state->choked( ) >= 1; } else { fakelag( ); } } } else { g::send_packet = true; } if ( !g::local->valid( ) || !enable_antiaim || cmd->m_buttons & in_attack || cmd->m_buttons & in_use ) { return; } /* setup view angles */ setup_view( cmd ); /* do desync */ desync( cmd ); } void fakelag( ) { /* find menu vars */ FIND( double, ticks, "anti-aim", "fake-lag", "ticks", oxui::object_type::object_slider ); g::send_packet = csgo::i::client_state->choked( ) >= max( 1, min( 16, static_cast< int >( ticks ) ) ); } void setup_view( ucmd_t* cmd ) { /* get local view angles */ vec3_t local_view; csgo::i::engine->get_viewangles( local_view ); /* find menu vars */ FIND( int, pitch, "anti-aim", "basic", "pitch", oxui::object_type::object_dropdown ); FIND( bool, legit_yaw, "anti-aim", "basic", "legit yaw", oxui::object_type::object_checkbox ); FIND( bool, manual_antiaim, "anti-aim", "basic", "manual", oxui::object_type::object_checkbox ); FIND( int, left_key, "anti-aim", "basic", "m-left", oxui::object_type::object_keybind ); FIND( int, right_key, "anti-aim", "basic", "m-right", oxui::object_type::object_keybind ); FIND( int, back_key, "anti-aim", "basic", "m-back", oxui::object_type::object_keybind ); /* get anti-aim side */ enum side_t : int { left = 1, right = -1, back = 2 }; static int m_antiaim_side = back; if ( manual_antiaim ) { if ( GetAsyncKeyState( left_key ) ) { m_antiaim_side = left; } else if ( GetAsyncKeyState( right_key ) ) { m_antiaim_side = right; } else if ( GetAsyncKeyState( back_key ) ) { m_antiaim_side = back; } } else { m_antiaim_side = back; } /* setup pitch */ { enum pitch_t : int { none, down, up, zero }; switch ( pitch ) { case none: cmd->m_angs.x = local_view.x; break; case down: cmd->m_angs.x = 89.f; break; case up: cmd->m_angs.x = -89.f; break; case zero: cmd->m_angs.x = -12.f; break; default: cmd->m_angs.x = local_view.x; break; } } /* setup yaw */ cmd->m_angs.y = legit_yaw ? local_view.y : local_view.y + ( 90 * m_antiaim_side ); } void desync( ucmd_t* cmd ) { /* https://www.unknowncheats.me/forum/2627823-post7.html */ const auto m_max_lby_delta = ( g::local->desync_amount( ) * 2 ) + ( g::local->animstate( )->m_last_clientside_anim_update_time_delta * 120.f ); /* find menu vars */ FIND( bool, enable_desync, "anti-aim", "desync", "enable", oxui::object_type::object_checkbox ); FIND( int, flip_key, "anti-aim", "desync", "flip key", oxui::object_type::object_keybind ); if ( !enable_desync ) return; static bool m_flip_desync; csgo::update_key_toggle( flip_key, m_flip_desync ); /* break lby */ if ( !g::send_packet ) { if ( ( m_in_lby_update || m_in_balance_update ) && !m_can_micro_move ) { if ( m_flip_desync ) cmd->m_angs.y -= m_max_lby_delta; else cmd->m_angs.y += m_max_lby_delta; } else { /* normal real */ if ( m_flip_desync ) cmd->m_angs.y += m_max_lby_delta; else cmd->m_angs.y -= m_max_lby_delta; } if ( m_can_micro_move ) { /* trigger balance completely */ cmd->m_angs.y += 180.f; } } } void after_movement( ucmd_t* cmd ) { /* find menu vars */ FIND( bool, enable_antiaim, "anti-aim", "basic", "enable", oxui::object_type::object_checkbox ); if ( !g::local->valid( ) || !enable_antiaim || cmd->m_buttons & in_attack || cmd->m_buttons & in_use ) { return; } auto micro_move = [ ] ( float min_move, float& move ) -> void { /* do backup of move */ const auto o_move = move; /* get switch_side */ static bool switch_side = false; if ( g::send_packet ) switch_side = !switch_side; /* move if needed */ if ( move == 0.0f ) { if ( switch_side ) move = o_move - min_move; else move = o_move + min_move; } }; /* do micro-movements */ if ( m_can_micro_move ) { /* https://www.unknowncheats.me/forum/2628078-post10.html */ /* get value we must move to */ const auto m_min_move = cmd->m_buttons & in_duck ? 4.941177f : 1.1f; /* micro move forward and side movements */ micro_move( m_min_move, cmd->m_fmove ); micro_move( m_min_move, cmd->m_smove ); } } } }