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
bool HasWeapon(CachedEntity *ent, int wantedId);
bool IsAmbassador(CachedEntity *ent);
bool HasDarwins(CachedEntity *ent);
bool AmbassadorCanHeadshot();
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" };
std::mutex setupbones_mutex;
static std::mutex setupbones_mutex;
matrix3x4_t *EntityHitboxCache::GetBones()
{

View File

@ -8,6 +8,7 @@
#include <settings/Bool.hpp>
#include "common.hpp"
#include "hacks/Backtrack.hpp"
#include "hacks/Aimbot.hpp"
static settings::Bool enable{ "autobackstab.enable", "0" };
static settings::Bool silent{ "autobackstab.silent", "1" };
@ -25,174 +26,121 @@ const Vector GetWorldSpaceCenter(CachedEntity *ent)
return vWorldSpaceCenter;
}
bool found;
std::pair<Vector, Vector> GetHitboxBounds(CachedEntity *it, int hitbox)
{
std::pair<Vector, Vector> result(it->hitboxes.GetHitbox(hitbox)->min,it->hitboxes.GetHitbox(hitbox)->max);
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))
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();
Ray_t ray;
Vector forward;
float sp, sy, cp, cy;
trace_t trace;
// Get a vector from my origin to my targets origin
Vector vecToTarget;
vecToTarget = GetWorldSpaceCenter(tar) - GetWorldSpaceCenter(LOCAL_E);
vecToTarget.z = 0.0f;
vecToTarget.NormalizeInPlace();
trace::filter_default.SetSelf(RAW_ENT(g_pLocalPlayer->entity));
sy = sinf(DEG2RAD(angle[1]));
cy = cosf(DEG2RAD(angle[1]));
sp = sinf(DEG2RAD(angle[0]));
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.
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);
bool canBackstab(CachedEntity *tar, Vector angle, Vector loc, Vector hitboxLoc)
{
float meleeRange = re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W));
Vector targetAngle = NET_VECTOR(RAW_ENT(tar), netvar.m_angEyeAngles);
if (fabsf(angle.y - targetAngle.y) < 80)
{
int IDX;
Vector hitLoc;
traceEntity(&IDX, &hitLoc, QAngle(angle.x, angle.y, angle.z), loc);
if (IDX == tar->m_IDX)
{
if (loc.DistTo(hitboxLoc) <= meleeRange)
return true;
}
}
return false;
}
void CreateMove()
{
if (!enable)
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 *besttarget = nullptr;
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::isBacktrackEnabled() &&
CanBackstab(target, g_pLocalPlayer->v_OrigViewangles))
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))
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 *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->hitboxes.GetHitbox(spine_2)->center.DistTo(
g_pLocalPlayer->v_Eye) <= 300.0f)
{
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->hitboxes.GetHitbox(spine_2)->center.DistTo(
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())
return;
if (hacks::shared::backtrack::iBestTarget == -1)
return;
int iBestTarget = hacks::shared::backtrack::iBestTarget;
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)))
Vector hitboxLoc =
besttarget->hitboxes.GetHitbox(spine_2)
->center;
Vector angle = NET_VECTOR(RAW_ENT(LOCAL_E), netvar.m_angEyeAngles);
for (angle.y = -180.0f; angle.y < 180.0f; angle.y += 1.0f)
{
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;
current_user_cmd->tick_count = i.tickcount;
current_user_cmd->buttons |= IN_ATTACK;
break;
}
// Get angles
Vector tr = (hitboxLoc - g_pLocalPlayer->v_Eye);
Vector xAngle;
VectorAngles(tr, xAngle);
// Clamping is important
fClampAngle(xAngle);
angle.x = xAngle.x;
if (canBackstab(besttarget, angle, g_pLocalPlayer->v_Eye, hitboxLoc))
{
current_user_cmd->viewangles = angle;
current_user_cmd->buttons |= IN_ATTACK;
besttarget = nullptr;
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;
// TODO VisCheck from patient.
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;
return vacc_sniper ? 2 : 1;
}

View File

@ -12,7 +12,7 @@
#include <settings/Bool.hpp>
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::Float follow_distance{ "follow-bot.distance", "175" };
static settings::Float follow_activation{ "follow-bot.max-range", "1000" };

View File

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

View File

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

View File

