52 if (
Group* group = player->GetGroup())
54 for (
GroupReference* groupRef = group->GetFirstMember(); groupRef !=
nullptr; groupRef = groupRef->
next())
55 if (
Player* member = groupRef->GetSource())
56 if (member->IsInMap(player))
98 bool maxRangeExceeded =
true;
102 if (
Group* group = player->GetGroup())
104 for (
GroupReference* groupRef = group->GetFirstMember(); groupRef && (maxRangeExceeded || questAbandoned); groupRef = groupRef->
next())
106 Player* member = groupRef->GetSource();
110 maxRangeExceeded =
false;
115 questAbandoned =
false;
122 maxRangeExceeded =
false;
127 questAbandoned =
false;
132 if (maxRangeExceeded || questAbandoned)
134 TC_LOG_DEBUG(
"scripts.ai.followerai",
"FollowerAI::UpdateAI: failed because player/group was to far away or not found ({})",
me->
GetGUID().
ToString());
169 TC_LOG_ERROR(
"scripts.ai.followerai",
"FollowerAI::StartFollow: attempt to StartFollow while already following. ({})",
me->
GetGUID().
ToString());
176 if (factionForFollower)
235 if (player->IsAlive())
239 if (
Group* group = player->GetGroup())
241 for (
GroupReference* groupRef = group->GetFirstMember(); groupRef !=
nullptr; groupRef = groupRef->
next())
243 Player* member = groupRef->GetSource();
246 TC_LOG_DEBUG(
"scripts.ai.followerai",
"FollowerAI::GetLeaderForFollower: GetLeader changed and returned new leader. ({})",
me->
GetGUID().
ToString());
255 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
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
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)
FollowerAI(Creature *creature)
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, Optional< Scripting::v2::ActionResultSetter< MovementStopReason > > &&scriptResult={})
void Remove(MovementGenerator *movement, MovementSlot slot=MOTION_SLOT_ACTIVE)
std::string ToString() const
static Creature * ToCreature(Object *o)
static ObjectGuid GetGUID(Object const *o)
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)