AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
SmartAI Class Reference

#include "SmartAI.h"

Inheritance diagram for SmartAI:
CreatureAI UnitAI npc_black_morass_summoned_add npc_pos_freed_slave::npc_pos_freed_slaveAI npc_stable_master::npc_stable_masterAI

Public Member Functions

 ~SmartAI () override
 
 SmartAI (Creature *c)
 
bool IsAIControlled () const
 
void StartPath (ForcedMovement forcedMovement=FORCED_MOVEMENT_NONE, uint32 path=0, bool repeat=false, Unit *invoker=nullptr, PathSource pathSource=PathSource::SMART_WAYPOINT_MGR)
 
bool LoadPath (uint32 entry, PathSource pathSource)
 
void PausePath (uint32 delay, bool forced=false)
 
void StopPath (uint32 DespawnTime=0, uint32 quest=0, bool fail=false)
 
void EndPath (bool fail=false)
 
void ResumePath ()
 
WaypointNode const * GetNextWayPoint ()
 
void GenerateWayPointArray (Movement::PointsArray *points)
 
bool HasEscortState (uint32 uiEscortState)
 
void AddEscortState (uint32 uiEscortState)
 
bool IsEscorted () override
 
void RemoveEscortState (uint32 uiEscortState)
 
void SetAutoAttack (bool on)
 
void SetCombatMovement (bool on, bool stopOrStartMovement)
 
void SetCurrentRangeMode (bool on, float range=0.f)
 
void SetMainSpell (uint32 spellId)
 
void DistanceYourself (float range)
 
void SetFollow (Unit *target, float dist=0.0f, float angle=0.0f, uint32 credit=0, uint32 end=0, uint32 creditType=0, bool aliveState=true)
 
void StopFollow (bool complete)
 
void SetScript9 (SmartScriptHolder &e, uint32 entry, WorldObject *invoker)
 
SmartScriptGetScript ()
 
bool IsEscortInvokerInRange ()
 
void JustRespawned () override
 
void JustReachedHome () override
 
void JustEngagedWith (Unit *enemy) override
 Called for reaction when initially engaged - this happens after JustEnteredCombat.
 
void EnterEvadeMode (EvadeReason why=EVADE_REASON_OTHER) override
 
void JustDied (Unit *killer) override
 
void KilledUnit (Unit *victim) override
 
void JustSummoned (Creature *creature) override
 
void SummonedCreatureDies (Creature *summon, Unit *killer) override
 
void SummonedCreatureEvade (Creature *summon) override
 
void AttackStart (Unit *who) override
 
void MoveInLineOfSight (Unit *who) override
 
void SpellHit (Unit *unit, SpellInfo const *spellInfo) override
 
void SpellHitTarget (Unit *target, SpellInfo const *spellInfo) override
 
void DamageTaken (Unit *done_by, uint32 &damage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask) override
 Called at any Damage from any attacker (before damage apply)
 
void HealReceived (Unit *doneBy, uint32 &addhealth) override
 Called when the creature receives heal.
 
void UpdateAI (uint32 diff) override
 Use to start attacking a target. Called just before JustEngagedWith()
 
void ReceiveEmote (Player *player, uint32 textEmote) override
 
void MovementInform (uint32 MovementType, uint32 Data) override
 
void IsSummonedBy (WorldObject *summoner) override
 
void DamageDealt (Unit *doneTo, uint32 &damage, DamageEffectType damagetyp, SpellSchoolMask damageSchoolMask) override
 Called at any Damage to any victim (before damage apply)
 
void SummonedCreatureDespawn (Creature *unit) override
 
void CorpseRemoved (uint32 &respawnDelay) override
 == Triggered Actions Requested ==================
 
void PassengerBoarded (Unit *who, int8 seatId, bool apply) override
 == Fields =======================================
 
void InitializeAI () override
 
void OnCharmed (bool apply) override
 Called when unit is charmed.
 
bool CanAIAttack (Unit const *who) const override
 
void DoAction (int32 param=0) override
 
uint32 GetData (uint32 id=0) const override
 
void SetData (uint32 id, uint32 value) override
 
void SetData (uint32 id, uint32 value, WorldObject *invoker)
 
void SetGUID (ObjectGuid const &guid, int32 id=0) override
 
ObjectGuid GetGUID (int32 id=0) const override
 
void MovepointReached (uint32 id)
 
void SetFly (bool fly=true)
 
void SetSwim (bool swim=true)
 
void SetEvadeDisabled (bool disable=true)
 
void SetInvincibilityHpLevel (uint32 level)
 
void sGossipHello (Player *player) override
 
void sGossipSelect (Player *player, uint32 sender, uint32 action) override
 
void sGossipSelectCode (Player *player, uint32 sender, uint32 action, const char *code) override
 
void sQuestAccept (Player *player, Quest const *quest) override
 
void sQuestReward (Player *player, Quest const *quest, uint32 opt) override
 
void sOnGameEvent (bool start, uint16 eventId) override
 
void SetDespawnTime (uint32 t)
 
void StartDespawn ()
 
void OnSpellClick (Unit *clicker, bool &result) override
 
void PathEndReached (uint32 pathId) override
 
void WaypointPathStarted (uint32 pathId) override
 == Waypoints system =============================
 
void WaypointStarted (uint32 nodeId, uint32 pathId) override
 
void WaypointReached (uint32 nodeId, uint32 pathId) override
 
void WaypointPathEnded (uint32 nodeId, uint32 pathId) override
 
bool CanRespawn () override
 
void SetCanRespawn (bool canSpawn)
 
void SetWPPauseTimer (uint32 time)
 
void DistancingEnded () override
 
bool IsMainSpellPrevented (SpellInfo const *spellInfo) const
 
void OnSpellFailed (SpellInfo const *spell) override
 
- Public Member Functions inherited from CreatureAI
void Talk (uint8 id, WorldObject const *whisperTarget=nullptr, Milliseconds delay=0ms)
 Causes the creature to talk/say the text assigned to their entry in the creature_text database table.
 
void Talk (uint8 id, Milliseconds delay)
 
WorldObjectGetSummoner () const
 Returns the summoner creature/object, if the creature is a temporary summon.
 
 CreatureAI (Creature *creature)
 
 ~CreatureAI () override
 
bool IsEngaged () const
 Check if creature is currently engaged in combat.
 
void MoveCircleChecks ()
 
void MoveBackwardsChecks ()
 
void MoveInLineOfSight_Safe (Unit *who)
 == Reactions At =================================
 
void TriggerAlert (Unit const *who) const
 
void JustEnteredCombat (Unit *who) override
 Called when the unit enters combat.
 
virtual void JustStartedThreateningMe (Unit *who)
 
void EngagementStart (Unit *who)
 
void EngagementOver ()
 
void JustExitedCombat () override
 Called when the unit leaves combat.
 
virtual void SummonedCreatureDespawnAll ()
 
virtual void OnSpellStart (SpellInfo const *)
 
virtual void OnSpellCast (SpellInfo const *)
 
virtual void OnChannelFinished (SpellInfo const *)
 
virtual void AttackedBy (Unit *)
 
void DoZoneInCombat (Creature *creature=nullptr, float maxRangeToNearestTarget=250.0f)
 
virtual void OwnerAttackedBy (Unit *attacker)
 
virtual void OwnerAttacked (Unit *target)
 
void OnOwnerCombatInteraction (Unit *target)
 
virtual bool BeforeSpellClick (Unit *)
 
virtual bool CanSeeAlways (WorldObject const *)
 
virtual bool CanBeSeen (Player const *)
 
virtual bool CanAlwaysBeDetectable (WorldObject const *)
 
virtual void PetStopAttack ()
 
int32 VisualizeBoundary (uint32 duration, Unit *owner=nullptr, bool fill=false, bool checkZ=false) const
 
virtual bool CheckInRoom ()
 
CreatureBoundary const * GetBoundary () const
 
void SetBoundary (CreatureBoundary const *boundary, bool negativeBoundaries=false)
 
bool IsInBoundary (Position const *who=nullptr) const
 
virtual void CalculateThreat (Unit *, float &, SpellInfo const *)
 
virtual bool OnTeleportUnreacheablePlayer (Player *)
 
virtual void OnAuraRemove (AuraApplication *, AuraRemoveMode)
 
virtual void DistancingStarted ()
 
- Public Member Functions inherited from UnitAI
 UnitAI (Unit *unit)
 
virtual ~UnitAI ()
 
virtual void Reset ()
 
