fix: logic in cover and defend node practice filtering
fix: predict enemy takes in account distance to the enemy
This commit is contained in:
parent
8916dd2b70
commit
6204192703
2 changed files with 45 additions and 25 deletions
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue