diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index def842518..14048b6f3 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -307,7 +307,7 @@ bool CreatureAI::_EnterEvadeMode(EvadeReason /*why*/) me->SetLootRecipient(nullptr); me->ResetPlayerDamageReq(); me->SetLastDamagedTime(0); - me->SetCannotReachTarget(true); + me->SetCannotReachTarget(); if (ZoneScript* zoneScript = me->GetZoneScript() ? me->GetZoneScript() : (ZoneScript*)me->GetInstanceScript()) zoneScript->OnCreatureEvade(me); diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 34976db59..9589b3175 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -3494,26 +3494,35 @@ bool Creature::IsMovementPreventedByCasting() const return false; } -bool Creature::SetCannotReachTarget() +void Creature::SetCannotReachTarget(ObjectGuid const& cannotReach) { - return SetCannotReachTarget(true); -} - -bool Creature::SetCannotReachTarget(bool cannotReach, bool isChase /*= true*/) + if (cannotReach == m_cannotReachTarget) { - if (!isChase || !Unit::SetCannotReachTarget(cannotReach)) - { - return false; + return; } + m_cannotReachTarget = cannotReach; m_cannotReachTimer = 0; if (cannotReach) { LOG_DEBUG("entities.unit", "Creature::SetCannotReachTarget() called with true. Details: {}", GetDebugInfo()); } +} - return true; +bool Creature::CanNotReachTarget() const +{ + return m_cannotReachTarget; +} + +bool Creature::IsNotReachableAndNeedRegen() const +{ + if (CanNotReachTarget()) + { + return m_cannotReachTimer >= (sWorld->getIntConfig(CONFIG_NPC_REGEN_TIME_IF_NOT_REACHABLE_IN_RAID) * IN_MILLISECONDS); + } + + return false; } time_t Creature::GetLastDamagedTime() const diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 782e94ffa..0dbc3fb04 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -310,10 +310,9 @@ public: return m_charmInfo->GetCharmSpell(pos)->GetAction(); } - bool SetCannotReachTarget(); - bool SetCannotReachTarget(bool cannotReach, bool isChase = true) override; - [[nodiscard]] bool IsNotReachable() const { return (m_cannotReachTimer >= (sWorld->getIntConfig(CONFIG_NPC_EVADE_IF_NOT_REACHABLE) * IN_MILLISECONDS)) && m_cannotReachTarget; } - [[nodiscard]] bool IsNotReachableAndNeedRegen() const { return (m_cannotReachTimer >= (sWorld->getIntConfig(CONFIG_NPC_REGEN_TIME_IF_NOT_REACHABLE_IN_RAID) * IN_MILLISECONDS)) && m_cannotReachTarget; } + void SetCannotReachTarget(ObjectGuid const& target = ObjectGuid::Empty); + [[nodiscard]] bool CanNotReachTarget() const; + [[nodiscard]] bool IsNotReachableAndNeedRegen() const; void SetPosition(float x, float y, float z, float o); void SetPosition(const Position& pos) { SetPosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 11be39428..4cc2fa9e2 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -212,7 +212,6 @@ Unit::Unit(bool isWorldObject) : WorldObject(isWorldObject), m_vehicleKit(nullptr), m_unitTypeMask(UNIT_MASK_NONE), m_HostileRefMgr(this), - m_cannotReachTarget(false), m_comboTarget(nullptr), m_comboPoints(0) { @@ -20787,18 +20786,6 @@ bool Unit::CanRestoreMana(SpellInfo const* spellInfo) const return false; } -bool Unit::SetCannotReachTarget(bool cannotReach, bool /*isChase = true*/) -{ - if (cannotReach == m_cannotReachTarget) - { - return false; - } - - m_cannotReachTarget = cannotReach; - - return true; -} - bool Unit::IsInDisallowedMountForm() const { if (SpellInfo const* transformSpellInfo = sSpellMgr->GetSpellInfo(getTransForm())) @@ -20864,3 +20851,18 @@ std::string Unit::GetDebugInfo() const << " Class: " << std::to_string(getClass()); return sstr.str(); } + +void Unit::SetCannotReachTargetUnit(bool cannotReach, bool isChase) +{ + if (cannotReach == m_cannotReachTarget) + { + return; + } + + m_cannotReachTarget = cannotReach; +} + +bool Unit::CanNotReachTarget() const +{ + return m_cannotReachTarget; +} diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index ce81bb6e3..5df24dbb8 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -2428,10 +2428,11 @@ public: [[nodiscard]] bool CanRestoreMana(SpellInfo const* spellInfo) const; - virtual bool SetCannotReachTarget(bool cannotReach, bool isChase = true); - [[nodiscard]] bool CanNotReachTarget() const { return m_cannotReachTarget; } - std::string GetDebugInfo() const override; + void SetCannotReachTargetUnit(bool target, bool isChase); + [[nodiscard]] bool CanNotReachTarget() const; + + bool m_cannotReachTarget; protected: explicit Unit (bool isWorldObject); @@ -2513,8 +2514,6 @@ protected: bool IsAlwaysDetectableFor(WorldObject const* seer) const override; bool _instantCast; - bool m_cannotReachTarget; - private: bool IsTriggeredAtSpellProcEvent(Unit* victim, Aura* aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const*& spellProcEvent, ProcEventInfo const& eventInfo); bool HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggeredByAura, SpellInfo const* procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, Spell const* spellProc = nullptr); diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index 215040b46..adf9cb547 100644 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -100,7 +100,7 @@ bool ChaseMovementGenerator::DoUpdate(T* owner, uint32 time_diff) i_path = nullptr; if (Creature* cOwner2 = owner->ToCreature()) { - cOwner2->SetCannotReachTarget(false); + cOwner2->SetCannotReachTarget(this->i_target.getTarget()->GetGUID()); } owner->StopMoving(); @@ -414,7 +414,7 @@ bool FollowMovementGenerator::DoUpdate(T* owner, uint32 time_diff) { i_path = nullptr; owner->StopMoving(); - owner->SetCannotReachTarget(false, false); + owner->SetCannotReachTargetUnit(false, false); _lastTargetPosition.reset(); return true; } @@ -438,7 +438,7 @@ bool FollowMovementGenerator::DoUpdate(T* owner, uint32 time_diff) if (owner->HasUnitState(UNIT_STATE_FOLLOW_MOVE) && owner->movespline->Finalized()) { owner->ClearUnitState(UNIT_STATE_FOLLOW_MOVE); - owner->SetCannotReachTarget(false, false); + owner->SetCannotReachTargetUnit(false, false); i_path = nullptr; MovementInform(owner); @@ -491,12 +491,12 @@ bool FollowMovementGenerator::DoUpdate(T* owner, uint32 time_diff) if (!owner->IsStopped()) owner->StopMoving(); - owner->SetCannotReachTarget(true, false); + owner->SetCannotReachTargetUnit(true, false); return true; } - owner->SetCannotReachTarget(false, false); + owner->SetCannotReachTargetUnit(false, false); owner->AddUnitState(UNIT_STATE_FOLLOW_MOVE); @@ -523,7 +523,7 @@ template void FollowMovementGenerator::DoFinalize(T* owner) { owner->ClearUnitState(UNIT_STATE_FOLLOW | UNIT_STATE_FOLLOW_MOVE); - owner->SetCannotReachTarget(false, false); + owner->SetCannotReachTargetUnit(false, false); } template