UnitSelectTarget (SelectTargetMethod targetType, uint32 position=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
 
template<class PREDICATE >
UnitSelectTarget (SelectTargetMethod targetType, uint32 position, PREDICATE const &predicate)
 
void SelectTargetList (std::list< Unit * > &targetList, uint32 num, SelectTargetMethod targetType, uint32 position=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
 Select the best (up to) <num> targets (in <targetType> order) from the threat list that fulfill the following:
 
template<class PREDICATE >
void SelectTargetList (std::list< Unit * > &targetList, uint32 num, SelectTargetMethod targetType, uint32 position, PREDICATE const &predicate)
 
virtual void EvadeTimerExpired ()
 Called when evade timer expires (target unreachable for too long)
 
virtual void OnPowerUpdate (Powers, int32, int32, uint32)
 Called when the creature power updates.
 
virtual void HealDone (Unit *, uint32 &)
 Called when the unit heals.
 
virtual void OnCalculateMeleeDamageReceived (uint32 &, Unit *)
 Called during damage calculations.
 
virtual void OnCalculateSpellDamageReceived (int32 &, Unit *)
 
virtual void OnCalculatePeriodicTickReceived (uint32 &, Unit *)
 Called during calculation when receiving periodic healing or damage (DoT or HoT)
 
void AttackStartCaster (Unit *victim, float dist)
 
SpellCastResult DoAddAuraToAllHostilePlayers (uint32 spellid)
 
SpellCastResult DoCast (uint32 spellId)
 
SpellCastResult DoCast (Unit *victim, uint32 spellId, bool triggered=false)
 
SpellCastResult DoCastSelf (uint32 spellId, bool triggered=false)
 
SpellCastResult DoCastToAllHostilePlayers (uint32 spellid, bool triggered=false)
 To specify the caster as target if the spell is self-cast.
 
SpellCastResult DoCastVictim (uint32 spellId, bool triggered=false)
 
SpellCastResult DoCastAOE (uint32 spellId, bool triggered=false)
 
SpellCastResult DoCastRandomTarget (uint32 spellId, uint32 threatTablePosition=0, float dist=0.0f, bool playerOnly=true, bool triggered=false, bool withTank=true)
 Cast the spell on a random unit from the threat list.
 
SpellCastResult DoCastMaxThreat (uint32 spellId, uint32 threatTablePosition=0, float dist=0.0f, bool playerOnly=true, bool triggered=false)
 Cast spell on the top threat target, which may not be the current victim.
 
float DoGetSpellMaxRange (uint32 spellId, bool positive=false)
 
void DoMeleeAttackIfReady ()
 
bool DoSpellAttackIfReady (uint32 spell)
 
void DoSpellAttackToRandomTargetIfReady (uint32 spell, uint32 threatTablePosition=0, float dist=0.f, bool playerOnly=true)
 
virtual void SummonMovementInform (Creature *, uint32, uint32)
 Called when a summon reaches a waypoint or point movement finished.
 
virtual void sQuestSelect (Player *, Quest const *)
 
virtual void sQuestComplete (Player *, Quest const *)
 
virtual std::string GetDebugInfo () const
 

Static Public Member Functions

static int32 Permissible (Creature const *)
 
- Static Public Member Functions inherited from CreatureAI
static bool IsInBounds (CreatureBoundary const &boundary, Position const *who)
 
- Static Public Member Functions inherited from UnitAI
static void FillAISpellInfo ()
 

Public Attributes

uint32 mEscortQuestID
 

Private Member Functions

void ReturnToLastOOCPos ()
 
void UpdatePath (const uint32 diff)
 
uint32 GetWPCount ()
 
bool AssistPlayerInCombatAgainst (Unit *who)
 
void UpdateDespawn (const uint32 diff)
 
void UpdateFollow (const uint32 diff)
 
void CheckConditions (const uint32 diff)
 

Private Attributes

bool mIsCharmed
 
uint32 mFollowCreditType
 
uint32 mFollowArrivedTimer
 
uint32 _followCheckTimer
 
uint32 mFollowCredit
 
uint32 mFollowArrivedEntry
 
bool mFollowArrivedAlive
 
ObjectGuid mFollowGuid
 
float mFollowDist
 
float mFollowAngle
 
SmartScript mScript
 
WaypointPath const * mWayPoints
 
uint32 mEscortState
 
uint32 mCurrentWPID
 
bool mWPReached
 
bool mOOCReached
 
uint32 mWPPauseTimer
 
WaypointNode const * mLastWP
 
uint32 mEscortNPCFlags
 
bool mCanRepeatPath
 
bool mEvadeDisabled
 
bool mCanAutoAttack
 
bool mForcedPaused
 
uint32 mInvincibilityHpLevel
 
ForcedMovement mForcedMovement
 
uint32 mDespawnTime
 
uint32 mDespawnState
 
uint32 mEscortInvokerCheckTimer
 
bool mJustReset
 
bool mcanSpawn
 
ConditionList conditions
 
uint32 m_ConditionsTimer
 
bool _chaseOnInterrupt
 
std::unordered_map< uint32, uint32aiDataSet
 
bool _currentRangeMode
 
float _attackDistance
 
float _pendingDistancing
 
uint32 _mainSpellId
 

Additional Inherited Members

- Public Types inherited from CreatureAI
enum  EvadeReason {
  EVADE_REASON_NO_HOSTILES ,
  EVADE_REASON_BOUNDARY ,
  EVADE_REASON_SEQUENCE_BREAK ,
  EVADE_REASON_NO_PATH ,
  EVADE_REASON_OTHER
}
 
- Static Public Attributes inherited from UnitAI
static AISpellInfoTypeAISpellInfo
 
- Protected Member Functions inherited from CreatureAI
bool UpdateVictim ()
 
bool UpdateVictimWithGaze ()
 
void SetGazeOn (Unit *target)
 
CreatureDoSummon (uint32 entry, Position const &pos, uint32 despawnTime=30000, TempSummonType summonType=TEMPSUMMON_CORPSE_TIMED_DESPAWN)
 
CreatureDoSummon (uint32 entry, WorldObject *obj, float radius=5.0f, uint32 despawnTime=30000, TempSummonType summonType=TEMPSUMMON_CORPSE_TIMED_DESPAWN)
 
CreatureDoSummonFlyer (uint32 entry, WorldObject *obj, float flightZ, float radius=5.0f, uint32 despawnTime=30000, TempSummonType summonType=TEMPSUMMON_CORPSE_TIMED_DESPAWN)
 
bool _EnterEvadeMode (EvadeReason why=EVADE_REASON_OTHER)
 
- Protected Attributes inherited from CreatureAI
Creature *const me
 
EventMap events
 
TaskScheduler scheduler
 
CreatureBoundary const * _boundary
 
bool _negateBoundary
 
bool _isEngaged
 
- Protected Attributes inherited from UnitAI
Unit *const me
 

Detailed Description

Constructor & Destructor Documentation

◆ ~SmartAI()

SmartAI::~SmartAI ( )
inlineoverride
48{};

◆ SmartAI()

SmartAI::SmartAI ( Creature c)
explicit
30 : CreatureAI(c)
31{
32 mIsCharmed = false;
33 // copy script to local (protection for table reload)
34
35 mWayPoints = nullptr;
37 mCurrentWPID = 0;//first wp id is 1 !!
38 mWPReached = false;
39 mOOCReached = false;
40 mWPPauseTimer = 0;
41 mLastWP = nullptr;
43
44 mCanRepeatPath = false;
45
46 mEvadeDisabled = false;
47
48 mCanAutoAttack = true;
49
50 mForcedPaused = false;
51
53
55
56 mDespawnTime = 0;
57 mDespawnState = 0;
58
60 mFollowDist = 0;
61 mFollowAngle = 0;
62 mFollowCredit = 0;
68
69 mJustReset = false;
70
71 mcanSpawn = true;
72
73 _chaseOnInterrupt = false;
74
75 aiDataSet.clear();
76
77 // Xinef: Vehicle conditions
79 if (me->GetVehicleKit())
81
82 _currentRangeMode = false;
83 _attackDistance = 0.f;
84 _mainSpellId = 0;
85}
#define sConditionMgr
Definition ConditionMgr.h:292
@ CONDITION_SOURCE_TYPE_CREATURE_TEMPLATE_VEHICLE
Definition ConditionMgr.h:141
@ FORCED_MOVEMENT_NONE
Definition MotionMaster.h:86
@ SMART_ESCORT_NONE
Definition SmartAI.h:31
Definition CreatureAI.h:69
Creature *const me
Definition CreatureAI.h:71
uint32 GetEntry() const
Definition Object.h:117
uint32 mDespawnTime
Definition SmartAI.h:259
uint32 mEscortState
Definition SmartAI.h:242
uint32 mEscortInvokerCheckTimer
Definition SmartAI.h:263
uint32 mDespawnState
Definition SmartAI.h:260
bool mOOCReached
Definition SmartAI.h:245
uint32 mWPPauseTimer
Definition SmartAI.h:246
uint32 _mainSpellId
Definition SmartAI.h:279
bool _chaseOnInterrupt
Definition SmartAI.h:273
uint32 mCurrentWPID
Definition SmartAI.h:243
uint32 m_ConditionsTimer
Definition SmartAI.h:271
bool mIsCharmed
Definition SmartAI.h:227
bool mWPReached
Definition SmartAI.h:244
uint32 mFollowArrivedTimer
Definition SmartAI.h:229
float mFollowAngle
Definition SmartAI.h:236
uint32 mEscortQuestID
Definition SmartAI.h:196
bool _currentRangeMode
Definition SmartAI.h:276
float _attackDistance
Definition SmartAI.h:277
WaypointPath const * mWayPoints
Definition SmartAI.h:241
ForcedMovement mForcedMovement
Definition SmartAI.h:255
uint32 mEscortNPCFlags
Definition SmartAI.h:248
ConditionList conditions
Definition SmartAI.h:270
uint32 mFollowCreditType
Definition SmartAI.h:228
bool mFollowArrivedAlive
Definition SmartAI.h:233
bool mcanSpawn
Definition SmartAI.h:266
uint32 mInvincibilityHpLevel
Definition SmartAI.h:254
bool mCanAutoAttack
Definition SmartAI.h:252
bool mJustReset
Definition SmartAI.h:264
bool mCanRepeatPath
Definition SmartAI.h:250
bool mEvadeDisabled
Definition SmartAI.h:251
bool mForcedPaused
Definition SmartAI.h:253
uint32 mFollowCredit
Definition SmartAI.h:231
uint32 mFollowArrivedEntry
Definition SmartAI.h:232
float mFollowDist
Definition SmartAI.h:235
WaypointNode const * mLastWP
Definition SmartAI.h:247
std::unordered_map< uint32, uint32 > aiDataSet
Definition SmartAI.h:274
Vehicle * GetVehicleKit() const
Definition Unit.h:1925

References _attackDistance, _chaseOnInterrupt, _currentRangeMode, _mainSpellId, aiDataSet, CONDITION_SOURCE_TYPE_CREATURE_TEMPLATE_VEHICLE, conditions, FORCED_MOVEMENT_NONE, Object::GetEntry(), Unit::GetVehicleKit(), m_ConditionsTimer, mCanAutoAttack, mCanRepeatPath, mcanSpawn, mCurrentWPID, mDespawnState, mDespawnTime, CreatureAI::me, mEscortInvokerCheckTimer, mEscortNPCFlags, mEscortQuestID, mEscortState, mEvadeDisabled, mFollowAngle, mFollowArrivedAlive, mFollowArrivedEntry, mFollowArrivedTimer, mFollowCredit, mFollowCreditType, mFollowDist, mForcedMovement, mForcedPaused, mInvincibilityHpLevel, mIsCharmed, mJustReset, mLastWP, mOOCReached, mWayPoints, mWPPauseTimer, mWPReached, sConditionMgr, and SMART_ESCORT_NONE.

Member Function Documentation

◆ AddEscortState()

void SmartAI::AddEscortState ( uint32  uiEscortState)
inline
64{ mEscortState |= uiEscortState; }

References mEscortState.

Referenced by EnterEvadeMode(), PausePath(), and StartPath().

◆ AssistPlayerInCombatAgainst()

bool SmartAI::AssistPlayerInCombatAgainst ( Unit who)
private
783{
784 if (!IsAIControlled())
785 return false;
786
787 // Xinef: if unit has no victim, or victim is player controlled thing
788 if (!who->GetVictim() || who->GetCharmerOrOwnerOrOwnGUID().IsPlayer())
789 return false;
790
791 //experimental (unknown) flag not present
793 return false;
794
795 // Xinef: victim of unit has to be a player controlled unit
797 return false;
798
799 // Xinef: Check if victim can be assisted
800 if (!me->IsValidAssistTarget(who->GetVictim()))
801 return false;
802
803 //too far away and no free sight?
805 {
806 AttackStart(who);
807 return true;
808 }
809
810 return false;
811}
@ CREATURE_TYPE_FLAG_CAN_ASSIST
Definition SharedDefines.h:2703
@ SMART_MAX_AID_DIST
Definition SmartAI.h:40
CreatureTemplate const * GetCreatureTemplate() const
Definition Creature.h:206
bool IsPlayer() const
Definition ObjectGuid.h:168
void AttackStart(Unit *who) override
Definition SmartAI.cpp:886
bool IsAIControlled() const
Definition SmartAI.cpp:87
ObjectGuid GetCharmerOrOwnerOrOwnGUID() const
Definition Unit.h:1296
Unit * GetVictim() const
Definition Unit.h:903
bool IsValidAssistTarget(Unit const *target) const
Definition Unit.cpp:10843
bool IsWithinLOSInMap(WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
Definition Object.cpp:1403
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:1377
uint32 type_flags
Definition CreatureData.h:219

References AttackStart(), CREATURE_TYPE_FLAG_CAN_ASSIST, Unit::GetCharmerOrOwnerOrOwnGUID(), Creature::GetCreatureTemplate(), Unit::GetVictim(), IsAIControlled(), ObjectGuid::IsPlayer(), Unit::IsValidAssistTarget(), WorldObject::IsWithinDistInMap(), WorldObject::IsWithinLOSInMap(), CreatureAI::me, SMART_MAX_AID_DIST, and CreatureTemplate::type_flags.

Referenced by MoveInLineOfSight().

◆ AttackStart()

void SmartAI::AttackStart ( Unit who)
overridevirtual

Reimplemented from UnitAI.

887{
888 // xinef: dont allow charmed npcs to act on their own
890 {
891 if (who)
892 me->Attack(who, mCanAutoAttack);
893 return;
894 }
895
896 if (who && me->Attack(who, me->IsWithinMeleeRange(who)))
897 {
899 {
901 if (type == ESCORT_MOTION_TYPE || type == POINT_MOTION_TYPE)
902 {
904 me->StopMoving();
905 me->GetMotionMaster()->Clear(false);
906 }
907
909 }
910 }
911}
@ MOTION_SLOT_ACTIVE
Definition MotionMaster.h:65
MovementGeneratorType
Definition MotionMaster.h:38
@ ESCORT_MOTION_TYPE
Definition MotionMaster.h:57
@ POINT_MOTION_TYPE
Definition MotionMaster.h:48
@ UNIT_STATE_NO_COMBAT_MOVEMENT
Definition UnitDefines.h:204
@ UNIT_FLAG_POSSESSED
Definition UnitDefines.h:281
MovementGeneratorType GetMotionSlotType(int slot) const
Definition MotionMaster.cpp:969
void MoveChase(Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
Force the unit to chase this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:315
void MovementExpired(bool reset=true)
Definition MotionMaster.h:206
void Clear(bool reset=true)
Definition MotionMaster.h:193
MotionMaster * GetMotionMaster()
Definition Unit.h:1758
bool HasUnitFlag(UnitFlags flags) const
Definition Unit.h:747
void StopMoving()
Definition Unit.cpp:12997
bool IsWithinMeleeRange(Unit const *obj, float dist=0.f) const
Definition Unit.cpp:782
bool Attack(Unit *victim, bool meleeAttack)
Definition Unit.cpp:7272
bool HasUnitState(const uint32 f) const
Definition Unit.h:736

References _attackDistance, Unit::Attack(), MotionMaster::Clear(), ESCORT_MOTION_TYPE, Unit::GetMotionMaster(), MotionMaster::GetMotionSlotType(), Unit::HasUnitFlag(), Unit::HasUnitState(), Unit::IsWithinMeleeRange(), mCanAutoAttack, CreatureAI::me, MOTION_SLOT_ACTIVE, MotionMaster::MoveChase(), MotionMaster::MovementExpired(), POINT_MOTION_TYPE, Unit::StopMoving(), UNIT_FLAG_POSSESSED, and UNIT_STATE_NO_COMBAT_MOVEMENT.

Referenced by AssistPlayerInCombatAgainst(), and MoveInLineOfSight().

◆ CanAIAttack()

bool SmartAI::CanAIAttack ( Unit const *  who) const
overridevirtual

Reimplemented from UnitAI.

778{
779 return true;
780}

◆ CanRespawn()

bool SmartAI::CanRespawn ( )
inlineoverridevirtual

Reimplemented from CreatureAI.

214{ return mcanSpawn; };

References mcanSpawn.

◆ CheckConditions()

void SmartAI::CheckConditions ( const uint32  diff)
private
533{
534 Vehicle* vehicle = me->GetVehicleKit();
535 if (!vehicle)
536 return;
537
538 if (m_ConditionsTimer < diff)
539 {
540 if (!conditions.empty())
541 {
542 for (SeatMap::iterator itr = vehicle->Seats.begin(); itr != vehicle->Seats.end(); ++itr)
543 if (Unit* passenger = ObjectAccessor::GetUnit(*me, itr->second.Passenger.Guid))
544 {
545 if (Player* player = passenger->ToPlayer())
546 {
547 if (!sConditionMgr->IsObjectMeetToConditions(player, me, conditions))
548 {
549 player->ExitVehicle();
550 return;//check other pessanger in next tick
551 }
552 }
553 }
554 }
555 m_ConditionsTimer = 1000;
556 }
557 else
558 m_ConditionsTimer -= diff;
559}
Player * ToPlayer()
Definition Object.h:202
Definition Player.h:1084
Definition Unit.h:664
Definition Vehicle.h:28
SeatMap Seats
Definition Vehicle.h:57
Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:199

References conditions, ObjectAccessor::GetUnit(), Unit::GetVehicleKit(), m_ConditionsTimer, CreatureAI::me, sConditionMgr, Vehicle::Seats, and Object::ToPlayer().

Referenced by UpdateAI().

◆ CorpseRemoved()

void SmartAI::CorpseRemoved ( uint32 )
overridevirtual

== Triggered Actions Requested ==================

== State checks =================================

Reimplemented from CreatureAI.

963{
964 GetScript()->ProcessEventsFor(SMART_EVENT_CORPSE_REMOVED, nullptr, respawnDelay);
965
966 // xinef: end escort upon corpse remove, safe check in case of immediate despawn
967 if (IsEscorted())
968 EndPath(true);
969}
@ SMART_EVENT_CORPSE_REMOVED
Definition SmartScriptMgr.h:135
void EndPath(bool fail=false)
Definition SmartAI.cpp:350
bool IsEscorted() override
Definition SmartAI.h:65
SmartScript * GetScript()
Definition SmartAI.h:76
void ProcessEventsFor(SMART_EVENT e, Unit *unit=nullptr, uint32 var0=0, uint32 var1=0, bool bvar=false, SpellInfo const *spell=nullptr, GameObject *gob=nullptr)
Definition SmartScript.cpp:136

References EndPath(), GetScript(), IsEscorted(), SmartScript::ProcessEventsFor(), and SMART_EVENT_CORPSE_REMOVED.

◆ DamageDealt()

void SmartAI::DamageDealt ( Unit ,
uint32 ,
DamageEffectType  ,
SpellSchoolMask   
)
overridevirtual

Called at any Damage to any victim (before damage apply)

Reimplemented from UnitAI.

952{
954}
@ SMART_EVENT_DAMAGED_TARGET
Definition SmartScriptMgr.h:132

References GetScript(), SmartScript::ProcessEventsFor(), and SMART_EVENT_DAMAGED_TARGET.

◆ DamageTaken()

void SmartAI::DamageTaken ( Unit ,
uint32 ,
DamageEffectType  ,
SpellSchoolMask   
)
overridevirtual

Called at any Damage from any attacker (before damage apply)

Note
It use for recalculation damage or special reaction at damage for attack reaction use AttackedBy called for non DOT damage in Unit::DealDamage also

Reimplemented from UnitAI.

924{
925 if (doneBy)
927
928 if (!IsAIControlled()) // don't allow players to use unkillable units
929 return;
930
931 // Xinef: skip nodamage type (eg. instakill effect)
932 if (damagetype != NODAMAGE && mInvincibilityHpLevel && (damage >= me->GetHealth() - mInvincibilityHpLevel))
933 damage = me->GetHealth() - mInvincibilityHpLevel; // damage should not be nullified, because of player damage req.
934}
@ SMART_EVENT_DAMAGED
Definition SmartScriptMgr.h:131
@ NODAMAGE
Definition Unit.h:258
uint32 GetHealth() const
Definition Unit.h:1108

References Unit::GetHealth(), GetScript(), IsAIControlled(), CreatureAI::me, mInvincibilityHpLevel, NODAMAGE, SmartScript::ProcessEventsFor(), and SMART_EVENT_DAMAGED.

◆ DistanceYourself()

void SmartAI::DistanceYourself ( float  range)
1190{
1191 Unit* victim = me->GetVictim();
1192 if (!victim || !victim->IsWithinMeleeRange(me))
1193 return;
1194
1195 float combatReach = me->GetMeleeRange(victim);
1196 float distance = DISTANCING_CONSTANT + std::max(combatReach * 1.5f, combatReach + range);
1197 me->GetMotionMaster()->DistanceYourself(distance);
1198 _pendingDistancing = distance;
1199}
#define DISTANCING_CONSTANT
Definition SmartAI.h:43
void DistanceYourself(float range)
Definition MotionMaster.cpp:353
float _pendingDistancing
Definition SmartAI.h:278
float GetMeleeRange(Unit const *target) const
Definition Unit.cpp:800

References _pendingDistancing, MotionMaster::DistanceYourself(), DISTANCING_CONSTANT, Unit::GetMeleeRange(), Unit::GetMotionMaster(), Unit::GetVictim(), Unit::IsWithinMeleeRange(), and CreatureAI::me.

◆ DistancingEnded()

void SmartAI::DistancingEnded ( )
overridevirtual

Reimplemented from CreatureAI.

1306{
1308 _pendingDistancing = 0.f;
1309}
void SetCurrentRangeMode(bool on, float range=0.f)
Definition SmartAI.cpp:1165

References _pendingDistancing, and SetCurrentRangeMode().

◆ DoAction()

void SmartAI::DoAction ( int32  param = 0)
overridevirtual

Reimplemented from UnitAI.

1064{
1066}
@ SMART_EVENT_ACTION_DONE
Definition SmartScriptMgr.h:171

References GetScript(), SmartScript::ProcessEventsFor(), and SMART_EVENT_ACTION_DONE.

◆ EndPath()

void SmartAI::EndPath ( bool  fail = false)
351{
353 mWayPoints = nullptr;
354 mLastWP = nullptr;
355 mWPPauseTimer = 0;
356
357 if (mEscortNPCFlags)
358 {
360 mEscortNPCFlags = 0;
361 }
362
364 if (targets && mEscortQuestID)
365 {
366 if (targets->size() == 1 && GetScript()->IsPlayer((*targets->begin())))
367 {
368 Player* player = targets->front()->ToPlayer();
369 if (Group* group = player->GetGroup())
370 {
371 for (GroupReference* groupRef = group->GetFirstMember(); groupRef != nullptr; groupRef = groupRef->next())
372 {
373 Player* groupGuy = groupRef->GetSource();
374 if (!groupGuy || !player->IsInMap(groupGuy))
375 continue;
376
377 if (!fail && groupGuy->IsAtGroupRewardDistance(me) && !groupGuy->HasCorpse())
379 else if (fail && groupGuy->GetQuestStatus(mEscortQuestID) == QUEST_STATUS_INCOMPLETE)
380 groupGuy->FailQuest(mEscortQuestID);
381 }
382 }
383 else
384 {
385 if (!fail && player->IsAtGroupRewardDistance(me) && !player->HasCorpse())
387 else if (fail && player->GetQuestStatus(mEscortQuestID) == QUEST_STATUS_INCOMPLETE)
388 player->FailQuest(mEscortQuestID);
389 }
390 }
391 else
392 {
393 for (WorldObject* target : *targets)
394 {
395 if (GetScript()->IsPlayer(target))
396 {
397 Player* player = target->ToPlayer();
398 if (!fail && player->IsAtGroupRewardDistance(me) && !player->HasCorpse())
400 else if (fail && player->GetQuestStatus(mEscortQuestID) == QUEST_STATUS_INCOMPLETE)
401 player->FailQuest(mEscortQuestID);
402 }
403 }
404 }
405 }
406
407 // Xinef: if the escort failed - DO NOT PROCESS ANYTHING
408 // Xinef: End Path events should be only processed if it was SUCCESSFUL stop or stop called by SMART_ACTION_WAYPOINT_STOP
409 if (fail)
410 {
411 mCurrentWPID = 0;
412 return;
413 }
414
416 mCurrentWPID = 0;
417
418 if (mCanRepeatPath)
419 {
420 if (IsAIControlled())
421 StartPath(mForcedMovement, GetScript()->GetPathId(), true);
422 }
423 else
424 GetScript()->SetPathId(0);
425
426 if (mDespawnState == 1)
427 StartDespawn();
428}
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:103
@ SMART_ESCORT_ESCORTING
Definition SmartAI.h:32
@ SMART_ESCORT_PAUSED
Definition SmartAI.h:34
@ SMART_ESCORT_RETURNING
Definition SmartAI.h:33
std::vector< WorldObject * > ObjectVector
Definition SmartScriptMgr.h:2026
@ SMART_EVENT_ESCORT_ENDED
Definition SmartScriptMgr.h:157
@ SMART_ESCORT_TARGETS
Definition SmartScriptMgr.h:40
NPCFlags
Non Player Character flags.
Definition UnitDefines.h:320
Definition GroupReference.h:27
Definition Group.h:169
bool HasCorpse() const
Definition Player.h:2058
void GroupEventHappens(uint32 questId, WorldObject const *pEventObject)
Definition PlayerQuest.cpp:1850
bool IsAtGroupRewardDistance(WorldObject const *pRewardSource) const
Definition Player.cpp:12761
Group * GetGroup()
Definition Player.h:2504
void AreaExploredOrEventHappens(uint32 questId)
Definition PlayerQuest.cpp:1823
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition PlayerQuest.cpp:1462
void FailQuest(uint32 quest_id)
Definition PlayerQuest.cpp:887
void RemoveEscortState(uint32 uiEscortState)
Definition SmartAI.h:66
void StartDespawn()
Definition SmartAI.h:203
void StartPath(ForcedMovement forcedMovement=FORCED_MOVEMENT_NONE, uint32 path=0, bool repeat=false, Unit *invoker=nullptr, PathSource pathSource=PathSource::SMART_WAYPOINT_MGR)
Definition SmartAI.cpp:232
ObjectVector const * GetStoredTargetVector(uint32 id, WorldObject const &ref) const
Definition SmartScript.h:100
void SetPathId(uint32 id)
Definition SmartScript.h:62
void ReplaceAllNpcFlags(NPCFlags flags)
Definition Unit.h:766
Definition Object.h:475
bool IsInMap(WorldObject const *obj) const
Definition Object.cpp:1335

References Player::AreaExploredOrEventHappens(), Player::FailQuest(), Player::GetGroup(), Player::GetQuestStatus(), GetScript(), SmartScript::GetStoredTargetVector(), Player::GroupEventHappens(), Player::HasCorpse(), IsAIControlled(), Player::IsAtGroupRewardDistance(), WorldObject::IsInMap(), SmartScript::IsPlayer(), mCanRepeatPath, mCurrentWPID, mDespawnState, CreatureAI::me, mEscortNPCFlags, mEscortQuestID, mForcedMovement, mLastWP, mWayPoints, mWPPauseTimer, SmartScript::ProcessEventsFor(), QUEST_STATUS_INCOMPLETE, RemoveEscortState(), Unit::ReplaceAllNpcFlags(), SmartScript::SetPathId(), SMART_ESCORT_ESCORTING, SMART_ESCORT_PAUSED, SMART_ESCORT_RETURNING, SMART_ESCORT_TARGETS, SMART_EVENT_ESCORT_ENDED, StartDespawn(), StartPath(), and Object::ToPlayer().

Referenced by CorpseRemoved(), JustDied(), MovepointReached(), OnCharmed(), StopPath(), and UpdatePath().

◆ EnterEvadeMode()

void SmartAI::EnterEvadeMode ( EvadeReason  why = EVADE_REASON_OTHER)
overridevirtual

Reimplemented from CreatureAI.

700{
701 if (mEvadeDisabled)
702 {
704 return;
705 }
706
708 {
709 me->AttackStop();
711 return;
712 }
713
714 if (!_EnterEvadeMode())
715 return;
716
718
719 GetScript()->ProcessEventsFor(SMART_EVENT_EVADE); //must be after aura clear so we can cast spells from db
720
721 if (Unit* owner = me->GetCharmerOrOwner())
722 {
725 }
727 {
730 }
731 else if (mFollowGuid)
732 {
736
737 // xinef: do not forget to reset scripts as we wont call reached home
738 GetScript()->OnReset();
739 }
740 else
741 {
743
744 // xinef: do not forget to reset scripts as we wont call reached home
746 GetScript()->OnReset();
747 }
748}
constexpr float PET_FOLLOW_DIST
Definition PetDefines.h:206
@ SMART_EVENT_EVADE
Definition SmartScriptMgr.h:106
@ UNIT_STATE_EVADE
Definition UnitDefines.h:194
@ UNIT_FLAG_IN_COMBAT
Definition UnitDefines.h:276
bool _EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
Definition CreatureAI.cpp:382
void MoveTargetedHome(bool walk=false)
The unit will return this initial position (owner for pets and summoned creatures)....
Definition MotionMaster.cpp:261
void MoveFollow(Unit *target, float dist, float angle, MovementSlot slot=MOTION_SLOT_ACTIVE, bool inheritWalkState=true, bool inheritSpeed=true)
The unit will follow this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:447
bool HasEscortState(uint32 uiEscortState)
Definition SmartAI.h:63
void ReturnToLastOOCPos()
Definition SmartAI.cpp:441
void AddEscortState(uint32 uiEscortState)
Definition SmartAI.h:64
ObjectGuid mFollowGuid
Definition SmartAI.h:234
void OnReset()
Definition SmartScript.cpp:110
void ClearUnitState(uint32 f)
Definition Unit.h:737
void AddUnitState(uint32 f)
Definition Unit.h:735
Unit * GetCharmerOrOwner() const
Definition Unit.h:1286
virtual float GetFollowAngle() const
Definition Unit.h:1895
ObjectGuid GetCharmerGUID() const
Definition Unit.h:719
bool AttackStop()
Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell...
Definition Unit.cpp:7436
void RemoveUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:749

References CreatureAI::_EnterEvadeMode(), AddEscortState(), Unit::AddUnitState(), Unit::AttackStop(), Unit::ClearUnitState(), Unit::GetCharmerGUID(), Unit::GetCharmerOrOwner(), Unit::GetFollowAngle(), Unit::GetMotionMaster(), GetScript(), ObjectAccessor::GetUnit(), HasEscortState(), Unit::HasUnitFlag(), Unit::HasUnitState(), ObjectGuid::IsPlayer(), CreatureAI::me, mEvadeDisabled, mFollowAngle, mFollowDist, mFollowGuid, MotionMaster::MoveFollow(), MotionMaster::MoveTargetedHome(), SmartScript::OnReset(), PET_FOLLOW_DIST, SmartScript::ProcessEventsFor(), Unit::RemoveUnitFlag(), ReturnToLastOOCPos(), SMART_ESCORT_ESCORTING, SMART_ESCORT_RETURNING, SMART_EVENT_EVADE, UNIT_FLAG_IN_COMBAT, UNIT_FLAG_POSSESSED, and UNIT_STATE_EVADE.

Referenced by npc_black_morass_summoned_add::EnterEvadeMode(), and OnCharmed().

◆ GenerateWayPointArray()

void SmartAI::GenerateWayPointArray ( Movement::PointsArray points)
171{
172 if (!mWayPoints || mWayPoints->Nodes.empty())
173 return;
174
175 // Flying unit, just fill array
177 {
178 // xinef: first point in vector is unit real position
179 points->clear();
180 points->push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()));
181 // mCurrentWPID is 1-based
182 for (uint32 i = mCurrentWPID > 0 ? mCurrentWPID - 1 : 0; i < mWayPoints->Nodes.size(); ++i)
183 {
184 WaypointNode const& wp = mWayPoints->Nodes[i];
185 points->push_back(G3D::Vector3(wp.X, wp.Y, wp.Z));
186 }
187 }
188 else
189 {
190 for (float size = 1.0f; size; size *= 0.5f)
191 {
192 std::vector<G3D::Vector3> pVector;
193 // xinef: first point in vector is unit real position
194 pVector.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()));
195
196 uint32 startIdx = mCurrentWPID > 0 ? mCurrentWPID - 1 : 0;
197 uint32 length = (uint32)((mWayPoints->Nodes.size() - startIdx) * size);
198
199 uint32 cnt = 0;
200 for (uint32 i = startIdx; i < mWayPoints->Nodes.size() && cnt++ <= length; ++i)
201 {
202 WaypointNode const& wp = mWayPoints->Nodes[i];
203 pVector.push_back(G3D::Vector3(wp.X, wp.Y, wp.Z));
204 }
205
206 if (pVector.size() > 2) // more than source + dest
207 {
208 G3D::Vector3 middle = (pVector[0] + pVector[pVector.size() - 1]) / 2.f;
209 G3D::Vector3 offset;
210
211 bool continueLoop = false;
212 for (uint32 i = 1; i < pVector.size() - 1; ++i)
213 {
214 offset = middle - pVector[i];
215 if (std::fabs(offset.x) >= 0xFF || std::fabs(offset.y) >= 0xFF || std::fabs(offset.z) >= 0x7F)
216 {
217 // offset is too big, split points
218 continueLoop = true;
219 break;
220 }
221 }
222 if (continueLoop)
223 continue;
224 }
225 // everything ok
226 *points = pVector;
227 break;
228 }
229 }
230}
std::uint32_t uint32
Definition Define.h:107
MovementFlags
Definition UnitDefines.h:370
@ MOVEMENTFLAG_DISABLE_GRAVITY
Definition UnitDefines.h:382
@ MOVEMENTFLAG_CAN_FLY
Definition UnitDefines.h:396
MovementInfo m_movementInfo
Definition Object.h:698
bool HasMovementFlag(uint32 flag) const
Definition Object.h:346
float GetPositionZ() const
Definition Position.h:123
float GetPositionX() const
Definition Position.h:121
float GetPositionY() const
Definition Position.h:122
Definition WaypointDefines.h:37
float X
Definition WaypointDefines.h:48
float Z
Definition WaypointDefines.h:48
float Y
Definition WaypointDefines.h:48
std::vector< WaypointNode > Nodes
Definition WaypointDefines.h:68

References Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), MovementInfo::HasMovementFlag(), WorldObject::m_movementInfo, mCurrentWPID, CreatureAI::me, MOVEMENTFLAG_CAN_FLY, MOVEMENTFLAG_DISABLE_GRAVITY, mWayPoints, WaypointPath::Nodes, WaypointNode::X, WaypointNode::Y, and WaypointNode::Z.

Referenced by ResumePath(), and StartPath().

◆ GetData()

uint32 SmartAI::GetData ( uint32  id = 0) const
overridevirtual

Reimplemented from UnitAI.

1069{
1070 auto const& itr = aiDataSet.find(id);
1071 if (itr != aiDataSet.end())
1072 return itr->second;
1073
1074 return 0;
1075}

References aiDataSet.

◆ GetGUID()

ObjectGuid SmartAI::GetGUID ( int32  id = 0) const
overridevirtual

Reimplemented from UnitAI.

1098{
1099 return ObjectGuid::Empty;
1100}
static ObjectGuid const Empty
Definition ObjectGuid.h:120

References ObjectGuid::Empty.

◆ GetNextWayPoint()

WaypointNode const * SmartAI::GetNextWayPoint ( )
152{
153 if (!mWayPoints || mWayPoints->Nodes.empty())
154 return nullptr;
155
156 mCurrentWPID++;
157 // mCurrentWPID is 1-based for SmartAI escort paths
158 if (mCurrentWPID > mWayPoints->Nodes.size())
159 return nullptr;
160
161 // Nodes are 0-indexed, mCurrentWPID is 1-based
162 WaypointNode const& node = mWayPoints->Nodes[mCurrentWPID - 1];
163 mLastWP = &node;
164 if (mLastWP->Id != mCurrentWPID)
165 LOG_ERROR("scripts.ai.sai", "SmartAI::GetNextWayPoint: Got not expected waypoint id {}, expected {}", mLastWP->Id, mCurrentWPID);
166
167 return mLastWP;
168}
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
uint32 Id
Definition WaypointDefines.h:47

