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] 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; +}}