diff --git a/include/helpers.hpp b/include/helpers.hpp index c8bf44a1..ee20e429 100644 --- a/include/helpers.hpp +++ b/include/helpers.hpp @@ -98,7 +98,6 @@ std::unique_ptr 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) diff --git a/src/entityhitboxcache.cpp b/src/entityhitboxcache.cpp index 4d47fcbf..18df915e 100644 --- a/src/entityhitboxcache.cpp +++ b/src/entityhitboxcache.cpp @@ -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() { diff --git a/src/hacks/AutoBackstab.cpp b/src/hacks/AutoBackstab.cpp index 023760b8..46a0eabb 100644 --- a/src/hacks/AutoBackstab.cpp +++ b/src/hacks/AutoBackstab.cpp @@ -8,6 +8,7 @@ #include #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 GetHitboxBounds(CachedEntity *it, int hitbox) { std::pair 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 diff --git a/src/hacks/AutoHeal.cpp b/src/hacks/AutoHeal.cpp index 70d50a79..38707c30 100644 --- a/src/hacks/AutoHeal.cpp +++ b/src/hacks/AutoHeal.cpp @@ -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; } diff --git a/src/hacks/FollowBot.cpp b/src/hacks/FollowBot.cpp index a9c31134..f820c0f7 100644 --- a/src/hacks/FollowBot.cpp +++ b/src/hacks/FollowBot.cpp @@ -12,7 +12,7 @@ #include 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" }; diff --git a/src/hacks/SpyAlert.cpp b/src/hacks/SpyAlert.cpp index 291d3402..16ef8bb7 100644 --- a/src/hacks/SpyAlert.cpp +++ b/src/hacks/SpyAlert.cpp @@ -26,6 +26,7 @@ Timer lastVoicemenu{}; void Draw() { + PROF_SECTION(DRAW_SpyAlert) if (!enable) return; CachedEntity *closest_spy, *ent; diff --git a/src/hacks/Walkbot.cpp b/src/hacks/Walkbot.cpp index a650302d..1afc4a3e 100644 --- a/src/hacks/Walkbot.cpp +++ b/src/hacks/Walkbot.cpp @@ -834,7 +834,6 @@ index_t SelectNextNode() return FindNearestNode(true); } auto &n = state::nodes[state::active_node]; - // TODO medkit connections and shit std::vector chance{}; for (index_t i = 0; i < MAX_CONNECTIONS; i++) { diff --git a/src/helpers.cpp b/src/helpers.cpp index 5a9cbdd6..068b290f 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -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 str(strfmt("\x07%06X[\x07%06XCAT\x07%06X]\x01 %s", - 0x5e3252, 0xba3d9a, 0x5e3252, - buf.get()) - .release()); + std::unique_ptr 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()); diff --git a/src/visual/drawing.cpp b/src/visual/drawing.cpp index 8446ec11..1044b512 100644 --- a/src/visual/drawing.cpp +++ b/src/visual/drawing.cpp @@ -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; diff --git a/update b/update index 167c4b32..e51da3de 100755 --- a/update +++ b/update @@ -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"