diff options
| author | navewindre <nw@moneybot.cc> | 2024-07-12 00:55:39 +0200 |
|---|---|---|
| committer | navewindre <nw@moneybot.cc> | 2024-07-12 00:55:39 +0200 |
| commit | 2ebf959ec02048c15323e1bbfc63faedcf5067b6 (patch) | |
| tree | 18862ba5d3b4be44294c0a81317d31eace7ee150 /src/csgo/hack_aim.cpp | |
| parent | ecca2728f1a583ea484f8bdcda390a30e4906f1d (diff) | |
ha haaa
Diffstat (limited to 'src/csgo/hack_aim.cpp')
| -rw-r--r-- | src/csgo/hack_aim.cpp | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/src/csgo/hack_aim.cpp b/src/csgo/hack_aim.cpp new file mode 100644 index 0000000..9c95bdf --- /dev/null +++ b/src/csgo/hack_aim.cpp @@ -0,0 +1,110 @@ +#include "hack.h" + +#include "convar.h" +#include "netvar.h" + +SETTING<bool>& aim_active = *settings.find<bool>( "aim_active"fnv ); + +bool aim_check_player( CSGOPLAYER player, CSGO* p ) { + if( !player ) + return true; // if no player + if( player.get_clientclass().index != CCSPlayer ) + return true; // if not player + CSGOPLAYER local = p->read<U32>( localplayer_ptr ); + if( player.base == local ) + return true; // if player is you + if( player.m_iTeamNum() == local.m_iTeamNum() ) + return true; + if( player.m_bDormant() ) + return true; // dormant + if( player.m_lifeState() ) + return true; + if( !player.m_bSpottedByMask() ) + return true; + return false; +} + +#define aim_fov 10.f +#define aim_reset( ) { \ + m_pitch = m_yaw = 0.022f; \ + convar_set( p, pitch_ptr, m_pitch ); \ + convar_set( p, yaw_ptr, m_yaw ); \ + return; \ +} + +F32 calc_dist( VEC3 v, F32 distance ) { + F32 sqr1 = sinf( v.x * M_PI / 180.f ) * distance; + F32 sqr2 = sinf( v.y * M_PI / 180.f ) * distance; + return sqrtf( + ( sqr1 * sqr1 ) + ( sqr2 * sqr2 ) + ); +} + +void hack_run_aim( CSGO* p ) { + if( !aim_active ) + return; + + F32 m_pitch, m_yaw; + + CSGOPLAYER local = p->read<U32>( localplayer_ptr ); + if( local.m_iHealth( ) < 1 || !local ) + aim_reset(); + + CSGOENTITY wep = CSGOENTITY::from_list( + ( ( local.m_hActiveWeapon() & 0xFFF ) - 1 ) + ); + + if( !wep.is_weapon( ) ) + aim_reset(); + + F32 lowest_dist{ aim_fov }; + U32 closest{ }; + for( U32 index{}; index <= 64; ++index ) { + CSGOPLAYER player = CSGOENTITY::from_list( index ); + + if( aim_check_player( player, p ) ) + continue; + + VEC3 local_pos = local.m_vecOrigin( ) + local.m_vecViewOffset( ); + VEC3 local_view = p->read<VEC3>( clientstate_ptr + 0x4d90 ); + // could replace this magic number with pattern, but is it worth it ? + VEC3 target_pos; + if( wep.get_clientclass( ).index == CWeaponAWP ) + target_pos = player.get_bone_pos( 6 ); + else + target_pos = player.get_bone_pos( 8 ); + VEC3 target_ang = vector_angles( local_pos, target_pos ); + + //F32 distance = ( local_view - target_ang ).clamp().length2d(); // non-dynamic + F32 distance = calc_dist( + ( local_view - target_ang ), + local_pos.dist_to( target_pos ) + ); + + if( distance > lowest_dist ) + continue; + + lowest_dist = distance; + closest = player; + } + + if( !closest ) + aim_reset(); + + // change this to change strength. this is the minimum allowed by the game. + const F32 min_sens = 0.0001f; + F32 factor = ( lowest_dist / aim_fov ); + if( factor > 1.f ) + factor = 1.f; + + // change this for how aggressively the aim 'comes on'. + // lower values = less assist on outer edge of fov, more on inner. + factor = pow( factor, 3.f ); + + + m_pitch = min_sens + ( 0.022f - min_sens ) * factor, + m_yaw = min_sens + ( 0.022f - min_sens ) * factor; + + convar_set( p, pitch_ptr, m_pitch ); + convar_set( p, yaw_ptr, m_yaw ); +}
\ No newline at end of file |
