46 if (
me->Attack(who,
true))
49 me->GetMotionMaster()->MovementExpired();
52 me->GetMotionMaster()->MoveChase(who);
71 if (
me->IsFriendlyTo(who))
86 me->AddThreat(who, 0.0f);
104 if (
me->IsHostileTo(who))
106 float fAttackRadius =
me->GetAttackDistance(who);
107 if (
me->IsWithinDistInMap(who, fAttackRadius) &&
me->IsWithinLOSInMap(who))
109 if (!
me->GetVictim())
114 else if (
me->GetMap()->IsInstance())
117 me->AddThreat(who, 0.0f);
131 if (
Group* group = player->GetGroup())
133 for (
GroupReference* groupRef = group->GetFirstMember(); groupRef != NULL; groupRef = groupRef->
next())
134 if (
Player* member = groupRef->GetSource())
156 if (
me->getFaction() !=
me->GetCreatureTemplate()->faction_A)
157 me->RestoreFaction();
165 me->GetHomePosition(x, y, z, o);
171 me->RemoveAllAuras();
172 me->DeleteThreatList();
173 me->CombatStop(
true);
174 me->SetLootRecipient(NULL);
180 SF_LOG_DEBUG(
"scripts",
"EscortAI has left combat and is now returning to last point");
184 me->GetMotionMaster()->MoveTargetedHome();
195 if (
Group* group = player->GetGroup())
197 for (
GroupReference* groupRef = group->GetFirstMember(); groupRef != NULL; groupRef = groupRef->
next())
198 if (
Player* member = groupRef->GetSource())
221 SF_LOG_DEBUG(
"scripts",
"EscortAI reached end of waypoints");
225 float fRetX, fRetY, fRetZ;
226 me->GetRespawnPosition(fRetX, fRetY, fRetZ);
228 me->GetMotionMaster()->MovePoint(
POINT_HOME, fRetX, fRetY, fRetZ);
232 SF_LOG_DEBUG(
"scripts",
"EscortAI are returning home to spawn location: %u, %f, %f, %f",
POINT_HOME, fRetX, fRetY, fRetZ);
242 me->DespawnOrUnsummon();
248 SF_LOG_DEBUG(
"scripts",
"EscortAI reached end of waypoints with Despawn off");
275 SF_LOG_DEBUG(
"scripts",
"EscortAI failed because player/group was to far away or not found");
283 me->DespawnOrUnsummon();
313 SF_LOG_DEBUG(
"scripts",
"EscortAI has returned to original position before combat");
323 SF_LOG_DEBUG(
"scripts",
"EscortAI has returned to original home location and will continue from beginning of waypoint list.");
333 SF_LOG_ERROR(
"misc",
"TSCR ERROR: EscortAI reached waypoint out of order %u, expected %u, creature entry %u", pointId,
CurrentWP->id,
me->GetEntry());
388 if (movePoints.empty())
391 ScriptPointVector::const_iterator itrEnd = movePoints.end();
392 for (ScriptPointVector::const_iterator itr = movePoints.begin(); itr != itrEnd; ++itr)
394 Escort_Waypoint point(itr->uiPointId, itr->fX, itr->fY, itr->fZ, itr->uiWaitTime);
406 SF_LOG_DEBUG(
"scripts",
"EscortAI attempt to set run mode, but is already running.");
413 SF_LOG_DEBUG(
"scripts",
"EscortAI attempt to set walk mode, but is already walking.");
420void npc_escortAI::Start(
bool isActiveAttacker ,
bool run ,
uint64 playerGUID ,
Quest const* quest ,
bool instantRespawn ,
bool canLoopPath ,
bool resetWaypoints )
424 SF_LOG_ERROR(
"misc",
"TSCR ERROR: EscortAI (script: %s, creature entry: %u) attempts to Start while in combat",
me->GetScriptName().c_str(),
me->GetEntry());
430 SF_LOG_ERROR(
"scripts",
"EscortAI (script: %s, creature entry: %u) attempts to Start while already escorting",
me->GetScriptName().c_str(),
me->GetEntry());
443 SF_LOG_ERROR(
"scripts",
"EscortAI (script: %s, creature entry: %u) starts with 0 waypoints (possible missing entry in script_waypoint. Quest: %u).",
444 me->GetScriptName().c_str(),
me->GetEntry(), quest ? quest->
GetQuestId() : 0);
459 SF_LOG_DEBUG(
"scripts",
"EscortAI is set to return home after waypoint end and instant respawn at waypoint end. Creature will never despawn.");
463 me->GetMotionMaster()->MovementExpired();
464 me->GetMotionMaster()->MoveIdle();
465 SF_LOG_DEBUG(
"scripts",
"EscortAI start with WAYPOINT_MOTION_TYPE, changed to MoveIdle.");
502 me->UpdatePosition(x, y, z, orientation);
534 if (resetWaypointsOnFail && size !=
WaypointList.size())
548 if (waypoints.empty())
551 for (ScriptPointVector::const_iterator itr = waypoints.begin(); itr != waypoints.end(); ++itr)
553 if (itr->uiPointId == pointId)
#define CREATURE_Z_ATTACK_RANGE
#define SF_LOG_DEBUG(filterType__,...)
#define SF_LOG_ERROR(filterType__,...)
@ QUEST_STATUS_INCOMPLETE
std::vector< ScriptPointMove > ScriptPointVector
#define DEFAULT_MAX_PLAYER_DISTANCE
@ CREATURE_TYPEFLAGS_AID_PLAYERS
@ UNIT_FLAG_IMMUNE_TO_NPC
static float waypoint[6][3]
uint32 GetQuestId() const
void DoMeleeAttackIfReady()
bool isTargetableForAttack(bool checkFakeDeath=true) const
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
bool isInAccessiblePlaceFor(Creature const *c) const
void RemoveAurasByType(AuraType auraType, uint64 casterGUID=0, Aura *except=NULL, bool negative=true, bool positive=true)
void SetInCombatWith(Unit *enemy)
void SetCombatMovement(bool allowMovement)
bool IsCombatMovementAllowed() const
ScriptedAI(Creature *creature)
void EnterEvadeMode() OVERRIDE
void FillPointMovementListForCreature()
uint32 m_uiPlayerCheckTimer
std::list< Escort_Waypoint > WaypointList
std::list< Escort_Waypoint >::iterator CurrentWP
void AddEscortState(uint32 escortState)
virtual void UpdateEscortAI(uint32 const diff)
void JustDied(Unit *) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
virtual void WaypointReached(uint32 pointId)=0
bool IsPlayerOrGroupInRange()
Player * GetPlayerForEscort()
void SetRun(bool on=true)
bool HasEscortState(uint32 escortState) const
bool m_bCanInstantRespawn
npc_escortAI(Creature *creature)
void RemoveEscortState(uint32 escortState)
float GetMaxPlayerDistance() const
void SetEscortPaused(bool on)
void Start(bool isActiveAttacker=true, bool run=false, uint64 playerGUID=0, Quest const *quest=NULL, bool instantRespawn=false, bool canLoopPath=false, bool resetWaypoints=true)
void MovementInform(uint32, uint32) OVERRIDE
bool AssistPlayerInCombat(Unit *who)
bool SetNextWaypoint(uint32 pointId, float x, float y, float z, float orientation)
void MoveInLineOfSight(Unit *who) OVERRIDE
void JustRespawned() OVERRIDE
virtual void WaypointStart(uint32)
void AddWaypoint(uint32 id, float x, float y, float z, uint32 waitTime=0)
Quest const * m_pQuestForEscort
bool GetWaypointPosition(uint32 pointId, float &x, float &y, float &z)
void AttackStart(Unit *who) OVERRIDE