Merge pull request #540 from TotallyNotElite/master

Better Autobackstab
This commit is contained in:
LightCat 2018-08-02 16:15:56 +02:00 committed by GitHub
commit dae31355b3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 154 additions and 191 deletions

View File

@ -98,7 +98,6 @@ std::unique_ptr<char[]> strfmt(const char *fmt, ...);
// TODO move that to weaponid.h // TODO move that to weaponid.h
bool HasWeapon(CachedEntity *ent, int wantedId); bool HasWeapon(CachedEntity *ent, int wantedId);
bool IsAmbassador(CachedEntity *ent); bool IsAmbassador(CachedEntity *ent);
bool HasDarwins(CachedEntity *ent);
bool AmbassadorCanHeadshot(); bool AmbassadorCanHeadshot();
inline const char *teamname(int team) inline const char *teamname(int team)

View File

@ -108,7 +108,7 @@ bool EntityHitboxCache::VisibilityCheck(int id)
static settings::Int setupbones_time{ "source.setupbones-time", "3" }; static settings::Int setupbones_time{ "source.setupbones-time", "3" };
std::mutex setupbones_mutex; static std::mutex setupbones_mutex;
matrix3x4_t *EntityHitboxCache::GetBones() matrix3x4_t *EntityHitboxCache::GetBones()
{ {

View File

@ -8,6 +8,7 @@
#include <settings/Bool.hpp> #include <settings/Bool.hpp>
#include "common.hpp" #include "common.hpp"
#include "hacks/Backtrack.hpp" #include "hacks/Backtrack.hpp"
#include "hacks/Aimbot.hpp"
static settings::Bool enable{ "autobackstab.enable", "0" }; static settings::Bool enable{ "autobackstab.enable", "0" };
static settings::Bool silent{ "autobackstab.silent", "1" }; static settings::Bool silent{ "autobackstab.silent", "1" };
@ -25,174 +26,121 @@ const Vector GetWorldSpaceCenter(CachedEntity *ent)
return vWorldSpaceCenter; return vWorldSpaceCenter;
} }
bool found;
std::pair<Vector, Vector> GetHitboxBounds(CachedEntity *it, int hitbox) std::pair<Vector, Vector> GetHitboxBounds(CachedEntity *it, int hitbox)
{ {
std::pair<Vector, Vector> result(it->hitboxes.GetHitbox(hitbox)->min,it->hitboxes.GetHitbox(hitbox)->max); std::pair<Vector, Vector> result(it->hitboxes.GetHitbox(hitbox)->min,it->hitboxes.GetHitbox(hitbox)->max);
return result; return result;
} }
// TODO improve
bool CanBackstab(CachedEntity *tar, Vector Local_ang) void traceEntity(int *result_eindex, Vector *result_pos, QAngle angle,
Vector loc)
{ {
if (CE_BAD(tar)) Ray_t ray;
return false; Vector forward;
// Get the forward view vector of the target, ignore Z float sp, sy, cp, cy;
Vector vecVictimForward = NET_VECTOR(RAW_ENT(tar), netvar.m_angEyeAngles); trace_t trace;
vecVictimForward.z = 0.0f;
vecVictimForward.NormalizeInPlace();
// Get a vector from my origin to my targets origin trace::filter_default.SetSelf(RAW_ENT(g_pLocalPlayer->entity));
Vector vecToTarget; sy = sinf(DEG2RAD(angle[1]));
vecToTarget = GetWorldSpaceCenter(tar) - GetWorldSpaceCenter(LOCAL_E); cy = cosf(DEG2RAD(angle[1]));
vecToTarget.z = 0.0f; sp = sinf(DEG2RAD(angle[0]));
vecToTarget.NormalizeInPlace(); cp = cosf(DEG2RAD(angle[0]));
forward.x = cp * cy;
forward.y = cp * sy;
forward.z = -sp;
forward = forward * 8192.0f + loc;
ray.Init(loc, forward);
g_ITrace->TraceRay(ray, MASK_SHOT_HULL, &trace::filter_default, &trace);
if (result_pos)
*result_pos = trace.endpos;
if (result_eindex)
{
*result_eindex = 0;
}
if (trace.m_pEnt && result_eindex)
{
*result_eindex = ((IClientEntity *) (trace.m_pEnt))->entindex();
}
}
// Get a forward vector of the attacker. bool canBackstab(CachedEntity *tar, Vector angle, Vector loc, Vector hitboxLoc)
Vector vecOwnerForward = Local_ang; {
vecOwnerForward.z = 0.0f; float meleeRange = re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W));
vecOwnerForward.NormalizeInPlace(); Vector targetAngle = NET_VECTOR(RAW_ENT(tar), netvar.m_angEyeAngles);
if (fabsf(angle.y - targetAngle.y) < 80)
float flDotOwner = DotProduct(vecOwnerForward, vecToTarget); {
float flDotVictim = DotProduct(vecVictimForward, vecToTarget); int IDX;
Vector hitLoc;
// Make sure they're actually facing the target. traceEntity(&IDX, &hitLoc, QAngle(angle.x, angle.y, angle.z), loc);
// This needs to be done because lag compensation can place target slightly if (IDX == tar->m_IDX)
// behind the attacker. {
if (flDotOwner > 0.5) if (loc.DistTo(hitboxLoc) <= meleeRange)
return (flDotVictim > -0.1); return true;
}
}
return false; return false;
} }
void CreateMove() void CreateMove()
{ {
if (!enable) if (!enable)
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; CachedEntity *besttarget = nullptr;
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; for (int i = 0; i < g_IEngine->GetMaxClients(); i++)
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::isBacktrackEnabled() &&
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->hitboxes.GetHitbox(spine_2)->center.DistTo(
(min1.y <= max2.y && max1.y >= min2.y) && g_pLocalPlayer->v_Eye) <= 300.0f)
(min1.z <= max2.z && max1.z >= min2.z))
current_user_cmd->buttons |= IN_ATTACK;
}
else if (!hacks::shared::backtrack::isBacktrackEnabled())
{
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->hitboxes.GetHitbox(spine_2)->center.DistTo(
bestscr = tmp->m_flDistance(); g_pLocalPlayer->v_Eye) <
besttarget->hitboxes.GetHitbox(spine_2)->center.DistTo(
g_pLocalPlayer->v_Eye))
besttarget = target;
}
else
{
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))
{
current_user_cmd->viewangles.y = eyeang.y;
current_user_cmd->buttons |= IN_ATTACK;
if (silent)
g_pLocalPlayer->bUseSilentAngles = true;
}
break;
}
} }
else if (CE_GOOD(besttarget))
{ {
if (!hacks::shared::backtrack::isBacktrackEnabled()) Vector hitboxLoc =
return; besttarget->hitboxes.GetHitbox(spine_2)
if (hacks::shared::backtrack::iBestTarget == -1) ->center;
return; Vector angle = NET_VECTOR(RAW_ENT(LOCAL_E), netvar.m_angEyeAngles);
int iBestTarget = hacks::shared::backtrack::iBestTarget; for (angle.y = -180.0f; angle.y < 180.0f; angle.y += 1.0f)
int tickcnt = 0;
int tickus = (float(hacks::shared::backtrack::getLatency()) > 800.0f || float(hacks::shared::backtrack::getLatency()) < 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); // Get angles
// ok just in case Vector tr = (hitboxLoc - g_pLocalPlayer->v_Eye);
if (CE_BAD(tar)) Vector xAngle;
continue; VectorAngles(tr, xAngle);
Vector &angles = // Clamping is important
NET_VECTOR(RAW_ENT(tar), netvar.m_angEyeAngles); fClampAngle(xAngle);
float &simtime = angle.x = xAngle.x;
NET_FLOAT(RAW_ENT(tar), netvar.m_flSimulationTime); if (canBackstab(besttarget, angle, g_pLocalPlayer->v_Eye, hitboxLoc))
angles.y = i.viewangles; {
simtime = i.simtime; current_user_cmd->viewangles = angle;
current_user_cmd->tick_count = i.tickcount; current_user_cmd->buttons |= IN_ATTACK;
current_user_cmd->buttons |= IN_ATTACK; besttarget = nullptr;
break; if (silent)
} g_pLocalPlayer->bUseSilentAngles = true;
return;
}
} }
} }
} }
} } // namespace hacks::tf2::autobackstab

