From 77dcc3d44f33e36843d3452ae123433fcc3d0463 Mon Sep 17 00:00:00 2001 From: TotallyNotElite <1yourexperiment@protonmail.com> Date: Sat, 11 Aug 2018 13:36:33 +0200 Subject: [PATCH 1/5] Fix isBacktrackEnabled --- include/hacks/Backtrack.hpp | 3 +-- src/hacks/Aimbot.cpp | 2 +- src/hacks/AutoBackstab.cpp | 13 ++++++------- src/hacks/Backtrack.cpp | 36 +++++++++++++++++------------------- src/hacks/Trigger.cpp | 2 +- 5 files changed, 26 insertions(+), 30 deletions(-) diff --git a/include/hacks/Backtrack.hpp b/include/hacks/Backtrack.hpp index 343a69ba..fb39f395 100644 --- a/include/hacks/Backtrack.hpp +++ b/include/hacks/Backtrack.hpp @@ -40,7 +40,6 @@ void Run(); void Draw(); void AddLatencyToNetchan(INetChannel *, float); void UpdateIncomingSequences(); -bool shouldBacktrack(); extern int lastincomingsequencenumber; extern int BestTick; extern int iBestTarget; @@ -60,7 +59,7 @@ typedef boost::circular_buffer_space_optimized circular_buf; extern circular_buf sequences; extern BacktrackData headPositions[32][66]; -bool isBacktrackEnabled(); +extern bool isBacktrackEnabled; float getLatency(); int getTicks(); bool ValidTick(BacktrackData &i, CachedEntity *ent); diff --git a/src/hacks/Aimbot.cpp b/src/hacks/Aimbot.cpp index 60d09e13..aaa23ad1 100644 --- a/src/hacks/Aimbot.cpp +++ b/src/hacks/Aimbot.cpp @@ -91,7 +91,7 @@ AimbotCalculatedData_s calculated_data_array[2048]{}; #define IsMelee GetWeaponMode() == weapon_melee bool BacktrackAimbot() { - if (!hacks::shared::backtrack::isBacktrackEnabled() || !*backtrackAimbot) + if (!hacks::shared::backtrack::isBacktrackEnabled || !*backtrackAimbot) return false; if (aimkey && !aimkey.isKeyDown()) return true; diff --git a/src/hacks/AutoBackstab.cpp b/src/hacks/AutoBackstab.cpp index f68fd3f9..89c966b2 100644 --- a/src/hacks/AutoBackstab.cpp +++ b/src/hacks/AutoBackstab.cpp @@ -45,9 +45,9 @@ int ClosestDistanceHitbox(CachedEntity *target, { int closest = -1; float closest_dist = 0.0f, dist = 0.0f; - for (int i = spine_0; i < spine_3; i++) + for (int i = pelvis; i < lowerArm_R; i++) { - if (hacks::shared::backtrack::isBacktrackEnabled()) + if (hacks::shared::backtrack::isBacktrackEnabled) dist = g_pLocalPlayer->v_Eye.DistTo(btd.hitboxes.at(i).center); else dist = g_pLocalPlayer->v_Eye.DistTo( @@ -67,7 +67,7 @@ bool unifiedCanBackstab(Vector &vecAngle, Vector min, Vector max, // Get melee range float meleeRange = re::C_TFWeaponBaseMelee::GetSwingRange(RAW_ENT(LOCAL_W)); if (fabsf(vecAngle.y - - NET_VECTOR(RAW_ENT(besttarget), netvar.m_angEyeAngles).y) >= 50) + NET_VECTOR(RAW_ENT(besttarget), netvar.m_angEyeAngles).y) >= 60.0f) return false; if (!min.x && !max.x) return false; @@ -104,9 +104,8 @@ bool unifiedCanBackstab(Vector &vecAngle, Vector min, Vector max, forward.z = -sp; forward = forward * meleeRange + head; - Vector hit; // Check if we our line is within the targets hitbox - if (hacks::shared::triggerbot::CheckLineBox(minz, maxz, head, forward, hit)) + if (LineIntersectsBox(minz, maxz, head, forward)) return true; return false; } @@ -122,7 +121,7 @@ void CreateMove() if (!CanShoot()) return; CachedEntity *besttarget = nullptr; - if (!backtrack::isBacktrackEnabled()) + if (!backtrack::isBacktrackEnabled) { for (int i = 0; i < g_IEngine->GetMaxClients(); i++) { @@ -173,7 +172,7 @@ void CreateMove() { hacks::shared::anti_anti_aim::resolveEnt(besttarget->m_IDX); Vector angle = NET_VECTOR(RAW_ENT(LOCAL_E), netvar.m_angEyeAngles); - if (!backtrack::isBacktrackEnabled()) + if (!backtrack::isBacktrackEnabled) { for (angle.y = -180.0f; angle.y < 180.0f; angle.y += 10.0f) { diff --git a/src/hacks/Backtrack.cpp b/src/hacks/Backtrack.cpp index 8d18fc7f..d3387b4f 100644 --- a/src/hacks/Backtrack.cpp +++ b/src/hacks/Backtrack.cpp @@ -22,10 +22,12 @@ namespace hacks::shared::backtrack { void EmptyBacktrackData(BacktrackData &i); std::pair getBestEntBestTick(); +bool shouldBacktrack(); + BacktrackData headPositions[32][66]{}; int highesttick[32]{}; int lastincomingsequencenumber = 0; -static bool shouldDrawBt; +bool isBacktrackEnabled; circular_buf sequences{ 2048 }; void UpdateIncomingSequences() @@ -71,19 +73,16 @@ int BestTick = 0; int iBestTarget = -1; void Run() { - if (!enable) + if (!shouldBacktrack()) + { + isBacktrackEnabled = false; return; + } + isBacktrackEnabled = true; if (CE_BAD(LOCAL_E)) return; - if (!shouldBacktrack()) - { - shouldDrawBt = false; - return; - } - shouldDrawBt = true; - CUserCmd *cmd = current_user_cmd; float bestFov = 99999; @@ -151,12 +150,10 @@ void Run() void Draw() { #if ENABLE_VISUALS - if (!enable) + if (!isBacktrackEnabled) return; if (!draw_bt) return; - if (!shouldDrawBt) - return; for (int i = 0; i < g_IEngine->GetMaxClients(); i++) { CachedEntity *ent = ENTITY(i); @@ -192,10 +189,16 @@ void Draw() #endif } +// Internal only, use isBacktrackEnabled var instead bool shouldBacktrack() { + if (!*enable) + return false; + CachedEntity *wep = g_pLocalPlayer->weapon(); + if (CE_BAD(wep)) + return false; int slot = - re::C_BaseCombatWeapon::GetSlot(RAW_ENT(g_pLocalPlayer->weapon())); + re::C_BaseCombatWeapon::GetSlot(RAW_ENT(wep)); switch ((int) slots) { case 0: @@ -229,11 +232,6 @@ bool shouldBacktrack() return false; } -bool isBacktrackEnabled() -{ - return *enable; -} - float getLatency() { return *latency; @@ -293,7 +291,7 @@ std::pair getBestEntBestTick() } else { - float bestFov = 0.0f; + float bestFov = 100.0f; for (int i = 0; i < g_IEngine->GetMaxClients(); i++) { CachedEntity *tar = ENTITY(i); diff --git a/src/hacks/Trigger.cpp b/src/hacks/Trigger.cpp index 4988eb25..25d696c5 100644 --- a/src/hacks/Trigger.cpp +++ b/src/hacks/Trigger.cpp @@ -109,7 +109,7 @@ void CreateMove() CachedEntity *ent = FindEntInSight(EffectiveTargetingRange()); // Check if can backtrack, shoot if we can - if (!CanBacktrack() || hacks::shared::backtrack::isBacktrackEnabled()) + if (!CanBacktrack() || hacks::shared::backtrack::isBacktrackEnabled) return; // Check if dormant or null to prevent crashes From 2fa43fe72f418609e793bb453abbe8171422b81a Mon Sep 17 00:00:00 2001 From: TotallyNotElite <1yourexperiment@protonmail.com> Date: Sat, 11 Aug 2018 18:30:50 +0200 Subject: [PATCH 2/5] Disable latency when backtrack disabled --- src/hacks/AutoBackstab.cpp | 3 ++- src/hacks/Backtrack.cpp | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/hacks/AutoBackstab.cpp b/src/hacks/AutoBackstab.cpp index 89c966b2..38ee2fcf 100644 --- a/src/hacks/AutoBackstab.cpp +++ b/src/hacks/AutoBackstab.cpp @@ -104,8 +104,9 @@ bool unifiedCanBackstab(Vector &vecAngle, Vector min, Vector max, forward.z = -sp; forward = forward * meleeRange + head; + Vector hit; // Check if we our line is within the targets hitbox - if (LineIntersectsBox(minz, maxz, head, forward)) + if (hacks::shared::triggerbot::CheckLineBox(minz, maxz, head, forward, hit)) return true; return false; } diff --git a/src/hacks/Backtrack.cpp b/src/hacks/Backtrack.cpp index d3387b4f..b7b01a7a 100644 --- a/src/hacks/Backtrack.cpp +++ b/src/hacks/Backtrack.cpp @@ -27,7 +27,7 @@ bool shouldBacktrack(); BacktrackData headPositions[32][66]{}; int highesttick[32]{}; int lastincomingsequencenumber = 0; -bool isBacktrackEnabled; +bool isBacktrackEnabled = false; circular_buf sequences{ 2048 }; void UpdateIncomingSequences() @@ -50,6 +50,8 @@ void UpdateIncomingSequences() } void AddLatencyToNetchan(INetChannel *ch, float Latency) { + if (!isBacktrackEnabled) + return; if (Latency > 200.0f) Latency -= ch->GetLatency(MAX_FLOWS); for (auto &seq : sequences) From d417b2b778ecbfe44e11d903b0a608e5cc760825 Mon Sep 17 00:00:00 2001 From: TotallyNotElite <1yourexperiment@protonmail.com> Date: Sun, 12 Aug 2018 13:57:36 +0200 Subject: [PATCH 3/5] Fix clang gay --- include/core/netvars.hpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/core/netvars.hpp b/include/core/netvars.hpp index b22de707..cee7796b 100755 --- a/include/core/netvars.hpp +++ b/include/core/netvars.hpp @@ -11,9 +11,15 @@ class IClientEntity; +// Fix clang gay +#if defined(__clang__) +#define NET_VAR(entity, offset, type) \ + (*(reinterpret_cast(reinterpret_cast(entity) + (offset)))) +#elif defined(__GNUC__) || defined(__GNUG__) #define NET_VAR(entity, offset, type) \ (*(reinterpret_cast(reinterpret_cast(entity) + \ (offset)))) +#endif #define NET_INT(entity, offset) NET_VAR(entity, offset, int) From 3aebbc1c4af686403bb64e6d632150dca9b5c8a9 Mon Sep 17 00:00:00 2001 From: TotallyNotElite <1yourexperiment@protonmail.com> Date: Sun, 12 Aug 2018 17:30:06 +0200 Subject: [PATCH 4/5] WIP: Pathfinding --- .gitmodules | 6 +++ external/PathFinder | 1 + external/TF2_NavFile_Reader | 1 + src/CMakeLists.txt | 5 +- src/pathfinder.cpp | 101 ++++++++++++++++++++++++++++++++++++ 5 files changed, 112 insertions(+), 2 deletions(-) mode change 100755 => 100644 .gitmodules create mode 160000 external/PathFinder create mode 160000 external/TF2_NavFile_Reader create mode 100644 src/pathfinder.cpp diff --git a/.gitmodules b/.gitmodules old mode 100755 new mode 100644 index 84ae995f..492db354 --- a/.gitmodules +++ b/.gitmodules @@ -16,3 +16,9 @@ [submodule "external/co-library"] path = external/co-library url = https://github.com/nullworks/co-library.git +[submodule "external/TF2_NavFile_Reader"] + path = external/TF2_NavFile_Reader + url = https://github.com/nullworks/TF2_NavFile_Reader +[submodule "external/PathFinder"] + path = external/PathFinder + url = https://github.com/Sahnvour/PathFinder diff --git a/external/PathFinder b/external/PathFinder new file mode 160000 index 00000000..03bac251 --- /dev/null +++ b/external/PathFinder @@ -0,0 +1 @@ +Subproject commit 03bac25118aaa65822d036ac9f3b82124b681ad9 diff --git a/external/TF2_NavFile_Reader b/external/TF2_NavFile_Reader new file mode 160000 index 00000000..3514e482 --- /dev/null +++ b/external/TF2_NavFile_Reader @@ -0,0 +1 @@ +Subproject commit 3514e4821928dbdabe26ce324bf4f510380ad007 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0e7ab9cc..90a49c3a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -33,7 +33,8 @@ target_sources(cathook PRIVATE "${CMAKE_CURRENT_LIST_DIR}/votelogger.cpp" "${CMAKE_CURRENT_LIST_DIR}/MiscTemporary.cpp" "${CMAKE_CURRENT_LIST_DIR}/Options.cpp" - "${CMAKE_CURRENT_LIST_DIR}/PlayerTools.cpp") + "${CMAKE_CURRENT_LIST_DIR}/PlayerTools.cpp" + "${CMAKE_CURRENT_LIST_DIR}/pathfinder.cpp") add_subdirectory(core) add_subdirectory(classinfo) @@ -47,4 +48,4 @@ add_subdirectory(settings) if(EnableVisuals) add_subdirectory(visual) -endif() \ No newline at end of file +endif() diff --git a/src/pathfinder.cpp b/src/pathfinder.cpp new file mode 100644 index 00000000..4ace5078 --- /dev/null +++ b/src/pathfinder.cpp @@ -0,0 +1,101 @@ +#include "common.hpp" +#include "external/TF2_NavFile_Reader/CNavFile.h" +#include "external/PathFinder/src/PathFinder.h" +#include "external/PathFinder/src/AStar.h" + +struct navNode : public AStarNode +{ + navNode() + { + } + + ~navNode() + { + } + + Vector vecLoc; +}; + +std::unique_ptr navData = nullptr; +std::vector nodes; +Timer pathtimer{}; +settings::Bool enabled{"pathing.enabled", 0}; + +bool init() +{ + if(!enabled) + return false; + logging::Info("Pathing: Initiating path..."); + + // This will not work, please fix + std::string levelName = g_IEngine->GetLevelName(); + navData = std::make_unique(CNavFile(levelName.c_str())); + if (!navData->m_isOK) + { + navData = nullptr; + logging::Info("Pathing: Failed to parse nav file!"); + + return false; + } + std::vector *areas = &navData->m_areas; + int nodeCount = areas->size(); + + nodes.clear(); + nodes.reserve(nodeCount); + + // register nodes + for (int i = 0; i < nodeCount; i++) + { + navNode *node{}; + //node->setPosition(areas->at(i).m_center.x, areas->at(i).m_center.y); + node->vecLoc = areas->at(i).m_center; + nodes.push_back(node); + } + + for (int i = 0; i < nodeCount; ++i) + { + std::vector *connections = &areas->at(i).m_connections; + int childCount = connections->size(); + navNode *currNode = nodes.at(i); + for (int j = 0; j < childCount; j++) + { + currNode->addChild(nodes.at(connections->at(j).id), 1.0f); + } + } + logging::Info("Path init successful"); + return true; +} + +int findClosestNavSquare(Vector vec) +{ + float bestDist = 999999.0f; + int bestSquare = -1; + for (int i = 0; i < nodes.size(); i++) + { + float dist = nodes.at(i)->vecLoc.DistTo(vec); + if(dist < bestDist) + { + bestDist = dist; + bestSquare = i; + } + } + return bestSquare; +} + +std::vector findPath(Vector loc, Vector dest) +{ + if (nodes.empty()) + return {}; + + int node_loc = findClosestNavSquare(loc); + int node_dest = findClosestNavSquare(dest); + + PathFinder Finder; + Finder.setStart(*nodes.at(node_loc)); + Finder.setGoal(*nodes.at(node_dest)); + + std::vector pathNodes; + //bool result = Finder.findPath(pathNodes); + std::vector path; + +} From 2147229d9692ed4e9fa7cf8ae5485f3cb194405b Mon Sep 17 00:00:00 2001 From: TotallyNotElite <1yourexperiment@protonmail.com> Date: Sun, 12 Aug 2018 21:15:36 +0200 Subject: [PATCH 5/5] WIP: Pathfinding Nr. 2 --- CMakeLists.txt | 2 + external/TF2_NavFile_Reader | 2 +- src/pathfinder.cpp | 102 +++++++++++++++++++++++++----------- 3 files changed, 73 insertions(+), 33 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ce8916c5..1cc782b7 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -111,6 +111,8 @@ target_include_directories(cathook SYSTEM PRIVATE "external/source-sdk-2013-headers/mp/src") target_include_directories(cathook PRIVATE "external/ucccccp") +target_include_directories(cathook PRIVATE "external/TF2_NavFile_Reader") +target_include_directories(cathook PRIVATE "external/PathFinder/src/") if(EnableWarnings) target_compile_options(cathook PRIVATE -Wall -Wextra) diff --git a/external/TF2_NavFile_Reader b/external/TF2_NavFile_Reader index 3514e482..cf0ac17c 160000 --- a/external/TF2_NavFile_Reader +++ b/external/TF2_NavFile_Reader @@ -1 +1 @@ -Subproject commit 3514e4821928dbdabe26ce324bf4f510380ad007 +Subproject commit cf0ac17c8b3a44d99cf746c981186ca00c93be3b diff --git a/src/pathfinder.cpp b/src/pathfinder.cpp index 4ace5078..a544d620 100644 --- a/src/pathfinder.cpp +++ b/src/pathfinder.cpp @@ -3,41 +3,70 @@ #include "external/PathFinder/src/PathFinder.h" #include "external/PathFinder/src/AStar.h" -struct navNode : public AStarNode +namespace hacks::shared::pathfinder { - navNode() - { - } +Vector loc; +//std::vector findPath(Vector loc, Vector dest); +//bool initiatenavfile(); - ~navNode() - { - } +//CatCommand navset("nav_set", "Debug nav set", +// [](const CCommand &args) { loc = g_pLocalPlayer->v_Origin; }); +//CatCommand navfind("nav_find", "Debug nav find", [](const CCommand &args) { +// std::vector path = findPath(g_pLocalPlayer->v_Origin, loc); +// if (path.empty()) +// { +// logging::Info("Pathing: No path found"); +// } +// std::string output = "Pathing: Path found! Path: "; +// for (int i = 0; i < path.size(); i++) +// { +// output.append(format(path.at(i).x, ",", format(path.at(i).y))); +// } +// logging::Info(output.c_str()); +//}); + +//CatCommand navinit("nav_init", "Debug nav init", +// [](const CCommand &args) { initiatenavfile(); }); + +class navNode : public AStarNode +{ +// navNode() +// { +// } + +// ~navNode() +// { +// } +public: Vector vecLoc; }; -std::unique_ptr navData = nullptr; std::vector nodes; -Timer pathtimer{}; -settings::Bool enabled{"pathing.enabled", 0}; +//settings::Bool enabled{ "pathing.enabled", 0 }; -bool init() +bool initiatenavfile() { - if(!enabled) - return false; + //if (!enabled) + // return false; logging::Info("Pathing: Initiating path..."); // This will not work, please fix + std::string dir = + "/home/elite/.steam/steam/steamapps/common/Team Fortress 2/tf/maps/"; std::string levelName = g_IEngine->GetLevelName(); - navData = std::make_unique(CNavFile(levelName.c_str())); - if (!navData->m_isOK) - { - navData = nullptr; - logging::Info("Pathing: Failed to parse nav file!"); + int dotpos = levelName.find('.'); + levelName = levelName.substr(0, dotpos); + levelName.append(".nav"); + dir.append(levelName); + CNavFile navData(dir.c_str()); + if (!navData.m_isOK) + { + logging::Info("Pathing: Failed to parse nav file!"); return false; } - std::vector *areas = &navData->m_areas; + std::vector *areas = &navData.m_areas; int nodeCount = areas->size(); nodes.clear(); @@ -47,7 +76,7 @@ bool init() for (int i = 0; i < nodeCount; i++) { navNode *node{}; - //node->setPosition(areas->at(i).m_center.x, areas->at(i).m_center.y); + // node->setPosition(areas->at(i).m_center.x, areas->at(i).m_center.y); node->vecLoc = areas->at(i).m_center; nodes.push_back(node); } @@ -73,9 +102,9 @@ int findClosestNavSquare(Vector vec) for (int i = 0; i < nodes.size(); i++) { float dist = nodes.at(i)->vecLoc.DistTo(vec); - if(dist < bestDist) + if (dist < bestDist) { - bestDist = dist; + bestDist = dist; bestSquare = i; } } @@ -85,17 +114,26 @@ int findClosestNavSquare(Vector vec) std::vector findPath(Vector loc, Vector dest) { if (nodes.empty()) - return {}; + return std::vector(0); - int node_loc = findClosestNavSquare(loc); - int node_dest = findClosestNavSquare(dest); + int id_loc = findClosestNavSquare(loc); + int id_dest = findClosestNavSquare(dest); - PathFinder Finder; - Finder.setStart(*nodes.at(node_loc)); - Finder.setGoal(*nodes.at(node_dest)); + navNode &node_loc = *nodes.at(id_loc); + navNode &node_dest = *nodes.at(id_dest); + + PathFinder p; + std::vector pathNodes; + + p.setStart(node_loc); + p.setGoal(node_dest); + + p.findPath(pathNodes); - std::vector pathNodes; - //bool result = Finder.findPath(pathNodes); std::vector path; - -} + for (int i = 0; i < pathNodes.size(); i++) + { + path.push_back(pathNodes.at(i)->vecLoc); + } + return path; +}}