References WaypointNode::Id, LOG_ERROR, mCurrentWPID, mLastWP, mWayPoints, and WaypointPath::Nodes.

Referenced by MovepointReached(), StartPath(), and UpdatePath().

◆ GetScript()

◆ GetWPCount()

uint32 SmartAI::GetWPCount ( )
inlineprivate
249{ return mWayPoints ? mWayPoints->Nodes.size() : 0; }

References mWayPoints, and WaypointPath::Nodes.

Referenced by MovepointReached(), and UpdatePath().

◆ HasEscortState()

bool SmartAI::HasEscortState ( uint32  uiEscortState)
inline

◆ HealReceived()

void SmartAI::HealReceived ( Unit ,
uint32  
)
overridevirtual

Called when the creature receives heal.

Reimplemented from UnitAI.

937{
939}
@ SMART_EVENT_RECEIVE_HEAL
Definition SmartScriptMgr.h:152

References GetScript(), SmartScript::ProcessEventsFor(), and SMART_EVENT_RECEIVE_HEAL.

◆ InitializeAI()

void SmartAI::InitializeAI ( )
overridevirtual

Reimplemented from UnitAI.

977{
979
980 for (SmartScriptHolder const& event : GetScript()->GetEvents())
981 {
982 if (event.GetActionType() != SMART_ACTION_CAST)
983 continue;
984
985 if (!(event.action.cast.castFlags & SMARTCAST_MAIN_SPELL))
986 continue;
987
988 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(event.action.cast.spell);
989 if (spellInfo && spellInfo->IsPositive())
990 {
991 LOG_WARN("scripts.ai", "SmartAI: Creature {} has SMARTCAST_MAIN_SPELL on positive spell {} - positive spells should not be used as main spell",
992 me->GetEntry(), event.action.cast.spell);
993 continue;
994 }
995
996 SetMainSpell(event.action.cast.spell);
997 break;
998 }
999
1000 // Fallback: use first SMARTCAST_COMBAT_MOVE if no MAIN_SPELL found
1001 if (!_currentRangeMode)
1002 {
1003 for (SmartScriptHolder const& event : GetScript()->GetEvents())
1004 {
1005 if (event.GetActionType() != SMART_ACTION_CAST)
1006 continue;
1007
1008 if (!(event.action.cast.castFlags & SMARTCAST_COMBAT_MOVE))
1009 continue;
1010
1011 // Don't use positive (healing/buff) spells to determine attack distance
1012 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(event.action.cast.spell);
1013 if (spellInfo && spellInfo->IsPositive())
1014 continue;
1015
1016 SetMainSpell(event.action.cast.spell);
1017 break;
1018 }
1019 }
1020
1021 if (!me->isDead())
1022 {
1023 mJustReset = true;
1026 }
1027}
#define LOG_WARN(filterType__,...)
Definition Log.h:162
@ SMART_ACTION_CAST
Definition SmartScriptMgr.h:553
@ SMART_EVENT_RESPAWN
Definition SmartScriptMgr.h:110
@ SMARTCAST_MAIN_SPELL
Definition SmartScriptMgr.h:1974
@ SMARTCAST_COMBAT_MOVE
Definition SmartScriptMgr.h:1970
#define sSpellMgr
Definition SpellMgr.h:836
void SetMainSpell(uint32 spellId)
Definition SmartAI.cpp:1174
void JustReachedHome() override
Definition SmartAI.cpp:835
void OnInitialize(WorldObject *obj, AreaTrigger const *at=nullptr)
Definition SmartScript.cpp:5227
Definition SpellInfo.h:340
bool IsPositive() const
Definition SpellInfo.cpp:1269
bool isDead() const
Definition Unit.h:1795
Definition SmartScriptMgr.h:1989

References _currentRangeMode, Object::GetEntry(), SmartScript::GetEvents(), GetScript(), Unit::isDead(), SpellInfo::IsPositive(), JustReachedHome(), LOG_WARN, CreatureAI::me, mJustReset, SmartScript::OnInitialize(), SmartScript::ProcessEventsFor(), SetMainSpell(), SMART_ACTION_CAST, SMART_EVENT_RESPAWN, SMARTCAST_COMBAT_MOVE, SMARTCAST_MAIN_SPELL, and sSpellMgr.

◆ IsAIControlled()

bool SmartAI::IsAIControlled ( ) const

◆ IsEscorted()

bool SmartAI::IsEscorted ( )
inlineoverridevirtual

Reimplemented from CreatureAI.

References mEscortState, and SMART_ESCORT_ESCORTING.

Referenced by CorpseRemoved().

◆ IsEscortInvokerInRange()

bool SmartAI::IsEscortInvokerInRange ( )
599{
600 if (ObjectVector const* targets = GetScript()->GetStoredTargetVector(SMART_ESCORT_TARGETS, *me))
601 {
603 if (targets->size() == 1 && GetScript()->IsPlayer((*targets->begin())))
604 {
605 Player* player = (*targets->begin())->ToPlayer();
606 if (me->GetDistance(player) <= checkDist)
607 return true;
608
609 if (Group* group = player->GetGroup())
610 {
611 for (GroupReference* groupRef = group->GetFirstMember(); groupRef != nullptr; groupRef = groupRef->next())
612 {
613 Player* groupGuy = groupRef->GetSource();
614
615 if (groupGuy && me->IsInMap(groupGuy) && me->GetDistance(groupGuy) <= checkDist)
616 return true;
617 }
618 }
619 }
620 else
621 {
622 for (WorldObject* target : *targets)
623 {
624 if (GetScript()->IsPlayer(target))
625 {
626 if (me->GetDistance(target->ToPlayer()) <= checkDist)
627 return true;
628 }
629 }
630 }
631
632 // Xinef: no valid target found
633 return false;
634 }
635 // Xinef: no player invoker was stored, just ignore range check
636 return true;
637}
@ SMART_ESCORT_MAX_PLAYER_DIST
Definition SmartAI.h:39
GroupReference * next()
Definition GroupReference.h:36
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1238
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:1295

References WorldObject::GetDistance(), Player::GetGroup(), WorldObject::GetInstanceScript(), GetScript(), WorldObject::IsInMap(), SmartScript::IsPlayer(), CreatureAI::me, GroupReference::next(), SMART_ESCORT_MAX_PLAYER_DIST, and SMART_ESCORT_TARGETS.

Referenced by UpdatePath().

◆ IsMainSpellPrevented()

