diff --git a/src/hacks/AntiBackstab.cpp b/src/hacks/AntiBackstab.cpp index 26394c9d..8f909caf 100644 --- a/src/hacks/AntiBackstab.cpp +++ b/src/hacks/AntiBackstab.cpp @@ -15,6 +15,10 @@ static settings::Bool silent{ "antibackstab.silent", "1" }; static settings::Float angle{ "antibackstab.angle", "107.5" }; static settings::Bool sayno{ "antibackstab.nope", "0" }; +namespace hacks::tf2::autobackstab +{ +extern bool angleCheck(CachedEntity *from, CachedEntity *to, std::optional target_pos, Vector from_angle); +} namespace hacks::tf2::antibackstab { bool noaa = false; @@ -117,11 +121,12 @@ void CreateMove() noaa = true; if (current_user_cmd->buttons & IN_ATTACK) return; - const Vector &A = LOCAL_E->m_vecOrigin(); - const Vector &B = spy->m_vecOrigin(); - diff = (A - B); - if (diff.y < 0 || CE_INT(spy, netvar.iClass) == tf_class::tf_heavy) - current_user_cmd->viewangles.x = 180.0f; + Vector spy_angle; + spy_angle = CE_VECTOR(spy, netvar.m_angEyeAngles); + fClampAngle(spy_angle); + bool couldbebackstabbed = hacks::tf2::autobackstab::angleCheck(spy, LOCAL_E, std::nullopt, spy_angle); + if (couldbebackstabbed || CE_INT(spy, netvar.iClass) == tf_class::tf_heavy) + current_user_cmd->viewangles.x = 150.0f; if (silent) g_pLocalPlayer->bUseSilentAngles = true; if (sayno) diff --git a/src/hacks/AutoBackstab.cpp b/src/hacks/AutoBackstab.cpp index 07ecf248..e9d7b920 100644 --- a/src/hacks/AutoBackstab.cpp +++ b/src/hacks/AutoBackstab.cpp @@ -15,6 +15,37 @@ namespace hacks::tf2::autobackstab static settings::Bool enabled("autobackstab.enabled", "false"); static settings::Int mode("autobackstab.mode", "0"); +bool angleCheck(CachedEntity *from, CachedEntity *to, std::optional target_pos, Vector from_angle) +{ + Vector tarAngle = CE_VECTOR(to, netvar.m_angEyeAngles); + + Vector wsc_spy_to_victim; + if (target_pos) + wsc_spy_to_victim = *target_pos - from->m_vecOrigin(); + else + wsc_spy_to_victim = to->m_vecOrigin() - from->m_vecOrigin(); + wsc_spy_to_victim.z = 0; + wsc_spy_to_victim.NormalizeInPlace(); + + Vector eye_spy; + AngleVectors2(VectorToQAngle(from_angle), &eye_spy); + eye_spy.z = 0; + eye_spy.NormalizeInPlace(); + + Vector eye_victim; + AngleVectors2(VectorToQAngle(tarAngle), &eye_victim); + eye_victim.z = 0; + eye_victim.NormalizeInPlace(); + + if (DotProduct(wsc_spy_to_victim, eye_victim) <= 0.0f) + return false; + if (DotProduct(wsc_spy_to_victim, eye_spy) <= 0.5f) + return false; + if (DotProduct(eye_spy, eye_victim) <= -0.3f) + return false; + return true; +} + static bool angleCheck(CachedEntity *target, std::optional target_pos, Vector local_angle) { Vector tarAngle = CE_VECTOR(target, netvar.m_angEyeAngles);