bot: disrupt bot vision in dark areas

This commit is contained in:
jeefo 2024-10-17 22:21:22 +03:00
commit 3d0bb4d7da
No known key found for this signature in database
GPG key ID: D696786B81B667C8
5 changed files with 60 additions and 7 deletions

View file

@ -128,10 +128,49 @@ bool Bot::isEnemyNoTarget (edict_t *enemy) {
return !!(enemy->v.flags & FL_NOTARGET);
}
bool Bot::isEnemyInDarkArea (edict_t *enemy) {
if (!cv_check_darkness && game.isNullEntity (enemy)) {
return false;
}
const auto scolor = illum.getSkyColor ();
// check if node near the enemy have a degraded light level
const auto enemyNodeIndex = graph.getNearest (m_enemy->v.origin);
if (!graph.exists (enemyNodeIndex)) {
return false;
}
const auto llevel = graph[enemyNodeIndex].light;
// if light level is higher than 30, do not bother with further tests
if (llevel > 30.0f) {
return false;
}
bool enemySemiTransparent = false;
const bool enemyHasGun = (enemy->v.weapons & kPrimaryWeaponMask) || (enemy->v.weapons & kSecondaryWeaponMask);
const bool enemyHasFlashlightEnabled = !!(enemy->v.effects & EF_DIMLIGHT);
const bool enemyIsAttacking = !!(enemy->v.oldbuttons & IN_ATTACK);
if (!m_usesNVG && ((llevel < 3.0f && scolor > 50.0f) || (llevel < 25.0f && scolor <= 50.0f))
&& !enemyHasFlashlightEnabled && (!enemyIsAttacking || !enemyHasGun)) {
return false;
}
else if (((llevel < 10.0f && scolor > 50.0f) || (llevel < 30.0f && scolor <= 50.0f)
|| (enemyIsAttacking && enemyHasGun))
&& !m_usesNVG && !enemyHasFlashlightEnabled) {
enemySemiTransparent = true;
}
TraceResult result {};
game.testLine (getEyesPos (), enemy->v.origin, m_isCreature ? TraceIgnore::None : TraceIgnore::Everything, ent (), &result);
return (result.flFraction <= 1.0f && result.pHit == enemy && (m_usesNVG || !enemySemiTransparent));
}
bool Bot::checkBodyParts (edict_t *target) {
// this function checks visibility of a bot target.
if (isEnemyHidden (target) || isEnemyInvincible (target) || isEnemyNoTarget (target)) {
if (isEnemyHidden (target) || isEnemyInvincible (target) || isEnemyNoTarget (target) || isEnemyInDarkArea (target)) {
m_enemyParts = Visibility::None;
m_enemyOrigin.clear ();
@ -336,6 +375,9 @@ void Bot::trackEnemies () {
bool Bot::lookupEnemies () {
// this function tries to find the best suitable enemy for the bot
m_enemyParts = Visibility::None;
m_enemyOrigin.clear ();
// do not search for enemies while we're blinded, or shooting disabled by user
if (m_enemyIgnoreTimer > game.time () || m_blindTime > game.time () || cv_ignore_enemies) {
return false;
@ -359,8 +401,6 @@ bool Bot::lookupEnemies () {
m_aimFlags |= AimFlags::LastEnemy;
}
}
m_enemyParts = Visibility::None;
m_enemyOrigin.clear ();
if (!game.isNullEntity (m_enemy)) {
player = m_enemy;