bool SmartAI::IsMainSpellPrevented ( SpellInfo const *  spellInfo) const
1312{
1313 if (me->HasSpellCooldown(spellInfo->Id))
1314 return true;
1315
1316 if (spellInfo->PreventionType == SPELL_PREVENTION_TYPE_SILENCE && me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED))
1317 return true;
1318 if (spellInfo->PreventionType == SPELL_PREVENTION_TYPE_PACIFY && me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED))
1319 return true;
1320
1321 return false;
1322}
@ SPELL_PREVENTION_TYPE_SILENCE
Definition SharedDefines.h:1560
@ SPELL_PREVENTION_TYPE_PACIFY
Definition SharedDefines.h:1561
@ UNIT_FLAG_PACIFIED
Definition UnitDefines.h:274
@ UNIT_FLAG_SILENCED
Definition UnitDefines.h:270
@ UNIT_FIELD_FLAGS
Definition UpdateFields.h:117
bool HasSpellCooldown(uint32 spell_id) const override
Definition Creature.cpp:2963
bool HasFlag(uint16 index, uint32 flag) const
Definition Object.cpp:871

References Object::HasFlag(), Creature::HasSpellCooldown(), SpellInfo::Id, CreatureAI::me, SpellInfo::PreventionType, SPELL_PREVENTION_TYPE_PACIFY, SPELL_PREVENTION_TYPE_SILENCE, UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED, and UNIT_FLAG_SILENCED.

Referenced by OnSpellFailed().

◆ IsSummonedBy()

void SmartAI::IsSummonedBy ( WorldObject summoner)
overridevirtual

Reimplemented from CreatureAI.

947{
948 GetScript()->ProcessEventsFor(SMART_EVENT_JUST_SUMMONED, summoner->ToUnit(), 0, 0, false, nullptr, summoner->ToGameObject());
949}
@ SMART_EVENT_JUST_SUMMONED
Definition SmartScriptMgr.h:153
GameObject * ToGameObject()
Definition Object.h:214
Unit * ToUnit()
Definition Object.h:210

References GetScript(), SmartScript::ProcessEventsFor(), SMART_EVENT_JUST_SUMMONED, Object::ToGameObject(), and Object::ToUnit().

◆ JustDied()

void SmartAI::JustDied ( Unit killer)
overridevirtual

Reimplemented from CreatureAI.

859{
862 EndPath(true);
863}
@ SMART_EVENT_DEATH
Definition SmartScriptMgr.h:105

References EndPath(), GetScript(), HasEscortState(), SmartScript::ProcessEventsFor(), SMART_ESCORT_ESCORTING, and SMART_EVENT_DEATH.

◆ JustEngagedWith()

void SmartAI::JustEngagedWith ( Unit )
overridevirtual

Called for reaction when initially engaged - this happens after JustEnteredCombat.

Reimplemented from CreatureAI.

851{
852 // Xinef: Interrupt channeled spells
853 if (IsAIControlled())
856}
@ SMART_EVENT_AGGRO
Definition SmartScriptMgr.h:103
@ CURRENT_CHANNELED_SPELL
Definition Unit.h:557
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
Definition Unit.cpp:4230

References CURRENT_CHANNELED_SPELL, GetScript(), Unit::InterruptSpell(), IsAIControlled(), CreatureAI::me, SmartScript::ProcessEventsFor(), and SMART_EVENT_AGGRO.

◆ JustReachedHome()

void SmartAI::JustReachedHome ( )
overridevirtual

Reimplemented from CreatureAI.

836{
837 GetScript()->OnReset();
838
839 if (!mJustReset)
840 {
842
845 }
846
847 mJustReset = false;
848}
@ IDLE_MOTION_TYPE
Definition MotionMaster.h:39
@ SMART_EVENT_REACHED_HOME
Definition SmartScriptMgr.h:120
bool UpdateVictim()
Definition CreatureAI.cpp:353
uint32 GetWaypointPath() const
Definition Creature.h:355
void MoveWaypoint(uint32 path_id, bool repeatable, PathSource pathSource=PathSource::WAYPOINT_MGR)
Move the unit following a specific path. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:913
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition MotionMaster.cpp:961

References MotionMaster::GetCurrentMovementGeneratorType(), Unit::GetMotionMaster(), GetScript(), Creature::GetWaypointPath(), IDLE_MOTION_TYPE, CreatureAI::me, mJustReset, MotionMaster::MoveWaypoint(), SmartScript::OnReset(), SmartScript::ProcessEventsFor(), SMART_EVENT_REACHED_HOME, and CreatureAI::UpdateVictim().

Referenced by InitializeAI(), and JustRespawned().

◆ JustRespawned()

void SmartAI::JustRespawned ( )
overridevirtual

Reimplemented from CreatureAI.

814{
815 mDespawnTime = 0;
816 mDespawnState = 0;
818 me->SetVisible(true);
821 mJustReset = true;
824 mFollowGuid.Clear();//do not reset follower on Reset(), we need it after combat evade
825 mFollowDist = 0;
826 mFollowAngle = 0;
827 mFollowCredit = 0;
828 mFollowArrivedTimer = 1000;
831 mFollowArrivedAlive = true;
832 aiDataSet.clear();
833}
void Clear()
Definition ObjectGuid.h:138
void SetVisible(bool x)
Definition Unit.cpp:11072
void RestoreFaction()
Definition Unit.cpp:14920
uint32 GetFaction() const
Definition Unit.h:851
uint32 faction
Definition CreatureData.h:199

References aiDataSet, ObjectGuid::Clear(), CreatureTemplate::faction, Creature::GetCreatureTemplate(), Unit::GetFaction(), GetScript(), JustReachedHome(), mDespawnState, mDespawnTime, CreatureAI::me, mEscortState, mFollowAngle, mFollowArrivedAlive, mFollowArrivedEntry, mFollowArrivedTimer, mFollowCredit, mFollowCreditType, mFollowDist, mFollowGuid, mJustReset, SmartScript::ProcessEventsFor(), Unit::RestoreFaction(), Unit::SetVisible(), SMART_ESCORT_NONE, and SMART_EVENT_RESPAWN.

◆ JustSummoned()

void SmartAI::JustSummoned ( Creature creature)
overridevirtual

Reimplemented from CreatureAI.

871{
873 GetScript()->AddCreatureSummon(creature->GetGUID());
874}
@ SMART_EVENT_SUMMONED_UNIT
Definition SmartScriptMgr.h:116
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:114
void AddCreatureSummon(ObjectGuid const &guid)
Definition SmartScript.cpp:5499

References SmartScript::AddCreatureSummon(), Object::GetGUID(), GetScript(), SmartScript::ProcessEventsFor(), and SMART_EVENT_SUMMONED_UNIT.

◆ KilledUnit()

void SmartAI::KilledUnit ( Unit victim)
overridevirtual

Reimplemented from CreatureAI.

866{
868}
@ SMART_EVENT_KILL
Definition SmartScriptMgr.h:104

References GetScript(), SmartScript::ProcessEventsFor(), and SMART_EVENT_KILL.

◆ LoadPath()

bool SmartAI::LoadPath ( uint32  entry,
PathSource  pathSource 
)
267{
269 return false;
270
271 switch (pathSource)
272 {
274 {
275 mWayPoints = sSmartWaypointMgr->GetPath(entry);
276 if (!mWayPoints)
277 {
278 GetScript()->SetPathId(0);
279 return false;
280 }
281 break;
282 }
284 {
285 mWayPoints = sWaypointMgr->GetPath(entry);
286 if (!mWayPoints)
287 {
288 GetScript()->SetPathId(0);
289 return false;
290 }
291 break;
292 }
293 }
294
295 GetScript()->SetPathId(entry);
296 return true;
297}
@ SMART_WAYPOINT_MGR
#define sSmartWaypointMgr
Definition SmartScriptMgr.h:2263
#define sWaypointMgr
Definition WaypointMgr.h:54

References GetScript(), HasEscortState(), mWayPoints, SmartScript::SetPathId(), SMART_ESCORT_ESCORTING, SMART_WAYPOINT_MGR, sSmartWaypointMgr, sWaypointMgr, and WAYPOINT_MGR.

Referenced by StartPath().

◆ MoveInLineOfSight()

void SmartAI::MoveInLineOfSight ( Unit who)
overridevirtual

Reimplemented from CreatureAI.

751{
752 if (!who)
753 return;
754
756
757 if (!IsAIControlled())
758 return;
759
760 if (me->GetVictim())
761 return;
762
764 return;
765
767 {
769 {
772 }
773 AttackStart(who);
774 }
775}
@ UNIT_STATE_DISTRACTED
Definition UnitDefines.h:185
@ REACT_PASSIVE
Definition Unit.h:566
@ REACT_AGGRESSIVE
Definition Unit.h:568
bool HasReactState(ReactStates state) const
Definition Creature.h:101
bool CanStartAttack(Unit const *u, bool force=false) const
Definition Creature.cpp:1870
bool AssistPlayerInCombatAgainst(Unit *who)
Definition SmartAI.cpp:782
void OnMoveInLineOfSight(Unit *who)
Definition SmartScript.cpp:5270

References AssistPlayerInCombatAgainst(), AttackStart(), Creature::CanStartAttack(), MotionMaster::Clear(), Unit::ClearUnitState(), Unit::GetMotionMaster(), GetScript(), Unit::GetVictim(), Creature::HasReactState(), Unit::HasUnitState(), IsAIControlled(), CreatureAI::me, SmartScript::OnMoveInLineOfSight(), REACT_AGGRESSIVE, REACT_PASSIVE, and UNIT_STATE_DISTRACTED.

◆ MovementInform()

void SmartAI::MovementInform ( uint32  MovementType,
uint32  Data 
)
overridevirtual

Reimplemented from CreatureAI.

684{
685 if (MovementType == POINT_MOTION_TYPE && Data == SMART_ESCORT_LAST_OOC_POINT)
687
688 if (MovementType == WAYPOINT_MOTION_TYPE)
689 GetScript()->ProcessEventsFor(SMART_EVENT_WAYPOINT_REACHED, nullptr, Data); // data now corresponds to columns
690
691 GetScript()->ProcessEventsFor(SMART_EVENT_MOVEMENTINFORM, nullptr, MovementType, Data);
693 return;
694
695 if (MovementType == ESCORT_MOTION_TYPE || (MovementType == POINT_MOTION_TYPE && Data == SMART_ESCORT_LAST_OOC_POINT))
697}
@ WAYPOINT_MOTION_TYPE
Definition MotionMaster.h:41
@ SMART_EVENT_MOVEMENTINFORM
Definition SmartScriptMgr.h:133
@ SMART_EVENT_WAYPOINT_REACHED
Definition SmartScriptMgr.h:197
@ SMART_ESCORT_LAST_OOC_POINT
Definition SmartScriptMgr.h:38
Data
Definition blackfathom_deeps.h:24
void MovepointReached(uint32 id)
Definition SmartAI.cpp:639

References Unit::ClearUnitState(), ESCORT_MOTION_TYPE, GetScript(), HasEscortState(), CreatureAI::me, MovepointReached(), POINT_MOTION_TYPE, SmartScript::ProcessEventsFor(), SMART_ESCORT_ESCORTING, SMART_ESCORT_LAST_OOC_POINT, SMART_EVENT_MOVEMENTINFORM, SMART_EVENT_WAYPOINT_REACHED, UNIT_STATE_EVADE, and WAYPOINT_MOTION_TYPE.

◆ MovepointReached()

void SmartAI::MovepointReached ( uint32  id)
640{
641 // override the id, path can be resumed any time and counter will reset
642 // mCurrentWPID holds proper id
643
644 // xinef: both point movement and escort generator can enter this function
646 {
647 mOOCReached = true;
648 return;
649 }
650
651 mWPReached = true;
653
654 if (mLastWP)
655 {
658 }
659
661 {
664
667 }
668 // Xinef: Can be unset in ProcessEvents
670 {
671 mWPReached = false;
672 if (mCurrentWPID == GetWPCount())
673 EndPath();
674 else if (GetNextWayPoint())
675 {
676 // xinef: if we have reached waypoint, and there is no working spline movement it means our splitted array has ended, make new one
677 if (me->movespline->Finalized())
678 ResumePath();
679 }
680 }
681}
@ SMART_EVENT_ESCORT_REACHED
Definition SmartScriptMgr.h:139
void SetHomePosition(float x, float y, float z, float o)
Definition Creature.h:345
void SetPosition(float x, float y, float z, float o)
Definition Creature.cpp:3197
void MoveIdle()
Definition MotionMaster.cpp:234
bool Finalized() const
Definition MoveSpline.h:118
WaypointNode const * GetNextWayPoint()
Definition SmartAI.cpp:151
uint32 GetWPCount()
Definition SmartAI.h:249
void ResumePath()
Definition SmartAI.cpp:430
Movement::MoveSpline * movespline
Definition Unit.h:2114
void StopMovingOnCurrentPos()
Definition Unit.cpp:13036
float GetOrientation() const
Definition Position.h:124
void GetPosition(float &x, float &y) const
Definition Position.h:126

