From 97c94cff565104078be6b5df4cf7a15c488cae8c Mon Sep 17 00:00:00 2001 From: balrok Date: Wed, 21 Oct 2009 17:23:25 +0200 Subject: [PATCH] fixed problems with isInvisbleForAlive removed redundant check at MoveInLos this check is already done in istargetableForAttack thx to NoFantasy fixed in isVisibleForOrDetect that isInvisbleForAlive wasn't checked.. and therefore all spiritserviceprovider got visible thx to NetSky --- src/game/AggressorAI.cpp | 2 +- src/game/CreatureEventAI.cpp | 2 +- src/game/GuardAI.cpp | 2 +- src/game/PetAI.cpp | 2 +- src/game/Unit.cpp | 9 +++++---- 5 files changed, 9 insertions(+), 8 deletions(-) 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;