fix: logic in cover and defend node practice filtering

fix: predict enemy takes in account distance to the enemy
This commit is contained in:
jeefo 2023-03-23 16:33:59 +03:00
commit 6204192703
No known key found for this signature in database
GPG key ID: 927BCA0779BEA8ED
2 changed files with 45 additions and 25 deletions

View file

@ -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;

View file

@ -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);