References EndPath(), ESCORT_MOTION_TYPE, Movement::MoveSpline::Finalized(), MotionMaster::GetCurrentMovementGeneratorType(), Unit::GetMotionMaster(), MotionMaster::GetMotionSlotType(), GetNextWayPoint(), Position::GetOrientation(), Position::GetPosition(), GetScript(), GetWPCount(), HasEscortState(), mCurrentWPID, CreatureAI::me, mLastWP, mOOCReached, MOTION_SLOT_ACTIVE, MotionMaster::MoveIdle(), MotionMaster::MovementExpired(), Unit::movespline, mWPReached, SmartScript::ProcessEventsFor(), ResumePath(), Creature::SetHomePosition(), Creature::SetPosition(), SMART_ESCORT_ESCORTING, SMART_ESCORT_LAST_OOC_POINT, SMART_ESCORT_PAUSED, SMART_EVENT_ESCORT_REACHED, Unit::StopMovingOnCurrentPos(), WaypointNode::X, WaypointNode::Y, and WaypointNode::Z.

Referenced by MovementInform().

◆ OnCharmed()

void SmartAI::OnCharmed ( bool  apply)
overridevirtual

Called when unit is charmed.

Reimplemented from CreatureAI.

1030{
1031 bool const charmed = me->IsCharmed();
1032 if (charmed) // do this before we change charmed state, as charmed state might prevent these things from processing
1033 {
1035 EndPath(true);
1036 }
1037
1038 mIsCharmed = charmed;
1039
1040 if (charmed && !me->isPossessed() && !me->IsVehicle())
1042
1043 if (!charmed && !me->IsInEvadeMode())
1044 {
1045 if (mCanRepeatPath)
1046 StartPath(mForcedMovement, GetScript()->GetPathId(), true);
1047
1048 if (!me->LastCharmerGUID.IsEmpty())
1049 {
1051 if (Unit* lastCharmer = ObjectAccessor::GetUnit(*me, me->LastCharmerGUID))
1052 me->EngageWithTarget(lastCharmer);
1054
1055 if (!me->IsInCombat())
1057 }
1058 }
1059
1060 GetScript()->ProcessEventsFor(SMART_EVENT_CHARMED, nullptr, 0, 0, charmed);
1061}
@ SMART_EVENT_CHARMED
Definition SmartScriptMgr.h:128
@ EVADE_REASON_NO_HOSTILES
Definition CreatureAI.h:88
bool IsInEvadeMode() const
Definition Creature.h:137
bool IsEmpty() const
Definition ObjectGuid.h:161
void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER) override
Definition SmartAI.cpp:699
bool IsVehicle() const
Definition Unit.h:800
bool IsCharmed() const
Definition Unit.h:1310
Unit * GetCharmer() const
Definition Unit.cpp:7690
bool isPossessed() const
Definition Unit.h:1311
void EngageWithTarget(Unit *who)
Definition Unit.cpp:7502
ObjectGuid LastCharmerGUID
Definition Unit.h:2096
bool IsInCombat() const
Definition Unit.h:935

References ObjectGuid::Clear(), EndPath(), Unit::EngageWithTarget(), EnterEvadeMode(), CreatureAI::EVADE_REASON_NO_HOSTILES, Unit::GetCharmer(), Unit::GetFollowAngle(), Unit::GetMotionMaster(), GetScript(), ObjectAccessor::GetUnit(), HasEscortState(), Creature::HasReactState(), Unit::IsCharmed(), ObjectGuid::IsEmpty(), Unit::IsInCombat(), Creature::IsInEvadeMode(), Unit::isPossessed(), Unit::IsVehicle(), Unit::LastCharmerGUID, mCanRepeatPath, CreatureAI::me, mForcedMovement, mIsCharmed, MotionMaster::MoveFollow(), PET_FOLLOW_DIST, SmartScript::ProcessEventsFor(), REACT_PASSIVE, SMART_ESCORT_ESCORTING, SMART_ESCORT_PAUSED, SMART_ESCORT_RETURNING, SMART_EVENT_CHARMED, and StartPath().

◆ OnSpellClick()

void SmartAI::OnSpellClick ( Unit clicker,
bool &  result 
)
overridevirtual

Reimplemented from CreatureAI.

1265{
1266 // Xinef: i dont think this is necessery (can be made as event parameter)
1267 //if (!result)
1268 // return;
1269
1271}
@ SMART_EVENT_ON_SPELLCLICK
Definition SmartScriptMgr.h:172

References GetScript(), SmartScript::ProcessEventsFor(), and SMART_EVENT_ON_SPELLCLICK.

◆ OnSpellFailed()

void SmartAI::OnSpellFailed ( SpellInfo const *  spell)
overridevirtual

Reimplemented from CreatureAI.

1325{
1327 if (_mainSpellId == spell->Id)
1329 SetCurrentRangeMode(false);
1330}
virtual void OnSpellFailed(SpellInfo const *)
Definition CreatureAI.h:171
bool IsMainSpellPrevented(SpellInfo const *spellInfo) const
Definition SmartAI.cpp:1311

References _currentRangeMode, _mainSpellId, SpellInfo::Id, IsMainSpellPrevented(), CreatureAI::OnSpellFailed(), and SetCurrentRangeMode().

◆ PassengerBoarded()

void SmartAI::PassengerBoarded ( Unit ,
int8  ,
bool   
)
overridevirtual

== Fields =======================================

Reimplemented from CreatureAI.

972{
974}
@ SMART_EVENT_PASSENGER_REMOVED
Definition SmartScriptMgr.h:127
@ SMART_EVENT_PASSENGER_BOARDED
Definition SmartScriptMgr.h:126
void apply(T *val)
Definition ByteConverter.h:40

References GetScript(), SmartScript::ProcessEventsFor(), SMART_EVENT_PASSENGER_BOARDED, and SMART_EVENT_PASSENGER_REMOVED.

◆ PathEndReached()

void SmartAI::PathEndReached ( uint32  pathId)
overridevirtual

Reimplemented from CreatureAI.

1274{
1276 me->LoadPath(0);
1277}
@ SMART_EVENT_WAYPOINT_ENDED
Definition SmartScriptMgr.h:198
void LoadPath(uint32 pathid)
Definition Creature.h:356

References GetScript(), Creature::GetWaypointPath(), Creature::LoadPath(), CreatureAI::me, SmartScript::ProcessEventsFor(), and SMART_EVENT_WAYPOINT_ENDED.

◆ PausePath()

void SmartAI::PausePath ( uint32  delay,
bool  forced = false 
)
300{
302 return;
303
305 {
306 LOG_ERROR("scripts.ai.sai", "SmartAI::StartPath: Creature entry {} wanted to pause waypoint movement while already paused, ignoring.", me->GetEntry());
307 return;
308 }
309
311 mWPPauseTimer = delay;
312 if (forced && !mWPReached)
313 {
314 mForcedPaused = forced;
317
318 me->StopMoving();
319 me->GetMotionMaster()->MoveIdle();//force stop
320
321 if (mCurrentWPID > 0 && mCurrentWPID <= mWayPoints->Nodes.size())
322 {
323 WaypointNode const& waypoint = mWayPoints->Nodes[mCurrentWPID - 1];
324 if (waypoint.Orientation.has_value())
325 me->SetFacingTo(*waypoint.Orientation);
326 }
327 }
329}
@ SMART_EVENT_ESCORT_PAUSED
Definition SmartScriptMgr.h:154
void SetFacingTo(float ori)
Definition Unit.cpp:16411
std::optional< float > Orientation
Definition WaypointDefines.h:49

References AddEscortState(), ESCORT_MOTION_TYPE, Object::GetEntry(), Unit::GetMotionMaster(), MotionMaster::GetMotionSlotType(), GetScript(), HasEscortState(), LOG_ERROR, mCurrentWPID, CreatureAI::me, mForcedPaused, MOTION_SLOT_ACTIVE, MotionMaster::MoveIdle(), MotionMaster::MovementExpired(), mWayPoints, mWPPauseTimer, mWPReached, WaypointPath::Nodes, WaypointNode::Orientation, SmartScript::ProcessEventsFor(), Unit::SetFacingTo(), SMART_ESCORT_ESCORTING, SMART_ESCORT_PAUSED, SMART_EVENT_ESCORT_PAUSED, and Unit::StopMoving().

◆ Permissible()

static int32 SmartAI::Permissible ( Creature const *  )
inlinestatic
174{ return PERMIT_BASE_NO; }
@ PERMIT_BASE_NO
Definition CreatureAI.h:285

References PERMIT_BASE_NO.

◆ ReceiveEmote()

void SmartAI::ReceiveEmote ( Player player,
uint32  textEmote 
)
overridevirtual

Reimplemented from CreatureAI.

942{
944}
@ SMART_EVENT_RECEIVE_EMOTE
Definition SmartScriptMgr.h:121

References GetScript(), SmartScript::ProcessEventsFor(), and SMART_EVENT_RECEIVE_EMOTE.

◆ RemoveEscortState()

void SmartAI::RemoveEscortState ( uint32  uiEscortState)
inline
66{ mEscortState &= ~uiEscortState; }

References mEscortState.

Referenced by EndPath(), and UpdatePath().

◆ ResumePath()

void SmartAI::ResumePath ( )
431{
432 if (mLastWP)
433 {
434 Movement::PointsArray pathPoints;
435 GenerateWayPointArray(&pathPoints);
436
438 }
439}
void MoveSplinePath(Movement::PointsArray *path, ForcedMovement forcedMovement=FORCED_MOVEMENT_NONE)
Definition MotionMaster.cpp:503
void GenerateWayPointArray(Movement::PointsArray *points)
Definition SmartAI.cpp:170
std::vector< Vector3 > PointsArray
Definition MoveSplineInitArgs.h:28

References GenerateWayPointArray(), Unit::GetMotionMaster(), CreatureAI::me, mForcedMovement, mLastWP, and MotionMaster::MoveSplinePath().

Referenced by MovepointReached(), and UpdatePath().

◆ ReturnToLastOOCPos()

void SmartAI::ReturnToLastOOCPos ( )
private
442{
443 if (!IsAIControlled())
444 return;
445
446 float x, y, z, o;
447 me->GetHomePosition(x, y, z, o);
449}
@ FORCED_MOVEMENT_RUN
Definition MotionMaster.h:88
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Definition Creature.h:347
void MovePoint(uint32 id, const Position &pos, ForcedMovement forcedMovement=FORCED_MOVEMENT_NONE, float speed=0.f, bool generatePath=true, bool forceDestination=true, std::optional< AnimTier > animTier=std::nullopt)
Definition MotionMaster.h:240

References FORCED_MOVEMENT_RUN, Creature::GetHomePosition(), Unit::GetMotionMaster(), IsAIControlled(), CreatureAI::me, MotionMaster::MovePoint(), and SMART_ESCORT_LAST_OOC_POINT.

Referenced by EnterEvadeMode().

◆ SetAutoAttack()

void SmartAI::SetAutoAttack ( bool  on)
inline
67{ mCanAutoAttack = on; }

References mCanAutoAttack.

◆ SetCanRespawn()

void SmartAI::SetCanRespawn ( bool  canSpawn)
inline
215{ mcanSpawn = canSpawn; }

References mcanSpawn.

◆ SetCombatMovement()

void SmartAI::SetCombatMovement ( bool  on,
bool  stopOrStartMovement 
)
1144{
1145 if (on)
1147 else
1149
1151 return;
1152
1153 if (stopOrStartMovement && me->GetVictim()) // Only change current movement while in combat
1154 {
1155 if (!me->IsCrowdControlled())
1156 {
1157 if (on)
1160 me->StopMoving();
1161 }
1162 }
1163}
@ CHASE_MOTION_TYPE
Definition MotionMaster.h:45
bool IsCrowdControlled() const
Definition Unit.h:784

References Unit::AddUnitState(), CHASE_MOTION_TYPE, Unit::ClearUnitState(), MotionMaster::GetCurrentMovementGeneratorType(), Unit::GetMotionMaster(), Unit::GetVictim(), HasEscortState(), IsAIControlled(), Unit::IsCrowdControlled(), CreatureAI::me, MotionMaster::MoveChase(), SMART_ESCORT_ESCORTING, Unit::StopMoving(), and UNIT_STATE_NO_COMBAT_MOVEMENT.

◆ SetCurrentRangeMode()

void SmartAI::SetCurrentRangeMode ( bool  on,
float  range = 0.f 
)

◆ SetData() [1/2]

void SmartAI::SetData ( uint32  id,
uint32  value 
)
inlineoverridevirtual

Reimplemented from UnitAI.

164{ SetData(id, value, nullptr); }
void SetData(uint32 id, uint32 value) override
Definition SmartAI.h:164

References SetData().

Referenced by SetData().

◆ SetData() [2/2]

void SmartAI::SetData ( uint32  id,
uint32  value,
WorldObject invoker 
)
1078{
1079 Unit* unit = nullptr;
1080 GameObject* gob = nullptr;
1081
1082 if (invoker)
1083 {
1084 unit = invoker->ToUnit();
1085 if (!unit)
1086 gob = invoker->ToGameObject();
1087 }
1088
1089 aiDataSet[id] = value;
1090 GetScript()->ProcessEventsFor(SMART_EVENT_DATA_SET, unit, id, value, false, nullptr, gob);
1091}
@ SMART_EVENT_DATA_SET
Definition SmartScriptMgr.h:137
Definition GameObject.h:120

