From aa98f1c7eecd1a7d134b9d8fdf7e4605fae596c8 Mon Sep 17 00:00:00 2001 From: BenCat07 Date: Tue, 15 May 2018 17:51:21 +0200 Subject: [PATCH] backtrack for legit play --- include/core/offsets.hpp | 4 + include/hacks/CMakeLists.txt | 4 +- include/hacks/Radar.hpp | 2 - include/hacks/hacklist.hpp | 2 + include/hooks.hpp | 1 + include/hooks/HookedMethods.hpp | 2 + include/reclasses/C_TFWeaponBaseMelee.hpp | 4 +- include/visual/atlas.hpp | 17 +++-- src/MiscTemporary.cpp | 2 +- src/hack.cpp | 4 + src/hacks/AntiAim.cpp | 2 +- src/hacks/CMakeLists.txt | 4 +- src/hacks/FollowBot.cpp | 12 ++- src/hacks/LagExploit.cpp | 5 +- src/hacks/Radar.cpp | 93 +++++++++++++---------- src/hooks.cpp | 1 + src/hooks/CMakeLists.txt | 3 +- src/hooks/CreateMove.cpp | 4 + src/hooks/LevelInit.cpp | 1 + src/hooks/visual/PaintTraverse.cpp | 4 +- src/targethelper.cpp | 1 + src/visual/atlas.cpp | 16 ++-- src/visual/drawmgr.cpp | 5 ++ 23 files changed, 118 insertions(+), 75 deletions(-) mode change 100755 => 100644 src/visual/atlas.cpp diff --git a/include/core/offsets.hpp b/include/core/offsets.hpp index 91e7215f..e2ccdf4f 100644 --- a/include/core/offsets.hpp +++ b/include/core/offsets.hpp @@ -172,4 +172,8 @@ struct offsets { return PlatformOffset(14, undefined, undefined); } + static constexpr uint32_t IsPlayingTimeDemo() + { + return PlatformOffset(77, undefined, 77); + } }; diff --git a/include/hacks/CMakeLists.txt b/include/hacks/CMakeLists.txt index e4abc6b0..a6903775 100644 --- a/include/hacks/CMakeLists.txt +++ b/include/hacks/CMakeLists.txt @@ -15,6 +15,7 @@ target_sources(cathook PRIVATE "${CMAKE_CURRENT_LIST_DIR}/AutoSticky.hpp" "${CMAKE_CURRENT_LIST_DIR}/AutoTaunt.hpp" "${CMAKE_CURRENT_LIST_DIR}/Bunnyhop.hpp" + "${CMAKE_CURRENT_LIST_DIR}/Backtrack.hpp" "${CMAKE_CURRENT_LIST_DIR}/CatBot.hpp" "${CMAKE_CURRENT_LIST_DIR}/FollowBot.hpp" "${CMAKE_CURRENT_LIST_DIR}/hacklist.hpp" @@ -27,7 +28,8 @@ target_sources(cathook PRIVATE "${CMAKE_CURRENT_LIST_DIR}/Spam.hpp" "${CMAKE_CURRENT_LIST_DIR}/Trigger.hpp" "${CMAKE_CURRENT_LIST_DIR}/UberSpam.hpp" - "${CMAKE_CURRENT_LIST_DIR}/Walkbot.hpp") + "${CMAKE_CURRENT_LIST_DIR}/Walkbot.hpp" + "${CMAKE_CURRENT_LIST_DIR}/Radar.hpp") if(EnableVisuals) target_sources(cathook PRIVATE diff --git a/include/hacks/Radar.hpp b/include/hacks/Radar.hpp index 0329082f..3eb2895b 100755 --- a/include/hacks/Radar.hpp +++ b/include/hacks/Radar.hpp @@ -16,8 +16,6 @@ namespace tf { namespace radar { - -void Init(); std::pair WorldToRadar(int x, int y); void Draw(); } diff --git a/include/hacks/hacklist.hpp b/include/hacks/hacklist.hpp index b5c7177f..83e58376 100755 --- a/include/hacks/hacklist.hpp +++ b/include/hacks/hacklist.hpp @@ -29,6 +29,7 @@ #include "AutoDeadringer.hpp" #include "Bunnyhop.hpp" #include "LagExploit.hpp" +#include "Radar.hpp" #include "Walkbot.hpp" #include "AutoJoin.hpp" #include "AntiBackstab.hpp" @@ -46,3 +47,4 @@ #include "Announcer.hpp" #include "Killstreak.hpp" #include "CatBot.hpp" +#include "Backtrack.hpp" diff --git a/include/hooks.hpp b/include/hooks.hpp index 3d95ded1..8a5abded 100644 --- a/include/hooks.hpp +++ b/include/hooks.hpp @@ -58,6 +58,7 @@ extern VMTHook localbaseent; extern VMTHook clientmode; extern VMTHook clientmode4; extern VMTHook client; +extern VMTHook engine; extern VMTHook netchannel; extern VMTHook clientdll; extern VMTHook matsurface; diff --git a/include/hooks/HookedMethods.hpp b/include/hooks/HookedMethods.hpp index 5e0ea1b8..9cfd1a82 100644 --- a/include/hooks/HookedMethods.hpp +++ b/include/hooks/HookedMethods.hpp @@ -68,6 +68,8 @@ DECLARE_HOOKED_METHOD(FireEventClientSide, bool, IGameEventManager2 *, #if ENABLE_VISUALS // ClientMode DECLARE_HOOKED_METHOD(OverrideView, void, void *, CViewSetup *); +// g_IEngine +DECLARE_HOOKED_METHOD(IsPlayingTimeDemo, bool); // IVModelRender DECLARE_HOOKED_METHOD(DrawModelExecute, void, IVModelRender *, const DrawModelState_t &, const ModelRenderInfo_t &, diff --git a/include/reclasses/C_TFWeaponBaseMelee.hpp b/include/reclasses/C_TFWeaponBaseMelee.hpp index 975cb152..82822bd1 100644 --- a/include/reclasses/C_TFWeaponBaseMelee.hpp +++ b/include/reclasses/C_TFWeaponBaseMelee.hpp @@ -22,9 +22,9 @@ public: self, offsets::PlatformOffset(522, offsets::undefined, 522), 0)(self, trace); } - inline static int GetSwingRange(IClientEntity *self) + inline static float GetSwingRange(IClientEntity *self) { - typedef int (*fn_t)(IClientEntity *); + typedef float (*fn_t)(IClientEntity *); return vfunc( self, offsets::PlatformOffset(520, offsets::undefined, 520), 0)(self); diff --git a/include/visual/atlas.hpp b/include/visual/atlas.hpp index f214c3ea..b8555071 100755 --- a/include/visual/atlas.hpp +++ b/include/visual/atlas.hpp @@ -19,19 +19,20 @@ class sprite; class sprite { public: - sprite(float x, float y, float w, float h, const texture_atlas &atlas); + sprite(float x, float y, float w, float h, texture_atlas &atlas); public: + void setsprite(float x, float y, float w, float h); void draw(float scrx, float scry, float scrw, float scrh, - const rgba_t &rgba) const; + const rgba_t &rgba); public: - const float nx; - const float ny; - const float nw; - const float nh; + float nx; + float ny; + float nw; + float nh; - const texture_atlas &atlas; + texture_atlas &atlas; }; class texture_atlas @@ -40,7 +41,7 @@ public: texture_atlas(std::string filename, float width, float height); public: - sprite create_sprite(float x, float y, float sx, float sy) const; + sprite create_sprite(float x, float y, float sx, float sy); public: const float width; diff --git a/src/MiscTemporary.cpp b/src/MiscTemporary.cpp index 8c948ba7..751a6c28 100644 --- a/src/MiscTemporary.cpp +++ b/src/MiscTemporary.cpp @@ -12,7 +12,7 @@ CatVar jointeam(CV_SWITCH, "fb_autoteam", "1", CatVar joinclass(CV_STRING, "fb_autoclass", "spy", "Class that will be picked after joining a team (NYI)"); -CatVar nolerp(CV_SWITCH, "nolerp", "0", "NoLerp mode (experimental)"); +CatVar nolerp(CV_SWITCH, "nolerp", "1", "NoLerp mode (experimental)"); CatVar engine_pred(CV_SWITCH, "engine_prediction", "0", "Engine Prediction"); CatVar debug_projectiles(CV_SWITCH, "debug_projectiles", "0", diff --git a/src/hack.cpp b/src/hack.cpp index ea4b740d..a9958bf4 100644 --- a/src/hack.cpp +++ b/src/hack.cpp @@ -346,6 +346,10 @@ free(logname);*/ hooks::enginevgui.HookMethod(HOOK_ARGS(Paint)); hooks::enginevgui.Apply(); + hooks::engine.Set(g_IEngine); + hooks::engine.HookMethod(HOOK_ARGS(IsPlayingTimeDemo)); + hooks::engine.Apply(); + hooks::eventmanager2.Set(g_IEventManager2); hooks::eventmanager2.HookMethod(HOOK_ARGS(FireEvent)); hooks::eventmanager2.HookMethod(HOOK_ARGS(FireEventClientSide)); diff --git a/src/hacks/AntiAim.cpp b/src/hacks/AntiAim.cpp index d05a50cb..6abf45b6 100644 --- a/src/hacks/AntiAim.cpp +++ b/src/hacks/AntiAim.cpp @@ -15,7 +15,7 @@ namespace shared namespace antiaim { -CatVar communicate(CV_SWITCH, "identify", "1", "identify", +CatVar communicate(CV_SWITCH, "identify", "0", "identify", "Auto identify for other cathook users"); CatVar enabled(CV_SWITCH, "aa_enabled", "0", "Anti-Aim", "Master AntiAim switch"); diff --git a/src/hacks/CMakeLists.txt b/src/hacks/CMakeLists.txt index f8477efe..830c7534 100644 --- a/src/hacks/CMakeLists.txt +++ b/src/hacks/CMakeLists.txt @@ -16,6 +16,7 @@ target_sources(cathook PRIVATE "${CMAKE_CURRENT_LIST_DIR}/AutoSticky.cpp" "${CMAKE_CURRENT_LIST_DIR}/AutoTaunt.cpp" "${CMAKE_CURRENT_LIST_DIR}/Bunnyhop.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Backtrack.cpp" "${CMAKE_CURRENT_LIST_DIR}/CatBot.cpp" "${CMAKE_CURRENT_LIST_DIR}/FollowBot.cpp" "${CMAKE_CURRENT_LIST_DIR}/HealArrows.cpp" @@ -27,7 +28,8 @@ target_sources(cathook PRIVATE "${CMAKE_CURRENT_LIST_DIR}/Spam.cpp" "${CMAKE_CURRENT_LIST_DIR}/Trigger.cpp" "${CMAKE_CURRENT_LIST_DIR}/UberSpam.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Walkbot.cpp") + "${CMAKE_CURRENT_LIST_DIR}/Walkbot.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Radar.cpp") if(EnableVisuals) target_sources(cathook PRIVATE diff --git a/src/hacks/FollowBot.cpp b/src/hacks/FollowBot.cpp index 49627abe..16fe12a9 100644 --- a/src/hacks/FollowBot.cpp +++ b/src/hacks/FollowBot.cpp @@ -81,7 +81,7 @@ void WorldTick() if (follow_steam) { // Find a target with the steam id, as it is prioritized - auto ent_count = g_IEngine->GetMaxClients(); + auto ent_count = HIGHEST_ENTITY; for (int i = 0; i < ent_count; i++) { auto entity = ENTITY(i); @@ -89,12 +89,10 @@ void WorldTick() continue; if (entity->m_Type != ENTITY_PLAYER) continue; - player_info_s info; - g_IEngine->GetPlayerInfo(entity->m_IDX, &info); - unsigned int xd = info.friendsID; - int xdd = xd; - if ((int) follow_steam != xdd) // steamid check + if ((int)follow_steam + 18 != entity->player_info.friendsID) // steamid check continue; + logging::Info("Success"); + if (!entity->m_bAlivePlayer) // Dont follow dead players continue; if (!VisCheckEntFromEnt(LOCAL_E, entity)) @@ -149,7 +147,7 @@ void WorldTick() } } // last check for entity before we continue - if (!follow_target) +if (!follow_target) return; } diff --git a/src/hacks/LagExploit.cpp b/src/hacks/LagExploit.cpp index 804c5eb8..dee0f7a9 100644 --- a/src/hacks/LagExploit.cpp +++ b/src/hacks/LagExploit.cpp @@ -291,9 +291,8 @@ void CreateMove() } } } - if (cloak && shoot) + if (cloak && shoot && CE_INT(LOCAL_E, netvar.iClass) != tf_class::tf_spy) { - if ((g_pUserCmd->buttons & IN_ATTACK) && !bWasHolding && HasCondition(LOCAL_E)) { @@ -345,7 +344,7 @@ void CreateMove() } else if (!shoot) { - if (cloak) + if (cloak && CE_INT(LOCAL_E, netvar.iClass) != tf_class::tf_spy) { if ((g_pUserCmd->buttons & IN_ATTACK2) && !bWasHolding && !HasCondition(LOCAL_E)) diff --git a/src/hacks/Radar.cpp b/src/hacks/Radar.cpp index b790c807..30b6a849 100644 --- a/src/hacks/Radar.cpp +++ b/src/hacks/Radar.cpp @@ -6,6 +6,7 @@ */ #include "common.hpp" +#include "Radar.hpp" #ifndef FEATURE_RADAR_DISABLED @@ -16,10 +17,6 @@ namespace tf namespace radar { -std::array, 3> tx_class; -std::array tx_teams; -std::array tx_items; - static CatVar size(CV_INT, "radar_size", "300", "Radar size", "Defines radar size in pixels"); static CatVar zoom(CV_FLOAT, "radar_zoom", "20", "Radar zoom", @@ -45,27 +42,7 @@ static CatVar show_healthpacks(CV_SWITCH, "radar_healthpacks", "1", "Show Healthpacks"); static CatVar show_ammopacks(CV_SWITCH, "radar_ammopacks", "1", "Show Ammopacks"); - -void Init() -{ - for (int i = 0; i < 3; i++) - { - for (int j = 0; j < 9; j++) - { - tx_classes[i][j].reset(new textures::AtlasTexture( - 64 * j, textures::atlas_height - 64 * (i + 1), 64, 64)); - } - } - tx_teams[0].reset(new textures::AtlasTexture( - 11 * 64, textures::atlas_height - 128, 64, 64)); - tx_teams[1].reset(new textures::AtlasTexture( - 11 * 64, textures::atlas_height - 64, 64, 64)); - - tx_items[0].reset(new textures::AtlasTexture( - 10 * 64, textures::atlas_height - 64, 64, 64)); - tx_items[1].reset(new textures::AtlasTexture( - 10 * 64, textures::atlas_height - 128, 64, 64)); -} +Timer invalid{}; std::pair WorldToRadar(int x, int y) { @@ -103,9 +80,44 @@ std::pair WorldToRadar(int x, int y) return { nx + halfsize - (int) icon_size / 2, ny + halfsize - (int) icon_size / 2 }; } +bool loaded = false; + + +textures::texture_atlas texture(DATA_PATH "/res/atlas.png", 1024, 512); void DrawEntity(int x, int y, CachedEntity *ent) { + + if (!loaded) + { + if (texture.texture.handle == GLEZ_TEXTURE_INVALID && + invalid.test_and_set(10000)) + { + logging::Info("Invalid atlas, retrying...."); + texture.texture.handle = + glez_texture_load_png_rgba(DATA_PATH "/res/atlas.png"); + return; + } + else if (texture.texture.handle != GLEZ_TEXTURE_INVALID) + loaded = true; + else + return; + } + struct basesprite + { + textures::sprite sprite = texture.create_sprite(0, 0, 0, 0); + }; + static std::array, 3> tx_class; + static std::array tx_teams; + static std::array tx_items; + for (int i = 0; i < 3; i++) + for (int j = 0; j < 9; j++) + tx_class[i][j].sprite.setsprite(64 * j, texture.height -64 * (i + 1), 64, 64); + tx_teams[0].sprite.setsprite(11 * 64, texture.height - 128, 64, 64); + tx_teams[1].sprite.setsprite(11 * 64, texture.height -64, 64, 64); + + tx_items[0].sprite.setsprite(10 * 64, texture.height - 64, 64, 64); + tx_items[1].sprite.setsprite(10 * 64, texture.height - 128, 64, 64); int idx; rgba_t clr; float healthp; @@ -128,18 +140,18 @@ void DrawEntity(int x, int y, CachedEntity *ent) if (use_icons) { - tx_teams[idx].get()->Draw(x + wtr.first, y + wtr.second, - colors::white, (int) icon_size, - (int) icon_size); - tx_classes[2][clazz - 1].get()->Draw( - x + wtr.first, y + wtr.second, colors::white, - (int) icon_size, (int) icon_size); + tx_teams[idx].sprite.draw(x + wtr.first, y + wtr.second, + (int) icon_size, (int) icon_size, + colors::white); + tx_class[2][clazz - 1].sprite.draw( + x + wtr.first, y + wtr.second, (int) icon_size, + (int) icon_size, colors::white); } else { - tx_classes[idx][clazz - 1].get()->Draw( - x + wtr.first, y + wtr.second, colors::white, - (int) icon_size, (int) icon_size); + tx_class[idx][clazz - 1].sprite.draw( + x + wtr.first, y + wtr.second, (int) icon_size, + (int) icon_size, colors::white); draw_api::draw_rect_outlined( x + wtr.first, y + wtr.second, (int) icon_size, (int) icon_size, idx ? colors::blu_v : colors::red_v, 0.5f); @@ -190,8 +202,8 @@ void DrawEntity(int x, int y, CachedEntity *ent) WorldToRadar(ent->m_vecOrigin.x, ent->m_vecOrigin.y); float sz = float(icon_size) * 0.15f * 0.5f; float sz2 = float(icon_size) * 0.85; - tx_items[1].get()->Draw(x + wtr.first + sz, y + wtr.second + sz, - colors::white, sz2, sz2); + tx_items[1].sprite.draw(x + wtr.first + sz, y + wtr.second + sz, + sz2, sz2, colors::white); } else if (show_ammopacks && (ent->m_ItemType == ITEM_AMMO_LARGE || ent->m_ItemType == ITEM_AMMO_MEDIUM || @@ -201,8 +213,8 @@ void DrawEntity(int x, int y, CachedEntity *ent) WorldToRadar(ent->m_vecOrigin.x, ent->m_vecOrigin.y); float sz = float(icon_size) * 0.15f * 0.5f; float sz2 = float(icon_size) * 0.85; - tx_items[0].get()->Draw(x + wtr.first + sz, y + wtr.second + sz, - colors::white, sz2, sz2); + tx_items[0].sprite.draw(x + wtr.first + sz, y + wtr.second + sz, + sz2, sz2, colors::white); } } } @@ -212,6 +224,8 @@ void Draw() { if (!g_IEngine->IsInGame()) return; + if (CE_BAD(LOCAL_E)) + return; int x, y; rgba_t outlineclr; std::vector enemies{}; @@ -224,8 +238,7 @@ void Draw() int radar_size = size; int half_size = radar_size / 2; - outlineclr = - (hacks::shared::aimbot::foundTarget ? colors::pink : GUIColor()); + outlineclr = GUIColor(); draw_api::draw_rect(x, y, radar_size, radar_size, colors::Transparent(colors::black, 0.4f)); diff --git a/src/hooks.cpp b/src/hooks.cpp index 10685e71..f7a75978 100644 --- a/src/hooks.cpp +++ b/src/hooks.cpp @@ -100,6 +100,7 @@ VMTHook baseclientstate8{}; VMTHook clientmode{}; VMTHook panel{}; VMTHook client{}; +VMTHook engine{}; VMTHook ctfpartyclient; VMTHook netchannel{}; VMTHook clientdll{}; diff --git a/src/hooks/CMakeLists.txt b/src/hooks/CMakeLists.txt index 90257059..3e1c11f2 100644 --- a/src/hooks/CMakeLists.txt +++ b/src/hooks/CMakeLists.txt @@ -13,7 +13,8 @@ target_sources(cathook PRIVATE "${CMAKE_CURRENT_LIST_DIR}/SendNetMsg.cpp" "${CMAKE_CURRENT_LIST_DIR}/Shutdown.cpp" "${CMAKE_CURRENT_LIST_DIR}/FireEvent.cpp" - "${CMAKE_CURRENT_LIST_DIR}/FireEventClientSide.cpp") + "${CMAKE_CURRENT_LIST_DIR}/FireEventClientSide.cpp" + "${CMAKE_CURRENT_LIST_DIR}/IsPlayingTimeDemo.cpp") if(EnableVisuals) add_subdirectory(visual) diff --git a/src/hooks/CreateMove.cpp b/src/hooks/CreateMove.cpp index b4b48089..bd61360c 100644 --- a/src/hooks/CreateMove.cpp +++ b/src/hooks/CreateMove.cpp @@ -312,6 +312,10 @@ DEFINE_HOOKED_METHOD(CreateMove, bool, void *this_, float input_sample_time, if (engine_pred) engine_prediction::RunEnginePrediction(RAW_ENT(LOCAL_E), g_pUserCmd); + { + PROF_SECTION(CM_backtracc); + hacks::shared::backtrack::Run(); + } { PROF_SECTION(CM_aimbot); hacks::shared::aimbot::CreateMove(); diff --git a/src/hooks/LevelInit.cpp b/src/hooks/LevelInit.cpp index 8104d245..9a518a24 100644 --- a/src/hooks/LevelInit.cpp +++ b/src/hooks/LevelInit.cpp @@ -111,6 +111,7 @@ DEFINE_HOOKED_METHOD(LevelInit, void, void *this_, const char *name) g_IEngine->ClientCmd_Unrestricted("exec cat_matchexec"); hacks::shared::aimbot::Reset(); + hacks::shared::backtrack::Init(); chat_stack::Reset(); hacks::shared::anticheat::ResetEverything(); original::LevelInit(this_, name); diff --git a/src/hooks/visual/PaintTraverse.cpp b/src/hooks/visual/PaintTraverse.cpp index 95529457..46133cd0 100644 --- a/src/hooks/visual/PaintTraverse.cpp +++ b/src/hooks/visual/PaintTraverse.cpp @@ -4,6 +4,7 @@ */ #include "HookedMethods.hpp" +#include "Radar.hpp" CatVar clean_screenshots(CV_SWITCH, "clean_screenshots", "1", "Clean screenshots", @@ -44,9 +45,6 @@ DEFINE_HOOKED_METHOD(PaintTraverse, void, vgui::IPanel *this_, if (!textures_loaded) { textures_loaded = true; -#ifndef FEATURE_RADAR_DISABLED - hacks::tf::radar::Init(); -#endif } #endif if (pure_bypass) diff --git a/src/targethelper.cpp b/src/targethelper.cpp index a163c309..a9261690 100755 --- a/src/targethelper.cpp +++ b/src/targethelper.cpp @@ -6,6 +6,7 @@ */ #include "common.hpp" +#include "Backtrack.hpp" /* * Targeting priorities: diff --git a/src/visual/atlas.cpp b/src/visual/atlas.cpp old mode 100755 new mode 100644 index d808d824..3af45281 --- a/src/visual/atlas.cpp +++ b/src/visual/atlas.cpp @@ -10,14 +10,20 @@ namespace textures { -sprite::sprite(float x, float y, float w, float h, const texture_atlas &atlas) +sprite::sprite(float x, float y, float w, float h, texture_atlas &atlas) : nx(x / atlas.width), ny(y / atlas.height), nw(w / atlas.width), nh(h / atlas.height), atlas(atlas) { } - +void sprite::setsprite(float x, float y, float w, float h) +{ + nx = x; + ny = y; + nw = w; + nh = h; +} void sprite::draw(float scrx, float scry, float scrw, float scrh, - const rgba_t &rgba) const + const rgba_t &rgba) { draw_api::draw_rect_textured(scrx, scry, scrw, scrh, rgba, atlas.texture, nx, ny, nw, nh, 0); @@ -29,14 +35,14 @@ texture_atlas::texture_atlas(std::string filename, float width, float height) texture = draw_api::create_texture(filename.c_str()); } -sprite texture_atlas::create_sprite(float x, float y, float sx, float sy) const +sprite texture_atlas::create_sprite(float x, float y, float sx, float sy) { return sprite(x, y, sx, sy, *this); } texture_atlas &atlas() { - static texture_atlas object{ DATA_PATH "/atlas.png", 1024, 512 }; + static texture_atlas object{ DATA_PATH "/res/atlas.png", 1024, 512 }; return object; } } diff --git a/src/visual/drawmgr.cpp b/src/visual/drawmgr.cpp index 3a921f02..d5faf71c 100644 --- a/src/visual/drawmgr.cpp +++ b/src/visual/drawmgr.cpp @@ -139,6 +139,11 @@ void DrawCheatVisuals() hacks::tf::autoreflect::Draw(); } IF_GAME(IsTF2()) + { + PROF_SECTION(DRAW_backtracc); + hacks::shared::backtrack::Draw(); + } + IF_GAME(IsTF2()) { PROF_SECTION(DRAW_healarrows); hacks::tf2::healarrow::Draw();