38 _escortQuest(nullptr), _activeAttacker(true), _instantRespawn(false), _returnToStart(false), _despawnAtEnd(true), _despawnAtFar(true),
39 _hasImmuneToNPCFlags(false), _started(false), _ended(false), _resume(false)
61 if (
Group* group = player->GetGroup())
63 for (
GroupReference* groupRef = group->GetFirstMember(); groupRef !=
nullptr; groupRef = groupRef->next())
65 if (
Player* member = groupRef->GetSource())
66 if (member->IsInMap(player))
108 TC_LOG_DEBUG(
"scripts.ai.escortai",
"EscortAI::EnterEvadeMode: left combat and is now returning to last point ({})",
me->
GetGUID().
ToString());
139 TC_LOG_DEBUG(
"scripts.ai.escortai",
"EscortAI::MovementInform: returned to home location and restarting waypoint path ({})",
me->
GetGUID().
ToString());
145 ASSERT(
id <
_path.
nodes.size(),
"EscortAI::MovementInform: referenced movement id (%u) points to non-existing node in loaded path (%s)",
id,
me->
GetGUID().
ToString().c_str());
187 float orientation = 0.f;
208 movementGenerator->Resume(0);
223 TC_LOG_DEBUG(
"scripts.ai.escortai",
"EscortAI::UpdateAI: failed because player/group was to far away or not found ({})",
me->
GetGUID().
ToString());
225 bool isEscort =
false;
276 waypoint.
delay = waitTime.count();
340 TC_LOG_ERROR(
"scripts.ai.escortai",
"EscortAI::Start: (script: {}) is set to return home after waypoint end and instant respawn at waypoint end. Creature will never despawn ({})",
me->
GetScriptName(),
me->
GetGUID().
ToString());
353 TC_LOG_DEBUG(
"scripts.ai.escortai",
"EscortAI::Start: (script: {}) started with {} waypoints. ActiveAttacker = {}, Player = {} ({})",
369 movementGenerator->Pause(0);
431 if (
Group* group = player->GetGroup())
433 for (
GroupReference* groupRef = group->GetFirstMember(); groupRef !=
nullptr; groupRef = groupRef->next())
435 if (
Player* member = groupRef->GetSource())
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
#define TC_LOG_DEBUG(filterType__,...)
#define TC_LOG_ERROR(filterType__,...)
#define DEFAULT_MAX_PLAYER_DISTANCE
@ CREATURE_TYPE_FLAG_CAN_ASSIST
@ SPAWNGROUP_FLAG_ESCORTQUESTNPC
@ WAYPOINT_MOVE_TYPE_WALK
virtual void MoveInLineOfSight(Unit *)
void Respawn(bool force=false)
void GetRespawnPosition(float &x, float &y, float &z, float *ori=nullptr, float *dist=nullptr) const
void SetLootRecipient(Unit *unit, bool withGroup=true)
void GetHomePosition(float &x, float &y, float &z, float &ori) const
bool HasReactState(ReactStates state) const
bool IsEngaged() const override
bool IsImmuneToNPC() const
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
CreatureData const * GetCreatureData() const
ObjectGuid::LowType GetSpawnId() const
CreatureTemplate const * GetCreatureTemplate() const
uint32 GetRespawnDelay() const
void SetImmuneToNPC(bool apply) override
std::string GetScriptName() const
void SaveRespawnTime(uint32 forceDelay=0)
bool IsInEvadeMode() const
void Respawn(RespawnInfo *info, CharacterDatabaseTransaction dbTrans=nullptr)
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
void MovePath(uint32 pathId, bool repeatable)
MovementGenerator * GetCurrentMovementGenerator() const
std::string ToString() const
static Creature * ToCreature(Object *o)
static ObjectGuid GetGUID(Object const *o)
uint32 GetQuestId() const
void DoMeleeAttackIfReady()
virtual bool CanAIAttack(Unit const *) const
MotionMaster * GetMotionMaster()
bool isInAccessiblePlaceFor(Creature const *c) const
Unit * EnsureVictim() const
uint32 GetFaction() const override
bool SetWalk(bool enable)
void EngageWithTarget(Unit *who)
void CombatStop(bool includingCast=false, bool mutualPvP=true)
void ReplaceAllNpcFlags(NPCFlags flags)
bool IsWithinLOSInMap(WorldObject const *obj, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing) const
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
bool IsValidAssistTarget(WorldObject const *target, SpellInfo const *bySpell=nullptr) const
@ CONFIG_RESPAWN_DYNAMIC_ESCORTNPC
ObjectData const creatureData[]
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
void NormalizeMapCoord(float &c)
void InitializeAI() override
float GetMaxPlayerDistance() const
void Start(bool isActiveAttacker=true, ObjectGuid playerGUID=ObjectGuid::Empty, Quest const *quest=nullptr, bool instantRespawn=false, bool canLoopPath=false)
void AddWaypoint(uint32 id, float x, float y, float z, bool run)
EscortAI(Creature *creature)
void MoveInLineOfSight(Unit *who) override
bool HasEscortState(uint32 escortState)
void EnterEvadeMode(EvadeReason=EVADE_REASON_OTHER) override
virtual void UpdateEscortAI(uint32 diff)
void AddEscortState(uint32 escortState)
Quest const * _escortQuest
void RemoveEscortState(uint32 escortState)
void MovementInform(uint32, uint32) override
void LoadPath(uint32 pathId)
Player * GetPlayerForEscort()
void JustDied(Unit *) override
bool IsPlayerOrGroupInRange()
void SetEscortPaused(bool on)
void UpdateAI(uint32 diff) override
bool _hasImmuneToNPCFlags
bool AssistPlayerInCombatAgainst(Unit *who)
std::string ToString() const
void SetOrientation(float orientation)
void SetCombatMovement(bool allowMovement)
bool IsCombatMovementAllowed() const
Optional< float > orientation
std::vector< WaypointNode > nodes