diff --git a/src/game/AggressorAI.cpp b/src/game/AggressorAI.cpp index 7e01aba55..fdde05f7d 100644 --- a/src/game/AggressorAI.cpp +++ b/src/game/AggressorAI.cpp @@ -49,7 +49,7 @@ AggressorAI::MoveInLineOfSight(Unit *u) if (!m_creature->hasUnitState(UNIT_STAT_STUNNED | UNIT_STAT_DIED) && u->isTargetableForAttack() && ( m_creature->IsHostileTo( u ) /*|| u->getVictim() && m_creature->IsFriendlyTo( u->getVictim() )*/ ) && - u->isInAccessablePlaceFor(m_creature) && !u->isInvisibleForAlive()) + u->isInAccessablePlaceFor(m_creature)) { float attackRadius = m_creature->GetAttackDistance(u); if(m_creature->IsWithinDistInMap(u, attackRadius) && m_creature->IsWithinLOSInMap(u) ) diff --git a/src/game/CreatureEventAI.cpp b/src/game/CreatureEventAI.cpp index 4743f12d4..3e9c59e28 100644 --- a/src/game/CreatureEventAI.cpp +++ b/src/game/CreatureEventAI.cpp @@ -995,7 +995,7 @@ void CreatureEventAI::MoveInLineOfSight(Unit *who) return; if (!m_creature->hasUnitState(UNIT_STAT_STUNNED | UNIT_STAT_DIED) && who->isTargetableForAttack() && - m_creature->IsHostileTo(who) && who->isInAccessablePlaceFor(m_creature) && !who->isInvisibleForAlive()) + m_creature->IsHostileTo(who) && who->isInAccessablePlaceFor(m_creature)) { if (!m_creature->canFly() && m_creature->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE) return; diff --git a/src/game/GuardAI.cpp b/src/game/GuardAI.cpp index 3bae9ef61..3d5b529a7 100644 --- a/src/game/GuardAI.cpp +++ b/src/game/GuardAI.cpp @@ -43,7 +43,7 @@ void GuardAI::MoveInLineOfSight(Unit *u) if (!m_creature->getVictim() && u->isTargetableForAttack() && ( u->IsHostileToPlayers() || m_creature->IsHostileTo(u) /*|| u->getVictim() && m_creature->IsFriendlyTo(u->getVictim())*/ ) && - u->isInAccessablePlaceFor(m_creature) && !u->isInvisibleForAlive()) + u->isInAccessablePlaceFor(m_creature)) { float attackRadius = m_creature->GetAttackDistance(u); if (m_creature->IsWithinDistInMap(u,attackRadius)) diff --git a/src/game/PetAI.cpp b/src/game/PetAI.cpp index b20e5cb12..354ef371a 100644 --- a/src/game/PetAI.cpp +++ b/src/game/PetAI.cpp @@ -47,7 +47,7 @@ void PetAI::MoveInLineOfSight(Unit *u) if( !m_creature->getVictim() && m_creature->GetCharmInfo() && m_creature->GetCharmInfo()->HasReactState(REACT_AGGRESSIVE) && u->isTargetableForAttack() && m_creature->IsHostileTo( u ) && - u->isInAccessablePlaceFor(m_creature) && !u->isInvisibleForAlive()) + u->isInAccessablePlaceFor(m_creature)) { float attackRadius = m_creature->GetAttackDistance(u); if(m_creature->IsWithinDistInMap(u, attackRadius) && m_creature->GetDistanceZ(u) <= CREATURE_Z_ATTACK_RANGE) diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 876eaf76a..c145d17ad 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -9613,7 +9613,7 @@ bool Unit::isTargetableForAttack(bool inverseAlive /*=false*/) const if ((isAlive() && !isInvisibleForAlive()) == inverseAlive) return false; - return IsInWorld() && !hasUnitState(UNIT_STAT_DIED)&& !isInFlight() /*&& !isStealth()*/; + return IsInWorld() && !hasUnitState(UNIT_STAT_DIED) && !isInFlight(); } int32 Unit::ModifyHealth(int32 dVal) @@ -9772,6 +9772,10 @@ bool Unit::isVisibleForOrDetect(Unit const* u, WorldObject const* viewPoint, boo return false; } + if (u->isAlive() && isInvisibleForAlive()) + if (u->GetTypeId() == TYPEID_PLAYER && !((Player *)u)->isGameMaster()) + return false; + // Visible units, always are visible for all units, except for units under invisibility and phases if (m_Visibility == VISIBILITY_ON && u->m_invisibilityMask==0 && InSamePhase(u)) return true; @@ -9785,9 +9789,6 @@ bool Unit::isVisibleForOrDetect(Unit const* u, WorldObject const* viewPoint, boo return true; } - if (u->isAlive() && isInvisibleForAlive()) - return false; - // non faction visibility non-breakable for non-GMs if (m_Visibility == VISIBILITY_OFF) return false;