#include "hooks.hpp" #include "context.hpp" #include "base_cheat.hpp" void __fastcall hooks::update_clientside_animation( void* ecx_, void* edx_ ) { static bool first_update = true; auto old_func = update_clientside_animation_o; if( ecx_ != g_ctx.m_local ) return old_func( ecx_, edx_ ); auto ent = ( c_base_player* )( ecx_ ); static ent_animdata_t prev_anims; static float last_update; static float last_spawntime = 0.f; // Arbitrary number much. if( !g_settings.rage.anti_aim || !g_ctx.m_local->is_valid( ) || std::abs( last_update - g_csgo.m_globals->m_curtime ) > TICKS_TO_TIME( 20 ) || last_spawntime != ent->m_flSpawnTime( ) ) { last_update = g_csgo.m_globals->m_curtime; first_update = true; if( last_spawntime != ent->m_flSpawnTime( ) ) last_spawntime = ent->m_flSpawnTime( ); return old_func( ecx_, edx_ ); } *( byte* )( uintptr_t( ent ) + 0x270 ) = 1; if( !g_cheat.m_lagmgr.get_choked( ) || g_cheat.m_lagmgr.get_sent( ) > 1 || first_update ) { vec3_t backup; g_csgo.m_prediction( )->GetLocalViewAngles( backup ); float backup_curtime = g_csgo.m_globals->m_curtime; float backup_frametime = g_csgo.m_globals->m_frametime; last_update = backup_curtime; g_csgo.m_globals->m_curtime = g_ctx.pred_time( ); g_csgo.m_globals->m_frametime = TICK_INTERVAL( ); if( g_csgo.m_globals->m_curtime != ent->get_animstate( )->m_flLastClientSideAnimationUpdateTime ) { last_update = backup_curtime; vec3_t real_angle = g_ctx.m_thirdperson_angle; float pitch; if( g_ctx.m_local->get_animstate( )->m_bInHitGroundAnimation && ( g_ctx.m_local->m_fFlags( ) & FL_ONGROUND ) ) { bool dist = g_settings.rage.enabled( ) && g_settings.rage.selection_type( ) == 1; int target = util::get_closest_player( dist ); if( target != -1 ) { auto t = g_csgo.m_entlist( )->GetClientEntity( target ); pitch = math::vector_angles( ent->m_vecOrigin( ), t->m_vecOrigin( ) ).x; } else pitch = -10.f; real_angle.x = pitch; } ent->get_animstate( )->update( real_angle.y, real_angle.x ); old_func( ecx_, edx_ ); ent->cache_anim_data( ); } g_csgo.m_prediction( )->SetLocalViewAngles( backup ); g_csgo.m_globals->m_curtime = backup_curtime; g_csgo.m_globals->m_frametime = backup_frametime; } ent->restore_anim_data( true ); if( !first_update ) { //*( byte* )( uintptr_t( ent ) + 0x270 ) = 0; ent->set_abs_angles( vec3_t( 0, ent->get_animstate( )->m_flGoalFeetYaw, 0 ) ); bool backup = ent->get_animstate( )->m_bOnGround; ent->get_animstate( )->m_bOnGround = false; ent->invalidate_bone_cache( ); ent->ce( )->SetupBones( nullptr, 128, BONE_USED_BY_ANYTHING, 0.f ); ent->get_animstate( )->m_bOnGround = backup; } first_update = false; }