52 if (
Group* group = player->GetGroup())
55 if (groupRef.GetSource()->IsInMap(player))
97 bool maxRangeExceeded =
true;
101 if (
Group* group = player->GetGroup())
105 Player* member = groupRef.GetSource();
107 maxRangeExceeded =
false;
112 questAbandoned =
false;
119 maxRangeExceeded =
false;
124 questAbandoned =
false;
129 if (maxRangeExceeded || questAbandoned)
131 TC_LOG_DEBUG(
"scripts.ai.followerai",
"FollowerAI::UpdateAI: failed because player/group was to far away or not found ({})",
me->
GetGUID().
ToString());
166 TC_LOG_ERROR(
"scripts.ai.followerai",
"FollowerAI::StartFollow: attempt to StartFollow while already following. ({})",
me->
GetGUID().
ToString());
173 if (factionForFollower)
232 if (player->IsAlive())
236 if (
Group* group = player->GetGroup())
240 Player* member = groupRef.GetSource();
243 TC_LOG_DEBUG(
"scripts.ai.followerai",
"FollowerAI::GetLeaderForFollower: GetLeader changed and returned new leader. ({})",
me->
GetGUID().
ToString());
252 TC_LOG_DEBUG(
"scripts.ai.followerai",
"FollowerAI::GetLeaderForFollower: GetLeader can not find suitable leader. ({})",
me->
GetGUID().
ToString());
#define TC_LOG_DEBUG(filterType__, message__,...)
#define TC_LOG_ERROR(filterType__, message__,...)
@ QUEST_STATUS_INCOMPLETE
float constexpr MAX_PLAYER_DISTANCE
@ STATE_FOLLOW_INPROGRESS
@ CREATURE_TYPE_FLAG_CAN_ASSIST
@ SPAWNGROUP_FLAG_ESCORTQUESTNPC
ObjectGuid const & GetGUID() const
virtual void MoveInLineOfSight(Unit *)
CreatureDifficulty const * GetCreatureDifficulty() const
bool HasReactState(ReactStates state) const
bool IsEngaged() const override
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
CreatureData const * GetCreatureData() const
uint32 GetRespawnDelay() const
void SaveRespawnTime(uint32 forceDelay=0)
bool IsInEvadeMode() const
FollowerAI(Creature *creature) noexcept
void StartFollow(Player *player, uint32 factionForFollower=0, uint32 quest=0)
bool ShouldAssistPlayerInCombatAgainst(Unit *who) const
void JustReachedHome() override
virtual void UpdateFollowerAI(uint32)
void JustDied(Unit *) override
void MoveInLineOfSight(Unit *) override
void AddFollowState(uint32 followState)
Player * GetLeaderForFollower()
void SetFollowComplete(bool withEndEvent=false)
void RemoveFollowState(uint32 followState)
void UpdateAI(uint32) override
uint32 _updateFollowTimer
bool HasFollowState(uint32 uiFollowState) const
void OwnerAttackedBy(Unit *other) override
void SetFollowPaused(bool paused)
void MoveFollow(Unit *target, float dist, Optional< ChaseAngle > angle={}, Optional< Milliseconds > duration={}, bool ignoreTargetWalk=false, MovementSlot slot=MOTION_SLOT_ACTIVE, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
void Remove(MovementGenerator *movement, MovementSlot slot=MOTION_SLOT_ACTIVE)
std::string ToString() const
QuestStatus GetQuestStatus(uint32 quest_id) const
virtual bool CanAIAttack(Unit const *) const
void ReplaceAllNpcFlags2(NPCFlags2 flags)
void SetFaction(uint32 faction) override
MotionMaster * GetMotionMaster()
void PauseMovement(uint32 timer=0, uint8 slot=0, bool forced=true)
bool isInAccessiblePlaceFor(Creature const *c) const
void EngageWithTarget(Unit *who)
bool HasUnitState(const uint32 f) const
void ReplaceAllNpcFlags(NPCFlags flags)
std::string const & GetName() const
bool IsWithinLOSInMap(WorldObject const *obj, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing) const
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
bool IsFriendlyTo(WorldObject const *target) const
@ CONFIG_RESPAWN_DYNAMIC_ESCORTNPC
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)