Make Autobackstab worse

This commit is contained in:
TotallyNotElite 2018-07-31 22:56:37 +02:00
parent 155af2ebb7
commit d8806bde44

View File

@ -9,188 +9,61 @@
#include "hacks/Backtrack.hpp" #include "hacks/Backtrack.hpp"
namespace hacks::tf2::autobackstab namespace hacks::tf2::autobackstab
{ {
// pPaste, thanks to F1ssi0N
const Vector GetWorldSpaceCenter(CachedEntity *ent)
{
Vector vMin, vMax;
RAW_ENT(ent)->GetRenderBounds(vMin, vMax);
Vector vWorldSpaceCenter = RAW_ENT(ent)->GetAbsOrigin();
vWorldSpaceCenter.z += (vMin.z + vMax.z) / 2;
return vWorldSpaceCenter;
}
static CatVar enabled(CV_SWITCH, "autobackstab", "0", "Auto Backstab", static CatVar enabled(CV_SWITCH, "autobackstab", "0", "Auto Backstab",
"Does not depend on triggerbot!"); "Does not depend on triggerbot!");
static CatVar silent(CV_SWITCH, "autobackstab_silent", "1", "Silent");
bool found; bool canBackstab(CachedEntity *tar)
std::pair<Vector, Vector> GetHitboxBounds(CachedEntity *it, int hitbox)
{ {
std::pair<Vector, Vector> result(it->hitboxes.GetHitbox(hitbox)->min,it->hitboxes.GetHitbox(hitbox)->max); float _viewangles =
return result; NET_VECTOR(RAW_ENT(tar), netvar.m_angEyeAngles).y;
float viewangles =
(_viewangles > 180) ? _viewangles - 360 : _viewangles;
float scr = abs(g_pLocalPlayer->v_OrigViewangles.y - viewangles);
return (scr <= 90.0f);
} }
// TODO improve
bool CanBackstab(CachedEntity *tar, Vector Local_ang)
{
if (CE_BAD(tar))
return false;
// Get the forward view vector of the target, ignore Z
Vector vecVictimForward = NET_VECTOR(RAW_ENT(tar), netvar.m_angEyeAngles);
vecVictimForward.z = 0.0f;
vecVictimForward.NormalizeInPlace();
// Get a vector from my origin to my targets origin
Vector vecToTarget;
vecToTarget = GetWorldSpaceCenter(tar) - GetWorldSpaceCenter(LOCAL_E);
vecToTarget.z = 0.0f;
vecToTarget.NormalizeInPlace();
// Get a forward vector of the attacker.
Vector vecOwnerForward = Local_ang;
vecOwnerForward.z = 0.0f;
vecOwnerForward.NormalizeInPlace();
float flDotOwner = DotProduct(vecOwnerForward, vecToTarget);
float flDotVictim = DotProduct(vecVictimForward, vecToTarget);
// Make sure they're actually facing the target.
// This needs to be done because lag compensation can place target slightly
// behind the attacker.
if (flDotOwner > 0.5)
return (flDotVictim > -0.1);
return false;
}
void CreateMove() void CreateMove()
{ {
if (!enabled) if (!enabled)
return; return;
if (!CE_GOOD(LOCAL_E) || !LOCAL_E->m_bAlivePlayer() || !CE_GOOD(LOCAL_W)) if (CE_BAD(LOCAL_E) || CE_BAD(LOCAL_W) || !LOCAL_E->m_bAlivePlayer())
return;
if (!LOCAL_E->m_bAlivePlayer())
return; return;
if (g_pLocalPlayer->weapon()->m_iClassID() != CL_CLASS(CTFKnife)) if (g_pLocalPlayer->weapon()->m_iClassID() != CL_CLASS(CTFKnife))
return; return;
int eid = -1; int meleeRange = re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W));
Vector endpos; CachedEntity *besttarget = nullptr;
ICollideable *p = RAW_ENT(LOCAL_E)->GetCollideable(); for (int i = 0; i < g_IEngine->GetMaxClients(); i++)
const Vector &max1 = p->OBBMaxs() + RAW_ENT(LOCAL_E)->GetAbsOrigin();
const Vector &min1 = p->OBBMins() + RAW_ENT(LOCAL_E)->GetAbsOrigin();
WhatIAmLookingAt(&eid, &endpos);
CachedEntity *target = nullptr;
if (eid > -1)
target = ENTITY(eid);
if (CE_GOOD(target) && target != LOCAL_E &&
target->m_iTeam() != LOCAL_E->m_iTeam() && target->m_bAlivePlayer() &&
target->m_Type() == ENTITY_PLAYER &&
!hacks::shared::backtrack::enable &&
CanBackstab(target, g_pLocalPlayer->v_OrigViewangles))
{ {
float swingrange = CachedEntity *target = ENTITY(i);
re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W)); if (CE_BAD(target))
const Vector &max2 = GetHitboxBounds(target, 1).second + continue;
Vector(swingrange, swingrange, swingrange); if (target == LOCAL_E || target->m_iTeam() == LOCAL_E->m_iTeam() ||
const Vector &min2 = GetHitboxBounds(target, 1).first - !target->m_bAlivePlayer() || target->m_Type() != ENTITY_PLAYER)
Vector(swingrange, swingrange, swingrange); continue;
if ((min1.x <= max2.x && max1.x >= min2.x) && if (target
(min1.y <= max2.y && max1.y >= min2.y) && ->m_vecOrigin() /*target->hitboxes.GetHitbox(spine_3)->center*/
(min1.z <= max2.z && max1.z >= min2.z)) .DistTo(g_pLocalPlayer->v_Eye) <= meleeRange)
g_pUserCmd->buttons |= IN_ATTACK;
}
else if (!hacks::shared::backtrack::enable)
{
CachedEntity *tar = nullptr;
float bestscr = 9999.9f;
int bestent = -1;
for (int i = 0; i < g_IEngine->GetMaxClients(); i++)
{ {
CachedEntity *tmp = ENTITY(i); if (CE_GOOD(besttarget))
if (CE_BAD(tmp))
continue;
if (tmp == LOCAL_E)
continue;
if (tmp->m_iTeam() == LOCAL_E->m_iTeam())
continue;
if (!tmp->m_bAlivePlayer())
continue;
if (tmp->m_Type() != ENTITY_PLAYER)
continue;
float swingrange =
re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W));
ICollideable *c = RAW_ENT(tmp)->GetCollideable();
const Vector &max2 = c->OBBMaxs() + tmp->m_vecOrigin() +
Vector(swingrange, swingrange, swingrange);
const Vector &min2 = c->OBBMins() + tmp->m_vecOrigin() -
Vector(swingrange, swingrange, swingrange);
if ((min1.x <= max2.x && max1.x >= min2.x) &&
(min1.y <= max2.y && max1.y >= min2.y) &&
(min1.z <= max2.z && max1.z >= min2.z) &&
bestscr > tmp->m_flDistance())
{ {
bestent = tmp->m_IDX; if (target
bestscr = tmp->m_flDistance(); ->m_vecOrigin() /*target->hitboxes.GetHitbox(spine_3)->center*/
.DistTo(g_pLocalPlayer->v_Eye) >
target
->m_vecOrigin() /* besttarget->hitboxes.GetHitbox(spine_3)->center*/
.DistTo(g_pLocalPlayer->v_Eye))
besttarget = target;
} }
} else
if (bestent > -1)
tar = ENTITY(bestent);
if (CE_BAD(tar))
return;
Vector eyeang = g_pLocalPlayer->v_OrigViewangles;
for (float i = -180.0f; i < 180.0f; i += 30.0f)
{
eyeang.y = i;
if (CanBackstab(tar, eyeang))
{ {
g_pUserCmd->viewangles.y = eyeang.y; besttarget = target;
g_pUserCmd->buttons |= IN_ATTACK;
if (silent)
g_pLocalPlayer->bUseSilentAngles = true;
} }
break;
} }
} }
else if (CE_GOOD(besttarget) && canBackstab(besttarget))
{ {
if (!hacks::shared::backtrack::enable) g_pUserCmd->buttons |= IN_ATTACK;
return; besttarget = nullptr;
if (hacks::shared::backtrack::iBestTarget == -1)
return;
int iBestTarget = hacks::shared::backtrack::iBestTarget;
int tickcnt = 0;
int tickus = (float(hacks::shared::backtrack::latency) > 800.0f || float(hacks::shared::backtrack::latency) < 200.0f) ? 12 : 24;
for (auto i : hacks::shared::backtrack::headPositions[iBestTarget])
{
bool good_tick = false;
for (int j = 0; j < tickus; ++j)
if (tickcnt == hacks::shared::backtrack::sorted_ticks[j].tick &&
hacks::shared::backtrack::sorted_ticks[j].tickcount !=
INT_MAX)
good_tick = true;
tickcnt++;
if (!good_tick)
continue;
float scr = abs(g_pLocalPlayer->v_OrigViewangles.y - i.viewangles);
if (scr <= 90.0f &&
i.origin.DistTo(g_pLocalPlayer->v_Eye) <=
re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W)))
{
CachedEntity *tar = ENTITY(iBestTarget);
// ok just in case
if (CE_BAD(tar))
continue;
Vector &angles =
NET_VECTOR(RAW_ENT(tar), netvar.m_angEyeAngles);
float &simtime =
NET_FLOAT(RAW_ENT(tar), netvar.m_flSimulationTime);
angles.y = i.viewangles;
simtime = i.simtime;
g_pUserCmd->tick_count = i.tickcount;
g_pUserCmd->buttons |= IN_ATTACK;
break;
}
}
} }
} }
} }