View File

@ -76,7 +76,11 @@ int BulletDangerValue(CachedEntity *patient)
any_zoomed_snipers = true; any_zoomed_snipers = true;
// TODO VisCheck from patient. // TODO VisCheck from patient.
if ((int) vacc_sniper == 1) if ((int) vacc_sniper == 1)
if (!IsEntityVisible(ent, head)) if (!IsEntityVisible(ent, head) &&
!IsVectorVisible(ENTITY(m_iCurrentHealingTarget)
->hitboxes.GetHitbox(head)
->center,
ent->hitboxes.GetHitbox(head)->center, true))
continue; continue;
return vacc_sniper ? 2 : 1; return vacc_sniper ? 2 : 1;
} }

View File

@ -12,7 +12,7 @@
#include <settings/Bool.hpp> #include <settings/Bool.hpp>
static settings::Bool enable{ "follow-bot.enable", "false" }; static settings::Bool enable{ "follow-bot.enable", "false" };
static settings::Bool roambot{ "follow-bot.roaming", "false" }; static settings::Bool roambot{ "follow-bot.roaming", "true" };
static settings::Bool draw_crumb{ "follow-bot.draw-crumbs", "false" }; static settings::Bool draw_crumb{ "follow-bot.draw-crumbs", "false" };
static settings::Float follow_distance{ "follow-bot.distance", "175" }; static settings::Float follow_distance{ "follow-bot.distance", "175" };
static settings::Float follow_activation{ "follow-bot.max-range", "1000" }; static settings::Float follow_activation{ "follow-bot.max-range", "1000" };

