From 80d9845607058a85c5250aebca1280324b811285 Mon Sep 17 00:00:00 2001 From: navewindre Date: Wed, 5 Sep 2018 23:19:33 +0200 Subject: whole bunch of shit --- internal_rewrite/update_clientside_animation.cpp | 56 ++++++++++++++++-------- 1 file changed, 38 insertions(+), 18 deletions(-) (limited to 'internal_rewrite/update_clientside_animation.cpp') diff --git a/internal_rewrite/update_clientside_animation.cpp b/internal_rewrite/update_clientside_animation.cpp index 009250b..46f92fa 100644 --- a/internal_rewrite/update_clientside_animation.cpp +++ b/internal_rewrite/update_clientside_animation.cpp @@ -12,7 +12,7 @@ void __fastcall hooks::update_clientside_animation( void* ecx_, void* edx_ ) { static float last_choke; static float last_update; static float last_spawntime = 0.f; - + static float last_yaw; // 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( ) ) { @@ -59,11 +59,16 @@ void __fastcall hooks::update_clientside_animation( void* ecx_, void* edx_ ) { real_angle.x = pitch; } + last_yaw = ent->get_animstate( )->m_flGoalFeetYaw; + if( last_yaw < 0.f ) + last_yaw += 360.f; + g_csgo.m_prediction( )->SetViewAngles( real_angle ); ent->get_animstate( )->update( real_angle.y, real_angle.x ); old_func( ecx_, edx_ ); memcpy( &prev_anims, &ent->get_animdata( ), sizeof( prev_anims ) ); + prev_anims.m_last_simtime = last_yaw; ent->cache_anim_data( ); } @@ -73,19 +78,35 @@ void __fastcall hooks::update_clientside_animation( void* ecx_, void* edx_ ) { } ent->restore_anim_data( true ); - float yaw = ent->get_animstate( )->m_flGoalFeetYaw; + + float lerp = std::min( last_choke, TICK_INTERVAL( ) * 2.f ); + float update_delta = last_choke; + float update_lerp = std::clamp( update_delta - lerp, 0.f, 1.f ); + if( update_delta > 0.f ) + lerp = std::clamp( lerp, 0.f, update_delta ); + + float lerp_progress = ( last_update + lerp - g_csgo.m_globals->m_curtime ) / lerp; + + float lerp_yaw = 0.f; + if( !first_update && ( ent->get_animstate( )->m_velocity > 0.1f || std::abs( last_yaw - ent->get_animstate( )->m_flGoalFeetYaw ) < 35.f ) ) { + float yaw = ent->get_animstate( )->m_flGoalFeetYaw; + if( yaw < 0.f ) + yaw += 360.f; + + if( std::abs( yaw - last_yaw ) >= 180.f ) + lerp_yaw = yaw; + else { + float jmp_yaw = math::lerp( prev_anims.m_last_simtime, yaw, update_lerp / update_delta ); + lerp_yaw = math::lerp( yaw, jmp_yaw, std::clamp( lerp_progress, 0.f, 1.f ) ); + } + } + else { + lerp_yaw = ent->get_animstate( )->m_flGoalFeetYaw; + } //interpolate EVERYTHING if( !first_update && !( ent->get_animstate( )->m_bInHitGroundAnimation && ent->get_animstate( )->m_bOnGround ) ) { for( size_t i{ }; i < 18; ++i ) { - float lerp = std::min( last_choke, TICK_INTERVAL( ) * 2.f ); - float update_delta = last_choke; - float update_lerp = std::clamp( update_delta - lerp, 0.f, 1.f ); - if( update_delta > 0.f ) - lerp = std::clamp( lerp, 0.f, update_delta ); - - float lerp_progress = ( last_update + lerp - g_csgo.m_globals->m_curtime ) / lerp; - float old_param = prev_anims.m_poseparams.at( i ); float param = ent->get_animdata( ).m_poseparams.at( i ); @@ -101,28 +122,27 @@ void __fastcall hooks::update_clientside_animation( void* ecx_, void* edx_ ) { ent->m_flPoseParameter( )[ i ] = final_param; } - float lerp = std::min( last_choke, TICK_INTERVAL( ) * 2.f ); - float update_delta = last_choke; - float update_lerp = std::clamp( update_delta - lerp, 0.f, 1.f ); - if( update_delta > 0.f ) - lerp = std::clamp( lerp, 0.f, update_delta ); - for( size_t i{ }; i < 13; ++i ) { auto old_cycle = prev_anims.m_animlayers.at( i ).m_flCycle; auto cycle = ent->get_animdata( ).m_animlayers.at( i ).m_flCycle; - float lerp_progress = ( last_update + lerp - g_csgo.m_globals->m_curtime ) / lerp; + if( old_cycle > 0.9f && cycle < 0.1f ) { + cycle += 1.f; + } float jmp_cycle = math::lerp( old_cycle, cycle, update_lerp / update_delta ); float final_cycle = math::lerp( cycle, jmp_cycle, std::clamp( lerp_progress, 0.f, 1.f ) ); + if( final_cycle > 1.f ) + final_cycle -= 1.f; + ent->m_AnimOverlay( ).GetElements( )[ i ].m_flCycle = final_cycle; } } if( !first_update ) { //*( byte* )( uintptr_t( ent ) + 0x270 ) = 0; - ent->set_abs_angles( vec3_t( 0, yaw, 0 ) ); + ent->set_abs_angles( vec3_t( 0, lerp_yaw, 0 ) ); bool backup = ent->get_animstate( )->m_bOnGround; ent->get_animstate( )->m_bOnGround = false; -- cgit v1.2.3