summaryrefslogtreecommitdiff
path: root/src/csgo/hack_aim.cpp
blob: 9c95bdf3e9e397f96dbe3fc04486828b8115f4ec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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   );
}