References aiDataSet, GetScript(), SmartScript::ProcessEventsFor(), SMART_EVENT_DATA_SET, Object::ToGameObject(), and Object::ToUnit().

◆ SetDespawnTime()

void SmartAI::SetDespawnTime ( uint32  t)
inline
199 {
200 mDespawnTime = t;
201 mDespawnState = t ? 1 : 0;
202 }

References mDespawnState, and mDespawnTime.

Referenced by StopFollow(), and StopPath().

◆ SetEvadeDisabled()

void SmartAI::SetEvadeDisabled ( bool  disable = true)
1115{
1116 mEvadeDisabled = disable;
1117}

References mEvadeDisabled.

◆ SetFly()

void SmartAI::SetFly ( bool  fly = true)
1103{
1104 // xinef: set proper flag!
1105 //me->SetDisableGravity(fly);
1106 me->SetCanFly(fly);
1107}
void SetCanFly(bool enable)
Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pre...
Definition Unit.cpp:16522

References CreatureAI::me, and Unit::SetCanFly().

◆ SetFollow()

void SmartAI::SetFollow ( Unit target,
float  dist = 0.0f,
float  angle = 0.0f,
uint32  credit = 0,
uint32  end = 0,
uint32  creditType = 0,
bool  aliveState = true 
)
1202{
1203 if (!target)
1204 {
1205 StopFollow(false);
1206 return;
1207 }
1208
1209 mFollowGuid = target->GetGUID();
1210 mFollowDist = dist;
1211 mFollowAngle = angle;
1212 mFollowArrivedTimer = 1000;
1213 mFollowCredit = credit;
1214 mFollowArrivedEntry = end;
1215 mFollowArrivedAlive = !aliveState; // negate - 0 is alive
1216 mFollowCreditType = creditType;
1218}
void StopFollow(bool complete)
Definition SmartAI.cpp:1220

References Object::GetGUID(), Unit::GetMotionMaster(), CreatureAI::me, mFollowAngle, mFollowArrivedAlive, mFollowArrivedEntry, mFollowArrivedTimer, mFollowCredit, mFollowCreditType, mFollowDist, mFollowGuid, MotionMaster::MoveFollow(), and StopFollow().

◆ SetGUID()

void SmartAI::SetGUID ( ObjectGuid const &  guid,
int32  id = 0 
)
overridevirtual

Reimplemented from UnitAI.

1094{
1095}

◆ SetInvincibilityHpLevel()

void SmartAI::SetInvincibilityHpLevel ( uint32  level)
inline
185{ mInvincibilityHpLevel = level; }

References mInvincibilityHpLevel.

Referenced by SmartScript::ProcessAction().

◆ SetMainSpell()

void SmartAI::SetMainSpell ( uint32  spellId)
1175{
1176 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1177 if (!spellInfo)
1178 return;
1179
1180 float maxRange = spellInfo->GetMaxRange(false);
1181 if (maxRange <= NOMINAL_MELEE_RANGE)
1182 return;
1183
1184 _mainSpellId = spellId;
1185 _attackDistance = std::max(maxRange - NOMINAL_MELEE_RANGE, 0.0f);
1186 _currentRangeMode = true;
1187}
#define NOMINAL_MELEE_RANGE
Definition ObjectDefines.h:47
float GetMaxRange(bool positive=false, Unit *caster=nullptr, Spell *spell=nullptr) const
Definition SpellInfo.cpp:2723

References _attackDistance, _currentRangeMode, _mainSpellId, SpellInfo::GetMaxRange(), NOMINAL_MELEE_RANGE, and sSpellMgr.

Referenced by InitializeAI().

◆ SetScript9()

void SmartAI::SetScript9 ( SmartScriptHolder e,
uint32  entry,
WorldObject invoker 
)
1253{
1254 if (invoker)
1255 GetScript()->mLastInvoker = invoker->GetGUID();
1256 GetScript()->SetScript9(e, entry);
1257}
ObjectGuid mLastInvoker
Definition SmartScript.h:200
void SetScript9(SmartScriptHolder &e, uint32 entry)
Definition SmartScript.cpp:5382

References Object::GetGUID(), GetScript(), SmartScript::mLastInvoker, and SmartScript::SetScript9().

◆ SetSwim()

void SmartAI::SetSwim ( bool  swim = true)
1110{
1111 me->SetSwim(swim);
1112}
bool SetSwim(bool enable) override
Definition Creature.cpp:3258

References CreatureAI::me, and Creature::SetSwim().

◆ SetWPPauseTimer()

void SmartAI::SetWPPauseTimer ( uint32  time)
inline
218{ mWPPauseTimer = time; }

References mWPPauseTimer.

◆ sGossipHello()

void SmartAI::sGossipHello ( Player player)
overridevirtual

Reimplemented from UnitAI.

1120{
1122}
@ SMART_EVENT_GOSSIP_HELLO
Definition SmartScriptMgr.h:163

References GetScript(), SmartScript::ProcessEventsFor(), and SMART_EVENT_GOSSIP_HELLO.

◆ sGossipSelect()

void SmartAI::sGossipSelect ( Player player,
uint32  sender,
uint32  action 
)
overridevirtual

Reimplemented from UnitAI.

1125{
1126 GetScript()->ProcessEventsFor(SMART_EVENT_GOSSIP_SELECT, player, sender, action);
1127}
@ SMART_EVENT_GOSSIP_SELECT
Definition SmartScriptMgr.h:161

References GetScript(), SmartScript::ProcessEventsFor(), and SMART_EVENT_GOSSIP_SELECT.

Referenced by npc_stable_master::npc_stable_masterAI::sGossipSelect().

◆ sGossipSelectCode()

void SmartAI::sGossipSelectCode ( Player player,
uint32  sender,
uint32  action,
const char *  code 
)
overridevirtual

Reimplemented from UnitAI.

1130{
1131}

◆ sOnGameEvent()

void SmartAI::sOnGameEvent ( bool  start,
uint16  eventId 
)
overridevirtual

Reimplemented from UnitAI.

1260{
1262}
@ SMART_EVENT_GAME_EVENT_START
Definition SmartScriptMgr.h:167
@ SMART_EVENT_GAME_EVENT_END
Definition SmartScriptMgr.h:168

References GetScript(), SmartScript::ProcessEventsFor(), SMART_EVENT_GAME_EVENT_END, and SMART_EVENT_GAME_EVENT_START.

◆ SpellHit()

void SmartAI::SpellHit ( Unit unit,
SpellInfo const *  spellInfo 
)
overridevirtual

Reimplemented from CreatureAI.

914{
915 GetScript()->ProcessEventsFor(SMART_EVENT_SPELLHIT, unit, 0, 0, false, spellInfo);
916}
@ SMART_EVENT_SPELLHIT
Definition SmartScriptMgr.h:107

References GetScript(), SmartScript::ProcessEventsFor(), and SMART_EVENT_SPELLHIT.

◆ SpellHitTarget()

void SmartAI::SpellHitTarget ( Unit target,
SpellInfo const *  spellInfo 
)
overridevirtual

Reimplemented from CreatureAI.

919{
920 GetScript()->ProcessEventsFor(SMART_EVENT_SPELLHIT_TARGET, target, 0, 0, false, spellInfo);
921}
@ SMART_EVENT_SPELLHIT_TARGET
Definition SmartScriptMgr.h:130

References GetScript(), SmartScript::ProcessEventsFor(), and SMART_EVENT_SPELLHIT_TARGET.

◆ sQuestAccept()

void SmartAI::sQuestAccept ( Player player,
Quest const *  quest 
)
overridevirtual

Reimplemented from UnitAI.

1134{
1135 GetScript()->ProcessEventsFor(SMART_EVENT_ACCEPTED_QUEST, player, quest->GetQuestId());
1136}
@ SMART_EVENT_ACCEPTED_QUEST
Definition SmartScriptMgr.h:118

References Quest::GetQuestId(), GetScript(), SmartScript::ProcessEventsFor(), and SMART_EVENT_ACCEPTED_QUEST.

◆ sQuestReward()

void SmartAI::sQuestReward ( Player player,
Quest const *  quest,
uint32  opt 
)
overridevirtual

Reimplemented from UnitAI.

1139{
1140 GetScript()->ProcessEventsFor(SMART_EVENT_REWARD_QUEST, player, quest->GetQuestId(), opt);
1141}
@ SMART_EVENT_REWARD_QUEST
Definition SmartScriptMgr.h:119

References Quest::GetQuestId(), GetScript(), SmartScript::ProcessEventsFor(), and SMART_EVENT_REWARD_QUEST.

◆ StartDespawn()

void SmartAI::StartDespawn ( )
inline
203{ mDespawnState = 2; }

References mDespawnState.

Referenced by EndPath(), and StopFollow().

◆ StartPath()

void SmartAI::StartPath ( ForcedMovement  forcedMovement = FORCED_MOVEMENT_NONE,
uint32  path = 0,
bool  repeat = false,
Unit invoker = nullptr,
PathSource  pathSource = PathSource::SMART_WAYPOINT_MGR 
)
233{
235 StopPath();
236
237 if (path)
238 {
239 if (!LoadPath(path, pathSource))
240 return;
241 }
242
243 if (!mWayPoints || mWayPoints->Nodes.empty())
244 return;
245
246 if (WaypointNode const* wp = GetNextWayPoint())
247 {
249 mCanRepeatPath = repeat;
250 mForcedMovement = forcedMovement;
251
252 if (invoker && invoker->IsPlayer())
253 {
256 }
257
258 Movement::PointsArray pathPoints;
259 GenerateWayPointArray(&pathPoints);
260
262 GetScript()->ProcessEventsFor(SMART_EVENT_ESCORT_START, nullptr, wp->Id, GetScript()->GetPathId());
263 }
264}
@ SMART_EVENT_ESCORT_START
Definition SmartScriptMgr.h:138
@ UNIT_NPC_FLAG_NONE
Definition UnitDefines.h:321
bool IsPlayer() const
Definition Object.h:201
void StopPath(uint32 DespawnTime=0, uint32 quest=0, bool fail=false)
Definition SmartAI.cpp:331
bool LoadPath(uint32 entry, PathSource pathSource)
Definition SmartAI.cpp:266
NPCFlags GetNpcFlags() const
Clears emote state (looping emote)
Definition Unit.h:762

References AddEscortState(), GenerateWayPointArray(), Unit::GetMotionMaster(), GetNextWayPoint(), Unit::GetNpcFlags(), GetScript(), HasEscortState(), Object::IsPlayer(), LoadPath(), mCanRepeatPath, CreatureAI::me, mEscortNPCFlags, mForcedMovement, MotionMaster::MoveSplinePath(), mWayPoints, WaypointPath::Nodes, SmartScript::ProcessEventsFor(), Unit::ReplaceAllNpcFlags(), SMART_ESCORT_ESCORTING, SMART_EVENT_ESCORT_START, StopPath(), and UNIT_NPC_FLAG_NONE.

Referenced by EndPath(), and OnCharmed().

◆ StopFollow()