@ -546,20 +546,6 @@ bool HasWeapon(CachedEntity *ent, int wantedId)
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)
{
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)
{
Vector hit;
if (g_Settings.bInvalid)
return false;
if (entity == g_pLocalPlayer->entity)
@ -936,7 +921,10 @@ weaponmode GetWeaponMode()
classid == CL_CLASS(CTFSyringeGun) ||
classid == CL_CLASS(CTFCrossbow) ||
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;
}
@ -968,8 +956,6 @@ bool LineIntersectsBox(Vector &bmin, Vector &bmax, Vector &lmin, Vector &lmax)
return true;
}
// TODO add bison and grapple hook
// TODO FIX this function
bool GetProjectileData(CachedEntity *weapon, float &speed, float &gravity)
{
float rspeed, rgrav;
@ -982,16 +968,20 @@ bool GetProjectileData(CachedEntity *weapon, float &speed, float &gravity)
rgrav = 0.0f;
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;
break;
}
else if (classid == CL_CLASS(CTFRocketLauncher))
case CL_CLASS(CTFRocketLauncher):
{
rspeed = 1100.0f;
break;
}
else if (classid == CL_CLASS(CTFGrenadeLauncher))
case CL_CLASS(CTFGrenadeLauncher):
{
IF_GAME(IsTF2())
{
@ -1003,8 +993,9 @@ bool GetProjectileData(CachedEntity *weapon, float &speed, float &gravity)
rspeed = 1100.0f;
rgrav = 0.5f;
}
break;
}
else if (classid == CL_CLASS(CTFPipebombLauncher))
case CL_CLASS(CTFPipebombLauncher):
{
float chargebegin = *((float *) ((unsigned) RAW_ENT(LOCAL_W) + 3152));
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;
rgrav =
(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 =
g_GlobalVars->curtime * g_GlobalVars->interval_per_tick -
CE_FLOAT(weapon, netvar.flChargeBeginTime) *
g_GlobalVars->interval_per_tick;
rspeed = (fminf(fmaxf(chargetime, 0.0f), 1.0f) * 800.0f) + 1800.0f;
rgrav = (fminf(fmaxf(chargetime, 0.0f), 1.0f) * -0.40000001f) + 0.5f;
g_GlobalVars->curtime - CE_FLOAT(weapon, netvar.flChargeBeginTime);
rspeed = (float) ((float) (fminf(fmaxf(chargetime, 0.0), 1.0) * 800.0) +
1800.0);
rgrav = (float) ((float) (fminf(fmaxf(chargetime, 0.0), 1.0) *
-0.40000001) +
0.5);
break;
}
else if (classid == CL_CLASS(CTFBat_Wood))
case CL_CLASS(CTFBat_Wood):
{
rspeed = 3000.0f;
rgrav = 0.5f;
break;
}
else if (classid == CL_CLASS(CTFFlareGun))
case CL_CLASS(CTFFlareGun):
{
rspeed = 2000.0f;
rgrav = 0.25f;
break;
}
else if (classid == CL_CLASS(CTFSyringeGun))
case CL_CLASS(CTFSyringeGun):
{
rgrav = 0.2f;
rspeed = 990.0f;
break;
}
else if (classid == CL_CLASS(CTFCrossbow))
case CL_CLASS(CTFCrossbow):
{
rgrav = 0.2f;
rspeed = 2400.0f;
break;
}
else if (classid == CL_CLASS(CTFShotgunBuildingRescue))
case CL_CLASS(CTFShotgunBuildingRescue):
{
rgrav = 0.2f;
rspeed = 2400.0f;
break;
}
else if (classid == CL_CLASS(CTFDRGPomson))
case CL_CLASS(CTFDRGPomson):
{
rspeed = 1200.0f;
break;
}
else if (classid == CL_CLASS(CTFWeaponFlameBall))
case CL_CLASS(CTFWeaponFlameBall):
{
// ??
rspeed = 2500.0f;
rspeed = 3000.0f;
break;
}
case CL_CLASS(CTFRaygun):
{
rspeed = 1200.0f;
break;
}
case CL_CLASS(CTFGrapplingHook):
{
rspeed = 1500.0f;
break;
}
}
speed = rspeed;
gravity = rgrav;
return (rspeed || rgrav);
@ -1358,10 +1370,9 @@ void PrintChat(const char *fmt, ...)
va_start(list, fmt);
vsprintf(buf.get(), fmt, list);
va_end(list);
std::unique_ptr<char> str(strfmt("\x07%06X[\x07%06XCAT\x07%06X]\x01 %s",
0x5e3252, 0xba3d9a, 0x5e3252,
buf.get())
.release());
std::unique_ptr<char[]> str =
std::move(strfmt("\x07%06X[\x07%06XCAT\x07%06X]\x01 %s", 0x5e3252,
0xba3d9a, 0x5e3252, buf.get()));
// FIXME DEBUG LOG
logging::Info("%s", 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;
}
// TODO globals
int draw::width = 0;
int draw::height = 0;
float draw::fov = 90.0f;

4
update
View File

@ -2,5 +2,7 @@
#Get updated source code
git fetch;git pull origin;git submodule update --init --recursive
#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"