View File

@ -26,6 +26,7 @@ Timer lastVoicemenu{};
void Draw() void Draw()
{ {
PROF_SECTION(DRAW_SpyAlert)
if (!enable) if (!enable)
return; return;
CachedEntity *closest_spy, *ent; CachedEntity *closest_spy, *ent;

View File

@ -834,7 +834,6 @@ index_t SelectNextNode()
return FindNearestNode(true); return FindNearestNode(true);
} }
auto &n = state::nodes[state::active_node]; auto &n = state::nodes[state::active_node];
// TODO medkit connections and shit
std::vector<index_t> chance{}; std::vector<index_t> chance{};
for (index_t i = 0; i < MAX_CONNECTIONS; i++) for (index_t i = 0; i < MAX_CONNECTIONS; i++)
{ {

View File

@ -546,20 +546,6 @@ bool HasWeapon(CachedEntity *ent, int wantedId)
return false; return false;
} }
bool HasDarwins(CachedEntity *ent)
{
if (CE_BAD(ent))
return false;
// Check if player is sniper
if (CE_INT(ent, netvar.iClass) != tf_sniper)
return false;
// Check if player is using darwins, 231 is the id for darwins danger sheild
if (HasWeapon(ent, 231))
return true;
// Else return false
return false;
}
void VectorTransform(const float *in1, const matrix3x4_t &in2, float *out) void VectorTransform(const float *in1, const matrix3x4_t &in2, float *out)
{ {
out[0] = (in1[0] * in2[0][0] + in1[1] * in2[0][1] + in1[2] * in2[0][2]) + out[0] = (in1[0] * in2[0][0] + in1[1] * in2[0][1] + in1[2] * in2[0][2]) +
@ -726,7 +712,6 @@ float RandFloatRange(float min, float max)
bool IsEntityVisible(CachedEntity *entity, int hb) bool IsEntityVisible(CachedEntity *entity, int hb)
{ {
Vector hit;
if (g_Settings.bInvalid) if (g_Settings.bInvalid)
return false; return false;
if (entity == g_pLocalPlayer->entity) if (entity == g_pLocalPlayer->entity)
@ -936,7 +921,10 @@ weaponmode GetWeaponMode()
classid == CL_CLASS(CTFSyringeGun) || classid == CL_CLASS(CTFSyringeGun) ||
classid == CL_CLASS(CTFCrossbow) || classid == CL_CLASS(CTFCrossbow) ||
classid == CL_CLASS(CTFShotgunBuildingRescue) || classid == CL_CLASS(CTFShotgunBuildingRescue) ||
classid == CL_CLASS(CTFDRGPomson)) classid == CL_CLASS(CTFDRGPomson) ||
classid == CL_CLASS(CTFWeaponFlameBall) ||
classid == CL_CLASS(CTFRaygun) ||
classid == CL_CLASS(CTFGrapplingHook))
{ {
return weaponmode::weapon_projectile; return weaponmode::weapon_projectile;
} }
@ -968,8 +956,6 @@ bool LineIntersectsBox(Vector &bmin, Vector &bmax, Vector &lmin, Vector &lmax)
return true; return true;
} }
// TODO add bison and grapple hook
// TODO FIX this function
bool GetProjectileData(CachedEntity *weapon, float &speed, float &gravity) bool GetProjectileData(CachedEntity *weapon, float &speed, float &gravity)
{ {
float rspeed, rgrav; float rspeed, rgrav;
@ -982,16 +968,20 @@ bool GetProjectileData(CachedEntity *weapon, float &speed, float &gravity)
rgrav = 0.0f; rgrav = 0.0f;
typedef float(GetProjectileData)(IClientEntity *); typedef float(GetProjectileData)(IClientEntity *);
int classid = weapon->m_iClassID();
if (classid == CL_CLASS(CTFRocketLauncher_DirectHit)) switch (weapon->m_iClassID())
{
case CL_CLASS(CTFRocketLauncher_DirectHit):
{ {
rspeed = 1980.0f; rspeed = 1980.0f;
break;
} }
else if (classid == CL_CLASS(CTFRocketLauncher)) case CL_CLASS(CTFRocketLauncher):
{ {
rspeed = 1100.0f; rspeed = 1100.0f;
break;
} }
else if (classid == CL_CLASS(CTFGrenadeLauncher)) case CL_CLASS(CTFGrenadeLauncher):
{ {
IF_GAME(IsTF2()) IF_GAME(IsTF2())
{ {
@ -1003,8 +993,9 @@ bool GetProjectileData(CachedEntity *weapon, float &speed, float &gravity)
rspeed = 1100.0f; rspeed = 1100.0f;
rgrav = 0.5f; rgrav = 0.5f;
} }
break;
} }
else if (classid == CL_CLASS(CTFPipebombLauncher)) case CL_CLASS(CTFPipebombLauncher):
{ {
float chargebegin = *((float *) ((unsigned) RAW_ENT(LOCAL_W) + 3152)); float chargebegin = *((float *) ((unsigned) RAW_ENT(LOCAL_W) + 3152));
float chargetime = g_GlobalVars->curtime - chargebegin; float chargetime = g_GlobalVars->curtime - chargebegin;
@ -1012,50 +1003,71 @@ bool GetProjectileData(CachedEntity *weapon, float &speed, float &gravity)
(fminf(fmaxf(chargetime / 4.0f, 0.0f), 1.0f) * 1500.0f) + 900.0f; (fminf(fmaxf(chargetime / 4.0f, 0.0f), 1.0f) * 1500.0f) + 900.0f;
rgrav = rgrav =
(fminf(fmaxf(chargetime / 4.0f, 0.0f), 1.0f) * -0.70000001f) + 0.5f; (fminf(fmaxf(chargetime / 4.0f, 0.0f), 1.0f) * -0.70000001f) + 0.5f;
break;
} }
else if (classid == CL_CLASS(CTFCompoundBow)) case CL_CLASS(CTFCompoundBow):
{ {
float chargetime = float chargetime =
g_GlobalVars->curtime * g_GlobalVars->interval_per_tick - g_GlobalVars->curtime - CE_FLOAT(weapon, netvar.flChargeBeginTime);
CE_FLOAT(weapon, netvar.flChargeBeginTime) * rspeed = (float) ((float) (fminf(fmaxf(chargetime, 0.0), 1.0) * 800.0) +
g_GlobalVars->interval_per_tick; 1800.0);
rspeed = (fminf(fmaxf(chargetime, 0.0f), 1.0f) * 800.0f) + 1800.0f; rgrav = (float) ((float) (fminf(fmaxf(chargetime, 0.0), 1.0) *
rgrav = (fminf(fmaxf(chargetime, 0.0f), 1.0f) * -0.40000001f) + 0.5f; -0.40000001) +
0.5);
break;
} }
else if (classid == CL_CLASS(CTFBat_Wood)) case CL_CLASS(CTFBat_Wood):
{ {
rspeed = 3000.0f; rspeed = 3000.0f;
rgrav = 0.5f; rgrav = 0.5f;
break;
} }
else if (classid == CL_CLASS(CTFFlareGun)) case CL_CLASS(CTFFlareGun):
{ {
rspeed = 2000.0f; rspeed = 2000.0f;
rgrav = 0.25f; rgrav = 0.25f;
break;
} }
else if (classid == CL_CLASS(CTFSyringeGun)) case CL_CLASS(CTFSyringeGun):
{ {
rgrav = 0.2f; rgrav = 0.2f;
rspeed = 990.0f; rspeed = 990.0f;
break;
} }
else if (classid == CL_CLASS(CTFCrossbow)) case CL_CLASS(CTFCrossbow):
{ {
rgrav = 0.2f; rgrav = 0.2f;
rspeed = 2400.0f; rspeed = 2400.0f;
break;
} }
else if (classid == CL_CLASS(CTFShotgunBuildingRescue)) case CL_CLASS(CTFShotgunBuildingRescue):
{ {
rgrav = 0.2f; rgrav = 0.2f;
rspeed = 2400.0f; rspeed = 2400.0f;
break;
} }
else if (classid == CL_CLASS(CTFDRGPomson)) case CL_CLASS(CTFDRGPomson):
{ {
rspeed = 1200.0f; rspeed = 1200.0f;
break;
} }
else if (classid == CL_CLASS(CTFWeaponFlameBall)) case CL_CLASS(CTFWeaponFlameBall):
{ {
// ?? rspeed = 3000.0f;
rspeed = 2500.0f; break;
} }
case CL_CLASS(CTFRaygun):
{
rspeed = 1200.0f;
break;
}
case CL_CLASS(CTFGrapplingHook):
{
rspeed = 1500.0f;
break;
}
}
speed = rspeed; speed = rspeed;
gravity = rgrav; gravity = rgrav;
return (rspeed || rgrav); return (rspeed || rgrav);
@ -1358,10 +1370,9 @@ void PrintChat(const char *fmt, ...)
va_start(list, fmt); va_start(list, fmt);
vsprintf(buf.get(), fmt, list); vsprintf(buf.get(), fmt, list);
va_end(list); va_end(list);
std::unique_ptr<char> str(strfmt("\x07%06X[\x07%06XCAT\x07%06X]\x01 %s", std::unique_ptr<char[]> str =
0x5e3252, 0xba3d9a, 0x5e3252, std::move(strfmt("\x07%06X[\x07%06XCAT\x07%06X]\x01 %s", 0x5e3252,
buf.get()) 0xba3d9a, 0x5e3252, buf.get()));
.release());
// FIXME DEBUG LOG // FIXME DEBUG LOG
logging::Info("%s", str.get()); logging::Info("%s", str.get());
chat->Printf(str.get()); chat->Printf(str.get());

View File

@ -72,7 +72,6 @@ void AddCenterString(const std::string &string, const rgba_t &color)
++center_strings_count; ++center_strings_count;
} }
// TODO globals
int draw::width = 0; int draw::width = 0;
int draw::height = 0; int draw::height = 0;
float draw::fov = 90.0f; float draw::fov = 90.0f;

4
update
View File

@ -2,5 +2,7 @@
#Get updated source code #Get updated source code
git fetch;git pull origin;git submodule update --init --recursive git fetch;git pull origin;git submodule update --init --recursive
#Update cathook #Update cathook
cd build; cmake ..; make -j$(grep -c '^processor' /proc/cpuinfo); cd ..; cd .. cd build; cmake ..; make -j$(grep -c '^processor' /proc/cpuinfo)
#Update data
sudo make data; cd ..; cd ..
printf "\n\n";printf '\e[1;34m%-6s\e' "Cathook update complete!";printf "\n\n" printf "\n\n";printf '\e[1;34m%-6s\e' "Cathook update complete!";printf "\n\n"