fix: enemy selection when several shielded enemies are visible. (#451)
opt: minor optimizations in conditions (changed sequence of OR checks).
This commit is contained in:
parent
d832654f26
commit
dd1adab3b6
1 changed files with 24 additions and 10 deletions
|
|
@ -262,10 +262,11 @@ bool Bot::lookupEnemies () {
|
||||||
|
|
||||||
// the old enemy is no longer visible or
|
// the old enemy is no longer visible or
|
||||||
if (game.isNullEntity (newEnemy)) {
|
if (game.isNullEntity (newEnemy)) {
|
||||||
auto set = game.getVisibilitySet (this, true); // setup potential visibility set from engine
|
// setup potential visibility set from engine
|
||||||
|
auto set = game.getVisibilitySet (this, true);
|
||||||
|
|
||||||
// ignore shielded enemies, while we have real one
|
// ignore shielded enemies, while we have others
|
||||||
edict_t *shieldEnemy = nullptr;
|
Array <edict_t *> shieldedEnemies {};
|
||||||
|
|
||||||
if (cv_attack_monsters.bool_ ()) {
|
if (cv_attack_monsters.bool_ ()) {
|
||||||
// search the world for monsters...
|
// search the world for monsters...
|
||||||
|
|
@ -295,9 +296,10 @@ bool Bot::lookupEnemies () {
|
||||||
|
|
||||||
// search the world for players...
|
// search the world for players...
|
||||||
for (const auto &client : util.getClients ()) {
|
for (const auto &client : util.getClients ()) {
|
||||||
if (!(client.flags & ClientFlags::Used) || !(client.flags & ClientFlags::Alive) || client.team == m_team || client.ent == ent () || !client.ent) {
|
if (client.team == m_team || client.ent == ent() || !(client.flags & (ClientFlags::Used | ClientFlags::Alive)) || !client.ent) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
player = client.ent;
|
player = client.ent;
|
||||||
|
|
||||||
// check the engine PVS
|
// check the engine PVS
|
||||||
|
|
@ -305,15 +307,17 @@ bool Bot::lookupEnemies () {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// extra skill player can see thru smoke... if beeing attacked
|
// extra skill player can see through smoke... if beeing attacked
|
||||||
if ((player->v.button & (IN_ATTACK | IN_ATTACK2)) && m_viewDistance < m_maxViewDistance && m_difficulty == Difficulty::Expert) {
|
if (m_difficulty == Difficulty::Expert && (player->v.button & (IN_ATTACK | IN_ATTACK2)) && m_viewDistance < m_maxViewDistance) {
|
||||||
nearestDistance = cr::sqrf (m_maxViewDistance);
|
nearestDistance = cr::sqrf (m_maxViewDistance);
|
||||||
}
|
}
|
||||||
|
|
||||||
// see if bot can see the player...
|
// see if bot can see the player...
|
||||||
if (seesEnemy (player)) {
|
if (seesEnemy (player)) {
|
||||||
|
// low priority fo shielded enemies
|
||||||
if (isEnemyBehindShield (player)) {
|
if (isEnemyBehindShield (player)) {
|
||||||
shieldEnemy = player;
|
shieldedEnemies.push (player);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
float distance = player->v.origin.distanceSq (pev->origin);
|
float distance = player->v.origin.distanceSq (pev->origin);
|
||||||
|
|
@ -330,9 +334,19 @@ bool Bot::lookupEnemies () {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_enemyUpdateTime = game.time () + (usesKnife () ? 1.0f : 0.75f);
|
m_enemyUpdateTime = game.time () + (usesKnife () ? 1.0f : 0.75f);
|
||||||
|
|
||||||
if (game.isNullEntity (newEnemy) && !game.isNullEntity (shieldEnemy)) {
|
// If enemy is not selected yet then check visible shielded enemies
|
||||||
newEnemy = shieldEnemy;
|
if (game.isNullEntity (newEnemy) && shieldedEnemies.length () > 0) {
|
||||||
|
nearestDistance = cr::sqrf (m_viewDistance);
|
||||||
|
|
||||||
|
for (const auto &shieldedEnemy : shieldedEnemies) {
|
||||||
|
float distance = shieldedEnemy->v.origin.distanceSq (pev->origin);
|
||||||
|
|
||||||
|
if (distance < nearestDistance) {
|
||||||
|
nearestDistance = distance;
|
||||||
|
newEnemy = shieldedEnemy;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue