float aimbot::calc_hc( QAngle vangles, const aimpoint_t& point, C_CSPlayer* player ) const
{
auto weapon = get_weapon( g_pLocalPlayer->get_active_weapon() );
if ( !weapon )
return 0.f;
const auto hitchance_cfg = get_config( weapon )->hitchance->get<float>();
const auto backupvel = g_pLocalPlayer->get_velocity();
const auto backupabsvel = g_pLocalPlayer->get_abs_velocity();
g_pLocalPlayer->get_abs_velocity() = g_pLocalPlayer->get_velocity() = prediction::get().get_unpred_vel();
weapon->update_accuracy();
g_pLocalPlayer->get_velocity() = backupvel;
g_pLocalPlayer->get_abs_velocity() = backupabsvel;
Vector forward, right, up;
const auto eyepos = prediction::get().get_unpred_eyepos();
const auto spread = weapon->get_spread();
const auto inaccuracy = weapon->get_inaccuracy();
const auto angles = vangles.Clamp();
math::get().angle_vectors( angles, &forward, &right, &up );
math::get().fast_vec_normalize( forward );
math::get().fast_vec_normalize( right );
math::get().fast_vec_normalize( up );
auto endpoint = point.center;
const auto needed = static_cast< int >( 256 * ( hitchance_cfg / 100.f ) );
const auto allowed_misses = 256 - needed;
auto hits = 0;
auto i = 0;
while ( i < 256 )
{
random_seed( ( i & 255 ) + 1 );
const auto b = random_float( 0.f, 2.0f * M_PI );
const auto c = random_float( 0.0f, 1.0f );
const auto d = random_float( 0.f, 2.0f * M_PI );
const auto spread_val = c * spread;
const auto inaccuracy_val = c * inaccuracy;
const Vector v_spread( ( cos( b ) * spread_val ) + ( cos( d ) * inaccuracy_val ), ( sin( b ) * spread_val ) + ( sin( d ) * inaccuracy_val ), 0 );
Vector dir;
dir.x = forward.x + ( right.x * v_spread.x ) + ( up.x * v_spread.y );
dir.y = forward.y + ( right.y * v_spread.x ) + ( up.y * v_spread.y );
dir.z = forward.z + ( right.z * v_spread.x ) + ( up.z * v_spread.y );
math::get().fast_vec_normalize( dir );
QAngle spread_view;
Vector end;
math::get().vector_angles( dir, spread_view );
spread_view.NormalizeNoClamp();
math::get().angle_vectors( angles - ( spread_view - angles ), &end );
math::get().fast_vec_normalize( end );
trace_t tr;
Ray_t ray;
const auto trace_end = eyepos + ( end * endpoint.Dist( eyepos ) );
ray.Init( eyepos, trace_end );
//g_pDebugOverlay->AddLineOverlay( eyepos, trace_end, 180, 240, 0, true, 0.1f );
g_pTrace->ClipRayToEntity( ray, MASK_SHOT_HULL | CONTENTS_HITBOX, player, &tr );
if ( tr.m_pEnt == player )
hits++;
const auto hitchance = ( static_cast< float >( hits ) / 255.f ) * 100.f;
if ( hitchance >= hitchance_cfg )
return hitchance;
if ( i - hits > allowed_misses )
return hitchance;
i++;
}
return 0.0f;
}