Make Autobackstab worse
This commit is contained in:
parent
155af2ebb7
commit
d8806bde44
@ -9,188 +9,61 @@
|
||||
#include "hacks/Backtrack.hpp"
|
||||
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",
|
||||
"Does not depend on triggerbot!");
|
||||
static CatVar silent(CV_SWITCH, "autobackstab_silent", "1", "Silent");
|
||||
bool found;
|
||||
std::pair<Vector, Vector> GetHitboxBounds(CachedEntity *it, int hitbox)
|
||||
|
||||
bool canBackstab(CachedEntity *tar)
|
||||
{
|
||||
std::pair<Vector, Vector> result(it->hitboxes.GetHitbox(hitbox)->min,it->hitboxes.GetHitbox(hitbox)->max);
|
||||
return result;
|
||||
float _viewangles =
|
||||
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()
|
||||
{
|
||||
if (!enabled)
|
||||
return;
|
||||
if (!CE_GOOD(LOCAL_E) || !LOCAL_E->m_bAlivePlayer() || !CE_GOOD(LOCAL_W))
|
||||
return;
|
||||
if (!LOCAL_E->m_bAlivePlayer())
|
||||
if (CE_BAD(LOCAL_E) || CE_BAD(LOCAL_W) || !LOCAL_E->m_bAlivePlayer())
|
||||
return;
|
||||
if (g_pLocalPlayer->weapon()->m_iClassID() != CL_CLASS(CTFKnife))
|
||||
return;
|
||||
int eid = -1;
|
||||
Vector endpos;
|
||||
ICollideable *p = RAW_ENT(LOCAL_E)->GetCollideable();
|
||||
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))
|
||||
int meleeRange = re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W));
|
||||
CachedEntity *besttarget = nullptr;
|
||||
for (int i = 0; i < g_IEngine->GetMaxClients(); i++)
|
||||
{
|
||||
float swingrange =
|
||||
re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W));
|
||||
const Vector &max2 = GetHitboxBounds(target, 1).second +
|
||||
Vector(swingrange, swingrange, swingrange);
|
||||
const Vector &min2 = GetHitboxBounds(target, 1).first -
|
||||
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))
|
||||
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 *target = ENTITY(i);
|
||||
if (CE_BAD(target))
|
||||
continue;
|
||||
if (target == LOCAL_E || target->m_iTeam() == LOCAL_E->m_iTeam() ||
|
||||
!target->m_bAlivePlayer() || target->m_Type() != ENTITY_PLAYER)
|
||||
continue;
|
||||
if (target
|
||||
->m_vecOrigin() /*target->hitboxes.GetHitbox(spine_3)->center*/
|
||||
.DistTo(g_pLocalPlayer->v_Eye) <= meleeRange)
|
||||
{
|
||||
CachedEntity *tmp = ENTITY(i);
|
||||
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())
|
||||
if (CE_GOOD(besttarget))
|
||||
{
|
||||
bestent = tmp->m_IDX;
|
||||
bestscr = tmp->m_flDistance();
|
||||
if (target
|
||||
->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;
|
||||
}
|
||||
}
|
||||
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))
|
||||
else
|
||||
{
|
||||
g_pUserCmd->viewangles.y = eyeang.y;
|
||||
g_pUserCmd->buttons |= IN_ATTACK;
|
||||
if (silent)
|
||||
g_pLocalPlayer->bUseSilentAngles = true;
|
||||
besttarget = target;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (CE_GOOD(besttarget) && canBackstab(besttarget))
|
||||
{
|
||||
if (!hacks::shared::backtrack::enable)
|
||||
return;
|
||||
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;
|
||||
}
|
||||
}
|
||||
g_pUserCmd->buttons |= IN_ATTACK;
|
||||
besttarget = nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user