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!

Ingen kommentarer:
Send en kommentar