diff --git a/dlls/barney.cpp b/dlls/barney.cpp index f50c2c1ed6..0094c1977e 100644 --- a/dlls/barney.cpp +++ b/dlls/barney.cpp @@ -781,6 +781,7 @@ BOOL CBarney::NoFriendlyFire() CPlane backPlane; CPlane leftPlane; CPlane rightPlane; + CPlane frontPlane; Vector vecLeftSide; Vector vecRightSide; @@ -793,9 +794,13 @@ BOOL CBarney::NoFriendlyFire() v_left = gpGlobals->v_right * -1.0f; + CBaseEntity* pEnemy = m_hEnemy; + const Vector enemyCenter = pEnemy->Center(); + leftPlane.InitializePlane( gpGlobals->v_right, vecLeftSide ); rightPlane.InitializePlane( v_left, vecRightSide ); backPlane.InitializePlane( gpGlobals->v_forward, pev->origin ); + frontPlane.InitializePlane( gpGlobals->v_forward * -1, enemyCenter + gpGlobals->v_forward * pEnemy->pev->size.Length2D() / 2 ); for( int k = 1; k <= gpGlobals->maxClients; k++ ) { @@ -808,7 +813,10 @@ BOOL CBarney::NoFriendlyFire() { //ALERT(at_aiconsole, "%s: Ally player at fire plane!\n", STRING(pev->classname)); // player is in the check volume! Don't shoot! - return FALSE; + if (frontPlane.PointInFront( pPlayer->pev->origin )) + return FALSE; + else if (pEnemy->pev->deadflag == DEAD_DYING || pEnemy->pev->deadflag == DEAD_DEAD) // don't shoot when ally is behind the dying enemy + return FALSE; } } }