I attached a screenshot of a bot, using anti-aim via the bot_mimic 1 convar:
As you can see on the screenshot, aiming at the center of the head hitbox, is not very effective for getting headshots.
I have attached my solution below with comments explaining the code:
struct Hitbox { Hitbox( void ) { hitbox = -1; } Hitbox( int newHitBox ) { hitbox = newHitBox; } int hitbox; Vector points[9]; }; enum { FL_HIGH = (1<<0), FL_LOW = (1<<1), FL_SPECIAL = (1<<2) }; struct BestPoint { BestPoint( void ) { hitbox = -1; point = 0; index = -1; dmg = -1; flags = 0; } BestPoint( int newHitBox ) { hitbox = newHitBox; point = 0; index = -1; dmg = -1; flags = 0; } Vector point; int index; int dmg; int flags; int hitbox; };
bool Aimbot::GetHitbox( CSPlayer *targetPlayer, Hitbox *box ) { matrix3x4_t matrix[MAXSTUDIOBONES]; if ( !targetPlayer->SetupBones( matrix, MAXSTUDIOBONES, BONE_USED_BY_HITBOX, 0 ) ) { return false; } studiohdr_t *studioHeader = g_InterfaceManager->ModelInfo()->GetVTable<IVModelInfo>()->GetStudiomodel( targetPlayer->GetModel() ); if ( !studioHeader ) { return false; } mstudiohitboxset_t *hitboxSet = studioHeader->pHitboxSet( targetPlayer->GetHitboxSet() ); mstudiobbox_t *untransformedBox = hitboxSet->pHitbox( box->hitbox ); // center and all the corners of the hitbox hehe Vector points[] = { ( ( untransformedBox->bbmin + untransformedBox->bbmax ) * .5f ), Vector( untransformedBox->bbmin.x, untransformedBox->bbmin.y, untransformedBox->bbmin.z ), Vector( untransformedBox->bbmin.x, untransformedBox->bbmax.y, untransformedBox->bbmin.z ), Vector( untransformedBox->bbmax.x, untransformedBox->bbmax.y, untransformedBox->bbmin.z ), Vector( untransformedBox->bbmax.x, untransformedBox->bbmin.y, untransformedBox->bbmin.z ), Vector( untransformedBox->bbmax.x, untransformedBox->bbmax.y, untransformedBox->bbmax.z ), Vector( untransformedBox->bbmin.x, untransformedBox->bbmax.y, untransformedBox->bbmax.z ), Vector( untransformedBox->bbmin.x, untransformedBox->bbmin.y, untransformedBox->bbmax.z ), Vector( untransformedBox->bbmax.x, untransformedBox->bbmin.y, untransformedBox->bbmax.z ) }; for ( int index = 0; index <= 8; ++index ) { if ( index != 0 ) { // scale down the hitbox size points[index] = ( ( ( ( points[index] + points[0] ) * .5f ) + points[index] ) * .5f ); } // transform the vector VectorTransform( points[index], matrix[untransformedBox->bone], box->points[index] ); //box.points[index] = this->GetExtrapolatedPosition( box.points[index], targetPlayer ); } return true; } bool Aimbot::GetBestPoint( CSPlayer *targetPlayer, Hitbox *box, BestPoint *best ) { Vector center = box->points[0]; // if we're checking the head hitbox if ( box->hitbox == 12 ) { // aimpoints is already 3/4 of hitbox size Vector high = ( ( box->points[3] + box->points[5] ) * .5f ); // is target looking down? float pitch = targetPlayer->GetEyeAngles().x; if ( ( pitch > 0.f ) && ( pitch <= 89.f ) ) { Vector height = ( ( ( high - box->points[0] ) / 3 ) * 4 ); Vector newhigh = ( box->points[0] + ( height * ( pitch / 89.f ) ) ); box->points[0] = newhigh; best->flags |= FL_HIGH; } // is target looking up? else if ( ( pitch < 292.5f ) && ( pitch >= 271.f ) ) { // lower the aimpoint box->points[0] -= Vector( 0.f, 0.f, 1.f ); best->flags |= FL_LOW; } } for ( int index = 0; index <= 8; ++index ) { int tmpdmg = GetDamage( box->points[index], targetPlayer ); if ( ( tmpdmg != -1 ) && ( best->dmg < tmpdmg ) && ( ( tmpdmg - best->dmg ) > 1 ) ) { best->dmg = tmpdmg; best->point = box->points[index]; best->index = index; } } return ( best->dmg > 0 ); }Usage should be quite obvious;
Result:
Happy hacking!