Improve Auto hitbox positioning

This commit is contained in:
SheepyChris 2021-07-04 18:58:30 -04:00 committed by LightCat
parent ab2b701e64
commit ed8f614548

View File

@ -1259,20 +1259,20 @@ int BestHitbox(CachedEntity *target)
switch (*hitbox_mode) switch (*hitbox_mode)
{ {
case 0: case 0:
{ // AUTO-HEAD priority { // AUTO priority
int preferred = int(hitbox); int preferred = int(hitbox);
bool headonly = false; // Var to keep if we can bodyshot bool headonly = false; // Var to keep if we can bodyshot
IF_GAME(IsTF()) IF_GAME(IsTF())
{ {
int ci = g_pLocalPlayer->weapon()->m_iClassID(); int ci = g_pLocalPlayer->weapon()->m_iClassID();
preferred = hitbox_t::spine_2; preferred = hitbox_t::spine_3;
// Sniper rifle // Sniper rifle
if (g_pLocalPlayer->holding_sniper_rifle) if (g_pLocalPlayer->holding_sniper_rifle)
{
headonly = CanHeadshot(); headonly = CanHeadshot();
// Hunstman
} // Hunstman
else if (ci == CL_CLASS(CTFCompoundBow)) else if (ci == CL_CLASS(CTFCompoundBow))
{ {
float begincharge = CE_FLOAT(g_pLocalPlayer->weapon(), netvar.flChargeBeginTime); float begincharge = CE_FLOAT(g_pLocalPlayer->weapon(), netvar.flChargeBeginTime);
@ -1283,6 +1283,8 @@ int BestHitbox(CachedEntity *target)
else else
preferred = hitbox_t::head; preferred = hitbox_t::head;
} }
// Ambassador
else if (IsAmbassador(g_pLocalPlayer->weapon())) else if (IsAmbassador(g_pLocalPlayer->weapon()))
{ {
headonly = AmbassadorCanHeadshot(); headonly = AmbassadorCanHeadshot();
@ -1291,54 +1293,39 @@ int BestHitbox(CachedEntity *target)
// potentially be higher // potentially be higher
if (target->m_iHealth() <= 18 || IsPlayerCritBoosted(g_pLocalPlayer->entity) || target->m_flDistance() > 1200) if (target->m_iHealth() <= 18 || IsPlayerCritBoosted(g_pLocalPlayer->entity) || target->m_flDistance() > 1200)
headonly = false; headonly = false;
// Rocket launcher
} }
// These weapons should aim at the foot if the target is grounded
else if (ci == CL_CLASS(CTFPipebombLauncher) || ci == CL_CLASS(CTFRocketLauncher) || ci == CL_CLASS(CTFParticleCannon) || ci == CL_CLASS(CTFRocketLauncher_AirStrike) || ci == CL_CLASS(CTFRocketLauncher_Mortar)) // Rockets and stickies should aim at the foot if the target is on the ground
else if (ci == CL_CLASS(CTFPipebombLauncher) ||
ci == CL_CLASS(CTFRocketLauncher) ||
ci == CL_CLASS(CTFParticleCannon) ||
ci == CL_CLASS(CTFRocketLauncher_AirStrike) ||
ci == CL_CLASS(CTFRocketLauncher_Mortar) ||
ci == CL_CLASS(CTFRocketLauncher_DirectHit))
{ {
preferred = hitbox_t::foot_L; bool ground = CE_INT(target, netvar.iFlags) & (1 << 0);
} if (ground) preferred = hitbox_t::foot_L;
// These weapons should aim at the center of mass due to little/no splash
else if (ci == CL_CLASS(CTFRocketLauncher_DirectHit) || ci == CL_CLASS(CTFGrenadeLauncher))
{
preferred = hitbox_t::spine_3;
}
// Airborn targets should always get hit in center
if (GetWeaponMode() == weaponmode::weapon_projectile)
{
if (g_pLocalPlayer->weapon()->m_iClassID() != CL_CLASS(CTFCompoundBow))
{
bool ground = CE_INT(target, netvar.iFlags) & (1 << 0);
if (!ground)
preferred = hitbox_t::spine_3;
}
} }
// Bodyshot handling // Bodyshot handling
if (g_pLocalPlayer->holding_sniper_rifle) if (g_pLocalPlayer->holding_sniper_rifle)
{ {
float cdmg = CE_FLOAT(LOCAL_W, netvar.flChargedDamage); float cdmg = CE_FLOAT(LOCAL_W, netvar.flChargedDamage);
float bdmg = 50; float bdmg = 50;
// Vaccinator damage correction, protects against 20% of damage
if (CarryingHeatmaker()) if (CarryingHeatmaker())
{ {
bdmg = (bdmg * .80) - 1; bdmg = (bdmg * .80) - 1;
cdmg = (cdmg * .80) - 1; cdmg = (cdmg * .80) - 1;
} }
// Darwins damage correction, protects against 15% of damage
// if (HasDarwins(target))
// {
// bdmg = (bdmg * .85) - 1;
// cdmg = (cdmg * .85) - 1;
// }
// Vaccinator damage correction, protects against 75% of damage // Vaccinator damage correction, protects against 75% of damage
if (HasCondition<TFCond_UberBulletResist>(target)) if (HasCondition<TFCond_UberBulletResist>(target))
{ {
bdmg = (bdmg * .25) - 1; bdmg = (bdmg * .25) - 1;
cdmg = (cdmg * .25) - 1; cdmg = (cdmg * .25) - 1;
// Passive bullet resist protects against 10% of damage
} }
// Passive bullet resist protects against 10% of damage
else if (HasCondition<TFCond_SmallBulletResist>(target)) else if (HasCondition<TFCond_SmallBulletResist>(target))
{ {
bdmg = (bdmg * .90) - 1; bdmg = (bdmg * .90) - 1;
@ -1363,12 +1350,11 @@ int BestHitbox(CachedEntity *target)
headonly = false; headonly = false;
} }
} }
// In counter-strike source, headshots are what we want
} }
// In counter-strike source, headshots are what we want
else IF_GAME(IsCSS()) else IF_GAME(IsCSS())
{
headonly = true; headonly = true;
}
// Head only // Head only
if (headonly) if (headonly)
{ {
@ -1383,19 +1369,17 @@ int BestHitbox(CachedEntity *target)
return preferred; return preferred;
// Else attempt to find any hitbox at all // Else attempt to find any hitbox at all
for (int i = projectile_mode ? 1 : 0; i < target->hitboxes.GetNumHitboxes() && i < 6; i++) for (int i = projectile_mode ? 1 : 0; i < target->hitboxes.GetNumHitboxes() && i < 6; i++)
{
if (target->hitboxes.VisibilityCheck(i)) if (target->hitboxes.VisibilityCheck(i))
return i; return i;
}
} }
break; break;
case 1: case 1:
{ // AUTO-CLOSEST priority, Return closest hitbox to crosshair { // AUTO priority, return closest hitbox to crosshair
return ClosestHitbox(target); return ClosestHitbox(target);
} }
break; break;
case 2: case 2:
{ // STATIC priority, Return a user chosen hitbox { // STATIC priority, return a user chosen hitbox
return *hitbox; return *hitbox;
} }
break; break;