int CLocalNav::FindPath(Vector &vecStart, Vector &vecDest, float flTargetRadius, BOOL fNoMonsters) { int nIndexBest; node_index_t *node; Vector vecNodeLoc; float flDistToDest; #ifdef _DEBUG CONSOLE_ECHO("findpath: %f\n", gpGlobals->time); #endif nIndexBest = FindDirectPath(vecStart, vecDest, flTargetRadius, fNoMonsters); if (nIndexBest != -1) return nIndexBest; m_vecStartingLoc = vecStart; m_nindexAvailableNode = 0; AddPathNodes(-1, fNoMonsters); vecNodeLoc = vecStart; nIndexBest = GetBestNode(vecNodeLoc, vecDest); while (nIndexBest != -1) { node = GetNode(nIndexBest); vecNodeLoc = node->vecLoc; node->fSearched = TRUE; flDistToDest = (vecDest - node->vecLoc).Length2D(); if (flDistToDest <= flTargetRadius) break; if (flDistToDest <= HOSTAGE_STEPSIZE) break; if ((flDistToDest - flTargetRadius) > (MAX_NODES - m_nindexAvailableNode) * HOSTAGE_STEPSIZE || m_nindexAvailableNode == MAX_NODES) { nIndexBest = -1; break; } AddPathNodes(nIndexBest, fNoMonsters); nIndexBest = GetBestNode(vecNodeLoc, vecDest); } if (m_nindexAvailableNode <= 10) nodeval += 2; else if (m_nindexAvailableNode <= 20) nodeval += 4; else if (m_nindexAvailableNode <= 30) nodeval += 8; else if (m_nindexAvailableNode <= 40) nodeval += 13; else if (m_nindexAvailableNode <= 50) nodeval += 19; else if (m_nindexAvailableNode <= 60) nodeval += 26; else if (m_nindexAvailableNode <= 70) nodeval += 34; else if (m_nindexAvailableNode <= 80) nodeval += 43; else if (m_nindexAvailableNode <= 90) nodeval += 53; else if (m_nindexAvailableNode <= 100) nodeval += 64; else if (m_nindexAvailableNode <= 110) nodeval += 76; else if (m_nindexAvailableNode <= 120) nodeval += 89; else if (m_nindexAvailableNode <= 130) nodeval += 103; else if (m_nindexAvailableNode <= 140) nodeval += 118; else if (m_nindexAvailableNode <= 150) nodeval += 134; else if (m_nindexAvailableNode <= 160) nodeval += 151; else nodeval += 169; return nIndexBest; }
node_index_t CLocalNav::FindPath(Vector &vecStart, Vector &vecDest, float flTargetRadius, int fNoMonsters) { node_index_t nIndexBest = FindDirectPath(vecStart, vecDest, flTargetRadius, fNoMonsters); if (nIndexBest != NODE_INVALID_EMPTY) { return nIndexBest; } localnode_t *node; Vector vecNodeLoc; float_precision flDistToDest; m_vecStartingLoc = vecStart; m_nindexAvailableNode = 0; AddPathNodes(NODE_INVALID_EMPTY, fNoMonsters); nIndexBest = GetBestNode(vecStart, vecDest); while (nIndexBest != NODE_INVALID_EMPTY) { node = GetNode(nIndexBest); node->fSearched = TRUE; vecNodeLoc = node->vecLoc; flDistToDest = (vecDest - node->vecLoc).Length2D(); if (flDistToDest <= flTargetRadius) break; if (flDistToDest <= HOSTAGE_STEPSIZE) break; if (((flDistToDest - flTargetRadius) > ((MAX_NODES - m_nindexAvailableNode) * HOSTAGE_STEPSIZE)) || m_nindexAvailableNode == MAX_NODES) { nIndexBest = NODE_INVALID_EMPTY; break; } AddPathNodes(nIndexBest, fNoMonsters); nIndexBest = GetBestNode(vecNodeLoc, vecDest); } if (m_nindexAvailableNode <= 10) nodeval += 2; else if (m_nindexAvailableNode <= 20) nodeval += 4; else if (m_nindexAvailableNode <= 30) nodeval += 8; else if (m_nindexAvailableNode <= 40) nodeval += 13; else if (m_nindexAvailableNode <= 50) nodeval += 19; else if (m_nindexAvailableNode <= 60) nodeval += 26; else if (m_nindexAvailableNode <= 70) nodeval += 34; else if (m_nindexAvailableNode <= 80) nodeval += 43; else if (m_nindexAvailableNode <= 90) nodeval += 53; else if (m_nindexAvailableNode <= 100) nodeval += 64; else if (m_nindexAvailableNode <= 110) nodeval += 76; else if (m_nindexAvailableNode <= 120) nodeval += 89; else if (m_nindexAvailableNode <= 130) nodeval += 103; else if (m_nindexAvailableNode <= 140) nodeval += 118; else if (m_nindexAvailableNode <= 150) nodeval += 134; else if (m_nindexAvailableNode <= 160) nodeval += 151; else nodeval += 169; return nIndexBest; }