void SmartAI::StopFollow ( bool  complete)
1221{
1223 mFollowDist = 0;
1224 mFollowAngle = 0;
1225 mFollowCredit = 0;
1226 mFollowArrivedTimer = 1000;
1229
1230 me->GetMotionMaster()->Clear(false);
1231 me->StopMoving();
1233
1234 if (!complete)
1235 return;
1236
1238 if (player)
1239 {
1240 if (!mFollowCreditType)
1242 else
1244 }
1245
1246 SetDespawnTime(5000);
1247 StartDespawn();
1248
1250}
@ SMART_EVENT_FOLLOW_COMPLETED
Definition SmartScriptMgr.h:164
void RewardPlayerAndGroupAtEvent(uint32 creature_id, WorldObject *pRewardSource)
Definition Player.cpp:12733
void SetDespawnTime(uint32 t)
Definition SmartAI.h:198
Player * GetPlayer(Map const *, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:220

References ObjectGuid::Clear(), MotionMaster::Clear(), Unit::GetMotionMaster(), ObjectAccessor::GetPlayer(), GetScript(), Player::GroupEventHappens(), CreatureAI::me, mFollowAngle, mFollowArrivedEntry, mFollowArrivedTimer, mFollowCredit, mFollowCreditType, mFollowDist, mFollowGuid, MotionMaster::MoveIdle(), SmartScript::ProcessEventsFor(), Player::RewardPlayerAndGroupAtEvent(), SetDespawnTime(), SMART_EVENT_FOLLOW_COMPLETED, StartDespawn(), and Unit::StopMoving().

Referenced by SetFollow(), and UpdateFollow().

◆ StopPath()

◆ SummonedCreatureDespawn()

void SmartAI::SummonedCreatureDespawn ( Creature unit)
overridevirtual

Reimplemented from CreatureAI.

957{
960}
@ SMART_EVENT_SUMMON_DESPAWNED
Definition SmartScriptMgr.h:134
void RemoveCreatureSummon(ObjectGuid const &guid)
Definition SmartScript.cpp:5504

References Object::GetGUID(), GetScript(), SmartScript::ProcessEventsFor(), SmartScript::RemoveCreatureSummon(), and SMART_EVENT_SUMMON_DESPAWNED.

◆ SummonedCreatureDies()

void SmartAI::SummonedCreatureDies ( Creature summon,
Unit killer 
)
overridevirtual

Reimplemented from CreatureAI.

877{
879}
@ SMART_EVENT_SUMMONED_UNIT_DIES
Definition SmartScriptMgr.h:183

References GetScript(), SmartScript::ProcessEventsFor(), and SMART_EVENT_SUMMONED_UNIT_DIES.

◆ SummonedCreatureEvade()

void SmartAI::SummonedCreatureEvade ( Creature summon)
overridevirtual

Reimplemented from CreatureAI.

882{
884}
@ SMART_EVENT_SUMMONED_UNIT_EVADE
Definition SmartScriptMgr.h:196

References GetScript(), SmartScript::ProcessEventsFor(), and SMART_EVENT_SUMMONED_UNIT_EVADE.

◆ UpdateAI()

void SmartAI::UpdateAI ( uint32  )
overridevirtual

Use to start attacking a target. Called just before JustEngagedWith()

Implements UnitAI.

562{
563 if (!me->IsAlive())
564 {
565 if (IsEngaged())
567 return;
568 }
569
570 CheckConditions(diff);
571
572 bool hasVictim = UpdateVictim();
573 GetScript()->OnUpdate(diff);
574 UpdatePath(diff);
575 UpdateDespawn(diff);
576 UpdateFollow(diff);
577
578 if (!IsAIControlled())
579 {
580 if (CharmInfo* charmInfo = me->GetCharmInfo())
581 {
582 if (charmInfo->IsCommandAttack() && mCanAutoAttack)
583 {
585 }
586 }
587
588 return;
589 }
590
591 if (!hasVictim)
592 return;
593
594 if (mCanAutoAttack)
596}
bool IsEngaged() const
Check if creature is currently engaged in combat.
Definition CreatureAI.h:105
void EngagementOver()
Definition CreatureAI.cpp:298
void UpdatePath(const uint32 diff)
Definition SmartAI.cpp:451
void UpdateFollow(const uint32 diff)
Definition SmartAI.cpp:112
void CheckConditions(const uint32 diff)
Definition SmartAI.cpp:532
void UpdateDespawn(const uint32 diff)
Definition SmartAI.cpp:92
void OnUpdate(const uint32 diff)
Definition SmartScript.cpp:5063
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:40
bool IsAlive() const
Definition Unit.h:1793
CharmInfo * GetCharmInfo()
Definition Unit.h:1281
Definition CharmInfo.h:127

References CheckConditions(), UnitAI::DoMeleeAttackIfReady(), CreatureAI::EngagementOver(), Unit::GetCharmInfo(), GetScript(), IsAIControlled(), Unit::IsAlive(), CreatureAI::IsEngaged(), mCanAutoAttack, CreatureAI::me, SmartScript::OnUpdate(), UpdateDespawn(), UpdateFollow(), UpdatePath(), and CreatureAI::UpdateVictim().

◆ UpdateDespawn()

void SmartAI::UpdateDespawn ( const uint32  diff)
private
93{
94 if (mDespawnState <= 1 || mDespawnState > 3)
95 return;
96
97 if (mDespawnTime < diff)
98 {
99 if (mDespawnState == 2)
100 {
101 me->SetVisible(false);
102 mDespawnTime = 5000;
104 }
105 else
107 }
108 else
109 mDespawnTime -= diff;
110}
void DespawnOrUnsummon(Milliseconds msTimeToDespawn=0ms, Seconds forcedRespawnTimer=0s)
Definition Creature.cpp:2126

References Creature::DespawnOrUnsummon(), mDespawnState, mDespawnTime, CreatureAI::me, and Unit::SetVisible().

Referenced by UpdateAI().

◆ UpdateFollow()

void SmartAI::UpdateFollow ( const uint32  diff)
private
113{
114 if (!mFollowGuid)
115 return;
116
117 if (mFollowArrivedTimer < diff)
118 {
120 StopFollow(true);
121 else
122 mFollowArrivedTimer = 1000;
123 }
124 else
125 mFollowArrivedTimer -= diff;
126
127 if (mFollowGuid.IsPlayer())
128 {
129 if (_followCheckTimer < diff)
130 {
131 bool shouldDespawn = false;
133 {
135 if (!me->IsWithinDistInMap(player, checkDist))
136 shouldDespawn = true;
137 }
138 else
139 shouldDespawn = true;
140
141 if (shouldDespawn)
143
144 _followCheckTimer = 1000;
145 }
146 else
147 _followCheckTimer -= diff;
148 }
149}
#define INTERACTION_DISTANCE
Definition ObjectDefines.h:24
uint32 _followCheckTimer
Definition SmartAI.h:230
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:2499
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:245

References _followCheckTimer, Creature::DespawnOrUnsummon(), WorldObject::FindNearestCreature(), ObjectAccessor::FindPlayer(), WorldObject::GetInstanceScript(), INTERACTION_DISTANCE, ObjectGuid::IsPlayer(), WorldObject::IsWithinDistInMap(), CreatureAI::me, mFollowArrivedAlive, mFollowArrivedEntry, mFollowArrivedTimer, mFollowGuid, SMART_ESCORT_MAX_PLAYER_DIST, and StopFollow().

Referenced by UpdateAI().

◆ UpdatePath()

void SmartAI::UpdatePath ( const uint32  diff)
private
452{
454 return;
455
456 if (mEscortInvokerCheckTimer < diff)
457 {
458 // Xinef: Escort failed - no players in range
459 // Xinef: Despawn immediately
461 {
462 StopPath(0, mEscortQuestID, true);
463
464 // Xinef: allow to properly hook out of range despawn action, which in most cases should perform the same operation as dying
466 me->DespawnOrUnsummon(1ms);
467 return;
468 }
470 }
471 else
473
474 // handle pause
476 {
477 if (mWPPauseTimer < diff)
478 {
480 {
483 if (mForcedPaused)// if paused between 2 wps resend movement
484 {
485 mWPReached = false;
486 mForcedPaused = false;
487 ResumePath();
488 }
489
490 mWPPauseTimer = 0;
491 }
492 }
493 else
494 mWPPauseTimer -= diff;
495 }
496
498 {
499 if (mOOCReached)//reached OOC WP
500 {
501 mOOCReached = false;
504 ResumePath();
505 }
506 }
507
509 return;
510
511 // handle next wp
512 if (!me->HasUnitState(UNIT_STATE_NOT_MOVE) && me->movespline->Finalized())//reached WP
513 {
514 if (!mWPReached)
515 {
516 ResumePath();
517 return;
518 }
519
520 mWPReached = false;
521 if (mCurrentWPID == GetWPCount())
522 EndPath();
523 else if (GetNextWayPoint())
524 {
525 // xinef: if we have reached waypoint, and there is no working spline movement it means our splitted array has ended, make new one
526 if (me->movespline->Finalized())
527 ResumePath();
528 }
529 }
530}
@ SMART_EVENT_ESCORT_RESUMED
Definition SmartScriptMgr.h:155
@ UNIT_STATE_NOT_MOVE
Definition UnitDefines.h:225
bool IsEscortInvokerInRange()
Definition SmartAI.cpp:598

References Creature::DespawnOrUnsummon(), EndPath(), Movement::MoveSpline::Finalized(), GetNextWayPoint(), GetScript(), Unit::GetVictim(), GetWPCount(), HasEscortState(), Unit::HasUnitState(), IsEscortInvokerInRange(), Unit::IsInCombat(), mCurrentWPID, CreatureAI::me, mEscortInvokerCheckTimer, mEscortQuestID, mForcedPaused, mOOCReached, Unit::movespline, mWPPauseTimer, mWPReached, SmartScript::ProcessEventsFor(), RemoveEscortState(), ResumePath(), SMART_ESCORT_ESCORTING, SMART_ESCORT_PAUSED, SMART_ESCORT_RETURNING, SMART_EVENT_DEATH, SMART_EVENT_ESCORT_RESUMED, StopPath(), and UNIT_STATE_NOT_MOVE.

Referenced by UpdateAI().

◆ WaypointPathEnded()

void SmartAI::WaypointPathEnded ( uint32  nodeId,
uint32  pathId 
)
overridevirtual

Reimplemented from CreatureAI.

1297{
1299 {
1300 GetScript()->ProcessEventsFor(SMART_EVENT_WAYPOINT_ENDED, nullptr, nodeId, pathId);
1301 return;
1302 }
1303}

References GetScript(), HasEscortState(), SmartScript::ProcessEventsFor(), SMART_ESCORT_ESCORTING, and SMART_EVENT_WAYPOINT_ENDED.

◆ WaypointPathStarted()

void SmartAI::WaypointPathStarted ( uint32  )
overridevirtual

== Waypoints system =============================

Reimplemented from CreatureAI.

1280{
1281}

◆ WaypointReached()

void SmartAI::WaypointReached ( uint32  nodeId,
uint32  pathId 
)
overridevirtual

Reimplemented from CreatureAI.

1288{
1290 {
1291 GetScript()->ProcessEventsFor(SMART_EVENT_WAYPOINT_REACHED, nullptr, nodeId, pathId);
1292 return;
1293 }
1294}

References GetScript(), HasEscortState(), SmartScript::ProcessEventsFor(), SMART_ESCORT_ESCORTING, and SMART_EVENT_WAYPOINT_REACHED.

◆ WaypointStarted()

void SmartAI::WaypointStarted ( uint32  nodeId,
uint32  pathId 
)
overridevirtual

Reimplemented from CreatureAI.

1284{
1285}

Member Data Documentation

◆ _attackDistance

float SmartAI::_attackDistance
private

◆ _chaseOnInterrupt

bool SmartAI::_chaseOnInterrupt
private

Referenced by SmartAI().

◆ _currentRangeMode

bool SmartAI::_currentRangeMode
private

◆ _followCheckTimer

uint32 SmartAI::_followCheckTimer
private

Referenced by UpdateFollow().

◆ _mainSpellId

uint32 SmartAI::_mainSpellId
private

◆ _pendingDistancing

float SmartAI::_pendingDistancing
private

◆ aiDataSet

std::unordered_map<uint32, uint32> SmartAI::aiDataSet
private

◆ conditions

ConditionList SmartAI::conditions
private

Referenced by CheckConditions(), and SmartAI().

◆ m_ConditionsTimer

uint32 SmartAI::m_ConditionsTimer
private

Referenced by CheckConditions(), and SmartAI().

◆ mCanAutoAttack

bool SmartAI::mCanAutoAttack
private

◆ mCanRepeatPath

bool SmartAI::mCanRepeatPath
private

Referenced by EndPath(), OnCharmed(), SmartAI(), and StartPath().

◆ mcanSpawn

bool SmartAI::mcanSpawn
private

Referenced by CanRespawn(), SetCanRespawn(), and SmartAI().

◆ mCurrentWPID

◆ mDespawnState

uint32 SmartAI::mDespawnState
private

◆ mDespawnTime

uint32 SmartAI::mDespawnTime
private

◆ mEscortInvokerCheckTimer

uint32 SmartAI::mEscortInvokerCheckTimer
private

Referenced by SmartAI(), and UpdatePath().

◆ mEscortNPCFlags

uint32 SmartAI::mEscortNPCFlags
private

Referenced by EndPath(), SmartAI(), and StartPath().

◆ mEscortQuestID

uint32 SmartAI::mEscortQuestID

Referenced by EndPath(), SmartAI(), StopPath(), and UpdatePath().

◆ mEscortState

uint32 SmartAI::mEscortState
private

◆ mEvadeDisabled

bool SmartAI::mEvadeDisabled
private

◆ mFollowAngle

float SmartAI::mFollowAngle
private

◆ mFollowArrivedAlive

bool SmartAI::mFollowArrivedAlive
private

◆ mFollowArrivedEntry

uint32 SmartAI::mFollowArrivedEntry
private

◆ mFollowArrivedTimer

uint32 SmartAI::mFollowArrivedTimer
private

◆ mFollowCredit

uint32 SmartAI::mFollowCredit
private

◆ mFollowCreditType

uint32 SmartAI::mFollowCreditType
private

◆ mFollowDist

float SmartAI::mFollowDist
private

◆ mFollowGuid

ObjectGuid SmartAI::mFollowGuid
private

◆ mForcedMovement

ForcedMovement SmartAI::mForcedMovement
private

◆ mForcedPaused

bool SmartAI::mForcedPaused
private

Referenced by PausePath(), SmartAI(), and UpdatePath().

◆ mInvincibilityHpLevel

uint32 SmartAI::mInvincibilityHpLevel
private

◆ mIsCharmed

bool SmartAI::mIsCharmed
private

Referenced by IsAIControlled(), OnCharmed(), and SmartAI().

◆ mJustReset

bool SmartAI::mJustReset
private

◆ mLastWP

WaypointNode const* SmartAI::mLastWP
private

◆ mOOCReached

bool SmartAI::mOOCReached
private

◆ mScript

SmartScript SmartAI::mScript
private

Referenced by GetScript().

◆ mWayPoints

◆ mWPPauseTimer

uint32 SmartAI::mWPPauseTimer
private

◆ mWPReached

bool SmartAI::mWPReached
private

The documentation for this class was generated from the following files: