summaryrefslogtreecommitdiff
path: root/src/csgo/hack_aim.cpp
diff options
context:
space:
mode:
authornavewindre <nw@moneybot.cc>2024-07-12 00:55:39 +0200
committernavewindre <nw@moneybot.cc>2024-07-12 00:55:39 +0200
commit2ebf959ec02048c15323e1bbfc63faedcf5067b6 (patch)
tree18862ba5d3b4be44294c0a81317d31eace7ee150 /src/csgo/hack_aim.cpp
parentecca2728f1a583ea484f8bdcda390a30e4906f1d (diff)
ha haaa
Diffstat (limited to 'src/csgo/hack_aim.cpp')
-rw-r--r--src/csgo/hack_aim.cpp110
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