diff --git a/src/botlib.cpp b/src/botlib.cpp index 5282bb0..1640e20 100644 --- a/src/botlib.cpp +++ b/src/botlib.cpp @@ -2816,38 +2816,54 @@ void Bot::updateAimDir () { } } else if (flags & AimFlags::PredictPath) { - bool changePredictedEnemy = true; + TraceResult tr {}; - if (m_timeNextTracking > game.time () && m_trackingEdict == m_lastEnemy && util.isAlive (m_lastEnemy)) { - changePredictedEnemy = false; - } + if (m_lastEnemyOrigin.distanceSq (pev->origin) < cr::square (1560.0f) || usesSniper ()) { + game.testLine (getEyesPos (), m_lastEnemyOrigin, TraceIgnore::Glass, pev->pContainingEntity, &tr); - if (changePredictedEnemy) { - auto aimPoint = findAimingNode (m_lastEnemyOrigin); + if (tr.flFraction >= 0.2f || !tr.fStartSolid || tr.pHit != game.getStartEntity ()) { + auto changePredictedEnemy = true; - if (aimPoint != kInvalidNodeIndex) { - m_lookAt = graph[aimPoint].origin; - m_camp = m_lookAt; + if (m_timeNextTracking < game.time () && m_trackingEdict == m_lastEnemy && util.isAlive (m_lastEnemy)) { + changePredictedEnemy = false; + } - m_timeNextTracking = game.time () + 0.5f; - m_trackingEdict = m_lastEnemy; - } - else { - m_aimFlags &= ~AimFlags::PredictPath; + if (changePredictedEnemy) { + auto aimPoint = findAimingNode (m_lastEnemyOrigin); - if (!m_camp.empty ()) { + if (aimPoint != kInvalidNodeIndex) { + m_lookAt = graph[aimPoint].origin + pev->view_ofs; + m_camp = m_lookAt; + + m_timeNextTracking = game.time () + 0.5f; + m_trackingEdict = m_lastEnemy; + + if (!usesSniper () && lastEnemyShootable ()) { + m_wantsToFire = true; + } + } + else { + m_lookAt = m_camp; + } + } + else { m_lookAt = m_camp; } } + else { + m_aimFlags &= ~AimFlags::PredictPath; // forget enemy far away + } } else { - m_lookAt = m_camp; + m_aimFlags &= ~AimFlags::PredictPath; // forget enemy far away } } else if (flags & AimFlags::Camp) { m_lookAt = m_camp; } else if (flags & AimFlags::Nav) { + m_lookAt = m_destOrigin; + auto smoothView = [&] (int32 index) -> Vector { auto radius = graph[index].radius; diff --git a/src/navigate.cpp b/src/navigate.cpp index 19a1612..b4d250a 100644 --- a/src/navigate.cpp +++ b/src/navigate.cpp @@ -1991,7 +1991,7 @@ int Bot::findDefendNode (const Vector &origin) { if (distance > kMaxDistance) { continue; } - game.testLine (graph[i].origin, graph[posIndex].origin, TraceIgnore::Everything, ent (), &tr); + game.testLine (graph[i].origin, graph[posIndex].origin, TraceIgnore::Glass, ent (), &tr); // check if line not hit anything if (!cr::fequal (tr.flFraction, 1.0f)) { @@ -2023,11 +2023,13 @@ int Bot::findDefendNode (const Vector &origin) { sorting = false; // completely sort the data - for (int i = 0; i < 3 && nodeIndex[i] != kInvalidNodeIndex && nodeIndex[i + 1] != kInvalidNodeIndex && minDistance[i] > minDistance[i + 1]; ++i) { - cr::swap (nodeIndex[i], nodeIndex[i + 1]); - cr::swap (minDistance[i], minDistance[i + 1]); + for (int i = 0; i < kMaxNodeLinks; ++i) { + if (nodeIndex[i] != kInvalidNodeIndex && nodeIndex[i + 1] != kInvalidNodeIndex && minDistance[i] > minDistance[i + 1]) { + cr::swap (nodeIndex[i], nodeIndex[i + 1]); + cr::swap (minDistance[i], minDistance[i + 1]); - sorting = true; + sorting = true; + } } } while (sorting); @@ -2150,11 +2152,13 @@ int Bot::findCoverNode (float maxDistance) { do { sorting = false; - for (int i = 0; i < 3 && nodeIndex[i] != kInvalidNodeIndex && nodeIndex[i + 1] != kInvalidNodeIndex && minDistance[i] > minDistance[i + 1]; ++i) { - cr::swap (nodeIndex[i], nodeIndex[i + 1]); - cr::swap (minDistance[i], minDistance[i + 1]); + for (int i = 0; i < kMaxNodeLinks; ++i) { + if (nodeIndex[i] != kInvalidNodeIndex && nodeIndex[i + 1] != kInvalidNodeIndex && minDistance[i] > minDistance[i + 1]) { + cr::swap (nodeIndex[i], nodeIndex[i + 1]); + cr::swap (minDistance[i], minDistance[i + 1]); - sorting = true; + sorting = true; + } } } while (sorting);