summaryrefslogtreecommitdiff
path: root/internal_rewrite/update_clientside_animation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'internal_rewrite/update_clientside_animation.cpp')
-rw-r--r--internal_rewrite/update_clientside_animation.cpp56
1 files changed, 38 insertions, 18 deletions
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;