AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Unit Class Referenceabstract

#include "Unit.h"

Inheritance diagram for Unit:
WorldObject Object WorldLocation Position Creature Player TempSummon Minion Guardian Puppet Totem Pet

Public Types

typedef std::unordered_set< Unit * > AttackerSet
 
typedef std::set< Unit * > ControlSet
 
typedef std::multimap< uint32, Aura * > AuraMap
 
typedef std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
 
typedef std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
 
typedef std::multimap< uint32, AuraApplication * > AuraApplicationMap
 
typedef std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
 
typedef std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
 
typedef std::multimap< AuraStateType, AuraApplication * > AuraStateAurasMap
 
typedef std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
 
typedef std::list< AuraEffect * > AuraEffectList
 
typedef std::list< Aura * > AuraList
 
typedef std::list< AuraApplication * > AuraApplicationList
 
typedef std::list< DiminishingReturnDiminishing
 
typedef GuidUnorderedSet ComboPointHolderSet
 
typedef std::map< uint8, AuraApplication * > VisibleAuraMap
 
typedef std::set< PetAura const * > PetAuraSet
 

Public Member Functions

 ~Unit () override
 
UnitAIGetAI ()
 
void SetAI (UnitAI *newAI)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void CleanupBeforeRemoveFromMap (bool finalCleanup)
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
uint32 GetDynamicFlags () const override
 
void ReplaceAllDynamicFlags (uint32 flag) override
 
DiminishingLevels GetDiminishing (DiminishingGroup group)
 
void IncrDiminishing (DiminishingGroup group)
 
float ApplyDiminishingToDuration (DiminishingGroup group, int32 &duration, Unit *caster, DiminishingLevels Level, int32 limitduration)
 
void ApplyDiminishingAura (DiminishingGroup group, bool apply)
 
void ClearDiminishings ()
 
float GetSpellMaxRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
float GetSpellMinRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
void Update (uint32 time) override
 
void setAttackTimer (WeaponAttackType type, int32 time)
 
void resetAttackTimer (WeaponAttackType type=BASE_ATTACK)
 
int32 getAttackTimer (WeaponAttackType type) const
 
bool isAttackReady (WeaponAttackType type=BASE_ATTACK) const
 
bool haveOffhandWeapon () const
 
bool CanDualWield () const
 
virtual void SetCanDualWield (bool value)
 
float GetCombatReach () const override
 
float GetMeleeReach () const
 
bool IsWithinRange (Unit const *obj, float dist) const
 
bool IsWithinCombatRange (Unit const *obj, float dist2compare) const
 
bool IsWithinMeleeRange (Unit const *obj, float dist=0.f) const
 
float GetMeleeRange (Unit const *target) const
 
virtual SpellSchoolMask GetMeleeDamageSchoolMask (WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
 
bool GetRandomContactPoint (Unit const *target, float &x, float &y, float &z, bool force=false) const
 
void _addAttacker (Unit *pAttacker)
 
void _removeAttacker (Unit *pAttacker)
 
UnitgetAttackerForHelper () const
 
bool Attack (Unit *victim, bool meleeAttack)
 
void CastStop (uint32 except_spellid=0, bool withInstant=true)
 
bool AttackStop ()
 
void RemoveAllAttackers ()
 
AttackerSet const & getAttackers () const
 
bool GetMeleeAttackPoint (Unit *attacker, Position &pos)
 
bool isAttackingPlayer () const
 
UnitGetVictim () const
 
void CombatStop (bool includingCast=false)
 
void CombatStopWithPets (bool includingCast=false)
 
void StopAttackFaction (uint32 faction_id)
 
void StopAttackingInvalidTarget ()
 
UnitSelectNearbyTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
UnitSelectNearbyNoTotemTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
void SendMeleeAttackStop (Unit *victim=nullptr)
 
void SendMeleeAttackStart (Unit *victim, Player *sendTo=nullptr)
 
void AddUnitState (uint32 f)
 
bool HasUnitState (const uint32 f) const
 
void ClearUnitState (uint32 f)
 
uint32 GetUnitState () const
 
bool CanFreeMove () const
 
uint32 HasUnitTypeMask (uint32 mask) const
 
void AddUnitTypeMask (uint32 mask)
 
uint32 GetUnitTypeMask () const
 
bool IsSummon () const
 
bool IsGuardian () const
 
bool IsControllableGuardian () const
 
bool IsPet () const
 
bool IsHunterPet () const
 
bool IsTotem () const
 
bool IsVehicle () const
 
uint8 getLevel () const
 
uint8 GetLevel () const
 
uint8 getLevelForTarget (WorldObject const *) const override
 
void SetLevel (uint8 lvl, bool showLevelChange=true)
 
uint8 getRace (bool original=false) const
 
void setRace (uint8 race)
 
uint32 getRaceMask () const
 
uint8 getClass () const
 
uint32 getClassMask () const
 
uint8 getGender () const
 
DisplayRace GetDisplayRaceFromModelId (uint32 modelId) const
 
DisplayRace GetDisplayRace () const
 
float GetStat (Stats stat) const
 
void SetStat (Stats stat, int32 val)
 
uint32 GetArmor () const
 
void SetArmor (int32 val)
 
uint32 GetResistance (SpellSchools school) const
 
uint32 GetResistance (SpellSchoolMask mask) const
 
void SetResistance (SpellSchools school, int32 val)
 
uint32 GetHealth () const
 
uint32 GetMaxHealth () const
 
bool IsFullHealth () const
 
bool HealthBelowPct (int32 pct) const
 
bool HealthBelowPctDamaged (int32 pct, uint32 damage) const
 
bool HealthAbovePct (int32 pct) const
 
bool HealthAbovePctHealed (int32 pct, uint32 heal) const
 
float GetHealthPct () const
 
uint32 CountPctFromMaxHealth (int32 pct) const
 
uint32 CountPctFromCurHealth (int32 pct) const
 
float GetPowerPct (Powers power) const
 
void SetHealth (uint32 val)
 
void SetMaxHealth (uint32 val)
 
void SetFullHealth ()
 
int32 ModifyHealth (int32 val)
 
int32 GetHealthGain (int32 dVal)
 
Powers getPowerType () const
 
void setPowerType (Powers power)
 
uint32 GetPower (Powers power) const
 
uint32 GetMaxPower (Powers power) const
 
void SetPower (Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
 
void SetMaxPower (Powers power, uint32 val)
 
int32 ModifyPower (Powers power, int32 val, bool withPowerUpdate=true)
 
int32 ModifyPowerPct (Powers power, float pct, bool apply=true)
 
uint32 GetAttackTime (WeaponAttackType att) const
 
void SetAttackTime (WeaponAttackType att, uint32 val)
 
void ApplyAttackTimePercentMod (WeaponAttackType att, float val, bool apply)
 
void ApplyCastTimePercentMod (float val, bool apply)
 
UnitFlags GetUnitFlags () const
 
bool HasUnitFlag (UnitFlags flags) const
 
void SetUnitFlag (UnitFlags flags)
 
void RemoveUnitFlag (UnitFlags flags)
 
void ReplaceAllUnitFlags (UnitFlags flags)
 
UnitFlags2 GetUnitFlags2 () const
 
bool HasUnitFlag2 (UnitFlags2 flags) const
 
void SetUnitFlag2 (UnitFlags2 flags)
 
void RemoveUnitFlag2 (UnitFlags2 flags)
 
void ReplaceAllUnitFlags2 (UnitFlags2 flags)
 
SheathState GetSheath () const
 
virtual void SetSheath (SheathState sheathed)
 
uint32 GetFaction () const
 
void SetFaction (uint32 faction)
 
FactionTemplateEntry const * GetFactionTemplateEntry () const
 
ReputationRank GetReactionTo (Unit const *target, bool checkOriginalFaction=false) const
 
ReputationRank GetFactionReactionTo (FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
 
bool IsHostileTo (Unit const *unit) const
 
bool IsHostileToPlayers () const
 
bool IsFriendlyTo (Unit const *unit) const
 
bool IsNeutralToAll () const
 
bool IsInPartyWith (Unit const *unit) const
 
bool IsInRaidWith (Unit const *unit) const
 
void GetPartyMembers (std::list< Unit * > &units)
 
bool IsContestedGuard () const
 
bool IsInSanctuary () const
 
bool IsPvP () const
 
bool IsFFAPvP () const
 
void SetPvP (bool state)
 
uint32 GetCreatureType () const
 
uint32 GetCreatureTypeMask () const
 
uint8 getStandState () const
 
bool IsSitState () const
 
bool IsStandState () const
 
void SetStandState (uint8 state)
 
void SetStandFlags (uint8 flags)
 
void RemoveStandFlags (uint8 flags)
 
bool IsMounted () const
 
uint32 GetMountID () const
 
void Mount (uint32 mount, uint32 vehicleId=0, uint32 creatureEntry=0)
 
void Dismount ()
 
uint16 GetMaxSkillValueForLevel (Unit const *target=nullptr) const
 
void KillSelf (bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
void ProcDamageAndSpellFor (bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
void GetProcAurasTriggeredOnEvent (std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
 
void TriggerAurasProcOnEvent (CalcDamageInfo &damageInfo)
 
void TriggerAurasProcOnEvent (std::list< AuraApplication * > *myProcAuras, std::list< AuraApplication * > *targetProcAuras, Unit *actionTarget, uint32 typeMaskActor, uint32 typeMaskActionTarget, uint32 spellTypeMask, uint32 spellPhaseMask, uint32 hitMask, Spell *spell, DamageInfo *damageInfo, HealInfo *healInfo)
 
void TriggerAurasProcOnEvent (ProcEventInfo &eventInfo, std::list< AuraApplication * > &procAuras)
 
void HandleEmoteCommand (uint32 emoteId)
 
void AttackerStateUpdate (Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
 
void CalculateMeleeDamage (Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
 
void DealMeleeDamage (CalcDamageInfo *damageInfo, bool durabilityLoss)
 
void HandleProcExtraAttackFor (Unit *victim, uint32 count)
 
void SetLastExtraAttackSpell (uint32 spellId)
 
uint32 GetLastExtraAttackSpell () const
 
void AddExtraAttacks (uint32 count)
 
void SetLastDamagedTargetGuid (ObjectGuid const &guid)
 
ObjectGuid const & GetLastDamagedTargetGuid () const
 
void CalculateSpellDamageTaken (SpellNonMeleeDamage *damageInfo, int32 damage, SpellInfo const *spellInfo, WeaponAttackType attackType=BASE_ATTACK, bool crit=false)
 
void DealSpellDamage (SpellNonMeleeDamage *damageInfo, bool durabilityLoss, Spell const *spell=nullptr)
 
float GetMeleeCritChanceReduction () const
 
float GetRangedCritChanceReduction () const
 
float GetSpellCritChanceReduction () const
 
uint32 GetMeleeCritDamageReduction (uint32 damage) const
 
uint32 GetRangedCritDamageReduction (uint32 damage) const
 
uint32 GetSpellCritDamageReduction (uint32 damage) const
 
uint32 GetMeleeDamageReduction (uint32 damage) const
 
uint32 GetRangedDamageReduction (uint32 damage) const
 
uint32 GetSpellDamageReduction (uint32 damage) const
 
float MeleeSpellMissChance (Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
 
SpellMissInfo MeleeSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo MagicSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo SpellHitResult (Unit *victim, SpellInfo const *spell, bool canReflect=false)
 
SpellMissInfo SpellHitResult (Unit *victim, Spell const *spell, bool canReflect=false)
 
float GetUnitDodgeChance () const
 
float GetUnitParryChance () const
 
float GetUnitBlockChance () const
 
float GetUnitMissChance (WeaponAttackType attType) const
 
float GetUnitCriticalChance (WeaponAttackType attackType, Unit const *victim) const
 
int32 GetMechanicResistChance (SpellInfo const *spell)
 
bool CanUseAttackType (uint8 attacktype) const
 
virtual uint32 GetShieldBlockValue () const =0
 
uint32 GetShieldBlockValue (uint32 soft_cap, uint32 hard_cap) const
 
uint32 GetUnitMeleeSkill (Unit const *target=nullptr) const
 
uint32 GetDefenseSkillValue (Unit const *target=nullptr) const
 
uint32 GetWeaponSkillValue (WeaponAttackType attType, Unit const *target=nullptr) const
 
float GetWeaponProcChance () const
 
float GetPPMProcChance (uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const
 
NPCFlags GetNpcFlags () const
 
bool HasNpcFlag (NPCFlags flags) const
 
void SetNpcFlag (NPCFlags flags)
 
void RemoveNpcFlag (NPCFlags flags)
 
void ReplaceAllNpcFlags (NPCFlags flags)
 
bool IsVendor () const
 
bool IsTrainer () const
 
bool IsQuestGiver () const
 
bool IsGossip () const
 
bool IsTaxi () const
 
bool IsGuildMaster () const
 
bool IsBattleMaster () const
 
bool IsBanker () const
 
bool IsInnkeeper () const
 
bool IsSpiritHealer () const
 
bool IsSpiritGuide () const
 
bool IsTabardDesigner () const
 
bool IsAuctioner () const
 
bool IsArmorer () const
 
bool IsServiceProvider () const
 
bool IsSpiritService () const
 
bool IsCritter () const
 
bool IsInFlight () const
 
void SetImmuneToAll (bool apply, bool keepCombat=false)
 
bool IsImmuneToAll () const
 
void SetImmuneToPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToPC () const
 
void SetImmuneToNPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToNPC () const
 
bool IsEngaged () const
 
bool IsEngagedBy (Unit const *who) const
 
bool IsInCombat () const
 
bool IsInCombatWith (Unit const *who) const
 
bool IsPetInCombat () const
 
void CombatStart (Unit *target, bool initialAggro=true)
 
void CombatStartOnCast (Unit *target, bool initialAggro=true, uint32 duration=0)
 
void SetInCombatState (bool PvP, Unit *enemy=nullptr, uint32 duration=0)
 
void SetInCombatWith (Unit *enemy, uint32 duration=0)
 
void ClearInCombat ()
 
void ClearInPetCombat ()
 
uint32 GetCombatTimer () const
 
void SetCombatTimer (uint32 timer)
 
bool HasAuraTypeWithFamilyFlags (AuraType auraType, uint32 familyName, uint32 familyFlags) const
 
virtual bool HasSpell (uint32) const
 
bool HasBreakableByDamageAuraType (AuraType type, uint32 excludeAura=0) const
 
bool HasBreakableByDamageCrowdControlAura (Unit *excludeCasterChannel=nullptr) const
 
bool HasStealthAura () const
 
bool HasInvisibilityAura () const
 
bool isFeared () const
 
bool isInRoots () const
 
bool IsPolymorphed () const
 
bool isFrozen () const
 
bool isTargetableForAttack (bool checkFakeDeath=true, Unit const *byWho=nullptr) const
 
bool IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell=nullptr) const
 
bool _IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
 
bool IsValidAssistTarget (Unit const *target) const
 
bool _IsValidAssistTarget (Unit const *target, SpellInfo const *bySpell) const
 
virtual bool IsInWater () const
 
virtual bool IsUnderWater () const
 
bool isInAccessiblePlaceFor (Creature const *c) const
 
void SendHealSpellLog (HealInfo const &healInfo, bool critical=false)
 
int32 HealBySpell (HealInfo &healInfo, bool critical=false)
 
void SendEnergizeSpellLog (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void EnergizeBySpell (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
SpellCastResult CastSpell (SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (float x, float y, float z, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (GameObject *go, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
AuraAddAura (uint32 spellId, Unit *target)
 
AuraAddAura (SpellInfo const *spellInfo, uint8 effMask, Unit *target)
 
void SetAuraStack (uint32 spellId, Unit *target, uint32 stack)
 
void SendPlaySpellVisual (uint32 id)
 
void SendPlaySpellImpact (ObjectGuid guid, uint32 id)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, PacketCooldowns const &cooldowns)
 
void DeMorph ()
 
void SendAttackStateUpdate (CalcDamageInfo *damageInfo)
 
void SendAttackStateUpdate (uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount)
 
void SendSpellNonMeleeDamageLog (SpellNonMeleeDamage *log)
 
void SendSpellNonMeleeReflectLog (SpellNonMeleeDamage *log, Unit *attacker)
 
void SendSpellNonMeleeDamageLog (Unit *target, SpellInfo const *spellInfo, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit=false, bool Split=false)
 
void SendPeriodicAuraLog (SpellPeriodicAuraLogInfo *pInfo)
 
void SendSpellMiss (Unit *target, uint32 spellID, SpellMissInfo missInfo)
 
void SendSpellDamageResist (Unit *target, uint32 spellId)
 
void SendSpellDamageImmune (Unit *target, uint32 spellId)
 
void NearTeleportTo (Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void NearTeleportTo (float x, float y, float z, float orientation, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void SendTameFailure (uint8 result)
 
void SendTeleportPacket (Position &pos)
 
virtual bool UpdatePosition (float x, float y, float z, float ang, bool teleport=false)
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void UpdateOrientation (float orientation)
 Only server-side orientation update, does not broadcast to client.
 
void UpdateHeight (float newZ)
 Only server-side height update, does not broadcast to client.
 
void KnockbackFrom (float x, float y, float speedXY, float speedZ)
 
void JumpTo (float speedXY, float speedZ, bool forward=true)
 
void JumpTo (WorldObject *obj, float speedZ)
 
void SendMonsterMove (float NewPosX, float NewPosY, float NewPosZ, uint32 TransitTime, SplineFlags sf=SPLINEFLAG_WALK_MODE)
 
void MonsterMoveWithSpeed (float x, float y, float z, float speed)
 
void SendMovementFlagUpdate (bool self=false)
 
virtual bool SetWalk (bool enable)
 
virtual bool SetDisableGravity (bool disable, bool packetOnly=false, bool updateAnimationTier=true)
 
virtual bool SetSwim (bool enable)
 
virtual bool SetCanFly (bool enable, bool packetOnly=false)
 
virtual bool SetWaterWalking (bool enable, bool packetOnly=false)
 
virtual bool SetFeatherFall (bool enable, bool packetOnly=false)
 
virtual bool SetHover (bool enable, bool packetOnly=false, bool updateAnimationTier=true)
 
void SendMovementWaterWalking (Player *sendTo)
 
void SendMovementFeatherFall (Player *sendTo)
 
void SendMovementHover (Player *sendTo)
 
void SetInFront (WorldObject const *target)
 
void SetFacingTo (float ori)
 
void SetFacingToObject (WorldObject *object)
 
void SendChangeCurrentVictimOpcode (HostileReference *pHostileReference)
 
void SendClearThreatListOpcode ()
 
void SendRemoveFromThreatListOpcode (HostileReference *pHostileReference)
 
void SendThreatListUpdate ()
 
void SendClearTarget ()
 
void BuildHeartBeatMsg (WorldPacket *data) const
 
bool IsAlive () const
 
bool isDying () const
 
bool isDead () const
 
DeathState getDeathState ()
 
virtual void setDeathState (DeathState s, bool despawn=false)
 
ObjectGuid GetOwnerGUID () const
 
void SetOwnerGUID (ObjectGuid owner)
 
ObjectGuid GetCreatorGUID () const
 
void SetCreatorGUID (ObjectGuid creator)
 
ObjectGuid GetMinionGUID () const
 
void SetMinionGUID (ObjectGuid guid)
 
ObjectGuid GetCharmerGUID () const
 
void SetCharmerGUID (ObjectGuid owner)
 
ObjectGuid GetCharmGUID () const
 
void SetPetGUID (ObjectGuid guid)
 
ObjectGuid GetPetGUID () const
 
void SetCritterGUID (ObjectGuid guid)
 
ObjectGuid GetCritterGUID () const
 
bool IsControlledByPlayer () const
 
bool IsCreatedByPlayer () const
 
ObjectGuid GetCharmerOrOwnerGUID () const
 
ObjectGuid GetCharmerOrOwnerOrOwnGUID () const
 
bool IsCharmedOwnedByPlayerOrPlayer () const
 
PlayerGetSpellModOwner () const
 
UnitGetOwner () const
 
GuardianGetGuardianPet () const
 
MinionGetFirstMinion () const
 
UnitGetCharmer () const
 
UnitGetCharm () const
 
UnitGetCharmerOrOwner () const
 
UnitGetCharmerOrOwnerOrSelf () const
 
PlayerGetCharmerOrOwnerPlayerOrPlayerItself () const
 
PlayerGetAffectingPlayer () const
 
void SetMinion (Minion *minion, bool apply)
 
void GetAllMinionsByEntry (std::list< Creature * > &Minions, uint32 entry)
 
void RemoveAllMinionsByEntry (uint32 entry)
 
void SetCharm (Unit *target, bool apply)
 
UnitGetNextRandomRaidMemberOrPet (float radius)
 
bool SetCharmedBy (Unit *charmer, CharmType type, AuraApplication const *aurApp=nullptr)
 
void RemoveCharmedBy (Unit *charmer)
 
void RestoreFaction ()
 
UnitGetFirstControlled () const
 
void RemoveAllControlled (bool onDeath=false)
 
bool IsCharmed () const
 
bool isPossessed () const
 
bool isPossessedByPlayer () const
 
bool isPossessing () const
 
bool isPossessing (Unit *u) const
 
CharmInfoGetCharmInfo ()
 
CharmInfoInitCharmInfo ()
 
void DeleteCharmInfo ()
 
void UpdateCharmAI ()
 
SharedVisionList const & GetSharedVisionList ()
 
void AddPlayerToVision (Player *player)
 
void RemovePlayerFromVision (Player *player)
 
bool HasSharedVision () const
 
void RemoveBindSightAuras ()
 
void RemoveCharmAuras ()
 
PetCreateTamedPetFrom (Creature *creatureTarget, uint32 spell_id=0)
 
PetCreateTamedPetFrom (uint32 creatureEntry, uint32 spell_id=0)
 
bool InitTamedPet (Pet *pet, uint8 level, uint32 spell_id)
 
Aura_TryStackingOrRefreshingExistingAura (SpellInfo const *newAura, uint8 effMask, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool periodicReset=false)
 
void _AddAura (UnitAura *aura, Unit *caster)
 
AuraApplication_CreateAuraApplication (Aura *aura, uint8 effMask)
 
void _ApplyAuraEffect (Aura *aura, uint8 effIndex)
 
void _ApplyAura (AuraApplication *aurApp, uint8 effMask)
 
void _UnapplyAura (AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
 
void _UnapplyAura (AuraApplication *aurApp, AuraRemoveMode removeMode)
 
void _RemoveNoStackAuraApplicationsDueToAura (Aura *aura)
 
void _RemoveNoStackAurasDueToAura (Aura *aura)
 
bool _IsNoStackAuraDueToAura (Aura *appliedAura, Aura *existingAura) const
 
void _RegisterAuraEffect (AuraEffect *aurEff, bool apply)
 
AuraMapGetOwnedAuras ()
 
AuraMap const & GetOwnedAuras () const
 
void RemoveOwnedAura (AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (Aura *aura, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
AuraGetOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
 
AuraApplicationMapGetAppliedAuras ()
 
AuraApplicationMap const & GetAppliedAuras () const
 
void RemoveAura (AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (AuraApplication *aurApp, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (Aura *aur, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAppliedAuras (std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (std::function< bool(Aura const *)> const &check)
 
void RemoveAppliedAuras (uint32 spellId, std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (uint32 spellId, std::function< bool(Aura const *)> const &check)
 
void RemoveAurasDueToSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAuraFromStack (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAurasDueToSpellByDispel (uint32 spellId, uint32 dispellerSpellId, ObjectGuid casterGUID, Unit *dispeller, uint8 chargesRemoved=1)
 
void RemoveAurasDueToSpellBySteal (uint32 spellId, ObjectGuid casterGUID, Unit *stealer)
 
void RemoveAurasDueToItemSpell (uint32 spellId, ObjectGuid castItemGuid)
 
void RemoveAurasByType (AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
 
void RemoveNotOwnSingleTargetAuras ()
 
void RemoveAurasWithInterruptFlags (uint32 flag, uint32 except=0, bool isAutoshot=false)
 
void RemoveAurasWithAttribute (uint32 flags)
 
void RemoveAurasWithFamily (SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID)
 
void RemoveAurasWithMechanic (uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
 
void RemoveMovementImpairingAuras (bool withRoot)
 
void RemoveAurasByShapeShift ()
 
void RemoveAreaAurasDueToLeaveWorld ()
 
void RemoveAllAuras ()
 
void RemoveArenaAuras ()
 
void RemoveAllAurasOnDeath ()
 
void RemoveAllAurasRequiringDeadTarget ()
 
void RemoveAllAurasExceptType (AuraType type)
 
void RemoveEvadeAuras ()
 
void DelayOwnedAuras (uint32 spellId, ObjectGuid caster, int32 delaytime)
 
void _RemoveAllAuraStatMods ()
 
void _ApplyAllAuraStatMods ()
 
AuraEffectList const & GetAuraEffectsByType (AuraType type) const
 
AuraListGetSingleCastAuras ()
 
AuraList const & GetSingleCastAuras () const
 
AuraEffectGetAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectOfRankedSpell (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectDummy (uint32 spellid) const
 
AuraEffectGetDummyAuraEffect (SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraApplicationGetAuraApplication (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
AuraApplicationGetAuraApplicationOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAuraOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
void GetDispellableAuraList (Unit *caster, uint32 dispelMask, DispelChargesList &dispelList, SpellInfo const *dispelSpell)
 
bool HasAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
 
uint32 GetAuraCount (uint32 spellId) const
 
bool HasAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
bool HasAuraType (AuraType auraType) const
 
bool HasAuraTypeWithCaster (AuraType auratype, ObjectGuid caster) const
 
bool HasAuraTypeWithMiscvalue (AuraType auratype, int32 miscvalue) const
 
bool HasAuraTypeWithAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
bool HasAuraTypeWithValue (AuraType auratype, int32 value) const
 
bool HasAuraTypeWithTriggerSpell (AuraType auratype, uint32 triggerSpell) const
 
bool HasNegativeAuraWithInterruptFlag (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasVisibleAuraType (AuraType auraType) const
 
bool HasNegativeAuraWithAttribute (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasAuraWithMechanic (uint32 mechanicMask) const
 
AuraEffectIsScriptOverriden (SpellInfo const *spell, int32 script) const
 
uint32 GetDiseasesByCaster (ObjectGuid casterGUID, uint8 mode=0)
 
uint32 GetDoTsByCaster (ObjectGuid casterGUID) const
 
int32 GetTotalAuraModifierAreaExclusive (AuraType auratype) const
 
int32 GetTotalAuraModifier (AuraType auratype) const
 
float GetTotalAuraMultiplier (AuraType auratype) const
 
int32 GetMaxPositiveAuraModifier (AuraType auratype)
 
int32 GetMaxNegativeAuraModifier (AuraType auratype) const
 
int32 GetTotalAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
float GetTotalAuraMultiplierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetMaxPositiveAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
 
int32 GetMaxNegativeAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetTotalAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
float GetTotalAuraMultiplierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxPositiveAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxNegativeAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetTotalAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetTotalAuraMultiplierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxPositiveAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxNegativeAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetResistanceBuffMods (SpellSchools school, bool positive) const
 
void SetResistanceBuffMods (SpellSchools school, bool positive, float val)
 
void ApplyResistanceBuffModsMod (SpellSchools school, bool positive, float val, bool apply)
 
void ApplyResistanceBuffModsPercentMod (SpellSchools school, bool positive, float val, bool apply)
 
void InitStatBuffMods ()
 
void ApplyStatBuffMod (Stats stat, float val, bool apply)
 
void ApplyStatPercentBuffMod (Stats stat, float val, bool apply)
 
void SetCreateStat (Stats stat, float val)
 
void SetCreateHealth (uint32 val)
 
uint32 GetCreateHealth () const
 
void SetCreateMana (uint32 val)
 
uint32 GetCreateMana () const
 
uint32 GetCreatePowers (Powers power) const
 
float GetPosStat (Stats stat) const
 
float GetNegStat (Stats stat) const
 
float GetCreateStat (Stats stat) const
 
void SetCurrentCastedSpell (Spell *pSpell)
 
virtual void ProhibitSpellSchool (SpellSchoolMask, uint32)
 
void InterruptSpell (CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
 
void FinishSpell (CurrentSpellTypes spellType, bool ok=true)
 
bool IsNonMeleeSpellCast (bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
 
void InterruptNonMeleeSpells (bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
 
SpellGetCurrentSpell (CurrentSpellTypes spellType) const
 
SpellGetCurrentSpell (uint32 spellType) const
 
SpellFindCurrentSpellBySpellId (uint32 spell_id) const
 
int32 GetCurrentSpellCastTime (uint32 spell_id) const
 
virtual bool IsMovementPreventedByCasting () const
 
ShapeshiftForm GetShapeshiftForm () const
 
void SetShapeshiftForm (ShapeshiftForm form)
 
bool IsInFeralForm () const
 
bool IsInDisallowedMountForm () const
 
bool HandleStatModifier (UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply)
 
void SetModifierValue (UnitMods unitMod, UnitModifierType modifierType, float value)
 
float GetModifierValue (UnitMods unitMod, UnitModifierType modifierType) const
 
float GetTotalStatValue (Stats stat, float additionalValue=0.0f) const
 
float GetTotalAuraModValue (UnitMods unitMod) const
 
SpellSchools GetSpellSchoolByAuraGroup (UnitMods unitMod) const
 
Stats GetStatByAuraGroup (UnitMods unitMod) const
 
Powers GetPowerTypeByAuraGroup (UnitMods unitMod) const
 
bool CanModifyStats () const
 
void SetCanModifyStats (bool modifyStats)
 
virtual bool UpdateStats (Stats stat)=0
 
virtual bool UpdateAllStats ()=0
 
virtual void UpdateResistances (uint32 school)=0
 
virtual void UpdateAllResistances ()
 
virtual void UpdateArmor ()=0
 
virtual void UpdateMaxHealth ()=0
 
virtual void UpdateMaxPower (Powers power)=0
 
virtual void UpdateAttackPowerAndDamage (bool ranged=false)=0
 
virtual void UpdateDamagePhysical (WeaponAttackType attType)
 
float GetTotalAttackPowerValue (WeaponAttackType attType, Unit *pVictim=nullptr) const
 
float GetWeaponDamageRange (WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
 
void SetBaseWeaponDamage (WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
 
virtual void CalculateMinMaxDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0
 
uint32 CalculateDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
 
float GetAPMultiplier (WeaponAttackType attType, bool normalized)
 
bool isInFrontInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool isInBackInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool IsVisible () const
 
void SetVisible (bool x)
 
void SetModelVisible (bool on)
 
uint32 GetPhaseByAuras () const
 
void SetPhaseMask (uint32 newPhaseMask, bool update) override
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
bool CanHaveThreatList () const
 
void AddThreat (Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
 
float ApplyTotalThreatModifier (float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
void TauntApply (Unit *victim)
 
void TauntFadeOut (Unit *taunter)
 
ThreatMgrGetThreatMgr ()
 
ThreatMgr const & GetThreatMgr () const
 
void addHatedBy (HostileReference *pHostileReference)
 
void removeHatedBy (HostileReference *)
 
HostileRefMgrgetHostileRefMgr ()
 
VisibleAuraMap const * GetVisibleAuras ()
 
AuraApplicationGetVisibleAura (uint8 slot)
 
void SetVisibleAura (uint8 slot, AuraApplication *aur)
 
void RemoveVisibleAura (uint8 slot)
 
uint32 GetInterruptMask () const
 
void AddInterruptMask (uint32 mask)
 
void UpdateInterruptMask ()
 
virtual float GetNativeObjectScale () const
 
virtual void RecalculateObjectScale ()
 
uint32 GetDisplayId () const
 
virtual void SetDisplayId (uint32 modelId)
 
uint32 GetNativeDisplayId () const
 
void RestoreDisplayId ()
 
void SetNativeDisplayId (uint32 modelId)
 
void setTransForm (uint32 spellid)
 
uint32 getTransForm () const
 
void _RegisterDynObject (DynamicObject *dynObj)
 
void _UnregisterDynObject (DynamicObject *dynObj)
 
DynamicObjectGetDynObject (uint32 spellId)
 
bool RemoveDynObject (uint32 spellId)
 
void RemoveAllDynObjects ()
 
GameObjectGetGameObject (uint32 spellId) const
 
void AddGameObject (GameObject *gameObj)
 
void RemoveGameObject (GameObject *gameObj, bool del)
 
void RemoveGameObject (uint32 spellid, bool del)
 
void RemoveAllGameObjects ()
 
void ModifyAuraState (AuraStateType flag, bool apply)
 
uint32 BuildAuraStateUpdateForTarget (Unit *target) const
 
bool HasAuraState (AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
 
void UnsummonAllTotems (bool onDeath=false)
 
UnitGetMagicHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo)
 
UnitGetMeleeHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo=nullptr)
 
int32 SpellBaseDamageBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseDamageBonusTaken (SpellSchoolMask schoolMask, bool isDoT=false)
 
float SpellPctDamageModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellDamageBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellDamageBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
 
int32 SpellBaseHealingBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseHealingBonusTaken (SpellSchoolMask schoolMask)
 
float SpellPctHealingModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellHealingBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellHealingBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack=1)
 
uint32 MeleeDamageBonusDone (Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
uint32 MeleeDamageBonusTaken (Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
bool isSpellBlocked (Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
 
bool isBlockCritical ()
 
float SpellDoneCritChance (Unit const *, SpellInfo const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType, bool skipEffectCheck) const
 
float SpellTakenCritChance (Unit const *caster, SpellInfo const *spellProto, SpellSchoolMask schoolMask, float doneChance, WeaponAttackType attackType, bool skipEffectCheck) const
 
void SetLastManaUse (uint32 spellCastTime)
 
bool IsUnderLastManaUseEffect () const
 
void SetContestedPvP (Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
 
uint32 GetCastingTimeForBonus (SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
 
float CalculateDefaultCoefficient (SpellInfo const *spellInfo, DamageEffectType damagetype) const
 
void CastDelayedSpellWithPeriodicAmount (Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
 
void ApplySpellImmune (uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
 
void ApplySpellDispelImmunity (SpellInfo const *spellProto, DispelType type, bool apply)
 
virtual bool IsImmunedToSpell (SpellInfo const *spellInfo, Spell const *spell=nullptr)
 
bool IsImmunedToDamage (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamage (SpellInfo const *spellInfo) const
 
bool IsImmunedToDamage (Spell const *spell) const
 
bool IsImmunedToSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToSchool (SpellInfo const *spellInfo) const
 
bool IsImmunedToSchool (Spell const *spell) const
 
bool IsImmunedToDamageOrSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamageOrSchool (SpellInfo const *spellInfo) const
 
virtual bool IsImmunedToSpellEffect (SpellInfo const *spellInfo, uint32 index) const
 
void UpdateSpeed (UnitMoveType mtype, bool forced)
 
float GetSpeed (UnitMoveType mtype) const
 
float GetSpeedRate (UnitMoveType mtype) const
 
void SetSpeed (UnitMoveType mtype, float rate, bool forced=false)
 
void SetSpeedRate (UnitMoveType mtype, float rate)
 
float ApplyEffectModifiers (SpellInfo const *spellProto, uint8 effect_index, float value) const
 
int32 CalculateSpellDamage (Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
 
int32 CalcSpellDuration (SpellInfo const *spellProto)
 
int32 ModSpellDuration (SpellInfo const *spellProto, Unit const *target, int32 duration, bool positive, uint32 effectMask)
 
void ModSpellCastTime (SpellInfo const *spellProto, int32 &castTime, Spell *spell=nullptr)
 
float CalculateLevelPenalty (SpellInfo const *spellProto) const
 
void addFollower (FollowerReference *pRef)
 
void removeFollower (FollowerReference *)
 
MotionMasterGetMotionMaster ()
 
const MotionMasterGetMotionMaster () const
 
virtual MovementGeneratorType GetDefaultMovementType () const
 -------—End of Pet responses methods-------—
 
bool IsStopped () const
 
void StopMoving ()
 
void StopMovingOnCurrentPos ()
 
virtual void PauseMovement (uint32 timer=0, uint8 slot=0)
 
void ResumeMovement (uint32 timer=0, uint8 slot=0)
 
void AddUnitMovementFlag (uint32 f)
 
void RemoveUnitMovementFlag (uint32 f)
 
bool HasUnitMovementFlag (uint32 f) const
 
uint32 GetUnitMovementFlags () const
 
void SetUnitMovementFlags (uint32 f)
 
void AddExtraUnitMovementFlag (uint16 f)
 
void RemoveExtraUnitMovementFlag (uint16 f)
 
uint16 HasExtraUnitMovementFlag (uint16 f) const
 
uint16 GetExtraUnitMovementFlags () const
 
void SetExtraUnitMovementFlags (uint16 f)
 
void SetControlled (bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
 
void DisableRotate (bool apply)
 
void DisableSpline ()
 
uint8 GetComboPoints (Unit const *who=nullptr) const
 --------—Combo point system----------------—
 
uint8 GetComboPoints (ObjectGuid const &guid) const
 
UnitGetComboTarget () const
 
ObjectGuid const GetComboTargetGUID () const
 
void AddComboPoints (Unit *target, int8 count)
 
void AddComboPoints (int8 count)
 
void ClearComboPoints ()
 
void SendComboPoints ()
 
void AddComboPointHolder (Unit *unit)
 
void RemoveComboPointHolder (Unit *unit)
 
void ClearComboPointHolders ()
 
void SendPetActionFeedback (uint8 msg)
 -------—Pet responses methods--------------—
 
void SendPetTalk (uint32 pettalk)
 
void SendPetAIReaction (ObjectGuid guid)
 
void propagateSpeedChange ()
 -------—End of Pet responses methods-------—
 
void ClearAllReactives ()
 
void StartReactiveTimer (ReactiveType reactive)
 
void UpdateReactives (uint32 p_time)
 
void UpdateAuraForGroup (uint8 slot)
 
bool CanProc ()
 
void SetCantProc (bool apply)
 
void AddPetAura (PetAura const *petSpell)
 
void RemovePetAura (PetAura const *petSpell)
 
void CastPetAura (PetAura const *aura)
 
bool IsPetAura (Aura const *aura)
 
uint32 GetModelForForm (ShapeshiftForm form, uint32 spellId) const
 
uint32 GetModelForTotem (PlayerTotemType totemType)
 
void SetRedirectThreat (ObjectGuid guid, uint32 pct)
 
void ResetRedirectThreat ()
 
void ModifyRedirectThreat (int32 amount)
 
uint32 GetRedirectThreatPercent ()
 
UnitGetRedirectThreatTarget () const
 
bool CreateVehicleKit (uint32 id, uint32 creatureEntry)
 
void RemoveVehicleKit ()
 
VehicleGetVehicleKit () const
 
VehicleGetVehicle () const
 
bool IsOnVehicle (Unit const *vehicle) const
 
UnitGetVehicleBase () const
 
CreatureGetVehicleCreatureBase () const
 
ObjectGuid GetTransGUID () const override
 
TransportBaseGetDirectTransport () const
 Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
 
bool HandleSpellClick (Unit *clicker, int8 seatId=-1)
 
void EnterVehicle (Unit *base, int8 seatId=-1)
 
void EnterVehicleUnattackable (Unit *base, int8 seatId=-1)
 
void ExitVehicle (Position const *exitPosition=nullptr)
 
void ChangeSeat (int8 seatId, bool next=true)
 
void _ExitVehicle (Position const *exitPosition=nullptr)
 
void _EnterVehicle (Vehicle *vehicle, int8 seatId, AuraApplication const *aurApp=nullptr)
 
void BuildMovementPacket (ByteBuffer *data) const
 
virtual bool CanSwim () const
 this method checks the current flag of a unit
 
bool IsLevitating () const
 
bool IsWalking () const
 
bool isMoving () const
 
bool isTurning () const
 
bool IsHovering () const
 
bool isSwimming () const
 
virtual bool CanFly () const =0
 
bool IsFlying () const
 
bool IsFalling () const
 
float GetHoverHeight () const
 
virtual bool CanEnterWater () const =0
 
void RewardRage (uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
 
virtual float GetFollowAngle () const
 
void OutDebugInfo () const
 
virtual bool isBeingLoaded () const
 
bool IsDuringRemoveFromWorld () const
 
PetToPet ()
 
TotemToTotem ()
 
TempSummonToTempSummon ()
 
const TempSummonToTempSummon () const
 
void AddPointedBy (SafeUnitPointer *sup)
 
void RemovePointedBy (SafeUnitPointer *sup)
 
void ExecuteDelayedUnitRelocationEvent ()
 
void ExecuteDelayedUnitAINotifyEvent ()
 
virtual bool HasSpellCooldown (uint32) const
 
virtual bool HasSpellItemCooldown (uint32, uint32) const
 
virtual void AddSpellCooldown (uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
 
bool CanApplyResilience () const
 
void PetSpellFail (SpellInfo const *spellInfo, Unit *target, uint32 result)
 
int32 CalculateAOEDamageReduction (int32 damage, uint32 schoolMask, Unit *caster) const
 
ObjectGuid GetTarget () const
 
virtual void SetTarget (ObjectGuid=ObjectGuid::Empty)=0
 
void SetInstantCast (bool set)
 
bool CanInstantCast () const
 
virtual void Talk (std::string_view text, ChatMsg msgType, Language language, float textRange, WorldObject const *target)
 
virtual void Say (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void Yell (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void TextEmote (std::string_view text, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (std::string_view text, Language language, Player *target, bool isBossWhisper=false)
 
virtual void Talk (uint32 textId, ChatMsg msgType, float textRange, WorldObject const *target)
 
virtual void Say (uint32 textId, WorldObject const *target=nullptr)
 
virtual void Yell (uint32 textId, WorldObject const *target=nullptr)
 
virtual void TextEmote (uint32 textId, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (uint32 textId, Player *target, bool isBossWhisper=false)
 
float GetCollisionHeight () const override
 Return collision height sent to client.
 
float GetCollisionWidth () const override
 this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC
 
float GetCollisionRadius () const override
 this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC
 
void ProcessPositionDataChanged (PositionFullTerrainStatus const &data) override
 
virtual void ProcessTerrainStatusUpdate ()
 
bool CanRestoreMana (SpellInfo const *spellInfo) const
 
std::string GetDebugInfo () const override
 
uint32 GetOldFactionId () const
 
- Public Member Functions inherited from WorldObject
 ~WorldObject () override
 
virtual void Update (uint32)
 
void _Create (ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void GetNearPoint2D (WorldObject const *searcher, float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint2D (float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint (WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
 
void GetVoidClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0, float controlZ=0) const
 
bool GetClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float angle=0, WorldObject const *forWho=nullptr, bool force=false) const
 
void MovePosition (Position &pos, float dist, float angle)
 
Position GetNearPosition (float dist, float angle)
 
void MovePositionToFirstCollision (Position &pos, float dist, float angle)
 
Position GetFirstCollisionPosition (float startX, float startY, float startZ, float destX, float destY)
 
Position GetFirstCollisionPosition (float destX, float destY, float destZ)
 
Position GetFirstCollisionPosition (float dist, float angle)
 
Position GetRandomNearPosition (float radius)
 
void GetContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
void GetChargeContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
float GetObjectSize () const
 
virtual float GetCombatReach () const
 
void UpdateGroundPositionZ (float x, float y, float &z) const
 
void UpdateAllowedPositionZ (float x, float y, float &z, float *groundZ=nullptr) const
 
void GetRandomPoint (const Position &srcPos, float distance, float &rand_x, float &rand_y, float &rand_z) const
 
Position GetRandomPoint (const Position &srcPos, float distance) const
 
uint32 GetInstanceId () const
 
virtual void SetPhaseMask (uint32 newPhaseMask, bool update)
 
uint32 GetPhaseMask () const
 
bool InSamePhase (WorldObject const *obj) const
 
bool InSamePhase (uint32 phasemask) const
 
uint32 GetZoneId () const
 
uint32 GetAreaId () const
 
void GetZoneAndAreaId (uint32 &zoneid, uint32 &areaid) const
 
bool IsOutdoors () const
 
LiquidData const & GetLiquidData () const
 
InstanceScriptGetInstanceScript () const
 
std::string const & GetName () const
 
void SetName (std::string const &newname)
 
virtual std::string const & GetNameForLocaleIdx (LocaleConstant) const
 
float GetDistance (WorldObject const *obj) const
 
float GetDistance (const Position &pos) const
 
float GetDistance (float x, float y, float z) const
 
float GetDistance2d (WorldObject const *obj) const
 
float GetDistance2d (float x, float y) const
 
float GetDistanceZ (WorldObject const *obj) const
 
bool IsSelfOrInSameMap (WorldObject const *obj) const
 
bool IsInMap (WorldObject const *obj) const
 
bool IsWithinDist3d (float x, float y, float z, float dist) const
 
bool IsWithinDist3d (const Position *pos, float dist) const
 
bool IsWithinDist2d (float x, float y, float dist) const
 
bool IsWithinDist2d (const Position *pos, float dist) const
 
bool IsWithinDist (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinDistInMap (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinLOS (float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
 
bool IsWithinLOSInMap (WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
Position GetHitSpherePointFor (Position const &dest, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
void GetHitSpherePointFor (Position const &dest, float &x, float &y, float &z, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
bool GetDistanceOrder (WorldObject const *obj1, WorldObject const *obj2, bool is3D=true) const
 
bool IsInRange (WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
 
bool IsInRange2d (float x, float y, float minRange, float maxRange) const
 
bool IsInRange3d (float x, float y, float z, float minRange, float maxRange) const
 
bool isInFront (WorldObject const *target, float arc=M_PI) const
 
bool isInBack (WorldObject const *target, float arc=M_PI) const
 
bool IsInBetween (WorldObject const *obj1, WorldObject const *obj2, float size=0) const
 
virtual void CleanupsBeforeDelete (bool finalCleanup=true)
 
virtual void SendMessageToSet (WorldPacket const *data, bool self) const
 
virtual void SendMessageToSetInRange (WorldPacket const *data, float dist, bool, bool includeMargin=false, Player const *skipped_rcvr=nullptr) const
 
virtual void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const
 
virtual uint8 getLevelForTarget (WorldObject const *) const
 
void PlayDistanceSound (uint32 sound_id, Player *target=nullptr)
 
void PlayDirectSound (uint32 sound_id, Player *target=nullptr)
 
void PlayDirectMusic (uint32 music_id, Player *target=nullptr)
 
void SendObjectDeSpawnAnim (ObjectGuid guid)
 
virtual void SaveRespawnTime ()
 
void AddObjectToRemoveList ()
 
float GetGridActivationRange () const
 
float GetVisibilityRange () const
 
virtual float GetSightRange (WorldObject const *target=nullptr) const
 
bool CanSeeOrDetect (WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
 
void SendPlayMusic (uint32 Music, bool OnlySelf)
 
virtual void SetMap (Map *map)
 
virtual void ResetMap ()
 
MapGetMap () const
 
MapFindMap () const
 
void SetZoneScript ()
 
void ClearZoneScript ()
 
ZoneScriptGetZoneScript () const
 
TempSummonSummonCreature (uint32 id, const Position &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false) const
 
TempSummonSummonCreature (uint32 id, float x, float y, float z, float ang=0, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false)
 
GameObjectSummonGameObject (uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport=true, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
 
CreatureSummonTrigger (float x, float y, float z, float ang, uint32 dur, bool setLevel=false, CreatureAI *(*GetAI)(Creature *)=nullptr)
 
void SummonCreatureGroup (uint8 group, std::list< TempSummon * > *list=nullptr)
 
CreatureFindNearestCreature (uint32 entry, float range, bool alive=true) const
 
GameObjectFindNearestGameObject (uint32 entry, float range, bool onlySpawned=false) const
 
GameObjectFindNearestGameObjectOfType (GameobjectTypes type, float range) const
 
PlayerSelectNearestPlayer (float distance=0) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetDeadCreatureListInGrid (std::list< Creature * > &lList, float maxSearchRange, bool alive=false) const
 
void DestroyForNearbyPlayers ()
 
virtual void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false)
 
void BuildUpdate (UpdateDataMapType &data_map, UpdatePlayerSet &player_set) override
 
void GetCreaturesWithEntryInRange (std::list< Creature * > &creatureList, float radius, uint32 entry)
 
void SetPositionDataUpdate ()
 
void UpdatePositionData ()
 
void AddToObjectUpdate () override
 
void RemoveFromObjectUpdate () override
 
void AddToNotify (uint16 f)
 
void RemoveFromNotify (uint16 f)
 
bool isNeedNotify (uint16 f) const
 
uint16 GetNotifyFlags () const
 
bool NotifyExecuted (uint16 f) const
 
void SetNotified (uint16 f)
 
void ResetAllNotifies ()
 
bool isActiveObject () const
 
void setActive (bool isActiveObject)
 
bool IsFarVisible () const
 
bool IsVisibilityOverridden () const
 
void SetVisibilityDistanceOverride (VisibilityDistanceType type)
 
void SetWorldObject (bool apply)
 
bool IsPermanentWorldObject () const
 
bool IsWorldObject () const
 
bool IsInWintergrasp () const
 
TransportGetTransport () const
 
float GetTransOffsetX () const
 
float GetTransOffsetY () const
 
float GetTransOffsetZ () const
 
float GetTransOffsetO () const
 
uint32 GetTransTime () const
 
int8 GetTransSeat () const
 
virtual ObjectGuid GetTransGUID () const
 
void SetTransport (Transport *t)
 
virtual float GetStationaryX () const
 
virtual float GetStationaryY () const
 
virtual float GetStationaryZ () const
 
virtual float GetStationaryO () const
 
float GetMapWaterOrGroundLevel (float x, float y, float z, float *ground=nullptr) const
 
float GetMapHeight (float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
 
float GetFloorZ () const
 
float GetMinHeightInWater () const
 Get the minimum height of a object that should be in water to start floating/swim.
 
virtual float GetCollisionHeight () const
 
virtual float GetCollisionWidth () const
 
virtual float GetCollisionRadius () const
 
void AddAllowedLooter (ObjectGuid guid)
 
void ResetAllowedLooters ()
 
void SetAllowedLooters (GuidUnorderedSet const looters)
 
bool HasAllowedLooter (ObjectGuid guid) const
 
GuidUnorderedSet const & GetAllowedLooters () const
 
void RemoveAllowedLooter (ObjectGuid guid)
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from Object
virtual ~Object ()
 
bool IsInWorld () const
 
virtual void AddToWorld ()
 
virtual void RemoveFromWorld ()
 
ObjectGuid GetGUID () const
 
PackedGuid const & GetPackGUID () const
 
uint32 GetEntry () const
 
void SetEntry (uint32 entry)
 
float GetObjectScale () const
 
virtual void SetObjectScale (float scale)
 
virtual uint32 GetDynamicFlags () const
 
bool HasDynamicFlag (uint32 flag) const
 
virtual void SetDynamicFlag (uint32 flag)
 
virtual void RemoveDynamicFlag (uint32 flag)
 
virtual void ReplaceAllDynamicFlags (uint32 flag)
 
TypeID GetTypeId () const
 
bool isType (uint16 mask) const
 
virtual void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target) const
 
void SendUpdateToPlayer (Player *player)
 
void BuildValuesUpdateBlockForPlayer (UpdateData *data, Player *target) const
 
void BuildOutOfRangeUpdateBlock (UpdateData *data) const
 
void BuildMovementUpdateBlock (UpdateData *data, uint32 flags=0) const
 
virtual void DestroyForPlayer (Player *target, bool onDeath=false) const
 
int32 GetInt32Value (uint16 index) const
 
uint32 GetUInt32Value (uint16 index) const
 
uint64 GetUInt64Value (uint16 index) const
 
float GetFloatValue (uint16 index) const
 
uint8 GetByteValue (uint16 index, uint8 offset) const
 
uint16 GetUInt16Value (uint16 index, uint8 offset) const
 
ObjectGuid GetGuidValue (uint16 index) const
 
void SetInt32Value (uint16 index, int32 value)
 
void SetUInt32Value (uint16 index, uint32 value)
 
void UpdateUInt32Value (uint16 index, uint32 value)
 
void SetUInt64Value (uint16 index, uint64 value)
 
void SetFloatValue (uint16 index, float value)
 
void SetByteValue (uint16 index, uint8 offset, uint8 value)
 
void SetUInt16Value (uint16 index, uint8 offset, uint16 value)
 
void SetInt16Value (uint16 index, uint8 offset, int16 value)
 
void SetGuidValue (uint16 index, ObjectGuid value)
 
void SetStatFloatValue (uint16 index, float value)
 
void SetStatInt32Value (uint16 index, int32 value)
 
bool AddGuidValue (uint16 index, ObjectGuid value)
 
bool RemoveGuidValue (uint16 index, ObjectGuid value)
 
void ApplyModUInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModUInt64Value (uint16 index, int32 val, bool apply)
 
void ApplyModPositiveFloatValue (uint16 index, float val, bool apply)
 
void ApplyModSignedFloatValue (uint16 index, float val, bool apply)
 
void ApplyPercentModFloatValue (uint16 index, float val, bool apply)
 
void SetFlag (uint16 index, uint32 newFlag)
 
void RemoveFlag (uint16 index, uint32 oldFlag)
 
void ToggleFlag (uint16 index, uint32 flag)
 
bool HasFlag (uint16 index, uint32 flag) const
 
void ApplyModFlag (uint16 index, uint32 flag, bool apply)
 
void SetByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
void RemoveByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
bool HasByteFlag (uint16 index, uint8 offset, uint8 flag) const
 
void SetFlag64 (uint16 index, uint64 newFlag)
 
void RemoveFlag64 (uint16 index, uint64 oldFlag)
 
void ToggleFlag64 (uint16 index, uint64 flag)
 
bool HasFlag64 (uint16 index, uint64 flag) const
 
void ApplyModFlag64 (uint16 index, uint64 flag, bool apply)
 
void ClearUpdateMask (bool remove)
 
uint16 GetValuesCount () const
 
virtual bool hasQuest (uint32) const
 
virtual bool hasInvolvedQuest (uint32) const
 
virtual void BuildUpdate (UpdateDataMapType &, UpdatePlayerSet &)
 
void BuildFieldsUpdate (Player *, UpdateDataMapType &) const
 
void SetFieldNotifyFlag (uint16 flag)
 
void RemoveFieldNotifyFlag (uint16 flag)
 
void ForceValuesUpdateAtIndex (uint32)
 
bool IsPlayer () const
 
PlayerToPlayer ()
 
Player const * ToPlayer () const
 
CreatureToCreature ()
 
Creature const * ToCreature () const
 
UnitToUnit ()
 
Unit const * ToUnit () const
 
GameObjectToGameObject ()
 
GameObject const * ToGameObject () const
 
CorpseToCorpse ()
 
Corpse const * ToCorpse () const
 
DynamicObjectToDynObject ()
 
DynamicObject const * ToDynObject () const
 
virtual std::string GetDebugInfo () const
 
- Public Member Functions inherited from WorldLocation
 WorldLocation (uint32 _mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
 WorldLocation (uint32 mapId, Position const &position)
 
void WorldRelocate (const WorldLocation &loc)
 
void WorldRelocate (uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
void SetMapId (uint32 mapId)
 
uint32 GetMapId () const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z, float &o) const
 
void GetWorldLocation (WorldLocation *location) const
 
WorldLocation GetWorldLocation () const
 
std::string GetDebugInfo () const
 
- Public Member Functions inherited from Position
 Position (float x=0, float y=0, float z=0, float o=0)
 
 Position (Position const &loc)
 
 Position (Position &&)=default
 
Positionoperator= (const Position &)=default
 
Positionoperator= (Position &&)=default
 
bool operator== (Position const &a) const
 
bool operator!= (Position const &a)
 
 operator G3D::Vector3 () const
 
void Relocate (float x, float y)
 
void Relocate (float x, float y, float z)
 
void Relocate (float x, float y, float z, float orientation)
 
void Relocate (const Position &pos)
 
void Relocate (const Position *pos)
 
void RelocatePolarOffset (float angle, float dist, float z=0.0f)
 
void RelocateOffset (const Position &offset)
 
void SetOrientation (float orientation)
 
float GetPositionX () const
 
float GetPositionY () const
 
float GetPositionZ () const
 
float GetOrientation () const
 
void GetPosition (float &x, float &y) const
 
void GetPosition (float &x, float &y, float &z) const
 
void GetPosition (float &x, float &y, float &z, float &o) const
 
Position GetPosition () const
 
Position::PositionXYZStreamer PositionXYZStream ()
 
Position::PositionXYZOStreamer PositionXYZOStream ()
 
bool IsPositionValid () const
 
float GetExactDist2dSq (const float x, const float y) const
 
float GetExactDist2dSq (Position const &pos) const
 
float GetExactDist2dSq (Position const *pos) const
 
float GetExactDist2d (const float x, const float y) const
 
float GetExactDist2d (Position const &pos) const
 
float GetExactDist2d (Position const *pos) const
 
float GetExactDistSq (float x, float y, float z) const
 
float GetExactDistSq (Position const &pos) const
 
float GetExactDistSq (Position const *pos) const
 
float GetExactDist (float x, float y, float z) const
 
float GetExactDist (Position const &pos) const
 
float GetExactDist (Position const *pos) const
 
void GetPositionOffsetTo (const Position &endPos, Position &retOffset) const
 
Position GetPositionWithOffset (Position const &offset) const
 
float GetAngle (const Position *pos) const
 
float GetAngle (float x, float y) const
 
float GetAbsoluteAngle (float x, float y) const
 
float GetAbsoluteAngle (Position const &pos) const
 
float GetAbsoluteAngle (Position const *pos) const
 
float GetRelativeAngle (const Position *pos) const
 
float GetRelativeAngle (float x, float y) const
 
float ToAbsoluteAngle (float relAngle) const
 
void GetSinCos (float x, float y, float &vsin, float &vcos) const
 
bool IsInDist2d (float x, float y, float dist) const
 
bool IsInDist2d (const Position *pos, float dist) const
 
bool IsInDist (float x, float y, float z, float dist) const
 
bool IsInDist (const Position *pos, float dist) const
 
bool IsWithinBox (const Position &center, float xradius, float yradius, float zradius) const
 
bool HasInArc (float arcangle, const Position *pos, float targetRadius=0.0f) const
 
bool HasInLine (Position const *pos, float width) const
 
std::string ToString () const
 

Static Public Member Functions

static float GetEffectiveResistChance (Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
 
static void DealDamageMods (Unit const *victim, uint32 &damage, uint32 *absorb)
 
static uint32 DealDamage (Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
 
static void Kill (Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
static int32 DealHeal (Unit *healer, Unit *victim, uint32 addhealth)
 
static void ProcDamageAndSpell (Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
static void ApplyResilience (Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
 
static uint32 SpellCriticalDamageBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static uint32 SpellCriticalHealingBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static bool IsDamageReducedByArmor (SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
 
static uint32 CalcArmorReducedDamage (Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
 
static void CalcAbsorbResist (DamageInfo &dmgInfo, bool Splited=false)
 
static void CalcHealAbsorb (HealInfo &healInfo)
 
static void HandleSafeUnitPointersOnDelete (Unit *thisUnit)
 
- Static Public Member Functions inherited from Object
static ObjectGuid GetGUID (Object const *o)
 
- Static Public Member Functions inherited from Position
static float NormalizeOrientation (float o)
 

Public Attributes

uint32 m_extraAttacks
 
bool m_canDualWield
 
ControlSet m_Controlled
 
SafeUnitPointer m_movedByPlayer
 
ObjectGuid m_SummonSlot [MAX_SUMMON_SLOT]
 
ObjectGuid m_ObjectSlot [MAX_GAMEOBJECT_SLOT]
 
float m_modMeleeHitChance
 
float m_modRangedHitChance
 
float m_modSpellHitChance
 
int32 m_baseSpellCritChance
 
float m_threatModifier [MAX_SPELL_SCHOOL]
 
float m_modAttackSpeedPct [3]
 
EventProcessor m_Events
 
SpellImmuneList m_spellImmune [MAX_SPELL_IMMUNITY]
 
uint32 m_lastSanctuaryTime
 
PetAuraSet m_petAuras
 
bool IsAIEnabled
 
bool NeedChangeAI
 
bool m_ControlledByPlayer
 
bool m_CreatedByPlayer
 
std::set< SafeUnitPointer * > SafeUnitPointerSet
 
Position m_last_notify_position
 
uint32 m_last_notify_mstime
 
uint16 m_delayed_unit_relocation_timer
 
uint16 m_delayed_unit_ai_notify_timer
 
bool bRequestForcedVisibilityUpdate
 
Movement::MoveSplinemovespline
 
- Public Attributes inherited from WorldObject
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealth
 
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealthDetect
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibility
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibilityDetect
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibility
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibilityDetect
 
uint32 LastUsedScriptID
 
MovementInfo m_movementInfo
 
ElunaEventProcessor * elunaEvents
 
- Public Attributes inherited from Object
DataMap CustomData
 
- Public Attributes inherited from WorldLocation
uint32 m_mapId
 
- Public Attributes inherited from Position
float m_positionX = 0
 
float m_positionY = 0
 
float m_positionZ = 0
 
float m_orientation = 0
 

Protected Types

typedef std::list< DynamicObject * > DynObjectList
 
typedef GuidList GameObjectList
 
typedef std::map< ObjectGuid, float > CharmThreatMap
 

Protected Member Functions

 Unit (bool isWorldObject)
 
void BuildValuesUpdate (uint8 updatetype, ByteBuffer *data, Player *target) const override
 
void _UpdateSpells (uint32 time)
 
void _DeleteRemovedAuras ()
 
void _UpdateAutoRepeatSpell ()
 
bool IsAlwaysVisibleFor (WorldObject const *seer) const override
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
void SetFeared (bool apply, Unit *fearedBy=nullptr, bool isFear=false)
 
void SetConfused (bool apply)
 
void SetStunned (bool apply)
 
void SetRooted (bool apply, bool isStun=false)
 
- Protected Member Functions inherited from WorldObject
 WorldObject (bool isWorldObject)
 
virtual void ProcessPositionDataChanged (PositionFullTerrainStatus const &data)
 
void SetLocationMapId (uint32 _mapId)
 
void SetLocationInstanceId (uint32 _instanceId)
 
virtual bool IsNeverVisible () const
 
virtual bool IsAlwaysVisibleFor (WorldObject const *) const
 
virtual bool IsInvisibleDueToDespawn () const
 
virtual bool IsAlwaysDetectableFor (WorldObject const *) const
 
- Protected Member Functions inherited from Object
 Object ()
 
void _InitValues ()
 
void _Create (ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
 
std::string _ConcatFields (uint16 startIndex, uint16 size) const
 
bool _LoadIntoDataField (std::string const &data, uint32 startOffset, uint32 count)
 
uint32 GetUpdateFieldData (Player const *target, uint32 *&flags) const
 
void BuildMovementUpdate (ByteBuffer *data, uint16 flags) const
 
virtual void BuildValuesUpdate (uint8 updatetype, ByteBuffer *data, Player *target) const
 
virtual void AddToObjectUpdate ()=0
 
virtual void RemoveFromObjectUpdate ()=0
 
void AddToObjectUpdateIfNeeded ()
 

Protected Attributes

UnitAIi_AI
 
UnitAIi_disabledAI
 
uint8 m_realRace
 
uint8 m_race
 
bool m_AutoRepeatFirstCast
 
int32 m_attackTimer [MAX_ATTACK]
 
float m_createStats [MAX_STATS]
 
AttackerSet m_attackers
 
Unitm_attacking
 
DeathState m_deathState
 
int32 m_procDeep
 
DynObjectList m_dynObj
 
GameObjectList m_gameObj
 
uint32 m_transform
 
Spellm_currentSpells [CURRENT_MAX_SPELL]
 
AuraMap m_ownedAuras
 
AuraApplicationMap m_appliedAuras
 
AuraList m_removedAuras
 
AuraMap::iterator m_auraUpdateIterator
 
uint32 m_removedAurasCount
 
AuraEffectList m_modAuras [TOTAL_AURAS]
 
AuraList m_scAuras
 
AuraApplicationList m_interruptableAuras
 
AuraStateAurasMap m_auraStateAuras
 
uint32 m_interruptMask
 
float m_auraModifiersGroup [UNIT_MOD_END][MODIFIER_TYPE_END]
 
float m_weaponDamage [MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
 
bool m_canModifyStats
 
VisibleAuraMap m_visibleAuras
 
float m_speed_rate [MAX_MOVE_TYPE]
 
CharmInfom_charmInfo
 
SharedVisionList m_sharedVision
 
MotionMasteri_motionMaster
 
uint32 m_reactiveTimer [MAX_REACTIVE]
 
int32 m_regenTimer
 
ThreatMgr m_ThreatMgr
 
CharmThreatMap _charmThreatInfo
 
Vehiclem_vehicle
 
Vehiclem_vehicleKit
 
uint32 m_unitTypeMask
 
LiquidTypeEntry const * _lastLiquid
 
bool m_applyResilience
 
bool _instantCast
 
uint32 m_rootTimes
 
- Protected Attributes inherited from WorldObject
std::string m_name
 
bool m_isActive
 
bool m_isFarVisible
 
Optional< float > m_visibilityDistanceOverride
 
const bool m_isWorldObject
 
ZoneScriptm_zoneScript
 
uint32 _zoneId
 
uint32 _areaId
 
float _floorZ
 
bool _outdoors
 
LiquidData _liquidData
 
bool _updatePositionData
 
Transportm_transport
 
- Protected Attributes inherited from Object
uint16 m_objectType
 
TypeID m_objectTypeId
 
uint16 m_updateFlag
 
union {
   int32 *   m_int32Values
 
   uint32 *   m_uint32Values
 
   float *   m_floatValues
 
}; 
 
UpdateMask _changesMask
 
uint16 m_valuesCount
 
uint16 _fieldNotifyFlags
 
bool m_objectUpdated
 

Private Member Functions

bool IsTriggeredAtSpellProcEvent (Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
 
bool HandleDummyAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
 
bool HandleAuraProc (Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
 
bool HandleProcTriggerSpell (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
 
bool HandleOverrideClassScriptAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
 
bool HandleAuraRaidProcFromChargeWithValue (AuraEffect *triggeredByAura)
 
bool HandleAuraRaidProcFromCharge (AuraEffect *triggeredByAura)
 
void UpdateSplineMovement (uint32 t_diff)
 
void UpdateSplinePosition ()
 
float GetCombatRatingReduction (CombatRating cr) const
 
uint32 GetCombatRatingDamageReduction (CombatRating cr, float rate, float cap, uint32 damage) const
 
float processDummyAuras (float TakenTotalMod) const
 

Private Attributes

uint32 m_state
 
uint32 m_CombatTimer
 
uint32 m_lastManaUse
 
Diminishing m_Diminishing
 
HostileRefMgr m_HostileRefMgr
 
FollowerRefMgr m_FollowingRefMgr
 
Unitm_comboTarget
 
int8 m_comboPoints
 
std::unordered_set< Unit * > m_ComboPointHolders
 
RedirectThreatInfo _redirectThreatInfo
 
bool m_cleanupDone
 
bool m_duringRemoveFromWorld
 
uint32 _oldFactionId
 faction before charm
 
bool _isWalkingBeforeCharm
 Are we walking before we were charmed?
 
uint32 _lastExtraAttackSpell
 
std::unordered_map< ObjectGuid, uint32extraAttacksTargets
 
ObjectGuid _lastDamagedTargetGuid
 

Detailed Description

Member Typedef Documentation

◆ AttackerSet

typedef std::unordered_set<Unit*> Unit::AttackerSet

◆ AuraApplicationList

◆ AuraApplicationMap

◆ AuraApplicationMapBounds

typedef std::pair<AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator> Unit::AuraApplicationMapBounds

◆ AuraApplicationMapBoundsNonConst

typedef std::pair<AuraApplicationMap::iterator, AuraApplicationMap::iterator> Unit::AuraApplicationMapBoundsNonConst

◆ AuraEffectList

typedef std::list<AuraEffect*> Unit::AuraEffectList

◆ AuraList

typedef std::list<Aura*> Unit::AuraList

◆ AuraMap

typedef std::multimap<uint32, Aura*> Unit::AuraMap

◆ AuraMapBounds

typedef std::pair<AuraMap::const_iterator, AuraMap::const_iterator> Unit::AuraMapBounds

◆ AuraMapBoundsNonConst

typedef std::pair<AuraMap::iterator, AuraMap::iterator> Unit::AuraMapBoundsNonConst

◆ AuraStateAurasMap

◆ AuraStateAurasMapBounds

typedef std::pair<AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator> Unit::AuraStateAurasMapBounds

◆ CharmThreatMap

typedef std::map<ObjectGuid, float> Unit::CharmThreatMap
protected

◆ ComboPointHolderSet

◆ ControlSet

typedef std::set<Unit*> Unit::ControlSet

◆ Diminishing

◆ DynObjectList

typedef std::list<DynamicObject*> Unit::DynObjectList
protected

◆ GameObjectList

typedef GuidList Unit::GameObjectList
protected

◆ PetAuraSet

typedef std::set<PetAura const*> Unit::PetAuraSet

◆ VisibleAuraMap

Constructor & Destructor Documentation

◆ ~Unit()

Unit::~Unit ( )
override
360{
361 // set current spells as deletable
362 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
363 if (m_currentSpells[i])
364 {
366 m_currentSpells[i] = nullptr;
367 }
368
370
371 delete i_motionMaster;
372 delete m_charmInfo;
373 delete movespline;
374
377 ASSERT(m_attackers.empty());
378
379 // pussywizard: clear m_sharedVision along with back references
380 if (!m_sharedVision.empty())
381 {
382 do
383 {
384 Player* p = *(m_sharedVision.begin());
385 p->m_isInSharedVisionOf.erase(this);
386 m_sharedVision.remove(p);
387 } while (!m_sharedVision.empty());
388 }
389
390 ASSERT(m_Controlled.empty());
391 ASSERT(m_appliedAuras.empty());
392 ASSERT(m_ownedAuras.empty());
393 ASSERT(m_removedAuras.empty());
394 ASSERT(m_gameObj.empty());
395 ASSERT(m_dynObj.empty());
396
397 if (m_movedByPlayer && m_movedByPlayer != this)
398 LOG_INFO("misc", "Unit::~Unit (A1)");
399
401}
#define ASSERT
Definition: Errors.h:68
std::uint8_t uint8
Definition: Define.h:110
#define LOG_INFO(filterType__,...)
Definition: Log.h:165
#define CURRENT_MAX_SPELL
Definition: Unit.h:997
Definition: Player.h:1056
std::set< Unit * > m_isInSharedVisionOf
Definition: Player.h:2297
bool m_duringRemoveFromWorld
Definition: Unit.h:2603
Spell * m_currentSpells[CURRENT_MAX_SPELL]
Definition: Unit.h:2515
AuraList m_removedAuras
Definition: Unit.h:2519
ControlSet m_Controlled
Definition: Unit.h:1881
Movement::MoveSpline * movespline
Definition: Unit.h:2454
CharmInfo * m_charmInfo
Definition: Unit.h:2536
MotionMaster * i_motionMaster
Definition: Unit.h:2539
void _DeleteRemovedAuras()
Definition: Unit.cpp:3798
DynObjectList m_dynObj
Definition: Unit.h:2509
SafeUnitPointer m_movedByPlayer
Definition: Unit.h:1902
AttackerSet m_attackers
Definition: Unit.h:2501
Unit * m_attacking
Definition: Unit.h:2502
GameObjectList m_gameObj
Definition: Unit.h:2512
AuraMap m_ownedAuras
Definition: Unit.h:2517
AuraApplicationMap m_appliedAuras
Definition: Unit.h:2518
static void HandleSafeUnitPointersOnDelete(Unit *thisUnit)
Definition: Unit.cpp:4281
SharedVisionList m_sharedVision
Definition: Unit.h:2537
void SetReferencedFromCurrent(bool yes)
Definition: Spell.h:558

References _DeleteRemovedAuras(), ASSERT, CURRENT_MAX_SPELL, HandleSafeUnitPointersOnDelete(), i_motionMaster, LOG_INFO, m_appliedAuras, m_attackers, m_attacking, m_charmInfo, m_Controlled, m_currentSpells, m_duringRemoveFromWorld, m_dynObj, m_gameObj, Player::m_isInSharedVisionOf, m_movedByPlayer, m_ownedAuras, m_removedAuras, m_sharedVision, movespline, and Spell::SetReferencedFromCurrent().

◆ Unit()

Unit::Unit ( bool  isWorldObject)
explicitprotected
206 : WorldObject(isWorldObject),
207 m_movedByPlayer(nullptr),
209 IsAIEnabled(false),
210 NeedChangeAI(false),
212 m_CreatedByPlayer(false),
214 i_AI(nullptr),
215 i_disabledAI(nullptr),
216 m_realRace(0),
217 m_race(0),
219 m_procDeep(0),
221 i_motionMaster(new MotionMaster(this)),
222 m_regenTimer(0),
223 m_ThreatMgr(this),
224 m_vehicle(nullptr),
225 m_vehicleKit(nullptr),
227 m_HostileRefMgr(this),
228 m_comboTarget(nullptr),
230{
231#ifdef _MSC_VER
232#pragma warning(default:4355)
233#endif
236
238
245
246 m_canDualWield = false;
247
248 m_rootTimes = 0;
249
250 m_state = 0;
251 m_deathState = DeathState::Alive;
252
253 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
254 m_currentSpells[i] = nullptr;
255
256 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
257 m_SummonSlot[i].Clear();
258
259 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
260 m_ObjectSlot[i].Clear();
261
263
264 m_interruptMask = 0;
265 m_transform = 0;
266 m_canModifyStats = false;
267
268 for (uint8 i = 0; i < MAX_SPELL_IMMUNITY; ++i)
269 m_spellImmune[i].clear();
270
271 for (uint8 i = 0; i < UNIT_MOD_END; ++i)
272 {
277 }
278 // implement 50% base damage from offhand
280
281 for (uint8 i = 0; i < MAX_ATTACK; ++i)
282 {
285
286 m_weaponDamage[i][MINDAMAGE][1] = 0.f;
287 m_weaponDamage[i][MAXDAMAGE][1] = 0.f;
288 }
289
290 for (uint8 i = 0; i < MAX_STATS; ++i)
291 m_createStats[i] = 0.0f;
292
293 m_attacking = nullptr;
294 m_modMeleeHitChance = 0.0f;
296 m_modSpellHitChance = 0.0f;
298
299 m_CombatTimer = 0;
300 m_lastManaUse = 0;
301
302 for (uint8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
303 m_threatModifier[i] = 1.0f;
304
305 for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
306 m_speed_rate[i] = 1.0f;
307
308 m_charmInfo = nullptr;
309
311
312 // remove aurastates allowing special moves
313 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
314 m_reactiveTimer[i] = 0;
315
316 m_cleanupDone = false;
318
320
321 m_last_notify_position.Relocate(-5000.0f, -5000.0f, -5000.0f, 0.0f);
326
327 m_applyResilience = false;
328 _instantCast = false;
329
330 _lastLiquid = nullptr;
331
332 _oldFactionId = 0;
333
334 _isWalkingBeforeCharm = false;
335
337}
@ TYPEID_UNIT
Definition: ObjectGuid.h:37
@ TYPEMASK_UNIT
Definition: ObjectGuid.h:51
@ UPDATEFLAG_LIVING
Definition: UpdateData.h:44
@ UPDATEFLAG_STATIONARY_POSITION
Definition: UpdateData.h:45
@ UNIT_MASK_NONE
Definition: Unit.h:674
@ MINDAMAGE
Definition: Unit.h:254
@ MAXDAMAGE
Definition: Unit.h:255
@ UNIT_MOD_DAMAGE_OFFHAND
Definition: Unit.h:285
@ UNIT_MOD_END
Definition: Unit.h:287
#define MAX_MOVE_TYPE
Definition: Unit.h:389
#define MAX_SUMMON_SLOT
Definition: Unit.h:1227
@ OFF_ATTACK
Definition: Unit.h:397
@ MAX_ATTACK
Definition: Unit.h:399
@ BASE_ATTACK
Definition: Unit.h:396
@ RANGED_ATTACK
Definition: Unit.h:398
@ BASE_VALUE
Definition: Unit.h:245
@ TOTAL_VALUE
Definition: Unit.h:247
@ TOTAL_PCT
Definition: Unit.h:248
@ BASE_PCT
Definition: Unit.h:246
#define BASE_MAXDAMAGE
Definition: Unit.h:39
@ MAX_REACTIVE
Definition: Unit.h:1219
#define MAX_GAMEOBJECT_SLOT
Definition: Unit.h:1229
#define BASE_MINDAMAGE
Definition: Unit.h:38
@ SERVERSIDE_VISIBILITY_GHOST
Definition: SharedDefines.h:1274
#define MAX_STATS
Definition: SharedDefines.h:265
constexpr auto MAX_SPELL_SCHOOL
Definition: SharedDefines.h:292
@ GHOST_VISIBILITY_ALIVE
Definition: SharedDefines.h:1281
#define MAX_SPELL_IMMUNITY
Definition: SharedDefines.h:1404
uint16 m_objectType
Definition: Object.h:228
uint16 m_updateFlag
Definition: Object.h:231
TypeID m_objectTypeId
Definition: Object.h:230
void SetValue(FLAG_TYPE flag, T_VALUES value)
Definition: Object.h:360
Definition: Object.h:393
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibility
Definition: Object.h:509
void Relocate(float x, float y)
Definition: Position.h:73
Definition: Unit.h:960
uint32 m_reactiveTimer[MAX_REACTIVE]
Definition: Unit.h:2541
uint32 m_lastSanctuaryTime
Definition: Unit.h:2151
LiquidTypeEntry const * _lastLiquid
Definition: Unit.h:2552
uint32 m_transform
Definition: Unit.h:2513
uint32 m_CombatTimer
Definition: Unit.h:2586
bool m_canModifyStats
Definition: Unit.h:2531
bool NeedChangeAI
Definition: Unit.h:2364
uint32 m_state
Definition: Unit.h:2585
float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END]
Definition: Unit.h:2529
int32 m_attackTimer[MAX_ATTACK]
Definition: Unit.h:2497
float m_modAttackSpeedPct[3]
Definition: Unit.h:2105
uint8 m_realRace
Definition: Unit.h:2492
Vehicle * m_vehicle
Definition: Unit.h:2548
uint32 m_rootTimes
Definition: Unit.h:2582
uint8 m_race
Definition: Unit.h:2493
UnitAI * i_AI
Definition: Unit.h:2485
uint32 _lastExtraAttackSpell
Definition: Unit.h:2610
bool _instantCast
Definition: Unit.h:2558
ObjectGuid m_ObjectSlot[MAX_GAMEOBJECT_SLOT]
Definition: Unit.h:2083
RedirectThreatInfo _redirectThreatInfo
Definition: Unit.h:2600
float m_createStats[MAX_STATS]
Definition: Unit.h:2499
float m_modRangedHitChance
Definition: Unit.h:2100
DeathState m_deathState
Definition: Unit.h:2504
uint32 m_unitTypeMask
Definition: Unit.h:2551
uint32 m_removedAurasCount
Definition: Unit.h:2521
ThreatMgr m_ThreatMgr
Definition: Unit.h:2544
Unit * m_comboTarget
Definition: Unit.h:2596
AuraMap::iterator m_auraUpdateIterator
Definition: Unit.h:2520
bool m_AutoRepeatFirstCast
Definition: Unit.h:2495
uint16 m_delayed_unit_ai_notify_timer
Definition: Unit.h:2426
int32 m_regenTimer
Definition: Unit.h:2542
bool bRequestForcedVisibilityUpdate
Definition: Unit.h:2427
bool m_ControlledByPlayer
Definition: Unit.h:2376
uint32 m_last_notify_mstime
Definition: Unit.h:2424
SpellImmuneList m_spellImmune[MAX_SPELL_IMMUNITY]
Definition: Unit.h:2150
int8 m_comboPoints
Definition: Unit.h:2597
uint32 _oldFactionId
faction before charm
Definition: Unit.h:2605
int32 m_baseSpellCritChance
Definition: Unit.h:2102
float m_modMeleeHitChance
Definition: Unit.h:2099
float m_weaponDamage[MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
Definition: Unit.h:2530
Position m_last_notify_position
Definition: Unit.h:2423
Vehicle * m_vehicleKit
Definition: Unit.h:2549
bool IsAIEnabled
Definition: Unit.h:2364
HostileRefMgr m_HostileRefMgr
Definition: Unit.h:2592
bool m_applyResilience
Definition: Unit.h:2555
bool m_canDualWield
Definition: Unit.h:1368
uint32 m_interruptMask
Definition: Unit.h:2527
int32 m_procDeep
Definition: Unit.h:2506
float m_speed_rate[MAX_MOVE_TYPE]
Definition: Unit.h:2534
float m_modSpellHitChance
Definition: Unit.h:2101
UnitAI * i_disabledAI
Definition: Unit.h:2485
ObjectGuid m_SummonSlot[MAX_SUMMON_SLOT]
Definition: Unit.h:2082
bool m_cleanupDone
Definition: Unit.h:2602
bool _isWalkingBeforeCharm
Are we walking before we were charmed?
Definition: Unit.h:2606
bool m_CreatedByPlayer
Definition: Unit.h:2377
uint16 m_delayed_unit_relocation_timer
Definition: Unit.h:2425
float m_threatModifier[MAX_SPELL_SCHOOL]
Definition: Unit.h:2104
uint32 m_lastManaUse
Definition: Unit.h:2587
Definition: MotionMaster.h:110
Definition: MoveSpline.h:40

References _instantCast, _isWalkingBeforeCharm, _lastExtraAttackSpell, _lastLiquid, _oldFactionId, _redirectThreatInfo, BASE_ATTACK, BASE_MAXDAMAGE, BASE_MINDAMAGE, BASE_PCT, BASE_VALUE, bRequestForcedVisibilityUpdate, CURRENT_MAX_SPELL, GHOST_VISIBILITY_ALIVE, m_applyResilience, m_attacking, m_attackTimer, m_auraModifiersGroup, m_auraUpdateIterator, m_baseSpellCritChance, m_canDualWield, m_canModifyStats, m_charmInfo, m_cleanupDone, m_CombatTimer, m_createStats, m_currentSpells, m_deathState, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_duringRemoveFromWorld, m_interruptMask, m_last_notify_mstime, m_last_notify_position, m_lastManaUse, m_modAttackSpeedPct, m_modMeleeHitChance, m_modRangedHitChance, m_modSpellHitChance, m_ObjectSlot, Object::m_objectType, Object::m_objectTypeId, m_ownedAuras, m_reactiveTimer, m_rootTimes, WorldObject::m_serverSideVisibility, m_speed_rate, m_spellImmune, m_state, m_SummonSlot, m_threatModifier, m_transform, Object::m_updateFlag, m_weaponDamage, MAX_ATTACK, MAX_GAMEOBJECT_SLOT, MAX_MOVE_TYPE, MAX_REACTIVE, MAX_SPELL_IMMUNITY, MAX_SPELL_SCHOOL, MAX_STATS, MAX_SUMMON_SLOT, MAXDAMAGE, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, Position::Relocate(), SERVERSIDE_VISIBILITY_GHOST, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), TOTAL_PCT, TOTAL_VALUE, TYPEID_UNIT, TYPEMASK_UNIT, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_END, UPDATEFLAG_LIVING, and UPDATEFLAG_STATIONARY_POSITION.

Member Function Documentation

◆ _addAttacker()

void Unit::_addAttacker ( Unit pAttacker)
inline
1371 {
1372 m_attackers.insert(pAttacker);
1373 }

References m_attackers.

Referenced by Attack().

◆ _AddAura()

void Unit::_AddAura ( UnitAura aura,
Unit caster 
)
4367{
4369 m_ownedAuras.insert(AuraMap::value_type(aura->GetId(), aura));
4370
4372
4373 if (aura->IsRemoved())
4374 return;
4375
4377 if (aura->IsSingleTarget())
4378 {
4379 ASSERT((IsInWorld() && !IsDuringRemoveFromWorld()) || (aura->GetCasterGUID() == GetGUID()));
4380 /* @HACK: Player is not in world during loading auras.
4381 * Single target auras are not saved or loaded from database
4382 * but may be created as a result of aura links (player mounts with passengers)
4383 */
4384
4385 // register single target aura
4386 caster->GetSingleCastAuras().push_back(aura);
4387 // remove other single target auras
4388 Unit::AuraList& scAuras = caster->GetSingleCastAuras();
4389 for (Unit::AuraList::iterator itr = scAuras.begin(); itr != scAuras.end();)
4390 {
4391 if ((*itr) != aura &&
4392 (*itr)->IsSingleTargetWith(aura))
4393 {
4394 (*itr)->Remove();
4395 itr = scAuras.begin();
4396 }
4397 else
4398 ++itr;
4399 }
4400 }
4401}
@ SPELL_AURA_CONTROL_VEHICLE
Definition: SpellAuraDefines.h:299
bool IsInWorld() const
Definition: Object.h:101
ObjectGuid GetGUID() const
Definition: Object.h:107
void _RemoveNoStackAurasDueToAura(Aura *aura)
Definition: Unit.cpp:4613
std::list< Aura * > AuraList
Definition: Unit.h:1319
bool IsDuringRemoveFromWorld() const
Definition: Unit.h:2410
AuraList & GetSingleCastAuras()
Definition: Unit.h:1982
ObjectGuid GetCasterGUID() const
Definition: SpellAuras.h:105
bool IsRemoved() const
Definition: SpellAuras.h:161
uint32 GetId() const
Definition: SpellAuras.cpp:466
bool HasEffectType(AuraType type) const
Definition: SpellAuras.cpp:1236
SpellInfo const * GetSpellInfo() const
Definition: SpellAuras.h:100
void SetIsSingleTarget(bool val)
Definition: SpellAuras.h:166
bool IsSingleTarget() const
Definition: SpellAuras.h:164
bool IsSingleTarget() const
Definition: SpellInfo.cpp:1361

References _RemoveNoStackAurasDueToAura(), ASSERT, Aura::GetCasterGUID(), Object::GetGUID(), Aura::GetId(), GetSingleCastAuras(), Aura::GetSpellInfo(), Aura::HasEffectType(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Aura::IsRemoved(), Aura::IsSingleTarget(), SpellInfo::IsSingleTarget(), Aura::IsSingleTargetWith(), m_cleanupDone, m_ownedAuras, Aura::SetIsSingleTarget(), and SPELL_AURA_CONTROL_VEHICLE.

Referenced by UnitAura::UnitAura().

◆ _ApplyAllAuraStatMods()

void Unit::_ApplyAllAuraStatMods ( )
5427{
5428 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5429 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, true);
5430}
@ AURA_EFFECT_HANDLE_STAT
Definition: SpellAuraDefines.h:46

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_ApplyAllStatBonuses().

◆ _ApplyAura()

void Unit::_ApplyAura ( AuraApplication aurApp,
uint8  effMask 
)
4458{
4459 Aura* aura = aurApp->GetBase();
4460
4462
4463 if (aurApp->GetRemoveMode())
4464 return;
4465
4466 Unit* caster = aura->GetCaster();
4467
4468 // Update target aura state flag
4469 SpellInfo const* spellInfo = aura->GetSpellInfo();
4470 if (AuraStateType aState = spellInfo->GetAuraState())
4471 {
4472 if (aState != AURA_STATE_CONFLAGRATE)
4473 {
4474 // Sting (hunter's pet ability), Faerie Fire (druid versions)
4475 if (aState == AURA_STATE_FAERIE_FIRE)
4477
4478 ModifyAuraState(aState, true);
4479 }
4480 else if (caster)
4481 {
4483 m_Events.AddEvent(pEvent, m_Events.CalculateTime(700)); // intended 700ms delay before allowing to cast conflagrate
4484 }
4485 }
4486
4487 if (aurApp->GetRemoveMode())
4488 return;
4489
4490 // Sitdown on apply aura req seated
4493
4494 if (aurApp->GetRemoveMode())
4495 return;
4496
4497 aura->HandleAuraSpecificMods(aurApp, caster, true, false);
4498
4499 // apply effects of the aura
4500 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4501 {
4502 if (effMask & 1 << i && (!aurApp->GetRemoveMode()))
4503 aurApp->_HandleEffect(i, true);
4504 }
4505
4506 sScriptMgr->OnAuraApply(this, aura);
4507}
@ UNIT_STAND_STATE_SIT
Definition: Unit.h:54
#define sScriptMgr
Definition: ScriptMgr.h:698
@ SPELL_AURA_MOD_STEALTH
Definition: SpellAuraDefines.h:79
@ AURA_INTERRUPT_FLAG_NOT_SEATED
Definition: SpellDefines.h:62
#define MAX_SPELL_EFFECTS
Definition: DBCStructure.h:1635
AuraStateType
Definition: SharedDefines.h:1288
@ AURA_STATE_FAERIE_FIRE
Definition: SharedDefines.h:1304
@ AURA_STATE_CONFLAGRATE
Definition: SharedDefines.h:1306
void AddEvent(BasicEvent *Event, uint64 e_time, bool set_addtime=true)
Definition: EventProcessor.h:104
uint64 CalculateTime(uint64 t_offset) const
Definition: EventProcessor.cpp:159
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:106
Definition: Unit.h:1302
void ModifyAuraState(AuraStateType flag, bool apply)
Definition: Unit.cpp:10496
EventProcessor m_Events
Definition: Unit.h:2108
void RemoveAurasByType(AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
Definition: Unit.cpp:5045
void SetStandState(uint8 state)
Definition: Unit.cpp:16994
bool IsSitState() const
Definition: Unit.cpp:16979
Definition: Unit.h:2672
Unit * GetTarget() const
Definition: SpellAuras.h:61
void _HandleEffect(uint8 effIndex, bool apply)
Definition: SpellAuras.cpp:161
Aura * GetBase() const
Definition: SpellAuras.h:62
AuraRemoveMode GetRemoveMode() const
Definition: SpellAuras.h:73
Definition: SpellAuras.h:87
Unit * GetCaster() const
Definition: SpellAuras.cpp:471
void HandleAuraSpecificMods(AuraApplication const *aurApp, Unit *caster, bool apply, bool onReapply)
Definition: SpellAuras.cpp:1279
Definition: SpellInfo.h:314
AuraStateType GetAuraState() const
Definition: SpellInfo.cpp:2047
uint32 AuraInterruptFlags
Definition: SpellInfo.h:351

References AuraApplication::_HandleEffect(), _RemoveNoStackAurasDueToAura(), EventProcessor::AddEvent(), AURA_INTERRUPT_FLAG_NOT_SEATED, AURA_STATE_CONFLAGRATE, AURA_STATE_FAERIE_FIRE, SpellInfo::AuraInterruptFlags, EventProcessor::CalculateTime(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), Object::GetGUID(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), AuraApplication::GetTarget(), Aura::HandleAuraSpecificMods(), IsSitState(), m_Events, MAX_SPELL_EFFECTS, ModifyAuraState(), RemoveAurasByType(), SetStandState(), SPELL_AURA_MOD_STEALTH, sScriptMgr, and UNIT_STAND_STATE_SIT.

Referenced by _ApplyAuraEffect().

◆ _ApplyAuraEffect()

void Unit::_ApplyAuraEffect ( Aura aura,
uint8  effIndex 
)
4444{
4445 ASSERT(aura);
4446 ASSERT(aura->HasEffect(effIndex));
4448 ASSERT(aurApp);
4449 if (!aurApp->GetEffectMask())
4450 _ApplyAura(aurApp, 1 << effIndex);
4451 else
4452 aurApp->_HandleEffect(effIndex, true);
4453}
void _ApplyAura(AuraApplication *aurApp, uint8 effMask)
Definition: Unit.cpp:4457
Definition: SpellAuras.h:37
uint8 GetEffectMask() const
Definition: SpellAuras.h:66
bool HasEffect(uint8 effIndex) const
Definition: SpellAuras.h:173
const AuraApplication * GetApplicationOfTarget(ObjectGuid guid) const
Definition: SpellAuras.h:183

References _ApplyAura(), AuraApplication::_HandleEffect(), ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetEffectMask(), Object::GetGUID(), and Aura::HasEffect().

◆ _CreateAuraApplication()

AuraApplication * Unit::_CreateAuraApplication ( Aura aura,
uint8  effMask 
)
4406{
4407 // can't apply aura on unit which is going to be deleted - to not create a memory leak
4409 // aura musn't be removed
4410 ASSERT(!aura->IsRemoved());
4411
4412 // aura mustn't be already applied on target
4413 ASSERT (!aura->IsAppliedOnTarget(GetGUID()) && "Unit::_CreateAuraApplication: aura musn't be applied on target");
4414
4415 SpellInfo const* aurSpellInfo = aura->GetSpellInfo();
4416 uint32 aurId = aurSpellInfo->Id;
4417
4418 // ghost spell check, allow apply any auras at player loading in ghost mode (will be cleanup after load)
4419 // Xinef: Added IsAllowingDeadTarget check
4420 if (!IsAlive() && !aurSpellInfo->IsDeathPersistent() && !aurSpellInfo->IsAllowingDeadTarget() && (GetTypeId() != TYPEID_PLAYER || !ToPlayer()->GetSession()->PlayerLoading()))
4421 return nullptr;
4422
4423 Unit* caster = aura->GetCaster();
4424
4425 AuraApplication* aurApp = new AuraApplication(this, caster, aura, effMask);
4426 m_appliedAuras.insert(AuraApplicationMap::value_type(aurId, aurApp));
4427
4428 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4429 // xinef: even if it gets removed, it will be reapplied in a second
4430 if (aurSpellInfo->AuraInterruptFlags && this == aura->GetOwner())
4431 {
4432 m_interruptableAuras.push_back(aurApp);
4433 AddInterruptMask(aurSpellInfo->AuraInterruptFlags);
4434 }
4435
4436 if (AuraStateType aState = aura->GetSpellInfo()->GetAuraState())
4437 m_auraStateAuras.insert(AuraStateAurasMap::value_type(aState, aurApp));
4438
4439 aura->_ApplyForTarget(this, caster, aurApp);
4440 return aurApp;
4441}
std::uint32_t uint32
Definition: Define.h:108
@ TYPEID_PLAYER
Definition: ObjectGuid.h:38
Player * ToPlayer()
Definition: Object.h:195
TypeID GetTypeId() const
Definition: Object.h:121
void AddInterruptMask(uint32 mask)
Definition: Unit.h:2177
bool IsAlive() const
Definition: Unit.h:1822
AuraApplicationList m_interruptableAuras
Definition: Unit.h:2525
AuraStateAurasMap m_auraStateAuras
Definition: Unit.h:2526
WorldObject * GetOwner() const
Definition: SpellAuras.h:107
bool IsAppliedOnTarget(ObjectGuid guid) const
Definition: SpellAuras.h:185
virtual void _ApplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition: SpellAuras.cpp:492
bool IsDeathPersistent() const
Definition: SpellInfo.cpp:1204
uint32 Id
Definition: SpellInfo.h:318
bool IsAllowingDeadTarget() const
Definition: SpellInfo.cpp:1214

References Aura::_ApplyForTarget(), AddInterruptMask(), ASSERT, SpellInfo::AuraInterruptFlags, SpellInfo::GetAuraState(), Aura::GetCaster(), Object::GetGUID(), Aura::GetOwner(), Aura::GetSpellInfo(), Object::GetTypeId(), SpellInfo::Id, IsAlive(), SpellInfo::IsAllowingDeadTarget(), Aura::IsAppliedOnTarget(), SpellInfo::IsDeathPersistent(), Aura::IsRemoved(), m_appliedAuras, m_auraStateAuras, m_cleanupDone, m_interruptableAuras, Object::ToPlayer(), and TYPEID_PLAYER.

◆ _DeleteRemovedAuras()

void Unit::_DeleteRemovedAuras ( )
protected
3799{
3800 while (!m_removedAuras.empty())
3801 {
3802 delete m_removedAuras.front();
3803 m_removedAuras.pop_front();
3804 }
3805}

References m_removedAuras.

Referenced by _UpdateSpells(), and ~Unit().

◆ _EnterVehicle()

void Unit::_EnterVehicle ( Vehicle vehicle,
int8  seatId,
AuraApplication const *  aurApp = nullptr 
)
19911{
19912 // Must be called only from aura handler
19913 if (!IsAlive() || GetVehicleKit() == vehicle || vehicle->GetBase()->IsOnVehicle(this))
19914 return;
19915
19916 if (m_vehicle)
19917 {
19918 if (m_vehicle == vehicle)
19919 {
19920 if (seatId >= 0 && seatId != GetTransSeat())
19921 {
19922 LOG_DEBUG("vehicles", "EnterVehicle: {} leave vehicle {} seat {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), GetTransSeat(), seatId);
19923 ChangeSeat(seatId);
19924 }
19925
19926 return;
19927 }
19928 else
19929 {
19930 LOG_DEBUG("vehicles", "EnterVehicle: {} exit {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), vehicle->GetBase()->GetEntry());
19931 ExitVehicle();
19932 }
19933 }
19934
19935 if (!aurApp || aurApp->GetRemoveMode())
19936 return;
19937
19938 if (Player* player = ToPlayer())
19939 {
19940 if (vehicle->GetBase()->GetTypeId() == TYPEID_PLAYER && player->IsInCombat())
19941 return;
19942
19943 sScriptMgr->AnticheatSetUnderACKmount(player);
19944 sScriptMgr->AnticheatSetSkipOnePacketForASH(player, true);
19945
19947 player->StopCastingCharm();
19948 player->StopCastingBindSight();
19949 Dismount();
19951
19952 // drop flag at invisible in bg
19953 if (Battleground* bg = player->GetBattleground())
19954 bg->EventPlayerDroppedFlag(player);
19955
19957 player->GetSession()->SendPacket(&data);
19958 }
19959
19960 ASSERT(!m_vehicle);
19961 m_vehicle = vehicle;
19962
19963 if (!m_vehicle->AddPassenger(this, seatId))
19964 {
19965 m_vehicle = nullptr;
19966 return;
19967 }
19968
19969 // Xinef: remove movement auras when entering vehicle (food buffs etc)
19971}
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:169
@ SPELL_AURA_MOUNTED
Definition: SpellAuraDefines.h:141
@ AURA_INTERRUPT_FLAG_MOVE
Definition: SpellDefines.h:47
@ AURA_INTERRUPT_FLAG_TURNING
Definition: SpellDefines.h:48
@ SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA
Definition: Opcodes.h:1211
Definition: Battleground.h:298
uint32 GetEntry() const
Definition: Object.h:109
int8 GetTransSeat() const
Definition: Object.h:591
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
Definition: Unit.cpp:4081
void Dismount()
Definition: Unit.cpp:13518
bool IsOnVehicle(Unit const *vehicle) const
Definition: Unit.h:2369
void ChangeSeat(int8 seatId, bool next=true)
Definition: Unit.cpp:19973
Vehicle * GetVehicleKit() const
Definition: Unit.h:2367
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except=0, bool isAutoshot=false)
Definition: Unit.cpp:5116
void ExitVehicle(Position const *exitPosition=nullptr)
Definition: Unit.cpp:19992
Unit * GetBase() const
May be called from scripts.
Definition: Vehicle.h:39
bool AddPassenger(Unit *passenger, int8 seatId=-1)
Definition: Vehicle.cpp:307
Definition: WorldPacket.h:27

References Vehicle::AddPassenger(), ASSERT, AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, ChangeSeat(), Dismount(), ExitVehicle(), Vehicle::GetBase(), Object::GetEntry(), AuraApplication::GetRemoveMode(), WorldObject::GetTransSeat(), Object::GetTypeId(), GetVehicleKit(), InterruptNonMeleeSpells(), IsAlive(), IsOnVehicle(), LOG_DEBUG, m_vehicle, RemoveAurasByType(), RemoveAurasWithInterruptFlags(), SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SPELL_AURA_MOUNTED, sScriptMgr, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by AuraEffect::HandleAuraControlVehicle().

◆ _ExitVehicle()

void Unit::_ExitVehicle ( Position const *  exitPosition = nullptr)
20031{
20032 if (!m_vehicle)
20033 return;
20034
20036
20037 Player* player = ToPlayer();
20038
20039 // If player is on mouted duel and exits the mount should immediatly lose the duel
20040 if (player && player->duel && player->duel->IsMounted)
20041 player->DuelComplete(DUEL_FLED);
20042
20043 // This should be done before dismiss, because there may be some aura removal
20044 Vehicle* vehicle = m_vehicle;
20045 Unit* vehicleBase = m_vehicle->GetBase();
20046 m_vehicle = nullptr;
20047
20048 if (!vehicleBase)
20049 return;
20050
20051 SetControlled(false, UNIT_STATE_ROOT); // SMSG_MOVE_FORCE_UNROOT, ~MOVEMENTFLAG_ROOT
20052
20053 Position pos;
20054 if (!exitPosition) // Exit position not specified
20055 pos = vehicleBase->GetPosition(); // This should use passenger's current position, leaving it as it is now
20056 // because we calculate positions incorrect (sometimes under map)
20057 else
20058 pos = *exitPosition;
20059
20060 // HACK
20061 VehicleEntry const* vehicleInfo = vehicle->GetVehicleInfo();
20062 if (vehicleInfo)
20063 {
20064 if (vehicleInfo->m_ID == 380) // Kologarn right arm
20065 {
20066 pos.Relocate(1776.0f, -24.0f, 448.75f, 0.0f);
20067 }
20068 else if (vehicleInfo->m_ID == 91) // Helsman's Ship
20069 {
20070 pos.Relocate(2802.18f, 7054.91f, -0.6f, 4.67f);
20071 }
20072 else if (vehicleInfo->m_ID == 349) // AT Mounts, dismount to the right
20073 {
20074 float x = pos.GetPositionX() + 2.0f * cos(pos.GetOrientation() - M_PI / 2.0f);
20075 float y = pos.GetPositionY() + 2.0f * std::sin(pos.GetOrientation() - M_PI / 2.0f);
20076 float z = GetMapHeight(x, y, pos.GetPositionZ());
20077 if (z > INVALID_HEIGHT)
20078 {
20079 pos.Relocate(x, y, z);
20080 }
20081 }
20082 }
20083
20085
20086 if (player)
20087 {
20089
20090 sScriptMgr->AnticheatSetUnderACKmount(player);
20091 sScriptMgr->AnticheatSetSkipOnePacketForASH(player, true);
20092 }
20094 {
20096 data << GetPackGUID();
20097 SendMessageToSet(&data, false);
20098 }
20099
20100 // xinef: hack for flameleviathan seat vehicle
20101 if (!vehicleInfo || vehicleInfo->m_ID != 341)
20102 {
20103 Movement::MoveSplineInit init(this);
20104 init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
20105 init.SetFacing(GetOrientation());
20106 init.SetTransportExit();
20107 init.Launch();
20108 }
20109 else
20110 {
20111 float o = pos.GetAngle(this);
20112 Movement::MoveSplineInit init(this);
20113 init.MoveTo(pos.GetPositionX() + 8 * cos(o), pos.GetPositionY() + 8 * std::sin(o), pos.GetPositionZ() + 16.0f);
20114 init.SetFacing(GetOrientation());
20115 init.SetTransportExit();
20116 init.Launch();
20117 DisableSpline();
20118 KnockbackFrom(pos.GetPositionX(), pos.GetPositionY(), 10.0f, 20.0f);
20120 }
20121
20122 // xinef: move fall, should we support all creatures that exited vehicle in air? Currently Quest Drag and Drop only, Air Assault quest
20123 if (GetTypeId() == TYPEID_UNIT && !CanFly() && vehicleInfo && (vehicleInfo->m_ID == 113 || vehicleInfo->m_ID == 8 || vehicleInfo->m_ID == 290 || vehicleInfo->m_ID == 298))
20124 {
20126 }
20127
20128 if ((!player || !(player->GetDelayedOperations() & DELAYED_VEHICLE_TELEPORT)) && vehicle->GetBase()->HasUnitTypeMask(UNIT_MASK_MINION))
20129 if (((Minion*)vehicleBase)->GetOwner() == this)
20130 {
20131 if (!vehicleInfo || vehicleInfo->m_ID != 349)
20132 {
20133 vehicle->Dismiss();
20134 }
20135 else if (vehicleBase->GetTypeId() == TYPEID_UNIT)
20136 {
20137 vehicle->Uninstall();
20138 vehicleBase->m_Events.AddEvent(new VehicleDespawnEvent(*vehicleBase, 2000), vehicleBase->m_Events.CalculateTime(2000));
20139 }
20140
20141 // xinef: ugly hack, no appripriate hook later to cast spell
20142 if (player)
20143 {
20144 if (vehicleBase->GetEntry() == NPC_EIDOLON_WATCHER)
20145 player->CastSpell(player, VEHICLE_SPELL_SHADE_CONTROL_END, true);
20146 else if (vehicleBase->GetEntry() == NPC_LITHE_STALKER)
20147 player->CastSpell(player, VEHICLE_SPELL_GEIST_CONTROL_END, true);
20148 }
20149 }
20150
20152 {
20153 // Vehicle just died, we die too
20154 if (vehicleBase->getDeathState() == DeathState::JustDied)
20155 setDeathState(DeathState::JustDied);
20156 // If for other reason we as minion are exiting the vehicle (ejected, master dismounted) - unsummon
20157 else
20158 {
20159 SetVisible(false);
20160 ToTempSummon()->UnSummon(2000); // Approximation
20161 }
20162 }
20163
20164 if (player)
20165 {
20167 player->SetCanTeleport(true);
20168 }
20169}
@ DELAYED_VEHICLE_TELEPORT
Definition: Player.h:901
@ MOVEMENTFLAG_ROOT
Definition: Unit.h:563
@ UNIT_MASK_ACCESSORY
Definition: Unit.h:684
@ UNIT_MASK_MINION
Definition: Unit.h:676
@ UNIT_STATE_ROOT
Definition: Unit.h:335
@ UNIT_STATE_MOVE
Definition: Unit.h:344
@ VEHICLE_SPELL_PARACHUTE
Definition: VehicleDefines.h:54
@ VEHICLE_SPELL_SHADE_CONTROL_END
Definition: VehicleDefines.h:57
@ VEHICLE_SPELL_GEIST_CONTROL_END
Definition: VehicleDefines.h:56
@ NPC_EIDOLON_WATCHER
Definition: VehicleDefines.h:62
@ NPC_LITHE_STALKER
Definition: VehicleDefines.h:63
#define INVALID_HEIGHT
Definition: Map.h:165
@ DUEL_FLED
Definition: SharedDefines.h:3614
@ SMSG_SPLINE_MOVE_UNROOT
Definition: Opcodes.h:802
Seconds GetGameTime()
Definition: GameTime.cpp:38
virtual void UnSummon(uint32 msTime=0)
Definition: TemporarySummon.cpp:282
Definition: TemporarySummon.h:76
PackedGuid const & GetPackGUID() const
Definition: Object.h:108
float GetMapHeight(float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
Definition: Object.cpp:3074
virtual void SendMessageToSet(WorldPacket const *data, bool self) const
Definition: Object.h:482
Definition: Position.h:28
float GetPositionZ() const
Definition: Position.h:119
float GetOrientation() const
Definition: Position.h:120
float GetPositionX() const
Definition: Position.h:117
void GetPosition(float &x, float &y) const
Definition: Position.h:122
float GetPositionY() const
Definition: Position.h:118
float GetAngle(const Position *pos) const
Definition: Position.cpp:77
void SetCanTeleport(bool value)
Definition: Player.h:2461
void DuelComplete(DuelCompleteType type)
Definition: Player.cpp:6325
void SetFallInformation(uint32 time, float z)
Definition: Player.h:2298
std::unique_ptr< DuelInfo > duel
Definition: Player.h:1841
void ResummonPetTemporaryUnSummonedIfAny()
Definition: Player.cpp:14148
uint32 GetDelayedOperations() const
Definition: Player.h:2062
void SetVisible(bool x)
Definition: Unit.cpp:14220
virtual void setDeathState(DeathState s, bool despawn=false)
Definition: Unit.cpp:14538
Unit * GetOwner() const
Definition: Unit.cpp:10599
DeathState getDeathState()
Definition: Unit.h:1825
virtual bool CanFly() const =0
MotionMaster * GetMotionMaster()
Definition: Unit.h:2276
TempSummon * ToTempSummon()
Definition: Unit.h:2414
void DisableSpline()
Definition: Unit.cpp:655
void AddUnitState(uint32 f)
Definition: Unit.h:1409
void SetControlled(bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
Definition: Unit.cpp:18288
bool HasUnitMovementFlag(uint32 f) const
Definition: Unit.h:2288
SpellCastResult CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition: Unit.cpp:1169
uint32 HasUnitTypeMask(uint32 mask) const
Definition: Unit.h:1419
void KnockbackFrom(float x, float y, float speedXY, float speedZ)
Definition: Unit.cpp:19407
Definition: Unit.h:2695
Definition: Vehicle.h:30
void Dismiss()
Definition: Vehicle.cpp:523
VehicleEntry const * GetVehicleInfo() const
Definition: Vehicle.h:40
void RemovePassenger(Unit *passenger)
Definition: Vehicle.cpp:444
void Uninstall()
Definition: Vehicle.cpp:99
void MoveFall(uint32 id=0, bool addFlagForNPC=false)
Definition: MotionMaster.cpp:587
Definition: MoveSplineInit.h:71
Definition: DBCStructure.h:2028
uint32 m_ID
Definition: DBCStructure.h:2029

References EventProcessor::AddEvent(), AddUnitState(), EventProcessor::CalculateTime(), CanFly(), CastSpell(), DELAYED_VEHICLE_TELEPORT, DisableSpline(), Vehicle::Dismiss(), Player::duel, DUEL_FLED, Player::DuelComplete(), Position::GetAngle(), Vehicle::GetBase(), getDeathState(), Player::GetDelayedOperations(), Object::GetEntry(), GameTime::GetGameTime(), WorldObject::GetMapHeight(), GetMotionMaster(), Position::GetOrientation(), GetOwner(), Object::GetPackGUID(), Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::GetTypeId(), Vehicle::GetVehicleInfo(), HasUnitMovementFlag(), HasUnitTypeMask(), INVALID_HEIGHT, KnockbackFrom(), Movement::MoveSplineInit::Launch(), m_Events, VehicleEntry::m_ID, m_vehicle, MotionMaster::MoveFall(), MOVEMENTFLAG_ROOT, Movement::MoveSplineInit::MoveTo(), NPC_EIDOLON_WATCHER, NPC_LITHE_STALKER, Position::Relocate(), Vehicle::RemovePassenger(), Player::ResummonPetTemporaryUnSummonedIfAny(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), SetControlled(), setDeathState(), Movement::MoveSplineInit::SetFacing(), Player::SetFallInformation(), Movement::MoveSplineInit::SetTransportExit(), SetVisible(), SMSG_SPLINE_MOVE_UNROOT, sScriptMgr, Object::ToPlayer(), ToTempSummon(), TYPEID_UNIT, Vehicle::Uninstall(), UNIT_MASK_ACCESSORY, UNIT_MASK_MINION, UNIT_STATE_MOVE, UNIT_STATE_ROOT, TempSummon::UnSummon(), VEHICLE_SPELL_GEIST_CONTROL_END, VEHICLE_SPELL_PARACHUTE, and VEHICLE_SPELL_SHADE_CONTROL_END.

Referenced by AuraEffect::HandleAuraControlVehicle(), and boss_mimiron::boss_mimironAI::UpdateAI().

◆ _IsNoStackAuraDueToAura()

bool Unit::_IsNoStackAuraDueToAura ( Aura appliedAura,
Aura existingAura 
) const

◆ _IsValidAssistTarget()

bool Unit::_IsValidAssistTarget ( Unit const *  target,
SpellInfo const *  bySpell 
) const
13989{
13990 ASSERT(target);
13991
13992 // can assist to self
13993 if (this == target)
13994 return true;
13995
13996 // can't assist unattackable units or GMs
13997 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
13998 || (target->GetTypeId() == TYPEID_PLAYER && target->ToPlayer()->IsGameMaster()))
13999 return false;
14000
14001 // can't assist own vehicle or passenger
14002 if (m_vehicle)
14003 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
14004 return false;
14005
14006 // can't assist invisible
14007 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()))
14008 return false;
14009
14010 // can't assist dead
14011 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
14012 return false;
14013
14014 // can't assist untargetable
14015 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
14016 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
14017 return false;
14018
14019 if (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14020 {
14021 // xinef: do not allow to assist non attackable units
14022 if (target->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE))
14023 return false;
14024
14026 {
14027 if (target->IsImmuneToPC())
14028 return false;
14029 }
14030 else
14031 {
14032 if (target->IsImmuneToNPC())
14033 return false;
14034 }
14035 }
14036
14037 // can't assist non-friendly targets
14038 if (GetReactionTo(target) < REP_NEUTRAL
14039 && target->GetReactionTo(this) < REP_NEUTRAL
14040 && (!ToCreature() || !(ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)))
14041 return false;
14042
14043 // PvP case
14044 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
14045 {
14046 Player const* targetPlayerOwner = target->GetAffectingPlayer();
14048 {
14049 Player const* selfPlayerOwner = GetAffectingPlayer();
14050 if (selfPlayerOwner && targetPlayerOwner)
14051 {
14052 // can't assist player which is dueling someone
14053 if (selfPlayerOwner != targetPlayerOwner
14054 && targetPlayerOwner->duel)
14055 return false;
14056 }
14057 // can't assist player in ffa_pvp zone from outside
14058 if (target->IsFFAPvP() && !IsFFAPvP())
14059 return false;
14060
14061 // can't assist player out of sanctuary from sanctuary if has pvp enabled
14062 if (target->IsPvP())
14063 if (IsInSanctuary() && !target->IsInSanctuary())
14064 return false;
14065 }
14066 }
14067 // PvC case - player can assist creature only if has specific type flags
14068 // !target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) &&
14070 && (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14071 && !target->IsPvP())
14072 {
14073 if (Creature const* creatureTarget = target->ToCreature())
14074 return creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT || creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST;
14075 }
14076 return true;
14077}
@ UNIT_STATE_UNATTACKABLE
Definition: Unit.h:362
@ UNIT_FLAG_NON_ATTACKABLE
Definition: Unit.h:449
@ UNIT_FLAG_NOT_SELECTABLE
Definition: Unit.h:473
@ UNIT_FLAG_PLAYER_CONTROLLED
Definition: Unit.h:451
@ REP_NEUTRAL
Definition: SharedDefines.h:183
@ CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT
Definition: SharedDefines.h:2721
@ CREATURE_TYPE_FLAG_CAN_ASSIST
Definition: SharedDefines.h:2707
@ SPELL_ATTR6_CAN_TARGET_UNTARGETABLE
Definition: SharedDefines.h:628
@ SPELL_ATTR6_IGNORE_PHASE_SHIFT
Definition: SharedDefines.h:617
@ SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC
Definition: SharedDefines.h:607
Definition: Creature.h:46
Creature * ToCreature()
Definition: Object.h:197
bool CanSeeOrDetect(WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
Definition: Object.cpp:1726
ReputationRank GetReactionTo(Unit const *target, bool checkOriginalFaction=false) const
Definition: Unit.cpp:10072
bool HasUnitFlag(UnitFlags flags) const
Definition: Unit.h:1494
bool IsInSanctuary() const
Definition: Unit.h:1530
bool IsFFAPvP() const
Definition: Unit.h:1532
Player * GetAffectingPlayer() const
Definition: Unit.cpp:10624

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_CAN_ASSIST, CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, GetAffectingPlayer(), Vehicle::GetBase(), GetReactionTo(), Object::GetTypeId(), SpellInfo::HasAttribute(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), IsFFAPvP(), Player::IsGameMaster(), IsImmuneToNPC(), IsImmuneToPC(), IsInSanctuary(), IsOnVehicle(), IsPvP(), m_vehicle, REP_NEUTRAL, SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_STATE_UNATTACKABLE.

Referenced by SpellInfo::CheckExplicitTarget(), IsValidAssistTarget(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _IsValidAttackTarget()

bool Unit::_IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell,
WorldObject const *  obj = nullptr 
) const
13866{
13867 ASSERT(target);
13868
13869 // can't attack self
13870 if (this == target)
13871 return false;
13872
13873 // can't attack unattackable units or GMs
13874 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
13875 || (target->GetTypeId() == TYPEID_PLAYER && target->ToPlayer()->IsGameMaster()))
13876 return false;
13877
13878 // can't attack own vehicle or passenger
13879 if (m_vehicle)
13880 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
13881 if (!IsHostileTo(target)) // pussywizard: actually can attack own vehicle or passenger if it's hostile to us - needed for snobold in Gormok encounter
13882 return false;
13883
13884 // can't attack invisible (ignore stealth for aoe spells) also if the area being looked at is from a spell use the dynamic object created instead of the casting unit.
13885 //Ignore stealth if target is player and unit in combat with same player
13886 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && (obj ? !obj->CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()) : !CanSeeOrDetect(target, (bySpell && bySpell->IsAffectingArea()) || (target->GetTypeId() == TYPEID_PLAYER && target->HasStealthAura() && target->IsInCombat() && IsInCombatWith(target)))))
13887 return false;
13888
13889 // can't attack dead
13890 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
13891 return false;
13892
13893 // can't attack untargetable
13894 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
13895 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
13896 return false;
13897
13898 if (Player const* playerAttacker = ToPlayer())
13899 {
13900 if (playerAttacker->HasPlayerFlag(PLAYER_FLAGS_UBER) || playerAttacker->IsSpectator())
13901 return false;
13902 }
13903 // check flags
13905 || (!HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToNPC())
13906 || (!target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToNPC())
13907 || (HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToPC())
13908 // check if this is a world trigger cast - GOs are using world triggers to cast their spells, so we need to ignore their immunity flag here, this is a temp workaround, needs removal when go cast is implemented properly
13909 || ((GetEntry() != WORLD_TRIGGER && (!obj || !obj->isType(TYPEMASK_GAMEOBJECT | TYPEMASK_DYNAMICOBJECT))) && target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToPC()))
13910 return false;
13911
13912 // CvC case - can attack each other only when one of them is hostile
13914 return GetReactionTo(target) <= REP_HOSTILE || target->GetReactionTo(this) <= REP_HOSTILE;
13915
13916 // PvP, PvC, CvP case
13917 // can't attack friendly targets
13918 ReputationRank repThisToTarget = GetReactionTo(target);
13919 ReputationRank repTargetToThis;
13920
13921 if (repThisToTarget > REP_NEUTRAL
13922 || (repTargetToThis = target->GetReactionTo(this)) > REP_NEUTRAL)
13923 return false;
13924
13925 // Not all neutral creatures can be attacked (even some unfriendly faction does not react aggresive to you, like Sporaggar)
13926 if (repThisToTarget == REP_NEUTRAL &&
13927 repTargetToThis <= REP_NEUTRAL)
13928 {
13929 Player* owner = GetAffectingPlayer();
13930 Unit const* const thisUnit = owner ? owner : this;
13931 if (!(target->GetTypeId() == TYPEID_PLAYER && thisUnit->GetTypeId() == TYPEID_PLAYER) &&
13932 !(target->GetTypeId() == TYPEID_UNIT && thisUnit->GetTypeId() == TYPEID_UNIT))
13933 {
13934 Player const* player = target->GetTypeId() == TYPEID_PLAYER ? target->ToPlayer() : thisUnit->ToPlayer();
13935 Unit const* creature = target->GetTypeId() == TYPEID_UNIT ? target : thisUnit;
13936
13937 if (FactionTemplateEntry const* factionTemplate = creature->GetFactionTemplateEntry())
13938 {
13939 if (!(player->GetReputationMgr().GetForcedRankIfAny(factionTemplate)))
13940 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplate->faction))
13941 if (FactionState const* repState = player->GetReputationMgr().GetState(factionEntry))
13942 if (!(repState->Flags & FACTION_FLAG_AT_WAR))
13943 return false;
13944 }
13945 }
13946 }
13947
13948 Creature const* creatureAttacker = ToCreature();
13949 if (creatureAttacker && creatureAttacker->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)
13950 return false;
13951
13952 Player const* playerAffectingAttacker = HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? GetAffectingPlayer() : nullptr;
13953 Player const* playerAffectingTarget = target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? target->GetAffectingPlayer() : nullptr;
13954
13955 // check duel - before sanctuary checks
13956 if (playerAffectingAttacker && playerAffectingTarget)
13957 if (playerAffectingAttacker->duel && playerAffectingAttacker->duel->Opponent == playerAffectingTarget && playerAffectingAttacker->duel->State == DUEL_STATE_IN_PROGRESS)
13958 return true;
13959
13960 // PvP case - can't attack when attacker or target are in sanctuary
13961 // however, 13850 client doesn't allow to attack when one of the unit's has sanctuary flag and is pvp
13962 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && (target->IsInSanctuary() || IsInSanctuary()))
13963 return false;
13964
13965 // additional checks - only PvP case
13966 if (playerAffectingAttacker && playerAffectingTarget)
13967 {
13968 if (!IsPvP() && bySpell && bySpell->IsAffectingArea() && !bySpell->HasAttribute(SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK))
13969 return false;
13970
13971 if (target->IsPvP())
13972 return true;
13973
13974 if (IsFFAPvP() && target->IsFFAPvP())
13975 return true;
13976
13978 }
13979 return true;
13980}
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
@ TYPEMASK_DYNAMICOBJECT
Definition: ObjectGuid.h:54
@ TYPEMASK_GAMEOBJECT
Definition: ObjectGuid.h:53
@ UNIT_FIELD_BYTES_2
Definition: UpdateFields.h:161
@ DUEL_STATE_IN_PROGRESS
Definition: Player.h:373
@ PLAYER_FLAGS_UBER
Definition: Player.h:494
#define WORLD_TRIGGER
Definition: Unit.h:36
@ UNIT_BYTE2_FLAG_UNK1
Definition: Unit.h:137
@ UNIT_FLAG_TAXI_FLIGHT
Definition: Unit.h:468
@ UNIT_FLAG_NON_ATTACKABLE_2
Definition: Unit.h:464
@ UNIT_FLAG_NOT_ATTACKABLE_1
Definition: Unit.h:455
@ FACTION_FLAG_AT_WAR
Definition: DBCEnums.h:316
@ SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK
Definition: SharedDefines.h:573
ReputationRank
Definition: SharedDefines.h:179
@ REP_HOSTILE
Definition: SharedDefines.h:181
CreatureTemplate const * GetCreatureTemplate() const
Definition: Creature.h:199
uint32 type_flags
Definition: CreatureData.h:216
bool HasByteFlag(uint16 index, uint8 offset, uint8 flag) const
Definition: Object.cpp:949
ReputationMgr & GetReputationMgr()
Definition: Player.h:2089
FactionTemplateEntry const * GetFactionTemplateEntry() const
Definition: Unit.cpp:10042
bool IsPvP() const
Definition: Unit.h:1531
bool IsInCombatWith(Unit const *who) const
Definition: Unit.cpp:21319
bool IsImmuneToNPC() const
Definition: Unit.h:1697
bool IsHostileTo(Unit const *unit) const
Definition: Unit.cpp:10244
bool IsImmuneToPC() const
Definition: Unit.h:1695
Definition: ReputationMgr.h:42
FactionState const * GetState(FactionEntry const *factionEntry) const
Definition: ReputationMgr.h:82
ReputationRank const * GetForcedRankIfAny(FactionTemplateEntry const *factionTemplateEntry) const
Definition: ReputationMgr.h:107
Definition: DBCStructure.h:898
Definition: DBCStructure.h:930

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_FLAG_AT_WAR, GetAffectingPlayer(), Vehicle::GetBase(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetReactionTo(), Player::GetReputationMgr(), ReputationMgr::GetState(), Object::GetTypeId(), SpellInfo::HasAttribute(), Object::HasByteFlag(), HasStealthAura(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), IsFFAPvP(), Player::IsGameMaster(), IsHostileTo(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsInCombatWith(), IsInSanctuary(), IsOnVehicle(), IsPvP(), Object::isType(), m_vehicle, PLAYER_FLAGS_UBER, REP_HOSTILE, REP_NEUTRAL, sFactionStore, SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), CreatureTemplate::type_flags, TYPEID_PLAYER, TYPEID_UNIT, TYPEMASK_DYNAMICOBJECT, TYPEMASK_GAMEOBJECT, UNIT_BYTE2_FLAG_UNK1, UNIT_FIELD_BYTES_2, UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NON_ATTACKABLE_2, UNIT_FLAG_NOT_ATTACKABLE_1, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_TAXI_FLIGHT, UNIT_STATE_UNATTACKABLE, and WORLD_TRIGGER.

Referenced by SpellInfo::CheckExplicitTarget(), Spell::DoSpellHitOnUnit(), GetMagicHitRedirectTarget(), GetMeleeHitRedirectTarget(), IsValidAttackTarget(), Acore::AnyAoETargetUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _RegisterAuraEffect()

void Unit::_RegisterAuraEffect ( AuraEffect aurEff,
bool  apply 
)
4643{
4644 if (apply)
4645 m_modAuras[aurEff->GetAuraType()].push_back(aurEff);
4646 else
4647 m_modAuras[aurEff->GetAuraType()].remove(aurEff);
4648}
AuraEffectList m_modAuras[TOTAL_AURAS]
Definition: Unit.h:2523
AuraType GetAuraType() const
Definition: SpellAuraEffects.cpp:447

References AuraEffect::GetAuraType(), and m_modAuras.

Referenced by AuraEffect::HandleEffect().

◆ _RegisterDynObject()

void Unit::_RegisterDynObject ( DynamicObject dynObj)
6057{
6058 m_dynObj.push_back(dynObj);
6059}

References m_dynObj.

Referenced by DynamicObject::BindToCaster().

◆ _RemoveAllAuraStatMods()

void Unit::_RemoveAllAuraStatMods ( )
5421{
5422 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5423 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, false);
5424}

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_RemoveAllStatBonuses().

◆ _removeAttacker()

void Unit::_removeAttacker ( Unit pAttacker)
inline
1375 {
1376 m_attackers.erase(pAttacker);
1377 }

References m_attackers.

Referenced by Attack(), and AttackStop().

◆ _RemoveNoStackAuraApplicationsDueToAura()

void Unit::_RemoveNoStackAuraApplicationsDueToAura ( Aura aura)

◆ _RemoveNoStackAurasDueToAura()

void Unit::_RemoveNoStackAurasDueToAura ( Aura aura)
4614{
4615 //SpellInfo const* spellProto = aura->GetSpellInfo();
4616
4617 // passive spell special case (only non stackable with ranks)
4618
4619 // xinef: this check makes caster to have 2 area auras thanks to spec switch
4620 // if (spellProto->IsPassiveStackableWithRanks())
4621 // return;
4622
4623 bool remove = false;
4624 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
4625 {
4626 if (remove)
4627 {
4628 remove = false;
4629 i = m_appliedAuras.begin();
4630 }
4631
4632 if (aura->CanStackWith(i->second->GetBase(), true))
4633 continue;
4634
4636 if (i == m_appliedAuras.end())
4637 break;
4638 remove = true;
4639 }
4640}
@ AURA_REMOVE_BY_DEFAULT
Definition: SpellAuraDefines.h:392
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4722
bool CanStackWith(Aura const *checkAura, bool remove) const
Definition: SpellAuras.cpp:2035

References AURA_REMOVE_BY_DEFAULT, Aura::CanStackWith(), m_appliedAuras, and RemoveAura().

Referenced by _AddAura(), and _ApplyAura().

◆ _TryStackingOrRefreshingExistingAura()

Aura * Unit::_TryStackingOrRefreshingExistingAura ( SpellInfo const *  newAura,
uint8  effMask,
Unit caster,
int32 baseAmount = nullptr,
Item castItem = nullptr,
ObjectGuid  casterGUID = ObjectGuid::Empty,
bool  periodicReset = false 
)
4307{
4308 ASSERT(casterGUID || caster);
4309 if (!casterGUID)
4310 casterGUID = caster->GetGUID();
4311
4312 // Xinef: Hax for mixology, best solution qq
4313 if (sSpellMgr->GetSpellGroup(newAura->Id) == 1)
4314 return nullptr;
4315
4316 // passive and Incanter's Absorption and auras with different type can stack with themselves any number of times
4317 if (!newAura->IsMultiSlotAura())
4318 {
4319 // check if cast item changed
4320 ObjectGuid castItemGUID;
4321 if (castItem)
4322 castItemGUID = castItem->GetGUID();
4323
4324 // find current aura from spell and change it's stackamount, or refresh it's duration
4325 if (Aura* foundAura = GetOwnedAura(newAura->Id, newAura->HasAttribute(SPELL_ATTR0_CU_SINGLE_AURA_STACK) ? ObjectGuid::Empty : casterGUID, newAura->HasAttribute(SPELL_ATTR0_CU_ENCHANT_PROC) ? castItemGUID : ObjectGuid::Empty, 0))
4326 {
4327 // effect masks do not match
4328 // extremely rare case
4329 // let's just recreate aura
4330 if (effMask != foundAura->GetEffectMask())
4331 return nullptr;
4332
4333 // update basepoints with new values - effect amount will be recalculated in ModStackAmount
4334 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4335 {
4336 if (!foundAura->HasEffect(i))
4337 continue;
4338
4339 int bp;
4340 if (baseAmount)
4341 bp = *(baseAmount + i);
4342 else
4343 bp = foundAura->GetSpellInfo()->Effects[i].BasePoints;
4344
4345 int32* oldBP = const_cast<int32*>(&(foundAura->GetEffect(i)->m_baseAmount));
4346 *oldBP = bp;
4347 }
4348
4349 // correct cast item guid if needed
4350 if (castItemGUID != foundAura->GetCastItemGUID())
4351 {
4352 ObjectGuid* oldGUID = const_cast<ObjectGuid*>(&foundAura->m_castItemGuid);
4353 *oldGUID = castItemGUID;
4354 }
4355
4356 // try to increase stack amount
4357 foundAura->ModStackAmount(1, AURA_REMOVE_BY_DEFAULT, periodicReset);
4358 sScriptMgr->OnAuraApply(this, foundAura);
4359 return foundAura;
4360 }
4361 }
4362
4363 return nullptr;
4364}
std::int32_t int32
Definition: Define.h:104
@ SPELL_ATTR0_CU_ENCHANT_PROC
Definition: SpellInfo.h:176
@ SPELL_ATTR0_CU_SINGLE_AURA_STACK
Definition: SpellInfo.h:198
#define sSpellMgr
Definition: SpellMgr.h:825
Definition: ObjectGuid.h:120
static ObjectGuid const Empty
Definition: ObjectGuid.h:122
Aura * GetOwnedAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
Definition: Unit.cpp:4706

References ASSERT, AURA_REMOVE_BY_DEFAULT, ObjectGuid::Empty, Object::GetGUID(), GetOwnedAura(), SpellInfo::HasAttribute(), SpellInfo::Id, SpellInfo::IsMultiSlotAura(), MAX_SPELL_EFFECTS, SPELL_ATTR0_CU_ENCHANT_PROC, SPELL_ATTR0_CU_SINGLE_AURA_STACK, sScriptMgr, and sSpellMgr.

Referenced by Aura::TryRefreshStackOrCreate().

◆ _UnapplyAura() [1/2]

void Unit::_UnapplyAura ( AuraApplication aurApp,
AuraRemoveMode  removeMode 
)
4593{
4594 // aura can be removed from unit only if it's applied on it, shouldn't happen
4595 ASSERT(aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) == aurApp);
4596
4597 uint32 spellId = aurApp->GetBase()->GetId();
4598 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4599
4600 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4601 {
4602 if (iter->second == aurApp)
4603 {
4604 _UnapplyAura(iter, removeMode);
4605 return;
4606 }
4607 else
4608 ++iter;
4609 }
4610 ABORT();
4611}
#define ABORT
Definition: Errors.h:76
std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
Definition: Unit.h:1313
void _UnapplyAura(AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
Definition: Unit.cpp:4510

References _UnapplyAura(), ABORT, ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), and m_appliedAuras.

◆ _UnapplyAura() [2/2]

void Unit::_UnapplyAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  removeMode 
)
4511{
4512 AuraApplication* aurApp = i->second;
4513 ASSERT(aurApp);
4514 ASSERT(!aurApp->GetRemoveMode());
4515 ASSERT(aurApp->GetTarget() == this);
4516
4517 aurApp->SetRemoveMode(removeMode);
4518 Aura* aura = aurApp->GetBase();
4519 LOG_DEBUG("spells.aura", "Aura {} now is remove mode {}", aura->GetId(), removeMode);
4520
4521 // dead loop is killing the server probably
4522 ASSERT(m_removedAurasCount < 0xFFFFFFFF);
4523
4525
4526 Unit* caster = aura->GetCaster();
4527
4528 // Remove all pointers from lists here to prevent possible pointer invalidation on spellcast/auraapply/auraremove
4529 m_appliedAuras.erase(i);
4530
4531 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4532 // xinef: event if it gets removed, it will be reapplied in a second
4533 if (aura->GetSpellInfo()->AuraInterruptFlags && this == aura->GetOwner())
4534 {
4535 m_interruptableAuras.remove(aurApp);
4537 }
4538
4539 bool auraStateFound = false;
4540 AuraStateType auraState = aura->GetSpellInfo()->GetAuraState();
4541 if (auraState)
4542 {
4543 bool canBreak = false;
4544 // Get mask of all aurastates from remaining auras
4545 for (AuraStateAurasMap::iterator itr = m_auraStateAuras.lower_bound(auraState); itr != m_auraStateAuras.upper_bound(auraState) && !(auraStateFound && canBreak);)
4546 {
4547 if (itr->second == aurApp)
4548 {
4549 m_auraStateAuras.erase(itr);
4550 itr = m_auraStateAuras.lower_bound(auraState);
4551 canBreak = true;
4552 continue;
4553 }
4554 auraStateFound = true;
4555 ++itr;
4556 }
4557 }
4558
4559 aurApp->_Remove();
4560 aura->_UnapplyForTarget(this, caster, aurApp);
4561
4562 // remove effects of the spell - needs to be done after removing aura from lists
4563 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4564 {
4565 if (aurApp->HasEffect(itr))
4566 aurApp->_HandleEffect(itr, false);
4567 }
4568
4569 // all effect mustn't be applied
4570 ASSERT(!aurApp->GetEffectMask());
4571
4572 // Remove totem at next update if totem loses its aura
4573 if (aurApp->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE && IsTotem() && GetGUID() == aura->GetCasterGUID())
4574 {
4575 if (ToTotem()->GetSpell() == aura->GetId() && ToTotem()->GetTotemType() == TOTEM_PASSIVE)
4576 ToTotem()->setDeathState(DeathState::JustDied);
4577 }
4578
4579 // Remove aurastates only if were not found
4580 if (!auraStateFound)
4581 ModifyAuraState(auraState, false);
4582
4583 aura->HandleAuraSpecificMods(aurApp, caster, false, false);
4584
4585 // only way correctly remove all auras from list
4586 //if (removedAuras != m_removedAurasCount) new aura may be added
4587 i = m_appliedAuras.begin();
4588
4589 sScriptMgr->OnAuraRemove(this, aurApp, removeMode);
4590}
@ TOTEM_PASSIVE
Definition: Totem.h:25
@ AURA_REMOVE_BY_EXPIRE
Definition: SpellAuraDefines.h:395
void setDeathState(DeathState s, bool despawn=false) override
Definition: TemporarySummon.cpp:395
Totem * ToTotem()
Definition: Unit.h:2413
void UpdateInterruptMask()
Definition: Unit.cpp:759
bool IsTotem() const
Definition: Unit.h:1427
void SetRemoveMode(AuraRemoveMode mode)
Definition: SpellAuras.h:72
void _Remove()
Definition: SpellAuras.cpp:94
bool HasEffect(uint8 effect) const
Definition: SpellAuras.h:67
virtual void _UnapplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition: SpellAuras.cpp:515

References AuraApplication::_HandleEffect(), AuraApplication::_Remove(), Aura::_UnapplyForTarget(), ASSERT, AURA_REMOVE_BY_EXPIRE, SpellInfo::AuraInterruptFlags, SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), Aura::GetCasterGUID(), AuraApplication::GetEffectMask(), Object::GetGUID(), Aura::GetId(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), AuraApplication::GetTarget(), Aura::HandleAuraSpecificMods(), AuraApplication::HasEffect(), IsTotem(), LOG_DEBUG, m_appliedAuras, m_auraStateAuras, m_interruptableAuras, m_removedAurasCount, MAX_SPELL_EFFECTS, ModifyAuraState(), Minion::setDeathState(), AuraApplication::SetRemoveMode(), sScriptMgr, TOTEM_PASSIVE, ToTotem(), and UpdateInterruptMask().

Referenced by Aura::_Remove(), _UnapplyAura(), RemoveAllAuras(), RemoveAllAurasExceptType(), RemoveAllAurasOnDeath(), RemoveAllAurasRequiringDeadTarget(), RemoveAura(), and RemoveEvadeAuras().

◆ _UnregisterDynObject()

void Unit::_UnregisterDynObject ( DynamicObject dynObj)
6062{
6063 m_dynObj.remove(dynObj);
6064}

References m_dynObj.

Referenced by DynamicObject::UnbindFromCaster().

◆ _UpdateAutoRepeatSpell()

void Unit::_UpdateAutoRepeatSpell ( )
protected
3866{
3867 SpellInfo const* spellProto = nullptr;
3869 {
3871 }
3872
3873 if (!spellProto)
3874 {
3875 return;
3876 }
3877
3878 static uint32 const HUNTER_AUTOSHOOT = 75;
3879
3880 // Check "realtime" interrupts
3881 if ((GetTypeId() == TYPEID_PLAYER && ToPlayer()->isMoving() && spellProto->Id != HUNTER_AUTOSHOOT) || IsNonMeleeSpellCast(false, false, true, spellProto->Id == HUNTER_AUTOSHOOT))
3882 {
3883 // cancel wand shoot
3884 if (spellProto->Id != HUNTER_AUTOSHOOT)
3886 m_AutoRepeatFirstCast = true;
3887 return;
3888 }
3889
3890 // Apply delay (Hunter's autoshoot not affected)
3891 if (m_AutoRepeatFirstCast && getAttackTimer(RANGED_ATTACK) < 500 && spellProto->Id != HUNTER_AUTOSHOOT)
3892 {
3894 }
3895
3896 m_AutoRepeatFirstCast = false;
3897
3898 // Check for ranged attack timer
3900 {
3902 if (result != SPELL_CAST_OK)
3903 {
3904 if (spellProto->Id != HUNTER_AUTOSHOOT)
3905 {
3907 }
3908
3909 return;
3910 }
3911
3912 // We want to shoot
3913 Spell* spell = new Spell(this, spellProto, TRIGGERED_FULL_MASK);
3914 spell->prepare(&(m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_targets));
3915
3916 // Reset attack
3918 }
3919}
@ CURRENT_AUTOREPEAT_SPELL
Definition: Unit.h:993
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
Definition: SpellDefines.h:148
SpellCastResult
Definition: SharedDefines.h:948
@ SPELL_CAST_OK
Definition: SharedDefines.h:1138
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
Definition: Unit.cpp:4014
bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
Definition: Unit.cpp:4051
void setAttackTimer(WeaponAttackType type, int32 time)
Definition: Unit.h:1352
bool isMoving() const
Definition: Unit.h:2394
int32 getAttackTimer(WeaponAttackType type) const
Definition: Unit.h:1354
bool isAttackReady(WeaponAttackType type=BASE_ATTACK) const
Definition: Unit.h:1355
void resetAttackTimer(WeaponAttackType type=BASE_ATTACK)
Definition: Unit.cpp:661
Definition: Spell.h:284
SpellCastResult prepare(SpellCastTargets const *targets, AuraEffect const *triggeredByAura=nullptr)
Definition: Spell.cpp:3464
SpellCastResult CheckCast(bool strict)
Definition: Spell.cpp:5626
SpellInfo const *const m_spellInfo
Definition: Spell.h:520

References Spell::CheckCast(), CURRENT_AUTOREPEAT_SPELL, getAttackTimer(), Object::GetTypeId(), SpellInfo::Id, InterruptSpell(), isAttackReady(), isMoving(), IsNonMeleeSpellCast(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_spellInfo, Spell::prepare(), RANGED_ATTACK, resetAttackTimer(), setAttackTimer(), SPELL_CAST_OK, Object::ToPlayer(), TRIGGERED_FULL_MASK, and TYPEID_PLAYER.

Referenced by _UpdateSpells().

◆ _UpdateSpells()

void Unit::_UpdateSpells ( uint32  time)
protected
3808{
3811
3812 // remove finished spells from current pointers
3813 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
3814 {
3815 if (m_currentSpells[i] && m_currentSpells[i]->getState() == SPELL_STATE_FINISHED)
3816 {
3818 m_currentSpells[i] = nullptr; // remove pointer
3819 }
3820 }
3821
3822 // m_auraUpdateIterator can be updated in indirect called code at aura remove to skip next planned to update but removed auras
3824 {
3825 Aura* i_aura = m_auraUpdateIterator->second;
3826 ++m_auraUpdateIterator; // need shift to next for allow update if need into aura update
3827 i_aura->UpdateOwner(time, this);
3828 }
3829
3830 // remove expired auras - do that after updates(used in scripts?)
3831 for (AuraMap::iterator i = m_ownedAuras.begin(); i != m_ownedAuras.end();)
3832 {
3833 if (i->second->IsExpired())
3835 else if (i->second->GetSpellInfo()->IsChanneled() && i->second->GetCasterGUID() != GetGUID() && !ObjectAccessor::GetWorldObject(*this, i->second->GetCasterGUID()))
3836 RemoveOwnedAura(i, AURA_REMOVE_BY_CANCEL); // remove channeled auras when caster is not on the same map
3837 else
3838 ++i;
3839 }
3840
3841 for (VisibleAuraMap::iterator itr = m_visibleAuras.begin(); itr != m_visibleAuras.end(); ++itr)
3842 if (itr->second->IsNeedClientUpdate())
3843 itr->second->ClientUpdate();
3844
3846
3847 if (!m_gameObj.empty())
3848 {
3849 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
3850 {
3851 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
3852 if (!go->isSpawned())
3853 {
3854 go->SetOwnerGUID(ObjectGuid::Empty);
3855 go->SetRespawnTime(0);
3856 go->Delete();
3857 m_gameObj.erase(itr++);
3858 continue;
3859 }
3860 ++itr;
3861 }
3862 }
3863}
@ AURA_REMOVE_BY_CANCEL
Definition: SpellAuraDefines.h:393
@ SPELL_STATE_FINISHED
Definition: Spell.h:226
GameObject * GetGameObject(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:187
WorldObject * GetWorldObject(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:118
Definition: GameObject.h:122
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4651
void _UpdateAutoRepeatSpell()
Definition: Unit.cpp:3865
VisibleAuraMap m_visibleAuras
Definition: Unit.h:2532
void UpdateOwner(uint32 diff, WorldObject *owner)
Definition: SpellAuras.cpp:770

References _DeleteRemovedAuras(), _UpdateAutoRepeatSpell(), AURA_REMOVE_BY_CANCEL, AURA_REMOVE_BY_EXPIRE, CURRENT_AUTOREPEAT_SPELL, CURRENT_MAX_SPELL, ObjectGuid::Empty, ObjectAccessor::GetGameObject(), Object::GetGUID(), ObjectAccessor::GetWorldObject(), m_auraUpdateIterator, m_currentSpells, m_gameObj, m_ownedAuras, m_visibleAuras, RemoveOwnedAura(), Spell::SetReferencedFromCurrent(), SPELL_STATE_FINISHED, and Aura::UpdateOwner().

Referenced by Update().

◆ AddAura() [1/2]

Aura * Unit::AddAura ( SpellInfo const *  spellInfo,
uint8  effMask,
Unit target 
)
19143{
19144 if (!spellInfo)
19145 return nullptr;
19146
19147 if (target->IsImmunedToSpell(spellInfo))
19148 return nullptr;
19149
19150 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
19151 {
19152 if (!(effMask & (1 << i)))
19153 continue;
19154 if (target->IsImmunedToSpellEffect(spellInfo, i))
19155 effMask &= ~(1 << i);
19156 }
19157
19158 if (Aura* aura = Aura::TryRefreshStackOrCreate(spellInfo, effMask, target, this))
19159 {
19160 aura->ApplyForTargets();
19161 return aura;
19162 }
19163 return nullptr;
19164}
virtual bool IsImmunedToSpellEffect(SpellInfo const *spellInfo, uint32 index) const
Definition: Unit.cpp:13000
virtual bool IsImmunedToSpell(SpellInfo const *spellInfo, Spell const *spell=nullptr)
Definition: Unit.cpp:12910
static Aura * TryRefreshStackOrCreate(SpellInfo const *spellproto, uint8 tryEffMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool *refresh=nullptr, bool periodicReset=false)
Definition: SpellAuras.cpp:326

References Aura::ApplyForTargets(), IsImmunedToSpell(), IsImmunedToSpellEffect(), MAX_SPELL_EFFECTS, and Aura::TryRefreshStackOrCreate().

◆ AddAura() [2/2]

Aura * Unit::AddAura ( uint32  spellId,
Unit target 
)
19128{
19129 if (!target)
19130 return nullptr;
19131
19132 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
19133 if (!spellInfo)
19134 return nullptr;
19135
19136 if (!target->IsAlive() && !spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_DEAD_TARGET))
19137 return nullptr;
19138
19139 return AddAura(spellInfo, MAX_EFFECT_MASK, target);
19140}
#define MAX_EFFECT_MASK
Definition: DBCStructure.h:1636
@ SPELL_ATTR2_ALLOW_DEAD_TARGET
Definition: SharedDefines.h:456
@ SPELL_ATTR0_PASSIVE
Definition: SharedDefines.h:388
Aura * AddAura(uint32 spellId, Unit *target)
Definition: Unit.cpp:19127
bool HasAttribute(SpellAttr0 attribute) const
Definition: SpellInfo.h:412

References AddAura(), SpellInfo::HasAttribute(), IsAlive(), MAX_EFFECT_MASK, SPELL_ATTR0_PASSIVE, SPELL_ATTR2_ALLOW_DEAD_TARGET, and sSpellMgr.

Referenced by AddAura(), boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::AttackStart(), boss_anzu::boss_anzu(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoTriggersOnSpellHit(), npc_anubisath_sentinel::aqsentinelAI::GainSentinelAbility(), AuraEffect::HandleAuraDummy(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterAdd(), gm_commandscript::HandleGMVisibleCommand(), spell_oculus_rider_aura::spell_oculus_rider_auraAuraScript::HandleOnEffectApply(), spell_transitus_shield_beam::spell_transitus_shield_beam_AuraScript::HandleOnEffectApply(), npc_pet_dk_dancing_rune_weapon::npc_pet_dk_dancing_rune_weaponAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), Guardian::InitStatsForLevel(), boss_gahzranka::boss_gahzrankaAI::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), npc_dalaran_warrior::npc_dalaran_warriorAI::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Creature::LoadCreaturesAddon(), npc_brew_bubble::MoveInLineOfSight(), npc_pet_gen_plump_turkey::MovementInform(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_empowered::spell_yogg_saron_empowered_AuraScript::OnPeriodic(), instance_stratholme::instance_stratholme_InstanceMapScript::OnPlayerEnter(), BattlefieldWG::OnPlayerEnterZone(), AreaTrigger_at_area_52_entrance::OnTrigger(), Player::ProcessDelayedOperations(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_corrupted_totem::Reset(), npc_troll_volunteer::npc_troll_volunteerAI::Reset(), npc_vengeful_shade::npc_vengeful_shadeAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_magus_telestra::boss_magus_telestraAI::Reset(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_archavon::boss_archavonAI::Reset(), boss_emalon::boss_emalonAI::Reset(), boss_koralon::boss_koralonAI::Reset(), boss_toravon::boss_toravonAI::Reset(), npc_dalaran_mage::npc_dalaran_mageAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), npc_pet_pri_shadowfiend::Reset(), Player::SendInitialPacketsAfterAddToMap(), npc_corrupted_totem::SetAura(), SetAuraStack(), Player::SetGMVisible(), Player::SetIsSpectator(), npc_artorius::npc_artoriusAI::SpellHit(), npc_simone::npc_simoneAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::SpellHitTarget(), Spell::SummonGuardian(), boss_netherspite::SwitchToPortalPhase(), boss_gyth::boss_gythAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), boss_netherspite::UpdatePortals(), and npc_emily::npc_emilyAI::WaypointReached().

◆ AddComboPointHolder()

void Unit::AddComboPointHolder ( Unit unit)
inline
2313{ m_ComboPointHolders.insert(unit); }
std::unordered_set< Unit * > m_ComboPointHolders
Definition: Unit.h:2598

References m_ComboPointHolders.

Referenced by AddComboPoints().

◆ AddComboPoints() [1/2]

void Unit::AddComboPoints ( int8  count)
inline
2309{ AddComboPoints(nullptr, count); }
void AddComboPoints(Unit *target, int8 count)
Definition: Unit.cpp:17103

References AddComboPoints().

Referenced by AddComboPoints().

◆ AddComboPoints() [2/2]

void Unit::AddComboPoints ( Unit target,
int8  count 
)
17104{
17105 if (!count)
17106 {
17107 return;
17108 }
17109
17110 if (target && target != m_comboTarget)
17111 {
17112 if (m_comboTarget)
17113 {
17115 }
17116
17117 m_comboTarget = target;
17118 m_comboPoints = count;
17119 target->AddComboPointHolder(this);
17120 }
17121 else
17122 {
17123 m_comboPoints = std::max<int8>(std::min<int8>(m_comboPoints + count, 5), 0);
17124 }
17125
17127}
void SendComboPoints()
Definition: Unit.cpp:17146
void AddComboPointHolder(Unit *unit)
Definition: Unit.h:2313
void RemoveComboPointHolder(Unit *unit)
Definition: Unit.h:2314

References AddComboPointHolder(), m_comboPoints, m_comboTarget, RemoveComboPointHolder(), and SendComboPoints().

Referenced by Spell::_handle_finish_phase(), AuraEffect::HandleAuraRetainComboPoints(), and ProcDamageAndSpellFor().

◆ AddExtraAttacks()

void Unit::AddExtraAttacks ( uint32  count)
2738{
2740 if (!targetGUID)
2741 {
2742 if (ObjectGuid selection = GetTarget())
2743 {
2744 targetGUID = selection; // Spell was cast directly (not triggered by aura)
2745 }
2746 else
2747 return;
2748 }
2749
2750 extraAttacksTargets[targetGUID] += count;
2751}
std::unordered_map< ObjectGuid, uint32 > extraAttacksTargets
Definition: Unit.h:2611
ObjectGuid _lastDamagedTargetGuid
Definition: Unit.h:2612
ObjectGuid GetTarget() const
Definition: Unit.h:2447

References _lastDamagedTargetGuid, extraAttacksTargets, and GetTarget().

Referenced by Spell::EffectAddExtraAttacks().

◆ AddExtraUnitMovementFlag()

void Unit::AddExtraUnitMovementFlag ( uint16  f)
inline
2292{ m_movementInfo.flags2 |= f; }
uint16 flags2
Definition: Object.h:268
MovementInfo m_movementInfo
Definition: Object.h:595

References MovementInfo::flags2, and WorldObject::m_movementInfo.

Referenced by Vehicle::InitMovementInfoForBase().

◆ addFollower()

void Unit::addFollower ( FollowerReference pRef)
inline
void insertFirst(LinkedListElement *pElem)
Definition: LinkedList.h:105
FollowerRefMgr m_FollowingRefMgr
Definition: Unit.h:2594

References LinkedListHead::insertFirst(), and m_FollowingRefMgr.

Referenced by FollowerReference::targetObjectBuildLink().

◆ AddGameObject()

void Unit::AddGameObject ( GameObject gameObj)
6118{
6119 if (!gameObj || gameObj->GetOwnerGUID())
6120 return;
6121
6122 m_gameObj.push_back(gameObj->GetGUID());
6123 gameObj->SetOwnerGUID(GetGUID());
6124
6125 if (GetTypeId() == TYPEID_PLAYER && gameObj->GetSpellId())
6126 {
6127 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(gameObj->GetSpellId());
6128 // Need disable spell use for owner
6129 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6130 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6131 ToPlayer()->AddSpellAndCategoryCooldowns(createBySpell, 0, nullptr, true);
6132 }
6133}
uint32 GetSpellId() const
Definition: GameObject.h:183
void SetOwnerGUID(ObjectGuid owner)
Definition: GameObject.h:165
ObjectGuid GetOwnerGUID() const
Definition: GameObject.h:175
void AddSpellAndCategoryCooldowns(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
Definition: Player.cpp:10826
bool IsCooldownStartedOnEvent() const
Definition: SpellInfo.cpp:1199

References Player::AddSpellAndCategoryCooldowns(), Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), Object::GetTypeId(), SpellInfo::IsCooldownStartedOnEvent(), m_gameObj, GameObject::SetOwnerGUID(), sSpellMgr, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by Spell::EffectDuel(), Spell::EffectSummonObject(), Spell::EffectTransmitted(), and WorldObject::SummonGameObject().

◆ addHatedBy()

void Unit::addHatedBy ( HostileReference pHostileReference)
inline

◆ AddInterruptMask()

void Unit::AddInterruptMask ( uint32  mask)
inline
2177{ m_interruptMask |= mask; }

References m_interruptMask.

Referenced by _CreateAuraApplication(), and Spell::handle_immediate().

◆ AddPetAura()

void Unit::AddPetAura ( PetAura const *  petSpell)
17552{
17553 if (GetTypeId() != TYPEID_PLAYER)
17554 return;
17555
17556 m_petAuras.insert(petSpell);
17557 if (Pet* pet = ToPlayer()->GetPet())
17558 pet->CastPetAura(petSpell);
17559 else if (Unit* charm = GetCharm())
17560 charm->CastPetAura(petSpell);
17561}
Pet * GetPet(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:218
Definition: Pet.h:40
Unit * GetCharm() const
Definition: Unit.cpp:10665
PetAuraSet m_petAuras
Definition: Unit.h:2348

References GetCharm(), Object::GetTypeId(), m_petAuras, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by Spell::EffectDummy(), and AuraEffect::HandleAuraDummy().

◆ AddPlayerToVision()

void Unit::AddPlayerToVision ( Player player)
11164{
11165 if (m_sharedVision.empty())
11166 {
11167 setActive(true);
11168 SetWorldObject(true);
11169 }
11170 m_sharedVision.push_back(player);
11171 player->m_isInSharedVisionOf.insert(this);
11172}
void SetWorldObject(bool apply)
Definition: Object.cpp:1066
void setActive(bool isActiveObject)
Definition: Object.cpp:1085

References Player::m_isInSharedVisionOf, m_sharedVision, WorldObject::setActive(), and WorldObject::SetWorldObject().

◆ AddPointedBy()

void Unit::AddPointedBy ( SafeUnitPointer sup)
inline
2419{ SafeUnitPointerSet.insert(sup); }
std::set< SafeUnitPointer * > SafeUnitPointerSet
Definition: Unit.h:2418

References SafeUnitPointerSet.

Referenced by SafeUnitPointer::SetPointedTo().

◆ AddSpellCooldown()

virtual void Unit::AddSpellCooldown ( uint32  ,
uint32  ,
uint32  ,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
inlinevirtual

◆ AddThreat()

void Unit::AddThreat ( Unit victim,
float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  threatSpell = nullptr 
)
14640{
14641 // Only mobs can manage threat lists
14643 {
14644 m_ThreatMgr.AddThreat(victim, fThreat, schoolMask, threatSpell);
14645 }
14646}
@ UNIT_STATE_EVADE
Definition: Unit.h:346
void AddThreat(Unit *victim, float threat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition: ThreatMgr.cpp:436
bool CanHaveThreatList() const
Definition: Unit.cpp:14600
bool HasUnitState(const uint32 f) const
Definition: Unit.h:1410

References ThreatMgr::AddThreat(), CanHaveThreatList(), HasUnitState(), m_ThreatMgr, and UNIT_STATE_EVADE.

Referenced by Attack(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), boss_shade_of_aran::AttackStart(), boss_alyson_antille::boss_alyson_antilleAI::AttackStart(), boss_gazakrothAI::AttackStart(), boss_slither::boss_slitherAI::AttackStart(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::AttackStart(), npc_dirt_mound::ChaseNewTarget(), boss_buru::ChaseNewVictim(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DamageTaken(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), DealDamage(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), CreatureAI::DoZoneInCombat(), Spell::EffectThreat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), npc_raging_flames::FixateRandomTarget(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), spell_morogrim_tidewalker_water_globule_new_target::HandleDummy(), HandleDummyAuraProc(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), AuraEffect::HandlePeriodicManaLeechAuraTick(), spell_frostwarden_handler_focus_fire::spell_frostwarden_handler_focus_fire_SpellScript::HandleScript(), spell_the_lich_king_vile_spirit_move_target_search::spell_the_lich_king_vile_spirit_move_target_search_SpellScript::HandleScript(), spell_pursue::spell_pursue_SpellScript::HandleScript(), Spell::HandleThreatSpells(), npc_tiger_matriarch::npc_tiger_matriarchAI::IsSummonedBy(), npc_little_ooze::npc_little_oozeAI::IsSummonedBy(), npc_malchezaar_axe::JustEngagedWith(), boss_buru::JustEngagedWith(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), boss_curator::JustSummoned(), boss_sacrolash::boss_sacrolashAI::JustSummoned(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustSummoned(), npc_akama_illidan::npc_akama_illidanAI::JustSummoned(), npc_creature_generator_akama::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), SmartScript::ProcessAction(), RemoveCharmedBy(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::Reset(), boss_dalronn_the_controller::boss_dalronn_the_controllerAI::Reset(), npc_pet_hunter_snake_trap::Reset(), boss_romulo::ScheduleCombat(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::SelectT(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_thrall_bfu::npc_thrall_bfuAI::SpawnWave(), npc_greengill_slave::npc_greengill_slaveAI::SpellHit(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), spell_putricide_ooze_channel::spell_putricide_ooze_channel_SpellScript::StartAttack(), brann_bronzebeard::brann_bronzebeardAI::SummonCreatures(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_kagani_nightstrike::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), npc_giant_infernal::npc_giant_infernalAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI(), boss_shade_of_akama::UpdateAI(), boss_supremus::UpdateAI(), boss_anetheron::boss_anetheronAI::WaypointReached(), boss_azgalor::boss_azgalorAI::WaypointReached(), boss_kazrogal::boss_kazrogalAI::WaypointReached(), boss_rage_winterchill::boss_rage_winterchillAI::WaypointReached(), npc_giant_infernal::npc_giant_infernalAI::WaypointReached(), npc_abomination::npc_abominationAI::WaypointReached(), npc_ghoul::npc_ghoulAI::WaypointReached(), npc_necromancer::npc_necromancerAI::WaypointReached(), npc_banshee::npc_bansheeAI::WaypointReached(), npc_crypt_fiend::npc_crypt_fiendAI::WaypointReached(), npc_fel_stalker::npc_fel_stalkerAI::WaypointReached(), npc_frost_wyrm::npc_frost_wyrmAI::WaypointReached(), and npc_gargoyle::npc_gargoyleAI::WaypointReached().

◆ AddToWorld()

void Unit::AddToWorld ( )
overridevirtual

Reimplemented from WorldObject.

15675{
15676 if (!IsInWorld())
15677 {
15679 }
15680}
void AddToWorld() override
Definition: Object.cpp:1176

References WorldObject::AddToWorld(), and Object::IsInWorld().

Referenced by Creature::AddToWorld(), Pet::AddToWorld(), and Player::AddToWorld().

◆ AddUnitMovementFlag()

◆ AddUnitState()

void Unit::AddUnitState ( uint32  f)
inline
1409{ m_state |= f; }

References m_state.

Referenced by _ExitVehicle(), RandomMovementGenerator< T >::_setRandomLocation(), MotionTransport::AddPassenger(), Attack(), boss_prince_keleseth_icc::boss_prince_kelesethAI::boss_prince_kelesethAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::boss_prince_taldaramAI(), boss_prince_valanar_icc::boss_prince_valanarAI::boss_prince_valanarAI(), Creature::Create(), MotionTransport::CreateNPCPassenger(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_thorim::boss_thorimAI::DisableThorim(), WaypointMovementGenerator< Creature >::DoInitialize(), RandomMovementGenerator< T >::DoInitialize(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoReset(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_jindo::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), Creature::FocusTarget(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetCastSpellOpcode(), RotateMovementGenerator::Initialize(), DistractMovementGenerator::Initialize(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), Player::LoadFromDB(), boss_ayamiss::MovementInform(), npc_pet_gen_moth::npc_pet_gen_moth(), npc_pet_gen_valkyr_guardian::npc_pet_gen_valkyr_guardian(), npc_pet_gen_wind_rider_cub::npc_pet_gen_wind_rider_cub(), npc_corrupted_totem::Reset(), boss_jedoga_shadowseeker::Reset(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::Reset(), npc_wild_wyrm::npc_wild_wyrmAI::Reset(), boss_hungarfen::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), SetCharmedBy(), SetContestedPvP(), SetControlled(), SetCurrentCastedSpell(), Player::setDeathState(), Player::SetIsSpectator(), boss_urom::boss_uromAI::SpellHit(), WaypointMovementGenerator< Creature >::StartMove(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), and boss_svala::boss_svalaAI::UpdateAI().

◆ AddUnitTypeMask()

void Unit::AddUnitTypeMask ( uint32  mask)
inline
1420{ m_unitTypeMask |= mask; }

References m_unitTypeMask.

◆ ApplyAttackTimePercentMod()

void Unit::ApplyAttackTimePercentMod ( WeaponAttackType  att,
float  val,
bool  apply 
)
17320{
17321 float remainingTimePct = std::max((float)m_attackTimer[att], 0.0f) / (GetAttackTime(att) * m_modAttackSpeedPct[att]);
17322 if (val > 0)
17323 {
17325 ApplyPercentModFloatValue(static_cast<uint16>(UNIT_FIELD_BASEATTACKTIME) + att, val, !apply);
17326 }
17327 else
17328 {
17330 ApplyPercentModFloatValue(static_cast<uint16>(UNIT_FIELD_BASEATTACKTIME) + att, -val, apply);
17331 }
17332 m_attackTimer[att] = uint32(GetAttackTime(att) * m_modAttackSpeedPct[att] * remainingTimePct);
17333}
std::uint16_t uint16
Definition: Define.h:109
void ApplyPercentModFloatVar(float &var, float val, bool apply)
Definition: Util.h:50
@ UNIT_FIELD_BASEATTACKTIME
Definition: UpdateFields.h:120
void ApplyPercentModFloatValue(uint16 index, float val, bool apply)
Definition: Object.cpp:829
uint32 GetAttackTime(WeaponAttackType att) const
Definition: Unit.h:1483

References Object::ApplyPercentModFloatValue(), ApplyPercentModFloatVar(), GetAttackTime(), m_attackTimer, m_modAttackSpeedPct, and UNIT_FIELD_BASEATTACKTIME.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleAuraModRangedHaste(), AuraEffect::HandleModAttackSpeed(), AuraEffect::HandleModCombatSpeedPct(), AuraEffect::HandleModMeleeRangedSpeedPct(), AuraEffect::HandleModMeleeSpeedPct(), and AuraEffect::HandleRangedAmmoHaste().

◆ ApplyCastTimePercentMod()

void Unit::ApplyCastTimePercentMod ( float  val,
bool  apply 
)
17336{
17337 if (val > 0)
17339 else
17341}
@ UNIT_MOD_CAST_SPEED
Definition: UpdateFields.h:137

References Object::ApplyPercentModFloatValue(), and UNIT_MOD_CAST_SPEED.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleModCastingSpeed(), and AuraEffect::HandleModCombatSpeedPct().

◆ ApplyDiminishingAura()

void Unit::ApplyDiminishingAura ( DiminishingGroup  group,
bool  apply 
)
15113{
15114 // Checking for existing in the table
15115 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15116 {
15117 if (i->DRGroup != group)
15118 continue;
15119
15120 if (apply)
15121 i->stack += 1;
15122 else if (i->stack)
15123 {
15124 i->stack -= 1;
15125 // Remember time after last aura from group removed
15126 if (i->stack == 0)
15127 i->hitTime = GameTime::GetGameTimeMS().count();
15128 }
15129 break;
15130 }
15131}
Milliseconds GetGameTimeMS()
Definition: GameTime.cpp:43
Diminishing m_Diminishing
Definition: Unit.h:2590

References GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by UnitAura::_ApplyForTarget(), and UnitAura::_UnapplyForTarget().

◆ ApplyDiminishingToDuration()

float Unit::ApplyDiminishingToDuration ( DiminishingGroup  group,
int32 duration,
Unit caster,
DiminishingLevels  Level,
int32  limitduration 
)
15034{
15035 // xinef: dont apply diminish to self casts
15036 if (duration == -1 || group == DIMINISHING_NONE)
15037 return 1.0f;
15038
15039 // test pet/charm masters instead pets/charmeds
15040 Unit const* targetOwner = GetOwner();
15041 Unit const* casterOwner = caster->GetOwner();
15042
15043 // Duration of crowd control abilities on pvp target is limited by 10 sec. (2.2.0)
15044 if (limitduration > 0 && duration > limitduration)
15045 {
15046 Unit const* target = targetOwner ? targetOwner : this;
15047 Unit const* source = casterOwner ? casterOwner : caster;
15048
15049 if ((target->GetTypeId() == TYPEID_PLAYER
15051 && source->GetTypeId() == TYPEID_PLAYER)
15052 duration = limitduration;
15053 }
15054
15055 float mod = 1.0f;
15056
15057 if (group == DIMINISHING_TAUNT)
15058 {
15059 if (GetTypeId() == TYPEID_UNIT && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS))
15060 {
15061 DiminishingLevels diminish = Level;
15062 switch (diminish)
15063 {
15065 break;
15067 mod = 0.65f;
15068 break;
15070 mod = 0.4225f;
15071 break;
15073 mod = 0.274625f;
15074 break;
15076 mod = 0.0f;
15077 break;
15078 default:
15079 break;
15080 }
15081 }
15082 }
15083 // Some diminishings applies to mobs too (for example, Stun)
15085 && ((targetOwner ? (targetOwner->GetTypeId() == TYPEID_PLAYER) : (GetTypeId() == TYPEID_PLAYER))
15086 || (GetTypeId() == TYPEID_UNIT && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH)))
15088 {
15089 DiminishingLevels diminish = Level;
15090 switch (diminish)
15091 {
15093 break;
15095 mod = 0.5f;
15096 break;
15098 mod = 0.25f;
15099 break;
15101 mod = 0.0f;
15102 break;
15103 default:
15104 break;
15105 }
15106 }
15107
15108 duration = int32(duration * mod);
15109 return mod;
15110}
@ CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS
Definition: CreatureData.h:68
@ CREATURE_FLAG_EXTRA_ALL_DIMINISH
Definition: CreatureData.h:69
DiminishingLevels
Definition: Unit.h:693
@ DIMINISHING_LEVEL_3
Definition: Unit.h:696
@ DIMINISHING_LEVEL_1
Definition: Unit.h:694
@ DIMINISHING_LEVEL_4
Definition: Unit.h:698
@ DIMINISHING_LEVEL_IMMUNE
Definition: Unit.h:697
@ DIMINISHING_LEVEL_TAUNT_IMMUNE
Definition: Unit.h:699
@ DIMINISHING_LEVEL_2
Definition: Unit.h:695
DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group)
Definition: SpellMgr.cpp:246
@ DIMINISHING_NONE
Definition: SharedDefines.h:3258
@ DIMINISHING_TAUNT
Definition: SharedDefines.h:3276
@ DRTYPE_PLAYER
Definition: SharedDefines.h:3251
@ DRTYPE_ALL
Definition: SharedDefines.h:3252
uint32 flags_extra
Definition: CreatureData.h:239

References CREATURE_FLAG_EXTRA_ALL_DIMINISH, CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS, DIMINISHING_LEVEL_1, DIMINISHING_LEVEL_2, DIMINISHING_LEVEL_3, DIMINISHING_LEVEL_4, DIMINISHING_LEVEL_IMMUNE, DIMINISHING_LEVEL_TAUNT_IMMUNE, DIMINISHING_NONE, DIMINISHING_TAUNT, DRTYPE_ALL, DRTYPE_PLAYER, CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), GetDiminishingReturnsGroupType(), GetOwner(), Object::GetTypeId(), Object::ToCreature(), TYPEID_PLAYER, and TYPEID_UNIT.

Referenced by Spell::DoSpellHitOnUnit().

◆ ApplyEffectModifiers()

float Unit::ApplyEffectModifiers ( SpellInfo const *  spellProto,
uint8  effect_index,
float  value 
) const
14816{
14817 if (Player* modOwner = GetSpellModOwner())
14818 {
14819 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_ALL_EFFECTS, value);
14820 switch (effect_index)
14821 {
14822 case 0:
14823 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT1, value);
14824 break;
14825 case 1:
14826 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT2, value);
14827 break;
14828 case 2:
14829 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT3, value);
14830 break;
14831 }
14832 }
14833 return value;
14834}
@ SPELLMOD_EFFECT2
Definition: SpellDefines.h:89
@ SPELLMOD_ALL_EFFECTS
Definition: SpellDefines.h:85
@ SPELLMOD_EFFECT3
Definition: SpellDefines.h:100
@ SPELLMOD_EFFECT1
Definition: SpellDefines.h:80
Player * GetSpellModOwner() const
Definition: Unit.cpp:16845

References GetSpellModOwner(), SpellInfo::Id, SPELLMOD_ALL_EFFECTS, SPELLMOD_EFFECT1, SPELLMOD_EFFECT2, and SPELLMOD_EFFECT3.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellEffectInfo::CalcValue(), and Spell::EffectSchoolDMG().

◆ ApplyResilience()

void Unit::ApplyResilience ( Unit const *  victim,
float *  crit,
int32 damage,
bool  isCrit,
CombatRating  type 
)
static
19192{
19193 // player mounted on multi-passenger mount is also classified as vehicle
19194 if (victim->IsVehicle() && victim->GetTypeId() != TYPEID_PLAYER)
19195 return;
19196
19197 Unit const* target = nullptr;
19198 if (victim->GetTypeId() == TYPEID_PLAYER)
19199 target = victim;
19200 else if (victim->GetTypeId() == TYPEID_UNIT)
19201 {
19202 if (Unit* owner = victim->GetOwner())
19203 if (owner->GetTypeId() == TYPEID_PLAYER)
19204 target = owner;
19205 }
19206
19207 if (!target)
19208 return;
19209
19210 switch (type)
19211 {
19213 // Crit chance reduction works against nonpets
19214 if (crit)
19215 *crit -= target->GetMeleeCritChanceReduction();
19216 if (damage)
19217 {
19218 if (isCrit)
19219 *damage -= target->GetMeleeCritDamageReduction(*damage);
19220 *damage -= target->GetMeleeDamageReduction(*damage);
19221 }
19222 break;
19224 // Crit chance reduction works against nonpets
19225 if (crit)
19226 *crit -= target->GetRangedCritChanceReduction();
19227 if (damage)
19228 {
19229 if (isCrit)
19230 *damage -= target->GetRangedCritDamageReduction(*damage);
19231 *damage -= target->GetRangedDamageReduction(*damage);
19232 }
19233 break;
19235 // Crit chance reduction works against nonpets
19236 if (crit)
19237 *crit -= target->GetSpellCritChanceReduction();
19238 if (damage)
19239 {
19240 if (isCrit)
19241 *damage -= target->GetSpellCritDamageReduction(*damage);
19242 *damage -= target->GetSpellDamageReduction(*damage);
19243 }
19244 break;
19245 default:
19246 break;
19247 }
19248}
@ CR_CRIT_TAKEN_RANGED
Definition: Unit.h:419
@ CR_CRIT_TAKEN_SPELL
Definition: Unit.h:420
@ CR_CRIT_TAKEN_MELEE
Definition: Unit.h:418
float GetSpellCritChanceReduction() const
Definition: Unit.h:1595
float GetRangedCritChanceReduction() const
Definition: Unit.h:1594
uint32 GetSpellCritDamageReduction(uint32 damage) const
Definition: Unit.h:1600
float GetMeleeCritChanceReduction() const
Definition: Unit.h:1593
uint32 GetRangedDamageReduction(uint32 damage) const
Definition: Unit.h:1604
uint32 GetRangedCritDamageReduction(uint32 damage) const
Definition: Unit.h:1599
uint32 GetMeleeCritDamageReduction(uint32 damage) const
Definition: Unit.h:1598
uint32 GetSpellDamageReduction(uint32 damage) const
Definition: Unit.h:1605
uint32 GetMeleeDamageReduction(uint32 damage) const
Definition: Unit.h:1603

References CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, GetMeleeCritChanceReduction(), GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetOwner(), GetRangedCritChanceReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritChanceReduction(), GetSpellCritDamageReduction(), GetSpellDamageReduction(), Object::GetTypeId(), IsVehicle(), TYPEID_PLAYER, and TYPEID_UNIT.

Referenced by CalculateSpellDamageTaken(), GetUnitCriticalChance(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_valkyr_touch::spell_valkyr_touchAuraScript::PrepareAuraScript(), and SpellTakenCritChance().

◆ ApplyResistanceBuffModsMod()

void Unit::ApplyResistanceBuffModsMod ( SpellSchools  school,
bool  positive,
float  val,
bool  apply 
)
inline
2041{ ApplyModSignedFloatValue(positive ? static_cast<uint16>(UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE) + school : static_cast<uint16>(UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE) + + school, val, apply); }
@ UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE
Definition: UpdateFields.h:157
@ UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE
Definition: UpdateFields.h:158
void ApplyModSignedFloatValue(uint16 index, float val, bool apply)
Definition: Object.cpp:822

References Object::ApplyModSignedFloatValue(), UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, and UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE.

Referenced by AuraEffect::HandleAuraModResistance(), and AuraEffect::HandleAuraModResistanceExclusive().

◆ ApplyResistanceBuffModsPercentMod()

void Unit::ApplyResistanceBuffModsPercentMod ( SpellSchools  school,
bool  positive,
float  val,
bool  apply 
)
inline

◆ ApplySpellDispelImmunity()

void Unit::ApplySpellDispelImmunity ( SpellInfo const *  spellProto,
DispelType  type,
bool  apply 
)
13411{
13412 ApplySpellImmune(spellProto->Id, IMMUNITY_DISPEL, type, apply);
13413
13414 if (apply && spellProto->HasAttribute(SPELL_ATTR1_IMMUNITY_PURGES_EFFECT))
13415 {
13416 // Create dispel mask by dispel type
13417 uint32 dispelMask = SpellInfo::GetDispelMask(type);
13418 // Dispel all existing auras vs current dispel type
13420 for (AuraApplicationMap::iterator itr = auras.begin(); itr != auras.end();)
13421 {
13422 SpellInfo const* spell = itr->second->GetBase()->GetSpellInfo();
13423 if (spell->GetDispelMask() & dispelMask)
13424 {
13425 // Dispel aura
13426 RemoveAura(itr);
13427 }
13428 else
13429 ++itr;
13430 }
13431 }
13432}
@ SPELL_ATTR1_IMMUNITY_PURGES_EFFECT
Definition: SharedDefines.h:434
@ IMMUNITY_DISPEL
Definition: SharedDefines.h:1398
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
Definition: Unit.cpp:13383
std::multimap< uint32, AuraApplication * > AuraApplicationMap
Definition: Unit.h:1311
AuraApplicationMap & GetAppliedAuras()
Definition: Unit.h:1938
uint32 GetDispelMask() const
Definition: SpellInfo.cpp:2028

References ApplySpellImmune(), GetAppliedAuras(), SpellInfo::GetDispelMask(), SpellInfo::HasAttribute(), SpellInfo::Id, IMMUNITY_DISPEL, RemoveAura(), and SPELL_ATTR1_IMMUNITY_PURGES_EFFECT.

Referenced by AuraEffect::HandleAuraModDispelImmunity().

◆ ApplySpellImmune()

void Unit::ApplySpellImmune ( uint32  spellId,
uint32  op,
uint32  type,
bool  apply,
SpellImmuneBlockType  blockType = SPELL_BLOCK_TYPE_ALL 
)
13384{
13385 if (apply)
13386 {
13387 // xinef: immunities with spellId 0 are intended to be applied only once (script purposes mosty)
13388 if (spellId == 0 && std::find_if(m_spellImmune[op].begin(), m_spellImmune[op].end(), spellIdImmunityPredicate(type)) != m_spellImmune[op].end())
13389 return;
13390
13391 SpellImmune immune;
13392 immune.spellId = spellId;
13393 immune.type = type;
13394 immune.blockType = blockType;
13395 m_spellImmune[op].push_back(std::move(immune));
13396 }
13397 else
13398 {
13399 for (SpellImmuneList::iterator itr = m_spellImmune[op].begin(); itr != m_spellImmune[op].end(); ++itr)
13400 {
13401 if (itr->spellId == spellId && itr->type == type)
13402 {
13403 m_spellImmune[op].erase(itr);
13404 break;
13405 }
13406 }
13407 }
13408}
Definition: Unit.cpp:13374
Definition: SpellDefines.h:171
uint32 blockType
Definition: SpellDefines.h:176
uint32 spellId
Definition: SpellDefines.h:174
uint32 type
Definition: SpellDefines.h:175

References SpellImmune::blockType, m_spellImmune, SpellImmune::spellId, and SpellImmune::type.

Referenced by Vehicle::ApplyAllImmunities(), boss_kelidan_the_breaker::ApplyImmunities(), ApplyMechanicImmune(), ApplySpellDispelImmunity(), boss_amanitar::boss_amanitar(), boss_anubarak_trial::boss_anubarak_trialAI::boss_anubarak_trialAI(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_icehowl::boss_icehowlAI::boss_icehowlAI(), boss_sindragosa::boss_sindragosaAI::boss_sindragosaAI(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_void_reaver::boss_void_reaver(), boss_yoggsaron_keeper::boss_yoggsaron_keeperAI::boss_yoggsaron_keeperAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDmgImmunity(), AuraEffect::HandleAuraModEffectImmunity(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleAuraModStateImmunity(), Aura::HandleAuraSpecificMods(), spell_q13007_iron_colossus::spell_q13007_iron_colossus_SpellScript::HandleDummy(), spell_love_in_air_perfume_immune::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_dk_anti_magic_shell_self::HandleEffectApply(), spell_dk_pet_scaling::HandleEffectApply(), spell_dru_treant_scaling::HandleEffectApply(), spell_pet_hit_expertise_scalling::HandleEffectApply(), spell_mage_pet_scaling::HandleEffectApply(), spell_pri_shadowfiend_scaling::HandleEffectApply(), spell_sha_feral_spirit_scaling::HandleEffectApply(), spell_sha_fire_elemental_scaling::HandleEffectApply(), spell_warl_infernal_scaling::HandleEffectApply(), spell_love_in_air_perfume_immune::HandleEffectRemove(), spell_dk_anti_magic_shell_self::HandleEffectRemove(), spell_gen_bg_preparation::HandleEffectRemove(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), npc_pet_dk_army_of_the_dead::npc_pet_dk_army_of_the_deadAI::InitializeAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_alar::boss_alarAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Player::LoadFromDB(), Creature::LoadSpellTemplateImmunity(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_target_dummy::npc_target_dummyAI::npc_target_dummyAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::npc_tournament_training_dummyAI(), npc_training_dummy::npc_training_dummyAI::npc_training_dummyAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::npc_ulduar_arachnopod_destroyerAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::npc_valkyr_shadowguardAI(), spell_yogg_saron_malady_of_the_mind::spell_yogg_saron_malady_of_the_mind_AuraScript::OnApply(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_malady_of_the_mind::spell_yogg_saron_malady_of_the_mind_AuraScript::OnRemove(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), npc_chesspiece::Reset(), boss_curator::Reset(), boss_felblood_kaelthas::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::Reset(), npc_dark_iron_guzzler::Reset(), boss_archimonde::boss_archimondeAI::Reset(), boss_mal_ganis::boss_mal_ganisAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_gluth::boss_gluthAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_auriaya::boss_auriayaAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_alar::boss_alarAI::Reset(), boss_kaelthas::boss_kaelthasAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), boss_supremus::SchedulePhase(), boss_hydross_the_unstable::SetForm(), boss_felblood_kaelthas::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), Creature::UpdateEntry(), and npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached().

◆ ApplyStatBuffMod()

void Unit::ApplyStatBuffMod ( Stats  stat,
float  val,
bool  apply 
)
inline
2048{ ApplyModSignedFloatValue((val > 0 ? static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat : static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat), val, apply); }
@ UNIT_FIELD_POSSTAT0
Definition: UpdateFields.h:146
@ UNIT_FIELD_NEGSTAT0
Definition: UpdateFields.h:151

References Object::ApplyModSignedFloatValue(), UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by Player::_ApplyItemBonuses(), Player::ApplyEnchantment(), and AuraEffect::HandleAuraModStat().

◆ ApplyStatPercentBuffMod()

void Unit::ApplyStatPercentBuffMod ( Stats  stat,
float  val,
bool  apply 
)
15324{
15325 if (val == -100.0f) // prevent set var to zero
15326 val = -99.99f;
15327 float var = GetStat(stat) * val / 100.0f;
15328 ApplyModSignedFloatValue((var > 0 ? static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat : static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat), var, apply);
15329}
float GetStat(Stats stat) const
Definition: Unit.h:1444

References Object::ApplyModSignedFloatValue(), GetStat(), UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by AuraEffect::HandleModTotalPercentStat().

◆ ApplyTotalThreatModifier()

float Unit::ApplyTotalThreatModifier ( float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
14628{
14629 if (!HasAuraType(SPELL_AURA_MOD_THREAT) || fThreat < 0)
14630 return fThreat;
14631
14632 SpellSchools school = GetFirstSchoolInMask(schoolMask);
14633
14634 return fThreat * m_threatModifier[school];
14635}
@ SPELL_AURA_MOD_THREAT
Definition: SpellAuraDefines.h:73
SpellSchools
Definition: SharedDefines.h:282
SpellSchools GetFirstSchoolInMask(SpellSchoolMask mask)
Definition: SharedDefines.h:318
bool HasAuraType(AuraType auraType) const
Definition: Unit.cpp:5643

References GetFirstSchoolInMask(), HasAuraType(), m_threatModifier, and SPELL_AURA_MOD_THREAT.

Referenced by ThreatCalcHelper::calcThreat().

◆ Attack()

bool Unit::Attack ( Unit victim,
bool  meleeAttack 
)
Todo:
: Implement aggro range, detection range and assistance range templates
10281{
10282 if (!victim || victim == this)
10283 return false;
10284
10285 // dead units can neither attack nor be attacked
10286 if (!IsAlive() || !victim->IsAlive())
10287 return false;
10288
10289 // pussywizard: check map, world, phase >_> multithreading crash fix
10290 if (!IsInMap(victim) || !InSamePhase(victim))
10291 return false;
10292
10293 // player cannot attack in mount state
10294 if (GetTypeId() == TYPEID_PLAYER && IsMounted())
10295 return false;
10296
10297 // creatures cannot attack while evading
10298 Creature* creature = ToCreature();
10299 if (creature && creature->IsInEvadeMode())
10300 {
10301 return false;
10302 }
10303
10304 // creatures should not try to attack the player during polymorph
10305 if (creature && creature->IsPolymorphed())
10306 {
10307 return false;
10308 }
10309
10310 //if (HasUnitFlag(UNIT_FLAG_PACIFIED)) // pussywizard: why having this flag prevents from entering combat? it should just prevent melee attack
10311 // return false;
10312
10313 // nobody can attack GM in GM-mode
10314 if (victim->GetTypeId() == TYPEID_PLAYER)
10315 {
10316 if (victim->ToPlayer()->IsGameMaster())
10317 return false;
10318 }
10319 else
10320 {
10321 if (victim->ToCreature()->IsEvadingAttacks())
10322 return false;
10323 }
10324
10325 // Unit with SPELL_AURA_SPIRIT_OF_REDEMPTION can not attack
10327 return false;
10328
10329 // remove SPELL_AURA_MOD_UNATTACKABLE at attack (in case non-interruptible spells stun aura applied also that not let attack)
10332
10333 if (m_attacking)
10334 {
10335 if (m_attacking == victim)
10336 {
10337 // switch to melee attack from ranged/magic
10338 if (meleeAttack)
10339 {
10341 {
10343 SendMeleeAttackStart(victim);
10344 return true;
10345 }
10346 }
10348 {
10350 SendMeleeAttackStop(victim);
10351 return true;
10352 }
10353 return false;
10354 }
10355
10356 // switch target
10357 InterruptSpell(CURRENT_MELEE_SPELL, true, true, true);
10358 if (!meleeAttack)
10360 }
10361
10362 if (m_attacking)
10364
10365 m_attacking = victim;
10367
10368 // Set our target
10369 SetTarget(victim->GetGUID());
10370
10371 if (meleeAttack)
10373
10374 // set position before any AI calls/assistance
10375 //if (GetTypeId() == TYPEID_UNIT)
10376 // ToCreature()->SetCombatStartPosition(GetPositionX(), GetPositionY(), GetPositionZ());
10377 if (creature && !(IsControllableGuardian() && IsControlledByPlayer()))
10378 {
10379 // should not let player enter combat by right clicking target - doesn't helps
10380 SetInCombatWith(victim);
10381 if (victim->GetTypeId() == TYPEID_PLAYER)
10382 victim->SetInCombatWith(this);
10383 AddThreat(victim, 0.0f);
10384
10386
10389 {
10390 creature->CallAssistance();
10391 }
10393
10395 }
10396
10397 // delay offhand weapon attack to next attack time
10400
10401 if (meleeAttack)
10402 SendMeleeAttackStart(victim);
10403
10404 return true;
10405}
@ CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE
Definition: CreatureData.h:74
@ UNIT_NPC_EMOTESTATE
Definition: UpdateFields.h:140
#define ATTACK_DISPLAY_DELAY
Definition: Unit.h:1250
@ CURRENT_MELEE_SPELL
Definition: Unit.h:990
@ UNIT_STATE_MELEE_ATTACKING
Definition: Unit.h:326
@ SPELL_AURA_SPIRIT_OF_REDEMPTION
Definition: SpellAuraDefines.h:239
@ SPELL_AURA_MOD_UNATTACKABLE
Definition: SpellAuraDefines.h:156
@ CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD
Definition: IWorld.h:284
@ EMOTE_ONESHOT_NONE
Definition: SharedDefines.h:1894
@ AI_REACTION_HOSTILE
Definition: SharedDefines.h:3242
#define sWorld
Definition: World.h:447
void CallAssistance(Unit *target=nullptr)
Definition: Creature.cpp:2366
bool IsEvadingAttacks() const
Definition: Creature.h:131
void SetAssistanceTimer(uint32 value)
Definition: Creature.h:394
void SendAIReaction(AiReaction reactionType)
Definition: Creature.cpp:2354
bool IsInEvadeMode() const
Definition: Creature.h:130
void SetUInt32Value(uint16 index, uint32 value)
Definition: Object.cpp:650
bool InSamePhase(WorldObject const *obj) const
Definition: Object.h:435
bool IsInMap(WorldObject const *obj) const
Definition: Object.cpp:1285
bool IsGameMaster() const
Definition: Player.h:1148
void ClearUnitState(uint32 f)
Definition: Unit.h:1411
bool IsPolymorphed() const
Definition: Unit.cpp:17009
void AddThreat(Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition: Unit.cpp:14639
void _removeAttacker(Unit *pAttacker)
Definition: Unit.h:1374
bool haveOffhandWeapon() const
Definition: Unit.cpp:540
void _addAttacker(Unit *pAttacker)
Definition: Unit.h:1370
void SetInCombatWith(Unit *enemy, uint32 duration=0)
Definition: Unit.cpp:13575
bool IsMounted() const
Definition: Unit.h:1556
void SendMeleeAttackStart(Unit *victim, Player *sendTo=nullptr)
Definition: Unit.cpp:3033
bool IsControllableGuardian() const
Definition: Unit.h:1424
void SendMeleeAttackStop(Unit *victim=nullptr)
Definition: Unit.cpp:3045
bool IsControlledByPlayer() const
Definition: Unit.h:1842
virtual void SetTarget(ObjectGuid=ObjectGuid::Empty)=0

References _addAttacker(), _removeAttacker(), AddThreat(), AddUnitState(), AI_REACTION_HOSTILE, ATTACK_DISPLAY_DELAY, Creature::CallAssistance(), ClearUnitState(), CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD, CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE, CURRENT_MELEE_SPELL, EMOTE_ONESHOT_NONE, CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), Object::GetGUID(), Object::GetTypeId(), HasAuraType(), HasUnitState(), haveOffhandWeapon(), WorldObject::InSamePhase(), InterruptSpell(), IsAlive(), isAttackReady(), IsControllableGuardian(), IsControlledByPlayer(), Creature::IsEvadingAttacks(), Player::IsGameMaster(), Creature::IsInEvadeMode(), WorldObject::IsInMap(), IsMounted(), IsPolymorphed(), m_attacking, OFF_ATTACK, RemoveAurasByType(), Creature::SendAIReaction(), SendMeleeAttackStart(), SendMeleeAttackStop(), Creature::SetAssistanceTimer(), setAttackTimer(), SetInCombatWith(), SetTarget(), Object::SetUInt32Value(), SPELL_AURA_MOD_UNATTACKABLE, SPELL_AURA_SPIRIT_OF_REDEMPTION, sWorld, Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, UNIT_NPC_EMOTESTATE, and UNIT_STATE_MELEE_ATTACKING.

Referenced by UnitAI::AttackStart(), FollowerAI::AttackStart(), PossessedAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::AttackStart(), npc_gunship_mage::npc_gunship_mageAI::AttackStart(), npc_gunship_gunner::npc_gunship_gunnerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::boss_malygosAI::AttackStart(), npc_nexus_lord::npc_nexus_lordAI::AttackStart(), boss_illidan_stormrage::boss_illidan_stormrageAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), TurretAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), boss_alyson_antille::boss_alyson_antilleAI::AttackStart(), boss_gazakrothAI::AttackStart(), boss_slither::boss_slitherAI::AttackStart(), boss_jormungarAI::AttackStart(), boss_four_horsemen::boss_four_horsemenAI::AttackStart(), boss_magus_telestra::boss_magus_telestraAI::AttackStart(), boss_kologarn::boss_kologarnAI::AttackStart(), boss_mimiron::boss_mimironAI::AttackStart(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_high_nethermancer_zerevor::boss_high_nethermancer_zerevorAI::AttackStart(), boss_lady_malande::boss_lady_malandeAI::AttackStart(), boss_the_lurker_below::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), boss_nazan::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_pet_gen_gnomish_flame_turret::AttackStart(), UnitAI::AttackStartCaster(), ScriptedAI::AttackStartNoMove(), PetAI::DoAttack(), boss_halazzi::boss_halazziAI::EnterPhase(), WorldSession::HandleAttackSwingOpcode(), spell_q12096_q12092_dummy::spell_q12096_q12092_dummy_SpellScript::HandleDummy(), WorldSession::HandlePetActionHelper(), npc_necromancer::npc_necromancerAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), RemoveCharmedBy(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_gargoyle::npc_gargoyleAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), Player::UpdateCharmedAI(), and npc_ranger_lilatha::WaypointReached().

◆ AttackerStateUpdate()

void Unit::AttackerStateUpdate ( Unit victim,
WeaponAttackType  attType = BASE_ATTACK,
bool  extra = false,
bool  ignoreCasting = false 
)
2538{
2540 {
2541 return;
2542 }
2543
2544 if (HasUnitState(UNIT_STATE_CANNOT_AUTOATTACK) && !extra && !ignoreCasting)
2545 {
2546 return;
2547 }
2548
2549 if (!victim->IsAlive())
2550 return;
2551
2552 if ((attType == BASE_ATTACK || attType == OFF_ATTACK) && !IsWithinLOSInMap(victim))
2553 return;
2554
2555 // CombatStart puts the target into stand state, so we need to cache sit state here to know if we should crit later
2556 const bool sittingVictim = victim->GetTypeId() == TYPEID_PLAYER && (victim->IsSitState() || victim->getStandState() == UNIT_STAND_STATE_SLEEP);
2557
2558 CombatStart(victim);
2560
2561 if (attType != BASE_ATTACK && attType != OFF_ATTACK)
2562 return; // ignore ranged case
2563
2564 if (!extra && _lastExtraAttackSpell)
2565 {
2567 }
2568
2569 bool meleeAttack = true;
2570
2571 // melee attack spell casted at main hand attack only - no normal melee dmg dealt
2572 if (attType == BASE_ATTACK && m_currentSpells[CURRENT_MELEE_SPELL] && !extra)
2573 {
2574 meleeAttack = false; // The melee attack is replaced by the melee spell
2575
2577 SpellCastResult castResult = meleeSpell->CheckCast(false);
2578 if (castResult != SPELL_CAST_OK)
2579 {
2580 meleeSpell->SendCastResult(castResult);
2581 meleeSpell->SendInterrupted(0);
2582
2583 meleeSpell->finish(false);
2584 meleeSpell->SetExecutedCurrently(false);
2585
2586 if (castResult == SPELL_FAILED_NO_POWER)
2587 {
2588 // Not enough rage, do a regular melee attack instead
2589 meleeAttack = true;
2590 }
2591 }
2592 else
2593 {
2594 meleeSpell->cast(true);
2595 }
2596 }
2597 if (meleeAttack)
2598 {
2599 // attack can be redirected to another target
2600 victim = GetMeleeHitRedirectTarget(victim);
2601 CalcDamageInfo damageInfo;
2602 CalculateMeleeDamage(victim, &damageInfo, attType, sittingVictim);
2603
2604 // Send log damage message to client
2605 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
2606 {
2607 Unit::DealDamageMods(victim, damageInfo.damages[i].damage, &damageInfo.damages[i].absorb);
2608 }
2609
2610 SendAttackStateUpdate(&damageInfo);
2611
2612 //TriggerAurasProcOnEvent(damageInfo);
2613
2614 _lastDamagedTargetGuid = victim->GetGUID();
2615
2616 DealMeleeDamage(&damageInfo, true);
2617
2618 DamageInfo dmgInfo(damageInfo);
2619 Unit::ProcDamageAndSpell(damageInfo.attacker, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, damageInfo.procEx, dmgInfo.GetDamage(),
2620 damageInfo.attackType, nullptr, nullptr, -1, nullptr, &dmgInfo);
2621
2622 if (GetTypeId() == TYPEID_PLAYER)
2623 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (Player) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2624 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2625 else
2626 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (NPC) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2627 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2628
2629 // Let the pet know we've started attacking someting. Handles melee attacks only
2630 // Spells such as auto-shot and others handled in WorldSession::HandleCastSpellOpcode
2631 if (GetTypeId() == TYPEID_PLAYER && !m_Controlled.empty())
2632 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
2633 if (Unit* pet = *itr)
2634 if (pet->IsAlive() && pet->GetTypeId() == TYPEID_UNIT)
2635 pet->ToCreature()->AI()->OwnerAttacked(victim);
2636 }
2637}
#define MAX_ITEM_PROTO_DAMAGES
Definition: ItemTemplate.h:622
@ UNIT_STAND_STATE_SLEEP
Definition: Unit.h:56
@ UNIT_STATE_CANNOT_AUTOATTACK
Definition: Unit.h:368
@ UNIT_FLAG_PACIFIED
Definition: Unit.h:465
@ AURA_INTERRUPT_FLAG_MELEE_ATTACK
Definition: SpellDefines.h:56
@ SPELL_FAILED_NO_POWER
Definition: SharedDefines.h:1034
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:1347
std::string ToString() const
Definition: ObjectGuid.cpp:47
std::string ToString() const
Definition: Position.cpp:51
Definition: Unit.h:761
Definition: Unit.h:894
uint32 procAttacker
Definition: Unit.h:911
uint32 procVictim
Definition: Unit.h:912
struct CalcDamageInfo::@257 damages[MAX_ITEM_PROTO_DAMAGES]
uint32 absorb
Definition: Unit.h:902
uint32 damage
Definition: Unit.h:901
uint32 procEx
Definition: Unit.h:913
Unit * attacker
Definition: Unit.h:895
Unit * target
Definition: Unit.h:896
WeaponAttackType attackType
Definition: Unit.h:910
void SendAttackStateUpdate(CalcDamageInfo *damageInfo)
Definition: Unit.cpp:6417
void CombatStart(Unit *target, bool initialAggro=true)
Definition: Unit.cpp:13619
Unit * GetMeleeHitRedirectTarget(Unit *victim, SpellInfo const *spellInfo=nullptr)
Definition: Unit.cpp:11051
void CalculateMeleeDamage(Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
Definition: Unit.cpp:1466
static void ProcDamageAndSpell(Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition: Unit.cpp:6316
uint8 getStandState() const
Definition: Unit.h:1548
void DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
Definition: Unit.cpp:1831
static void DealDamageMods(Unit const *victim, uint32 &damage, uint32 *absorb)
Definition: Unit.cpp:805
void cast(bool skipCheck=false)
Definition: Spell.cpp:3779
void SetExecutedCurrently(bool yes)
Definition: Spell.h:560
void SendInterrupted(uint8 result)
Definition: Spell.cpp:5150
static void SendCastResult(Player *caster, SpellInfo const *spellInfo, uint8 castCount, SpellCastResult result, SpellCustomErrors customError=SPELL_CUSTOM_ERROR_NONE)
Definition: Spell.cpp:4645
void finish(bool ok=true)
Definition: Spell.cpp:4463

References _lastDamagedTargetGuid, _lastExtraAttackSpell, CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::attackType, AURA_INTERRUPT_FLAG_MELEE_ATTACK, BASE_ATTACK, CalculateMeleeDamage(), Spell::cast(), Spell::CheckCast(), CombatStart(), CURRENT_MELEE_SPELL, CalcDamageInfo::damage, CalcDamageInfo::damages, DealDamageMods(), DealMeleeDamage(), Spell::finish(), DamageInfo::GetAbsorb(), DamageInfo::GetBlock(), DamageInfo::GetDamage(), Object::GetGUID(), GetMeleeHitRedirectTarget(), DamageInfo::GetResist(), getStandState(), Object::GetTypeId(), HasUnitFlag(), HasUnitState(), IsAlive(), IsSitState(), WorldObject::IsWithinLOSInMap(), LOG_DEBUG, m_Controlled, m_currentSpells, MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, CalcDamageInfo::procAttacker, ProcDamageAndSpell(), CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RemoveAurasWithInterruptFlags(), SendAttackStateUpdate(), Spell::SendCastResult(), Spell::SendInterrupted(), Spell::SetExecutedCurrently(), SPELL_CAST_OK, SPELL_FAILED_NO_POWER, CalcDamageInfo::target, ObjectGuid::ToString(), Position::ToString(), TYPEID_PLAYER, TYPEID_UNIT, UNIT_FLAG_PACIFIED, UNIT_STAND_STATE_SLEEP, and UNIT_STATE_CANNOT_AUTOATTACK.

Referenced by UnitAI::DoMeleeAttackIfReady(), boss_zuljin::boss_zuljinAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), HandleProcExtraAttackFor(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Player::Update(), boss_dred::boss_dredAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_alar::boss_alarAI::UpdateAI(), and generic_creature::generic_creatureAI::UpdateAI().

◆ AttackStop()

bool Unit::AttackStop ( )
10408{
10409 if (!m_attacking)
10410 return false;
10411
10412 Unit* victim = m_attacking;
10413
10415 m_attacking = nullptr;
10416
10417 // Clear our target
10419
10421
10423
10424 // reset only at real combat stop
10425 if (Creature* creature = ToCreature())
10426 {
10427 creature->SetNoCallAssistance(false);
10428
10429 if (creature->HasSearchedAssistance())
10430 {
10431 creature->SetNoSearchAssistance(false);
10432 }
10433 }
10434
10435 SendMeleeAttackStop(victim);
10436
10437 return true;
10438}

References _removeAttacker(), ClearUnitState(), CURRENT_MELEE_SPELL, ObjectGuid::Empty, InterruptSpell(), m_attacking, SendMeleeAttackStop(), SetTarget(), Object::ToCreature(), and UNIT_STATE_MELEE_ATTACKING.

Referenced by PetAI::_stopAttack(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CombatStop(), boss_jedoga_shadowseeker::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_thekal::DamageTaken(), boss_viscidus::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), ScriptedAI::DoStopAttack(), Player::DuelComplete(), Spell::EffectSanctuary(), SmartAI::EnterEvadeMode(), Spell::finish(), WorldSession::HandleAttackStopOpcode(), spell_hun_scatter_shot::HandleDummy(), spell_mc_play_dead::spell_mc_play_dead_AuraScript::HandleEffectApply(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetStopAttack(), RotateMovementGenerator::Initialize(), PetAI::KilledUnit(), MotionMaster::MoveSeekAssistance(), spell_halion_twilight_phasing::spell_halion_twilight_phasing_AuraScript::OnApply(), spell_halion_twilight_phasing::spell_halion_twilight_phasing_AuraScript::OnRemove(), PetSpellFail(), RemoveCharmedBy(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SetCharmedBy(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_heigan::boss_heiganAI::StartFightPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), StopAttackFaction(), StopAttackingInvalidTarget(), boss_ouro::Submerge(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_janalai::boss_janalaiAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ BuildAuraStateUpdateForTarget()

uint32 Unit::BuildAuraStateUpdateForTarget ( Unit target) const
10536{
10538 for (AuraStateAurasMap::const_iterator itr = m_auraStateAuras.begin(); itr != m_auraStateAuras.end(); ++itr)
10539 if ((1 << (itr->first - 1)) & PER_CASTER_AURA_STATE_MASK)
10540 if (itr->second->GetBase()->GetCasterGUID() == target->GetGUID())
10541 auraStates |= (1 << (itr->first - 1));
10542
10543 return auraStates;
10544}
@ UNIT_FIELD_AURASTATE
Definition: UpdateFields.h:119
#define PER_CASTER_AURA_STATE_MASK
Definition: SharedDefines.h:1318
uint32 GetUInt32Value(uint16 index) const
Definition: Object.cpp:305

References Object::GetGUID(), Object::GetUInt32Value(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, and UNIT_FIELD_AURASTATE.

Referenced by BuildValuesUpdate().

◆ BuildCooldownPacket() [1/2]

void Unit::BuildCooldownPacket ( WorldPacket data,
uint8  flags,
PacketCooldowns const &  cooldowns 
)
21276{
21277 data.Initialize(SMSG_SPELL_COOLDOWN, 8 + 1 + (4 + 4) * cooldowns.size());
21278 data << GetGUID();
21279 data << uint8(flags);
21280 for (std::unordered_map<uint32, uint32>::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
21281 {
21282 data << uint32(itr->first);
21283 data << uint32(itr->second);
21284 }
21285}
@ SMSG_SPELL_COOLDOWN
Definition: Opcodes.h:338
void Initialize(uint16 opcode, size_t newres=200)
Definition: WorldPacket.h:69

References Object::GetGUID(), WorldPacket::Initialize(), and SMSG_SPELL_COOLDOWN.

◆ BuildCooldownPacket() [2/2]

void Unit::BuildCooldownPacket ( WorldPacket data,
uint8  flags,
uint32  spellId,
uint32  cooldown 
)

◆ BuildHeartBeatMsg()

void Unit::BuildHeartBeatMsg ( WorldPacket data) const
2074{
2075 data->Initialize(MSG_MOVE_HEARTBEAT, 32);
2076 *data << GetPackGUID();
2077 BuildMovementPacket(data);
2078}
@ MSG_MOVE_HEARTBEAT
Definition: Opcodes.h:268
void BuildMovementPacket(ByteBuffer *data) const
Definition: Unit.cpp:20171

References BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), and MSG_MOVE_HEARTBEAT.

Referenced by boss_volkhan::boss_volkhanAI::MovementInform(), and SendMovementFlagUpdate().

◆ BuildMovementPacket()

void Unit::BuildMovementPacket ( ByteBuffer data) const
20172{
20173 *data << uint32(GetUnitMovementFlags()); // movement flags
20174 *data << uint16(GetExtraUnitMovementFlags()); // 2.3.0
20175 *data << uint32(GameTime::GetGameTimeMS().count()); // time / counter
20176 *data << GetPositionX();
20177 *data << GetPositionY();
20178 *data << GetPositionZ();
20179 *data << GetOrientation();
20180
20181 // 0x00000200
20183 {
20184 if (m_vehicle)
20185 *data << m_vehicle->GetBase()->GetPackGUID();
20186 else if (GetTransport())
20187 *data << GetTransport()->GetPackGUID();
20188 else
20189 *data << (uint8)0;
20190
20191 *data << float (GetTransOffsetX());
20192 *data << float (GetTransOffsetY());
20193 *data << float (GetTransOffsetZ());
20194 *data << float (GetTransOffsetO());
20195 *data << uint32(GetTransTime());
20196 *data << uint8 (GetTransSeat());
20197
20200 }
20201
20202 // 0x02200000
20205 *data << (float)m_movementInfo.pitch;
20206
20207 *data << (uint32)m_movementInfo.fallTime;
20208
20209 // 0x00001000
20211 {
20212 *data << (float)m_movementInfo.jump.zspeed;
20213 *data << (float)m_movementInfo.jump.sinAngle;
20214 *data << (float)m_movementInfo.jump.cosAngle;
20215 *data << (float)m_movementInfo.jump.xyspeed;
20216 }
20217
20218 // 0x04000000
20220 *data << (float)m_movementInfo.splineElevation;
20221}
@ MOVEMENTFLAG_ONTRANSPORT
Definition: Unit.h:561
@ MOVEMENTFLAG_FLYING
Definition: Unit.h:577
@ MOVEMENTFLAG_FALLING
Definition: Unit.h:564
@ MOVEMENTFLAG_SWIMMING
Definition: Unit.h:573
@ MOVEMENTFLAG_SPLINE_ELEVATION
Definition: Unit.h:578
@ MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING
Definition: Unit.h:613
@ MOVEMENTFLAG2_INTERPOLATED_MOVEMENT
Definition: Unit.h:618
struct MovementInfo::JumpInfo jump
uint32 fallTime
Definition: Object.h:295
struct MovementInfo::TransportInfo transport
float splineElevation
Definition: Object.h:309
float pitch
Definition: Object.h:292
uint32 time2
Definition: Object.h:288
float cosAngle
Definition: Object.h:305
float xyspeed
Definition: Object.h:305
float zspeed
Definition: Object.h:305
float sinAngle
Definition: Object.h:305
float GetTransOffsetX() const
Definition: Object.h:586
float GetTransOffsetY() const
Definition: Object.h:587
float GetTransOffsetZ() const
Definition: Object.h:588
uint32 GetTransTime() const
Definition: Object.h:590
Transport * GetTransport() const
Definition: Object.h:585
float GetTransOffsetO() const
Definition: Object.h:589
uint32 GetUnitMovementFlags() const
Definition: Unit.h:2289
uint16 GetExtraUnitMovementFlags() const
Definition: Unit.h:2295

References MovementInfo::JumpInfo::cosAngle, MovementInfo::fallTime, MovementInfo::flags2, Vehicle::GetBase(), GetExtraUnitMovementFlags(), GameTime::GetGameTimeMS(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransOffsetO(), WorldObject::GetTransOffsetX(), WorldObject::GetTransOffsetY(), WorldObject::GetTransOffsetZ(), WorldObject::GetTransport(), WorldObject::GetTransSeat(), WorldObject::GetTransTime(), GetUnitMovementFlags(), MovementInfo::jump, WorldObject::m_movementInfo, m_vehicle, MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING, MOVEMENTFLAG2_INTERPOLATED_MOVEMENT, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_FLYING, MOVEMENTFLAG_ONTRANSPORT, MOVEMENTFLAG_SPLINE_ELEVATION, MOVEMENTFLAG_SWIMMING, MovementInfo::pitch, MovementInfo::JumpInfo::sinAngle, MovementInfo::splineElevation, MovementInfo::TransportInfo::time2, MovementInfo::transport, MovementInfo::JumpInfo::xyspeed, and MovementInfo::JumpInfo::zspeed.

Referenced by BuildHeartBeatMsg(), Object::BuildMovementUpdate(), WorldSession::HandleMoveKnockBackAck(), Player::SendTeleportAckPacket(), SendTeleportPacket(), Player::SetCanFly(), Creature::SetCanFly(), Creature::SetDisableGravity(), Player::SetDisableGravity(), Player::SetFeatherFall(), Creature::SetFeatherFall(), Player::SetHover(), SetSpeed(), Player::SetWaterWalking(), and Creature::SetWaterWalking().

◆ BuildValuesUpdate()

void Unit::BuildValuesUpdate ( uint8  updatetype,
ByteBuffer data,
Player target 
) const
overrideprotectedvirtual

Reimplemented from Object.

21058{
21059 if (!target)
21060 return;
21061
21062 ByteBuffer fieldBuffer;
21063
21064 UpdateMask updateMask;
21065 updateMask.SetCount(m_valuesCount);
21066
21068 uint32 visibleFlag = UF_FLAG_PUBLIC;
21069
21070 if (target == this)
21071 visibleFlag |= UF_FLAG_PRIVATE;
21072
21074 if (GetOwnerGUID() == target->GetGUID())
21075 visibleFlag |= UF_FLAG_OWNER;
21076
21079 visibleFlag |= UF_FLAG_SPECIAL_INFO;
21080
21081 if (plr && plr->IsInSameRaidWith(target))
21082 visibleFlag |= UF_FLAG_PARTY_MEMBER;
21083
21084 Creature const* creature = ToCreature();
21085 for (uint16 index = 0; index < m_valuesCount; ++index)
21086 {
21087 if (_fieldNotifyFlags & flags[index] ||
21088 ((flags[index] & visibleFlag) & UF_FLAG_SPECIAL_INFO) ||
21089 ((updateType == UPDATETYPE_VALUES ? _changesMask.GetBit(index) : m_uint32Values[index]) && (flags[index] & visibleFlag)) ||
21091 {
21092 updateMask.SetBit(index);
21093
21094 if (index == UNIT_NPC_FLAGS)
21095 {
21096 uint32 appendValue = m_uint32Values[UNIT_NPC_FLAGS];
21097
21098 if (creature)
21099 {
21100 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && appendValue & UNIT_NPC_FLAG_FLIGHTMASTER)
21101 {
21102 appendValue |= UNIT_NPC_FLAG_GOSSIP; // flight masters need NPC gossip flag to show instant flight toggle option
21103 }
21104
21105 if (!target->CanSeeSpellClickOn(creature))
21106 {
21107 appendValue &= ~UNIT_NPC_FLAG_SPELLCLICK;
21108 }
21109
21110 if (!target->CanSeeVendor(creature))
21111 {
21112 appendValue &= ~UNIT_NPC_FLAG_VENDOR_MASK;
21113 }
21114
21115 if (!creature->IsValidTrainerForPlayer(target, &appendValue))
21116 {
21117 appendValue &= ~UNIT_NPC_FLAG_TRAINER;
21118 }
21119 }
21120
21121 fieldBuffer << uint32(appendValue);
21122 }
21123 else if (index == UNIT_FIELD_AURASTATE)
21124 {
21125 // Check per caster aura states to not enable using a spell in client if specified aura is not by target
21126 fieldBuffer << BuildAuraStateUpdateForTarget(target);
21127 }
21128 // FIXME: Some values at server stored in float format but must be sent to client in uint32 format
21129 else if (index >= UNIT_FIELD_BASEATTACKTIME && index <= UNIT_FIELD_RANGEDATTACKTIME)
21130 {
21131 // convert from float to uint32 and send
21132 fieldBuffer << uint32(m_floatValues[index] < 0 ? 0 : m_floatValues[index]);
21133 }
21134 // there are some float values which may be negative or can't get negative due to other checks
21135 else if ((index >= UNIT_FIELD_NEGSTAT0 && index <= UNIT_FIELD_NEGSTAT4) ||
21138 (index >= UNIT_FIELD_POSSTAT0 && index <= UNIT_FIELD_POSSTAT4))
21139 {
21140 fieldBuffer << uint32(m_floatValues[index]);
21141 }
21142 // Gamemasters should be always able to select units - remove not selectable flag
21143 else if (index == UNIT_FIELD_FLAGS)
21144 {
21145 uint32 appendValue = m_uint32Values[UNIT_FIELD_FLAGS];
21146 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
21147 appendValue &= ~UNIT_FLAG_NOT_SELECTABLE;
21148
21149 fieldBuffer << uint32(appendValue);
21150 }
21151 // use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures
21152 else if (index == UNIT_FIELD_DISPLAYID)
21153 {
21155 if (creature)
21156 {
21157 CreatureTemplate const* cinfo = creature->GetCreatureTemplate();
21158
21159 // this also applies for transform auras
21160 if (SpellInfo const* transform = sSpellMgr->GetSpellInfo(getTransForm()))
21161 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
21162 if (transform->Effects[i].IsAura(SPELL_AURA_TRANSFORM))
21163 if (CreatureTemplate const* transformInfo = sObjectMgr->GetCreatureTemplate(transform->Effects[i].MiscValue))
21164 {
21165 cinfo = transformInfo;
21166 break;
21167 }
21168
21170 {
21171 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
21172 {
21173 if (cinfo->Modelid1)
21174 displayId = cinfo->Modelid1; // Modelid1 is a visible model for gms
21175 else
21176 displayId = 17519; // world visible trigger's model
21177 }
21178 else
21179 {
21180 if (cinfo->Modelid2)
21181 displayId = cinfo->Modelid2; // Modelid2 is an invisible model for players
21182 else
21183 displayId = 11686; // world invisible trigger's model
21184 }
21185 }
21186 }
21187
21188 fieldBuffer << uint32(displayId);
21189 }
21190 // hide lootable animation for unallowed players
21191 else if (index == UNIT_DYNAMIC_FLAGS)
21192 {
21194
21195 if (creature)
21196 {
21197 if (creature->hasLootRecipient())
21198 {
21199 dynamicFlags |= UNIT_DYNFLAG_TAPPED;
21200 if (creature->isTappedBy(target))
21201 dynamicFlags |= UNIT_DYNFLAG_TAPPED_BY_PLAYER;
21202 }
21203
21204 if (!target->isAllowedToLoot(creature))
21205 dynamicFlags &= ~UNIT_DYNFLAG_LOOTABLE;
21206 }
21207
21208 // unit UNIT_DYNFLAG_TRACK_UNIT should only be sent to caster of SPELL_AURA_MOD_STALKED auras
21209 if (dynamicFlags & UNIT_DYNFLAG_TRACK_UNIT)
21211 dynamicFlags &= ~UNIT_DYNFLAG_TRACK_UNIT;
21212
21213 fieldBuffer << dynamicFlags;
21214 }
21215 // FG: pretend that OTHER players in own group are friendly ("blue")
21216 else if (index == UNIT_FIELD_BYTES_2 || index == UNIT_FIELD_FACTIONTEMPLATE)
21217 {
21218 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
21219 {
21221 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
21222 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
21223 {
21224 if (index == UNIT_FIELD_BYTES_2)
21225 // Allow targetting opposite faction in party when enabled in config
21226 fieldBuffer << (m_uint32Values[UNIT_FIELD_BYTES_2] & ((UNIT_BYTE2_FLAG_SANCTUARY /*| UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5*/) << 8)); // this flag is at uint8 offset 1 !!
21227 else
21228 // pretend that all other HOSTILE players have own faction, to allow follow, heal, rezz (trade wont work)
21229 fieldBuffer << uint32(target->GetFaction());
21230 }
21231 else
21232 fieldBuffer << m_uint32Values[index];
21233 }// pussywizard / Callmephil
21234 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
21235 (this->GetTypeId() == TYPEID_PLAYER || this->GetTypeId() == TYPEID_UNIT || this->GetTypeId() == TYPEID_DYNAMICOBJECT))
21236 {
21237 if (index == UNIT_FIELD_BYTES_2)
21238 fieldBuffer << (m_uint32Values[index] & 0xFFFFF2FF); // clear UNIT_BYTE2_FLAG_PVP, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY
21239 else
21240 fieldBuffer << (uint32)target->GetFaction();
21241 }
21242 else
21243 if (!sScriptMgr->IsCustomBuildValuesUpdate(this, updateType, fieldBuffer, target, index))
21244 {
21245 fieldBuffer << m_uint32Values[index];
21246 }
21247 }
21248 else
21249 {
21250 if (sScriptMgr->OnBuildValuesUpdate(this, updateType, fieldBuffer, target, index))
21251 {
21252 continue;
21253 }
21254
21255 // send in current format (float as float, uint32 as uint32)
21256 fieldBuffer << m_uint32Values[index];
21257 }
21258 }
21259 }
21260
21261 *data << uint8(updateMask.GetBlockCount());
21262 updateMask.AppendToPacket(data);
21263 data->append(fieldBuffer);
21264}
@ CREATURE_FLAG_EXTRA_TRIGGER
Definition: CreatureData.h:56
@ TYPEID_DYNAMICOBJECT
Definition: ObjectGuid.h:40
@ UPDATETYPE_VALUES
Definition: UpdateData.h:28
uint32 UnitUpdateFieldFlags[PLAYER_END]
Definition: UpdateFieldFlags.cpp:162
@ UF_FLAG_SPECIAL_INFO
Definition: UpdateFieldFlags.h:32
@ UF_FLAG_PUBLIC
Definition: UpdateFieldFlags.h:27
@ UF_FLAG_OWNER
Definition: UpdateFieldFlags.h:29
@ UF_FLAG_PRIVATE
Definition: UpdateFieldFlags.h:28
@ UF_FLAG_PARTY_MEMBER
Definition: UpdateFieldFlags.h:33
@ UNIT_NPC_FLAGS
Definition: UpdateFields.h:139
@ UNIT_FIELD_RANGEDATTACKTIME
Definition: UpdateFields.h:121
@ UNIT_FIELD_DISPLAYID
Definition: UpdateFields.h:124
@ UNIT_FIELD_FACTIONTEMPLATE
Definition: UpdateFields.h:115
@ UNIT_FIELD_POSSTAT4
Definition: UpdateFields.h:150
@ UNIT_FIELD_NEGSTAT4
Definition: UpdateFields.h:155
@ UNIT_FIELD_FLAGS
Definition: UpdateFields.h:117
@ UNIT_DYNAMIC_FLAGS
Definition: UpdateFields.h:136
@ UNIT_NPC_FLAG_GOSSIP
Definition: Unit.h:516
@ UNIT_NPC_FLAG_FLIGHTMASTER
Definition: Unit.h:529
@ UNIT_BYTE2_FLAG_SANCTUARY
Definition: Unit.h:139
#define sObjectMgr
Definition: ObjectMgr.h:1640
@ SPELL_AURA_EMPATHY
Definition: SpellAuraDefines.h:184
@ SPELL_AURA_MOD_STALKED
Definition: SpellAuraDefines.h:131
@ SPELL_AURA_TRANSFORM
Definition: SpellAuraDefines.h:119
@ CONFIG_INSTANT_TAXI
Definition: IWorld.h:382
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition: IWorld.h:80
@ UNIT_DYNFLAG_SPECIALINFO
Definition: SharedDefines.h:3125
@ UNIT_DYNFLAG_TAPPED_BY_PLAYER
Definition: SharedDefines.h:3124
@ UNIT_DYNFLAG_TAPPED
Definition: SharedDefines.h:3123
@ UNIT_DYNFLAG_LOOTABLE
Definition: SharedDefines.h:3121
@ UNIT_DYNFLAG_TRACK_UNIT
Definition: SharedDefines.h:3122
bool IsValidTrainerForPlayer(Player *player, uint32 *npcFlags=nullptr) const
Definition: Creature.cpp:1203
bool hasLootRecipient() const
Definition: Creature.h:225
bool isTappedBy(Player const *player) const
Definition: Creature.cpp:1319
Definition: CreatureData.h:176
uint32 Modelid1
Definition: CreatureData.h:180
uint32 Modelid2
Definition: CreatureData.h:181
uint16 _fieldNotifyFlags
Definition: Object.h:244
bool HasDynamicFlag(uint32 flag) const
Definition: Object.h:116
UpdateMask _changesMask
Definition: Object.h:240
uint32 * m_uint32Values
Definition: Object.h:236
uint16 m_valuesCount
Definition: Object.h:242
bool HasFlag(uint16 index, uint32 flag) const
Definition: Object.cpp:889
float * m_floatValues
Definition: Object.h:237
Map * FindMap() const
Definition: Object.h:518
Definition: UpdateMask.h:26
uint32 GetBlockCount() const
Definition: UpdateMask.h:63
bool GetBit(uint32 index) const
Definition: UpdateMask.h:48
void SetCount(uint32 valuesCount)
Definition: UpdateMask.h:66
void SetBit(uint32 index)
Definition: UpdateMask.h:46
void AppendToPacket(ByteBuffer *data)
Definition: UpdateMask.h:50
bool isAllowedToLoot(Creature const *creature)
Definition: PlayerStorage.cpp:5642
bool IsInSameRaidWith(Player const *p) const
Definition: Player.h:1849
WorldSession * GetSession() const
Definition: Player.h:1961
bool CanSeeVendor(Creature const *creature) const
Definition: Player.cpp:14218
bool IsSpectator() const
Definition: Player.h:2539
bool CanSeeSpellClickOn(Creature const *creature) const
Definition: Player.cpp:14195
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition: Unit.cpp:10615
bool HasAuraTypeWithCaster(AuraType auratype, ObjectGuid caster) const
Definition: Unit.cpp:5648
uint32 GetFaction() const
Definition: Unit.h:1509
uint32 BuildAuraStateUpdateForTarget(Unit *target) const
Definition: Unit.cpp:10535
bool IsInRaidWith(Unit const *unit) const
Definition: Unit.cpp:19061
ObjectGuid GetOwnerGUID() const
Definition: Unit.h:1828
uint32 getTransForm() const
Definition: Unit.h:2188
bool IsBattleArena() const
Definition: Map.h:455
bool IsGMAccount() const
Definition: WorldSession.cpp:179
bool IsFriendlyTo(FactionTemplateEntry const &entry) const
Definition: DBCStructure.h:942
Definition: ByteBuffer.h:70
void append(T value)
Definition: ByteBuffer.h:129

References Object::_changesMask, Object::_fieldNotifyFlags, ByteBuffer::append(), UpdateMask::AppendToPacket(), BuildAuraStateUpdateForTarget(), Player::CanSeeSpellClickOn(), Player::CanSeeVendor(), CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP, CONFIG_INSTANT_TAXI, CREATURE_FLAG_EXTRA_TRIGGER, WorldObject::FindMap(), CreatureTemplate::flags_extra, UpdateMask::GetBit(), UpdateMask::GetBlockCount(), GetCharmerOrOwnerPlayerOrPlayerItself(), Creature::GetCreatureTemplate(), GetFaction(), GetFactionTemplateEntry(), Object::GetGUID(), GetOwnerGUID(), Player::GetSession(), getTransForm(), HasAuraTypeWithCaster(), Object::HasDynamicFlag(), Object::HasFlag(), Creature::hasLootRecipient(), Player::isAllowedToLoot(), Map::IsBattleArena(), IsControlledByPlayer(), FactionTemplateEntry::IsFriendlyTo(), Player::IsGameMaster(), WorldSession::IsGMAccount(), IsInRaidWith(), Player::IsInSameRaidWith(), Player::IsSpectator(), Creature::isTappedBy(), Creature::IsValidTrainerForPlayer(), Object::m_floatValues, Object::m_uint32Values, Object::m_valuesCount, MAX_SPELL_EFFECTS, CreatureTemplate::Modelid1, CreatureTemplate::Modelid2, PER_CASTER_AURA_STATE_MASK, UpdateMask::SetBit(), UpdateMask::SetCount(), sObjectMgr, SPELL_AURA_EMPATHY, SPELL_AURA_MOD_STALKED, SPELL_AURA_TRANSFORM, sScriptMgr, sSpellMgr, sWorld, Object::ToCreature(), TYPEID_DYNAMICOBJECT, TYPEID_PLAYER, TYPEID_UNIT, UF_FLAG_OWNER, UF_FLAG_PARTY_MEMBER, UF_FLAG_PRIVATE, UF_FLAG_PUBLIC, UF_FLAG_SPECIAL_INFO, UNIT_BYTE2_FLAG_SANCTUARY, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE, UNIT_DYNFLAG_SPECIALINFO, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_DYNFLAG_TRACK_UNIT, UNIT_FIELD_AURASTATE, UNIT_FIELD_BASEATTACKTIME, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FACTIONTEMPLATE, UNIT_FIELD_FLAGS, UNIT_FIELD_NEGSTAT0, UNIT_FIELD_NEGSTAT4, UNIT_FIELD_POSSTAT0, UNIT_FIELD_POSSTAT4, UNIT_FIELD_RANGEDATTACKTIME, UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE, UNIT_NPC_FLAG_FLIGHTMASTER, UNIT_NPC_FLAG_GOSSIP, UNIT_NPC_FLAGS, UnitUpdateFieldFlags, and UPDATETYPE_VALUES.

◆ CalcAbsorbResist()

void Unit::CalcAbsorbResist ( DamageInfo dmgInfo,
bool  Splited = false 
)
static
2128{
2129 Unit* victim = dmgInfo.GetVictim();
2130 Unit* attacker = dmgInfo.GetAttacker();
2131 uint32 damage = dmgInfo.GetDamage();
2132 SpellSchoolMask schoolMask = dmgInfo.GetSchoolMask();
2133 SpellInfo const* spellInfo = dmgInfo.GetSpellInfo();
2134
2135 if (!victim || !victim->IsAlive() || !damage)
2136 return;
2137
2138 // Magic damage, check for resists
2139 // Ignore spells that cant be resisted
2140 // Xinef: holy resistance exists for npcs
2141 if (!(schoolMask & SPELL_SCHOOL_MASK_NORMAL) && (!(schoolMask & SPELL_SCHOOL_MASK_HOLY) || victim->GetTypeId() == TYPEID_UNIT) && (!spellInfo || (!spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))))
2142 {
2143 float averageResist = Unit::GetEffectiveResistChance(attacker, schoolMask, victim);
2144
2145 float discreteResistProbability[11];
2146 for (uint32 i = 0; i < 11; ++i)
2147 {
2148 discreteResistProbability[i] = 0.5f - 2.5f * std::fabs(0.1f * i - averageResist);
2149 if (discreteResistProbability[i] < 0.0f)
2150 discreteResistProbability[i] = 0.0f;
2151 }
2152
2153 if (averageResist <= 0.1f)
2154 {
2155 discreteResistProbability[0] = 1.0f - 7.5f * averageResist;
2156 discreteResistProbability[1] = 5.0f * averageResist;
2157 discreteResistProbability[2] = 2.5f * averageResist;
2158 }
2159
2160 float r = float(rand_norm());
2161 uint32 i = 0;
2162 float probabilitySum = discreteResistProbability[0];
2163
2164 while (r >= probabilitySum && i < 10)
2165 probabilitySum += discreteResistProbability[++i];
2166
2167 float damageResisted = float(damage * i / 10);
2168
2169 if (damageResisted) // if equal to 0, checking these is pointless
2170 {
2171 if (attacker)
2172 {
2174 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2175 if (((*j)->GetMiscValue() & schoolMask) && (*j)->IsAffectedOnSpell(spellInfo))
2176 AddPct(damageResisted, -(*j)->GetAmount());
2177
2179 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2180 if ((*j)->GetMiscValue() & schoolMask)
2181 AddPct(damageResisted, -(*j)->GetAmount());
2182 }
2183
2184 // pussywizard:
2185 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC))
2186 {
2187 uint32 damageAfterArmor = Unit::CalcArmorReducedDamage(attacker, victim, damage, spellInfo, 0, BASE_ATTACK);
2188 uint32 armorReduction = damage - damageAfterArmor;
2189 if (armorReduction < damageResisted) // pick the lower one, the weakest resistance counts
2190 damageResisted = armorReduction;
2191 }
2192 }
2193
2194 dmgInfo.ResistDamage(uint32(damageResisted));
2195 }
2196
2197 // Ignore Absorption Auras
2198 float auraAbsorbMod = 0;
2199 if (attacker)
2200 {
2202 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasA.begin(); itr != AbsIgnoreAurasA.end(); ++itr)
2203 {
2204 if (!((*itr)->GetMiscValue() & schoolMask))
2205 continue;
2206
2207 if ((*itr)->GetAmount() > auraAbsorbMod)
2208 auraAbsorbMod = float((*itr)->GetAmount());
2209 }
2210
2212 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasB.begin(); itr != AbsIgnoreAurasB.end(); ++itr)
2213 {
2214 if (!((*itr)->GetMiscValue() & schoolMask))
2215 continue;
2216
2217 if (((*itr)->GetAmount() > auraAbsorbMod) && (*itr)->IsAffectedOnSpell(spellInfo))
2218 auraAbsorbMod = float((*itr)->GetAmount());
2219 }
2220 RoundToInterval(auraAbsorbMod, 0.0f, 100.0f);
2221 }
2222
2223 // We're going to call functions which can modify content of the list during iteration over it's elements
2224 // Let's copy the list so we can prevent iterator invalidation
2226 vSchoolAbsorbCopy.sort(Acore::AbsorbAuraOrderPred());
2227
2228 // absorb without mana cost
2229 for (AuraEffectList::iterator itr = vSchoolAbsorbCopy.begin(); (itr != vSchoolAbsorbCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2230 {
2231 AuraEffect* absorbAurEff = *itr;
2232 // Check if aura was removed during iteration - we don't need to work on such auras
2233 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2234 if (!aurApp)
2235 continue;
2236 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2237 continue;
2238
2239 // get amount which can be still absorbed by the aura
2240 int32 currentAbsorb = absorbAurEff->GetAmount();
2241 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2242 if (currentAbsorb < 0)
2243 currentAbsorb = 0;
2244
2245 uint32 tempAbsorb = uint32(currentAbsorb);
2246
2247 bool defaultPrevented = false;
2248
2249 absorbAurEff->GetBase()->CallScriptEffectAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2250 currentAbsorb = tempAbsorb;
2251
2252 if (defaultPrevented)
2253 continue;
2254
2255 // absorb must be smaller than the damage itself
2256 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2257
2258 // xinef: do this after absorb is rounded to damage...
2259 AddPct(currentAbsorb, -auraAbsorbMod);
2260
2261 dmgInfo.AbsorbDamage(currentAbsorb);
2262
2263 tempAbsorb = currentAbsorb;
2264 absorbAurEff->GetBase()->CallScriptEffectAfterAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2265
2266 // Check if our aura is using amount to count damage
2267 if (absorbAurEff->GetAmount() >= 0)
2268 {
2269 // Reduce shield amount
2270 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2271 // Aura cannot absorb anything more - remove it
2272 if (absorbAurEff->GetAmount() <= 0)
2273 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2274 }
2275 }
2276
2277 // absorb by mana cost
2279 for (AuraEffectList::const_iterator itr = vManaShieldCopy.begin(); (itr != vManaShieldCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2280 {
2281 AuraEffect* absorbAurEff = *itr;
2282 // Check if aura was removed during iteration - we don't need to work on such auras
2283 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2284 if (!aurApp)
2285 continue;
2286 // check damage school mask
2287 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2288 continue;
2289
2290 // get amount which can be still absorbed by the aura
2291 int32 currentAbsorb = absorbAurEff->GetAmount();
2292 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2293 if (currentAbsorb < 0)
2294 currentAbsorb = 0;
2295
2296 uint32 tempAbsorb = currentAbsorb;
2297
2298 bool defaultPrevented = false;
2299
2300 absorbAurEff->GetBase()->CallScriptEffectManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2301 currentAbsorb = tempAbsorb;
2302
2303 if (defaultPrevented)
2304 continue;
2305
2306 // absorb must be smaller than the damage itself
2307 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2308
2309 // xinef: do this after absorb is rounded to damage...
2310 AddPct(currentAbsorb, -auraAbsorbMod);
2311
2312 int32 manaReduction = currentAbsorb;
2313
2314 // lower absorb amount by talents
2315 if (float manaMultiplier = absorbAurEff->GetSpellInfo()->Effects[absorbAurEff->GetEffIndex()].CalcValueMultiplier(absorbAurEff->GetCaster()))
2316 manaReduction = int32(float(manaReduction) * manaMultiplier);
2317
2318 int32 manaTaken = -victim->ModifyPower(POWER_MANA, -manaReduction);
2319
2320 // take case when mana has ended up into account
2321 currentAbsorb = currentAbsorb ? int32(float(currentAbsorb) * (float(manaTaken) / float(manaReduction))) : 0;
2322
2323 dmgInfo.AbsorbDamage(currentAbsorb);
2324
2325 tempAbsorb = currentAbsorb;
2326 absorbAurEff->GetBase()->CallScriptEffectAfterManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2327
2328 // Check if our aura is using amount to count damage
2329 if (absorbAurEff->GetAmount() >= 0)
2330 {
2331 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2332 if ((absorbAurEff->GetAmount() <= 0))
2333 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2334 }
2335 }
2336
2337 // split damage auras - only when not damaging self
2338 // Xinef: not true - Warlock Hellfire
2339 if (/*victim != attacker &&*/ !Splited)
2340 {
2341 // We're going to call functions which can modify content of the list during iteration over it's elements
2342 // Let's copy the list so we can prevent iterator invalidation
2344 for (AuraEffectList::iterator itr = vSplitDamageFlatCopy.begin(); (itr != vSplitDamageFlatCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2345 {
2346 // Check if aura was removed during iteration - we don't need to work on such auras
2347 if (!((*itr)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
2348 continue;
2349 // check damage school mask
2350 if (!((*itr)->GetMiscValue() & schoolMask))
2351 continue;
2352
2353 // Damage can be splitted only if aura has an alive caster
2354 Unit* caster = (*itr)->GetCaster();
2355 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2356 continue;
2357
2358 int32 splitDamage = (*itr)->GetAmount();
2359
2360 // absorb must be smaller than the damage itself
2361 splitDamage = RoundToInterval(splitDamage, 0, int32(dmgInfo.GetDamage()));
2362
2363 dmgInfo.AbsorbDamage(splitDamage);
2364
2365 uint32 splitted = splitDamage;
2366 uint32 splitted_absorb = 0;
2367 uint32 splitted_resist = 0;
2368
2369 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2370 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, schoolMask, dmgInfo.GetDamageType());
2371 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2372 {
2373 procEx |= PROC_EX_IMMUNE;
2374 splittedDmgInfo.AbsorbDamage(splitted);
2375 }
2376 else
2377 {
2378 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2379 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2380 }
2381
2382 splitted_absorb = splittedDmgInfo.GetAbsorb();
2383 splitted_resist = splittedDmgInfo.GetResist();
2384 splitted = splittedDmgInfo.GetDamage();
2385
2386 // create procs
2387 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2388 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted, nullptr, -1, nullptr, &splittedDmgInfo);
2389
2390 if (attacker)
2391 {
2392 attacker->SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo(), splitted, schoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2393 }
2394
2395 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2396 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, schoolMask, (*itr)->GetSpellInfo(), false);
2397 }
2398
2399 // We're going to call functions which can modify content of the list during iteration over it's elements
2400 // Let's copy the list so we can prevent iterator invalidation
2402 for (AuraEffectList::iterator itr = vSplitDamagePctCopy.begin(), next; (itr != vSplitDamagePctCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2403 {
2404 // Check if aura was removed during iteration - we don't need to work on such auras
2405 AuraApplication const* aurApp = (*itr)->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2406 if (!aurApp)
2407 continue;
2408
2409 // check damage school mask
2410 if (!((*itr)->GetMiscValue() & schoolMask))
2411 continue;
2412
2413 // Damage can be splitted only if aura has an alive caster
2414 Unit* caster = (*itr)->GetCaster();
2415 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2416 continue;
2417
2418 // Xinef: Single Target splits require LoS
2419 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2420 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect() && !splitSpellInfo->HasAttribute(SPELL_ATTR2_IGNORE_LINE_OF_SIGHT))
2421 if (!caster->IsWithinLOSInMap(victim) || !caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2422 continue;
2423
2424 uint32 splitDamage = CalculatePct(dmgInfo.GetDamage(), (*itr)->GetAmount());
2425 SpellSchoolMask splitSchoolMask = schoolMask;
2426
2427 (*itr)->GetBase()->CallScriptEffectSplitHandlers(*itr, aurApp, dmgInfo, splitDamage);
2428
2429 // absorb must be smaller than the damage itself
2430 splitDamage = RoundToInterval(splitDamage, uint32(0), uint32(dmgInfo.GetDamage()));
2431
2432 // Roar of Sacrifice, dont absorb it
2433 if (splitSpellInfo->Id != 53480)
2434 dmgInfo.AbsorbDamage(splitDamage);
2435 else
2436 splitSchoolMask = SPELL_SCHOOL_MASK_NATURE;
2437
2438 uint32 splitted = splitDamage;
2439 uint32 splitted_absorb = 0;
2440 uint32 splitted_resist = 0;
2441
2442 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2443 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, splitSchoolMask, dmgInfo.GetDamageType());
2444 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2445 {
2446 procEx |= PROC_EX_IMMUNE;
2447 splittedDmgInfo.AbsorbDamage(splitted);
2448 }
2449 else
2450 {
2451 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2452 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2453 }
2454
2455 splitted_absorb = splittedDmgInfo.GetAbsorb();
2456 splitted_resist = splittedDmgInfo.GetResist();
2457 splitted = splittedDmgInfo.GetDamage();
2458
2459 // create procs
2460 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2461 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted);
2462
2463 if (attacker)
2464 {
2465 attacker->SendSpellNonMeleeDamageLog(caster, splitSpellInfo, splitted, splitSchoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2466 }
2467
2468 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2469 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, splitSchoolMask, splitSpellInfo, false);
2470 }
2471 }
2472}
double rand_norm()
Definition: Random.cpp:77
T AddPct(T &base, U pct)
Definition: Util.h:67
T RoundToInterval(T &num, T floor, T ceil)
Definition: Util.h:79
T CalculatePct(T base, U pct)
Definition: Util.h:61
void createProcFlags(SpellInfo const *spellInfo, WeaponAttackType attackType, bool positive, uint32 &procAttacker, uint32 &procVictim)
Definition: Unit.cpp:16188
@ DIRECT_DAMAGE
Definition: Unit.h:435
@ MELEE_HIT_NORMAL
Definition: Unit.h:717
@ SPELL_AURA_MANA_SHIELD
Definition: SpellAuraDefines.h:160
@ SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL
Definition: SpellAuraDefines.h:257
@ SPELL_AURA_MOD_IGNORE_TARGET_RESIST
Definition: SpellAuraDefines.h:332
@ SPELL_AURA_SPLIT_DAMAGE_FLAT
Definition: SpellAuraDefines.h:216
@ SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL
Definition: SpellAuraDefines.h:258
@ SPELL_AURA_SPLIT_DAMAGE_PCT
Definition: SpellAuraDefines.h:144
@ SPELL_AURA_SCHOOL_ABSORB
Definition: SpellAuraDefines.h:132
@ SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST
Definition: SpellAuraDefines.h:333
@ AURA_REMOVE_BY_ENEMY_SPELL
Definition: SpellAuraDefines.h:394
@ SPELL_ATTR0_CU_BINARY_SPELL
Definition: SpellInfo.h:196
@ SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC
Definition: SpellInfo.h:199
@ PROC_EX_NORMAL_HIT
Definition: SpellMgr.h:194
@ PROC_EX_IMMUNE
Definition: SpellMgr.h:202
@ POWER_MANA
Definition: SharedDefines.h:269
@ SPELL_ATTR2_IGNORE_LINE_OF_SIGHT
Definition: SharedDefines.h:458
@ SPELL_ATTR4_NO_CAST_LOG
Definition: SharedDefines.h:530
SpellSchoolMask
Definition: SharedDefines.h:295
@ SPELL_SCHOOL_MASK_NORMAL
Definition: SharedDefines.h:297
@ SPELL_SCHOOL_MASK_NATURE
Definition: SharedDefines.h:300
@ SPELL_SCHOOL_MASK_HOLY
Definition: SharedDefines.h:298
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition: Object.cpp:1316
Definition: Unit.h:746
void ResistDamage(uint32 amount)
Definition: Unit.cpp:161
void AbsorbDamage(uint32 amount)
Definition: Unit.cpp:154
Unit * GetVictim() const
Definition: Unit.h:790
Unit * GetAttacker() const
Definition: Unit.h:789
SpellInfo const * GetSpellInfo() const
Definition: Unit.h:791
DamageEffectType GetDamageType() const
Definition: Unit.h:793
SpellSchoolMask GetSchoolMask() const
Definition: Unit.h:792
uint32 GetDamage() const
Definition: Unit.h:795
int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition: Unit.cpp:14137
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition: Unit.h:1981
static uint32 CalcArmorReducedDamage(Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
Definition: Unit.cpp:2011
static float GetEffectiveResistChance(Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
Definition: Unit.cpp:2093
void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage *log)
Definition: Unit.cpp:6248
void ProcDamageAndSpellFor(bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition: Unit.cpp:16322
std::list< AuraEffect * > AuraEffectList
Definition: Unit.h:1318
bool IsImmunedToDamageOrSchool(SpellSchoolMask meleeSchoolMask) const
Definition: Unit.cpp:12895
static void CalcAbsorbResist(DamageInfo &dmgInfo, bool Splited=false)
Definition: Unit.cpp:2127
static uint32 DealDamage(Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
Definition: Unit.cpp:815
Definition: SpellAuraEffects.h:39
SpellInfo const * GetSpellInfo() const
Definition: SpellAuraEffects.h:54
void SetAmount(int32 amount)
Definition: SpellAuraEffects.h:66
Unit * GetCaster() const
Definition: SpellAuraEffects.h:47
int32 GetMiscValue() const
Definition: SpellAuraEffects.cpp:442
Aura * GetBase() const
Definition: SpellAuraEffects.h:49
uint32 GetEffIndex() const
Definition: SpellAuraEffects.h:56
int32 GetAmount() const
Definition: SpellAuraEffects.h:64
Definition: SpellAuraEffects.h:349
void CallScriptEffectAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition: SpellAuras.cpp:2573
void CallScriptEffectAfterAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition: SpellAuras.cpp:2591
void CallScriptEffectManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition: SpellAuras.cpp:2605
void CallScriptEffectAfterManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition: SpellAuras.cpp:2619
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition: SpellInfo.h:391
float GetMaxRange(bool positive=false, Unit *caster=nullptr, Spell *spell=nullptr) const
Definition: SpellInfo.cpp:2309
bool IsPositive() const
Definition: SpellInfo.cpp:1224

References DamageInfo::AbsorbDamage(), AddPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, CalcAbsorbResist(), CalcArmorReducedDamage(), CalculatePct(), Aura::CallScriptEffectAbsorbHandlers(), Aura::CallScriptEffectAfterAbsorbHandlers(), Aura::CallScriptEffectAfterManaShieldHandlers(), Aura::CallScriptEffectManaShieldHandlers(), createProcFlags(), DealDamage(), DealDamageMods(), DIRECT_DAMAGE, SpellInfo::Effects, DamageInfo::GetAbsorb(), AuraEffect::GetAmount(), Aura::GetApplicationOfTarget(), DamageInfo::GetAttacker(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraApplication::GetBase(), AuraEffect::GetCaster(), DamageInfo::GetDamage(), DamageInfo::GetDamageType(), GetEffectiveResistChance(), AuraEffect::GetEffIndex(), Object::GetGUID(), SpellInfo::GetMaxRange(), AuraEffect::GetMiscValue(), DamageInfo::GetResist(), DamageInfo::GetSchoolMask(), DamageInfo::GetSpellInfo(), AuraEffect::GetSpellInfo(), Object::GetTypeId(), DamageInfo::GetVictim(), SpellInfo::HasAttribute(), SpellInfo::Id, IsAlive(), IsImmunedToDamageOrSchool(), Object::IsInWorld(), SpellInfo::IsPositive(), WorldObject::IsWithinDist(), WorldObject::IsWithinLOSInMap(), MELEE_HIT_NORMAL, ModifyPower(), POWER_MANA, PROC_EX_IMMUNE, PROC_EX_NORMAL_HIT, ProcDamageAndSpellFor(), rand_norm(), Aura::Remove(), DamageInfo::ResistDamage(), RoundToInterval(), SendSpellNonMeleeDamageLog(), AuraEffect::SetAmount(), SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC, SPELL_ATTR2_IGNORE_LINE_OF_SIGHT, SPELL_ATTR4_NO_CAST_LOG, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL, SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL, SPELL_AURA_SCHOOL_ABSORB, SPELL_AURA_SPLIT_DAMAGE_FLAT, SPELL_AURA_SPLIT_DAMAGE_PCT, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NATURE, SPELL_SCHOOL_MASK_NORMAL, and TYPEID_UNIT.

Referenced by CalcAbsorbResist(), CalculateSpellDamageTaken(), DealDamage(), DealMeleeDamage(), Player::EnvironmentalDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and spell_valkyr_touch::spell_valkyr_touchAuraScript::PrepareAuraScript().

◆ CalcArmorReducedDamage()

uint32 Unit::CalcArmorReducedDamage ( Unit const *  attacker,
Unit const *  victim,
const uint32  damage,
SpellInfo const *  spellInfo,
uint8  attackerLevel = 0,
WeaponAttackType  attackType = MAX_ATTACK 
)
static
2012{
2013 float armor = float(victim->GetArmor());
2014
2015 // Ignore enemy armor by SPELL_AURA_MOD_TARGET_RESISTANCE aura
2016 if (attacker)
2017 {
2018 armor += attacker->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL);
2019
2020 if (spellInfo)
2021 if (Player* modOwner = attacker->GetSpellModOwner())
2022 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_IGNORE_ARMOR, armor);
2023
2024 AuraEffectList const& ResIgnoreAurasAb = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST);
2025 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2026 {
2027 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL
2028 && (*j)->IsAffectedOnSpell(spellInfo))
2029 armor = floor(AddPct(armor, -(*j)->GetAmount()));
2030 }
2031
2032 AuraEffectList const& ResIgnoreAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST);
2033 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2034 {
2035 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
2036 armor = floor(AddPct(armor, -(*j)->GetAmount()));
2037 }
2038
2039 // Apply Player CR_ARMOR_PENETRATION rating and buffs from stances\specializations etc.
2040 if (attacker->GetTypeId() == TYPEID_PLAYER)
2041 {
2042 float bonusPct = 0;
2043 AuraEffectList const& armorPenAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ARMOR_PENETRATION_PCT);
2044 for (AuraEffectList::const_iterator itr = armorPenAuras.begin(); itr != armorPenAuras.end(); ++itr)
2045 {
2046 if ((*itr)->GetSpellInfo()->EquippedItemClass == -1)
2047 {
2048 if (!spellInfo || (*itr)->IsAffectedOnSpell(spellInfo) || (*itr)->GetMiscValue() & spellInfo->GetSchoolMask())
2049 bonusPct += (*itr)->GetAmount();
2050 else if (!(*itr)->GetMiscValue() && !(*itr)->HasSpellClassMask())
2051 bonusPct += (*itr)->GetAmount();
2052 }
2053 else
2054 {
2055 if (attacker->ToPlayer()->HasItemFitToSpellRequirements((*itr)->GetSpellInfo()))
2056 bonusPct += (*itr)->GetAmount();
2057 }
2058 }
2059
2060 float maxArmorPen = 0;
2061 if (victim->GetLevel() < 60)
2062 maxArmorPen = float(400 + 85 * victim->GetLevel());
2063 else
2064 maxArmorPen = 400 + 85 * victim->GetLevel() + 4.5f * 85 * (victim->GetLevel() - 59);
2065
2066 // Cap armor penetration to this number
2067 maxArmorPen = std::min((armor + maxArmorPen) / 3, armor);
2068 // Figure out how much armor do we ignore
2069 float armorPen = CalculatePct(maxArmorPen, bonusPct + attacker->ToPlayer()->GetRatingBonusValue(CR_ARMOR_PENETRATION));
2070 // Got the value, apply it
2071 armor -= std::min(armorPen, maxArmorPen);
2072 }
2073 }
2074
2075 if (armor < 0.0f)
2076 armor = 0.0f;
2077
2078 float levelModifier = attacker ? attacker->GetLevel() : attackerLevel;
2079 if (levelModifier > 59)
2080 levelModifier = levelModifier + (4.5f * (levelModifier - 59));
2081
2082 float tmpvalue = 0.1f * armor / (8.5f * levelModifier + 40);
2083 tmpvalue = tmpvalue / (1.0f + tmpvalue);
2084
2085 if (tmpvalue < 0.0f)
2086 tmpvalue = 0.0f;
2087 if (tmpvalue > 0.75f)
2088 tmpvalue = 0.75f;
2089
2090 return uint32(std::ceil(std::max(damage * (1.0f - tmpvalue), 0.0f)));
2091}
@ CR_ARMOR_PENETRATION
Definition: Unit.h:428
@ SPELL_AURA_MOD_ARMOR_PENETRATION_PCT
Definition: SpellAuraDefines.h:343
@ SPELL_AURA_MOD_TARGET_RESISTANCE
Definition: SpellAuraDefines.h:186
@ SPELLMOD_IGNORE_ARMOR
Definition: SpellDefines.h:90

References AddPct(), CalculatePct(), CR_ARMOR_PENETRATION, GetArmor(), GetAuraEffectsByType(), GetLevel(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), Object::GetTypeId(), Player::HasItemFitToSpellRequirements(), SpellInfo::Id, SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_ARMOR_PENETRATION_PCT, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL, SPELLMOD_IGNORE_ARMOR, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), boss_priestess_lackey_commonAI::GetThreatMod(), boss_faction_championsAI::GetThreatMod(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ CalcHealAbsorb()

void Unit::CalcHealAbsorb ( HealInfo healInfo)
static
2475{
2476 if (!healInfo.GetHeal())
2477 return;
2478
2479 int32 const healing = static_cast<int32>(healInfo.GetHeal());
2480 int32 absorbAmount = 0;
2481
2482 // Need remove expired auras after
2483 bool existExpired = false;
2484
2485 // absorb without mana cost
2487 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end() && absorbAmount <= healing; ++i)
2488 {
2489 if (!((*i)->GetMiscValue() & healInfo.GetSpellInfo()->SchoolMask))
2490 continue;
2491
2492 // Max Amount can be absorbed by this aura
2493 int32 currentAbsorb = (*i)->GetAmount();
2494
2495 // Found empty aura (impossible but..)
2496 if (currentAbsorb <= 0)
2497 {
2498 existExpired = true;
2499 continue;
2500 }
2501
2502 // currentAbsorb - damage can be absorbed by shield
2503 // If need absorb less damage
2504 if (healing < currentAbsorb + absorbAmount)
2505 currentAbsorb = healing - absorbAmount;
2506
2507 absorbAmount += currentAbsorb;
2508
2509 // Reduce shield amount
2510 (*i)->SetAmount((*i)->GetAmount() - currentAbsorb);
2511 // Need remove it later
2512 if ((*i)->GetAmount() <= 0)
2513 existExpired = true;
2514 }
2515
2516 // Remove all expired absorb auras
2517 if (existExpired)
2518 {
2519 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end();)
2520 {
2521 AuraEffect* auraEff = *i;
2522 ++i;
2523 if (auraEff->GetAmount() <= 0)
2524 {
2525 uint32 removedAuras = healInfo.GetTarget()->m_removedAurasCount;
2527 if (removedAuras + 1 < healInfo.GetTarget()->m_removedAurasCount)
2528 i = vHealAbsorb.begin();
2529 }
2530 }
2531 }
2532
2533 if (absorbAmount > 0)
2534 healInfo.AbsorbHeal(absorbAmount);
2535}
@ SPELL_AURA_SCHOOL_HEAL_ABSORB
Definition: SpellAuraDefines.h:364
SpellInfo const * GetSpellInfo() const
Definition: Unit.h:846
void AbsorbHeal(uint32 amount)
Definition: Unit.h:821
Unit * GetTarget() const
Definition: Unit.h:842
uint32 GetHeal() const
Definition: Unit.h:843
uint32 SchoolMask
Definition: SpellInfo.h:390

References HealInfo::AbsorbHeal(), AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::GetAmount(), GetAuraEffectsByType(), AuraEffect::GetBase(), HealInfo::GetHeal(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), m_removedAurasCount, Aura::Remove(), SpellInfo::SchoolMask, and SPELL_AURA_SCHOOL_HEAL_ABSORB.

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), and HealBySpell().

◆ CalcSpellDuration()

int32 Unit::CalcSpellDuration ( SpellInfo const *  spellProto)
14843{
14844 uint8 comboPoints = GetComboPoints();
14845
14846 int32 minduration = spellProto->GetDuration();
14847 int32 maxduration = spellProto->GetMaxDuration();
14848
14849 int32 duration;
14850
14851 if (comboPoints && minduration != -1 && minduration != maxduration)
14852 duration = minduration + int32((maxduration - minduration) * comboPoints / 5);
14853 else
14854 duration = minduration;
14855
14856 return duration;
14857}
uint8 GetComboPoints(Unit const *who=nullptr) const
--------—Combo point system----------------—
Definition: Unit.h:2304

References GetComboPoints(), SpellInfo::GetDuration(), and SpellInfo::GetMaxDuration().

Referenced by Aura::CalcMaxDuration(), Spell::EffectInterruptCast(), Spell::EffectSchoolDMG(), and Aura::HandleAuraSpecificMods().

◆ CalculateAOEDamageReduction()

int32 Unit::CalculateAOEDamageReduction ( int32  damage,
uint32  schoolMask,
Unit caster 
) const
20742{
20743 damage = int32(float(damage) * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, schoolMask));
20744 if (caster && caster->GetTypeId() == TYPEID_UNIT)
20746
20747 return damage;
20748}
@ SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE
Definition: SpellAuraDefines.h:373
@ SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE
Definition: SpellAuraDefines.h:292
float GetTotalAuraMultiplierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition: Unit.cpp:5912

References GetTotalAuraMultiplierByMiscMask(), Object::GetTypeId(), SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE, and TYPEID_UNIT.

Referenced by Spell::DoAllEffectOnLaunchTarget(), AuraEffect::HandlePeriodicDamageAurasTick(), and spell_dk_death_and_decay::RecalculateDamage().

◆ CalculateDamage()

uint32 Unit::CalculateDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
uint8  itemDamagesMask = 0 
)
2957{
2958 float minDamage = 0.0f;
2959 float maxDamage = 0.0f;
2960
2961 if (normalized || !addTotalPct || itemDamagesMask)
2962 {
2963 // get both by default
2964 if (!itemDamagesMask)
2965 {
2966 itemDamagesMask = (1 << 0) | (1 << 1);
2967 }
2968
2969 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
2970 {
2971 if (itemDamagesMask & (1 << i))
2972 {
2973 float minTmp, maxTmp;
2974 CalculateMinMaxDamage(attType, normalized, addTotalPct, minTmp, maxTmp, i);
2975 minDamage += minTmp;
2976 maxDamage += maxTmp;
2977 }
2978 }
2979 }
2980 else
2981 {
2982 switch (attType)
2983 {
2984 case RANGED_ATTACK:
2987 break;
2988 case BASE_ATTACK:
2991 break;
2992 case OFF_ATTACK:
2995 break;
2996 default:
2997 break;
2998 }
2999 }
3000
3001 minDamage = std::max(0.f, minDamage);
3002 maxDamage = std::max(0.f, maxDamage);
3003
3004 if (minDamage > maxDamage)
3005 {
3006 std::swap(minDamage, maxDamage);
3007 }
3008
3009 return urand(uint32(minDamage), uint32(maxDamage));
3010}
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:44
@ UNIT_FIELD_MINDAMAGE
Definition: UpdateFields.h:127
@ UNIT_FIELD_MAXDAMAGE
Definition: UpdateFields.h:128
@ UNIT_FIELD_MAXOFFHANDDAMAGE
Definition: UpdateFields.h:130
@ UNIT_FIELD_MAXRANGEDDAMAGE
Definition: UpdateFields.h:169
@ UNIT_FIELD_MINRANGEDDAMAGE
Definition: UpdateFields.h:168
@ UNIT_FIELD_MINOFFHANDDAMAGE
Definition: UpdateFields.h:129
float GetFloatValue(uint16 index) const
Definition: Object.cpp:317
virtual void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0

References BASE_ATTACK, CalculateMinMaxDamage(), Object::GetFloatValue(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, UNIT_FIELD_MINRANGEDDAMAGE, and urand().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ CalculateDefaultCoefficient()

float Unit::CalculateDefaultCoefficient ( SpellInfo const *  spellInfo,
DamageEffectType  damagetype 
) const
17462{
17463 // Damage over Time spells bonus calculation
17464 float DotFactor = 1.0f;
17465 if (damagetype == DOT)
17466 {
17467 int32 DotDuration = spellInfo->GetDuration();
17468 if (!spellInfo->IsChanneled() && DotDuration > 0)
17469 DotFactor = DotDuration / 15000.0f;
17470
17471 if (uint32 DotTicks = spellInfo->GetMaxTicks())
17472 DotFactor /= DotTicks;
17473 }
17474
17475 int32 CastingTime = spellInfo->IsChanneled() ? spellInfo->GetDuration() : spellInfo->CalcCastTime();
17476 // Distribute Damage over multiple effects, reduce by AoE
17477 CastingTime = GetCastingTimeForBonus(spellInfo, damagetype, CastingTime);
17478
17479 // As wowwiki says: C = (Cast Time / 3.5)
17480 return (CastingTime / 3500.0f) * DotFactor;
17481}
@ DOT
Definition: Unit.h:437
uint32 GetCastingTimeForBonus(SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
Definition: Unit.cpp:17343

References SpellInfo::CalcCastTime(), DOT, GetCastingTimeForBonus(), SpellInfo::GetDuration(), SpellInfo::GetMaxTicks(), and SpellInfo::IsChanneled().

Referenced by SpellDamageBonusTaken().

◆ CalculateLevelPenalty()

float Unit::CalculateLevelPenalty ( SpellInfo const *  spellProto) const
3013{
3014 if (GetTypeId() != TYPEID_PLAYER)
3015 return 1.0f;
3016
3017 if (spellProto->SpellLevel <= 0 || spellProto->SpellLevel >= spellProto->MaxLevel)
3018 return 1.0f;
3019
3020 float LvlPenalty = 0.0f;
3021
3022 // xinef: added brackets
3023 if (spellProto->SpellLevel < 20)
3024 LvlPenalty = (20.0f - spellProto->SpellLevel) * 3.75f;
3025
3026 float LvlFactor = (float(spellProto->SpellLevel) + 6.0f) / float(GetLevel());
3027 if (LvlFactor > 1.0f)
3028 LvlFactor = 1.0f;
3029
3030 return AddPct(LvlFactor, -LvlPenalty);
3031}
uint8 GetLevel() const
Definition: Unit.h:1432

References AddPct(), GetLevel(), Object::GetTypeId(), SpellInfo::MaxLevel, SpellInfo::SpellLevel, and TYPEID_PLAYER.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellDamageBonusDone(), SpellDamageBonusTaken(), and SpellHealingBonusDone().

◆ CalculateMeleeDamage()

void Unit::CalculateMeleeDamage ( Unit victim,
CalcDamageInfo damageInfo,
WeaponAttackType  attackType = BASE_ATTACK,
const bool  sittingVictim = false 
)
1467{
1468 damageInfo->attacker = this;
1469 damageInfo->target = victim;
1470
1471 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1472 {
1473 damageInfo->damages[i].damageSchoolMask = GetMeleeDamageSchoolMask(attackType, i);
1474 damageInfo->damages[i].damage = 0;
1475 damageInfo->damages[i].absorb = 0;
1476 damageInfo->damages[i].resist = 0;
1477 }
1478
1479 damageInfo->attackType = attackType;
1480 damageInfo->cleanDamage = 0;
1481 damageInfo->blocked_amount = 0;
1482
1483 damageInfo->TargetState = 0;
1484 damageInfo->HitInfo = 0;
1485 damageInfo->procAttacker = PROC_FLAG_NONE;
1486 damageInfo->procVictim = PROC_FLAG_NONE;
1487 damageInfo->procEx = PROC_EX_NONE;
1488 damageInfo->hitOutCome = MELEE_HIT_EVADE;
1489
1490 if (!victim)
1491 return;
1492
1493 if (!IsAlive() || !victim->IsAlive())
1494 return;
1495
1496 // Select HitInfo/procAttacker/procVictim flag based on attack type
1497 switch (attackType)
1498 {
1499 case BASE_ATTACK:
1502 break;
1503 case OFF_ATTACK:
1506 damageInfo->HitInfo = HITINFO_OFFHAND;
1507 break;
1508 default:
1509 return;
1510 }
1511
1512 // School Immune check
1513 uint8 immunedMask = 0;
1514 bool hasNonPhysicalSchoolMask = false;
1515 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1516 {
1518 {
1519 immunedMask |= (1 << i);
1521 {
1522 hasNonPhysicalSchoolMask = true;
1523 }
1524 }
1525 }
1526
1527 // School Immune check
1528 if (immunedMask & ((1 << 0) | (1 << 1)))
1529 {
1530 if (hasNonPhysicalSchoolMask || immunedMask == ((1 << 0) | (1 << 1)))
1531 {
1532 damageInfo->HitInfo |= HITINFO_NORMALSWING;
1533 damageInfo->TargetState = VICTIMSTATE_IS_IMMUNE;
1534
1535 damageInfo->procEx |= PROC_EX_IMMUNE;
1536 return;
1537 }
1538 }
1539
1540 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1541 {
1542 // only players have secondary weapon damage
1543 if (i > 0 && GetTypeId() != TYPEID_PLAYER)
1544 {
1545 break;
1546 }
1547
1548 if (immunedMask & (1 << i))
1549 {
1550 continue;
1551 }
1552
1553 SpellSchoolMask schoolMask = SpellSchoolMask(damageInfo->damages[i].damageSchoolMask);
1554 bool const addPctMods = (schoolMask & SPELL_SCHOOL_MASK_NORMAL);
1555
1556 uint32 damage = 0;
1557 uint8 itemDamagesMask = (GetTypeId() == TYPEID_PLAYER) ? (1 << i) : 0;
1558
1559 damage += CalculateDamage(damageInfo->attackType, false, addPctMods, itemDamagesMask);
1560 // Add melee damage bonus
1561 damage = MeleeDamageBonusDone(damageInfo->target, damage, damageInfo->attackType, nullptr, schoolMask);
1562 damage = damageInfo->target->MeleeDamageBonusTaken(this, damage, damageInfo->attackType, nullptr, schoolMask);
1563
1564 // Script Hook For CalculateMeleeDamage -- Allow scripts to change the Damage pre class mitigation calculations
1565 sScriptMgr->ModifyMeleeDamage(damageInfo->target, damageInfo->attacker, damage);
1566
1567 if (victim->GetAI())
1568 {
1569 victim->GetAI()->OnCalculateMeleeDamageReceived(damage, this);
1570 }
1571
1572 // Calculate armor reduction
1574 {
1575 damageInfo->damages[i].damage = Unit::CalcArmorReducedDamage(this, damageInfo->target, damage, nullptr, 0, damageInfo->attackType);
1576 damageInfo->cleanDamage += damage - damageInfo->damages[i].damage;
1577 }
1578 else
1579 {
1580 damageInfo->damages[i].damage = damage;
1581 }
1582 }
1583
1584 damageInfo->hitOutCome = RollMeleeOutcomeAgainst(damageInfo->target, damageInfo->attackType);
1585
1586 // If the victim was a sitting player and we didn't roll a miss, then crit.
1587 if (sittingVictim && damageInfo->hitOutCome != MELEE_HIT_MISS)
1588 {
1589 damageInfo->hitOutCome = MELEE_HIT_CRIT;
1590 }
1591 switch (damageInfo->hitOutCome)
1592 {
1593 case MELEE_HIT_EVADE:
1595 damageInfo->TargetState = VICTIMSTATE_EVADES;
1596 damageInfo->procEx |= PROC_EX_EVADE;
1597
1598 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1599 {
1600 damageInfo->damages[i].damage = 0;
1601 }
1602
1603 damageInfo->cleanDamage = 0;
1604 return;
1605 case MELEE_HIT_MISS:
1606 damageInfo->HitInfo |= HITINFO_MISS;
1607 damageInfo->TargetState = VICTIMSTATE_INTACT;
1608 damageInfo->procEx |= PROC_EX_MISS;
1609
1610 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1611 {
1612 damageInfo->damages[i].damage = 0;
1613 }
1614 damageInfo->cleanDamage = 0;
1615 break;
1616 case MELEE_HIT_NORMAL:
1617 damageInfo->TargetState = VICTIMSTATE_HIT;
1618 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1619 break;
1620 case MELEE_HIT_CRIT:
1621 {
1622 damageInfo->HitInfo |= HITINFO_CRITICALHIT;
1623 damageInfo->TargetState = VICTIMSTATE_HIT;
1624
1625 damageInfo->procEx |= PROC_EX_CRITICAL_HIT;
1626 // Crit bonus calc
1627 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1628 {
1629 damageInfo->damages[i].damage *= 2;
1630
1631 float mod = 0.0f;
1632 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1633 if (damageInfo->attackType == RANGED_ATTACK)
1634 {
1636 }
1637 else
1638 {
1640
1641 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1643 }
1644
1645 uint32 crTypeMask = damageInfo->target->GetCreatureTypeMask();
1646
1647 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1649 if (mod != 0)
1650 {
1651 AddPct(damageInfo->damages[i].damage, mod);
1652 }
1653 }
1654 break;
1655 }
1656 case MELEE_HIT_PARRY:
1657 damageInfo->TargetState = VICTIMSTATE_PARRY;
1658 damageInfo->procEx |= PROC_EX_PARRY;
1659 damageInfo->cleanDamage = 0;
1660
1661 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1662 {
1663 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1664 damageInfo->damages[i].damage = 0;
1665 }
1666 break;
1667 case MELEE_HIT_DODGE:
1668 damageInfo->TargetState = VICTIMSTATE_DODGE;
1669 damageInfo->procEx |= PROC_EX_DODGE;
1670 damageInfo->cleanDamage = 0;
1671
1672 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1673 {
1674 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1675 damageInfo->damages[i].damage = 0;
1676 }
1677 break;
1678 case MELEE_HIT_BLOCK:
1679 {
1680 damageInfo->TargetState = VICTIMSTATE_HIT;
1681 damageInfo->HitInfo |= HITINFO_BLOCK;
1682 damageInfo->procEx |= PROC_EX_BLOCK;
1683 damageInfo->blocked_amount = damageInfo->target->GetShieldBlockValue();
1684 // double blocked amount if block is critical
1685 if (damageInfo->target->isBlockCritical())
1686 damageInfo->blocked_amount += damageInfo->blocked_amount;
1687
1688 uint32 remainingBlock = damageInfo->blocked_amount;
1689 uint8 fullBlockMask = 0;
1690 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1691 {
1692 if (remainingBlock && remainingBlock >= damageInfo->damages[i].damage)
1693 {
1694 fullBlockMask |= (1 << i);
1695
1696 remainingBlock -= damageInfo->damages[i].damage;
1697 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1698 damageInfo->damages[i].damage = 0;
1699 }
1700 else
1701 {
1702 damageInfo->cleanDamage += remainingBlock;
1703 damageInfo->damages[i].damage -= remainingBlock;
1704 remainingBlock = 0;
1705 }
1706 }
1707
1708 // full block
1709 if (fullBlockMask == ((1 << 0) | (1 << 1)))
1710 {
1711 damageInfo->TargetState = VICTIMSTATE_BLOCKS;
1712 damageInfo->procEx |= PROC_EX_FULL_BLOCK;
1713 damageInfo->blocked_amount -= remainingBlock;
1714 }
1715 break;
1716 }
1717 case MELEE_HIT_GLANCING:
1718 {
1719 damageInfo->HitInfo |= HITINFO_GLANCING;
1720 damageInfo->TargetState = VICTIMSTATE_HIT;
1721 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1722 int32 leveldif = int32(victim->GetLevel()) - int32(GetLevel());
1723 if (leveldif > 3)
1724 leveldif = 3;
1725 float reducePercent = 1 - leveldif * 0.1f;
1726
1727 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1728 {
1729 uint32 reducedDamage = uint32(reducePercent * damageInfo->damages[i].damage);
1730 damageInfo->cleanDamage += damageInfo->damages[i].damage - reducedDamage;
1731 damageInfo->damages[i].damage = reducedDamage;
1732 }
1733 break;
1734 }
1735 case MELEE_HIT_CRUSHING:
1736 damageInfo->HitInfo |= HITINFO_CRUSHING;
1737 damageInfo->TargetState = VICTIMSTATE_HIT;
1738 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1739
1740 // 150% normal damage
1741 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1742 {
1743 damageInfo->damages[i].damage += (damageInfo->damages[i].damage / 2);
1744 }
1745 break;
1746 default:
1747 break;
1748 }
1749
1750 // Always apply HITINFO_AFFECTS_VICTIM in case its not a miss
1751 if (!(damageInfo->HitInfo & HITINFO_MISS))
1752 damageInfo->HitInfo |= HITINFO_AFFECTS_VICTIM;
1753
1754 uint32 tmpHitInfo[MAX_ITEM_PROTO_DAMAGES] = { };
1755
1756 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1757 {
1758 int32 dmg = damageInfo->damages[i].damage;
1759 int32 cleanDamage = damageInfo->cleanDamage;
1760 // attackType is checked already for BASE_ATTACK or OFF_ATTACK so it can't be RANGED_ATTACK here
1761 if (CanApplyResilience())
1762 {
1763 int32 resilienceReduction = damageInfo->damages[i].damage;
1764 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, (damageInfo->hitOutCome == MELEE_HIT_CRIT), CR_CRIT_TAKEN_MELEE);
1765
1766 resilienceReduction = damageInfo->damages[i].damage - resilienceReduction;
1767 dmg -= resilienceReduction;
1768 cleanDamage += resilienceReduction;
1769 }
1770
1771 damageInfo->damages[i].damage = std::max(0, dmg);
1772 damageInfo->cleanDamage = std::max(0, cleanDamage);
1773
1774 // Calculate absorb resist
1775 if (damageInfo->damages[i].damage > 0)
1776 {
1777 damageInfo->procVictim |= PROC_FLAG_TAKEN_DAMAGE;
1778
1779 // Calculate absorb & resists
1780 DamageInfo dmgInfo(*damageInfo, i);
1781 Unit::CalcAbsorbResist(dmgInfo);
1782 damageInfo->damages[i].absorb = dmgInfo.GetAbsorb();
1783 damageInfo->damages[i].resist = dmgInfo.GetResist();
1784
1785 if (damageInfo->damages[i].absorb)
1786 {
1787 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].absorb == 0 ? HITINFO_FULL_ABSORB : HITINFO_PARTIAL_ABSORB);
1788 }
1789
1790 if (damageInfo->damages[i].resist)
1791 {
1792 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].resist == 0 ? HITINFO_FULL_RESIST : HITINFO_PARTIAL_RESIST);
1793 }
1794
1795 damageInfo->damages[i].damage = dmgInfo.GetDamage();
1796 }
1797 }
1798
1799 // set proper HitInfo flags
1800 if ((tmpHitInfo[0] & HITINFO_FULL_ABSORB) != 0)
1801 {
1802 // set partial absorb when secondary damage isn't full absorbed
1803 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_ABSORB) != 0) ? HITINFO_PARTIAL_ABSORB : HITINFO_FULL_ABSORB;
1804 }
1805 else
1806 {
1807 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_ABSORB);
1808 }
1809
1810 if ((tmpHitInfo[0] & HITINFO_FULL_RESIST) != 0)
1811 {
1812 // set partial resist when secondary damage isn't full resisted
1813 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_RESIST) != 0) ? HITINFO_PARTIAL_RESIST : HITINFO_FULL_RESIST;
1814 }
1815 else
1816 {
1817 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_RESIST);
1818 }
1819
1821 {
1822 damageInfo->procEx |= PROC_EX_ABSORB;
1823 }
1824
1825 if (damageInfo->HitInfo & HITINFO_FULL_RESIST)
1826 {
1827 damageInfo->procEx |= PROC_EX_RESIST;
1828 }
1829}
@ VICTIMSTATE_INTACT
Definition: Unit.h:166
@ VICTIMSTATE_HIT
Definition: Unit.h:167
@ VICTIMSTATE_DODGE
Definition: Unit.h:168
@ VICTIMSTATE_IS_IMMUNE
Definition: Unit.h:173
@ VICTIMSTATE_PARRY
Definition: Unit.h:169
@ VICTIMSTATE_BLOCKS
Definition: Unit.h:171
@ VICTIMSTATE_EVADES
Definition: Unit.h:172
@ HITINFO_PARTIAL_ABSORB
Definition: Unit.h:186
@ HITINFO_FULL_RESIST
Definition: Unit.h:187
@ HITINFO_NORMALSWING
Definition: Unit.h:179
@ HITINFO_BLOCK
Definition: Unit.h:193
@ HITINFO_CRUSHING
Definition: Unit.h:197
@ HITINFO_SWINGNOHITSOUND
Definition: Unit.h:201
@ HITINFO_MISS
Definition: Unit.h:184
@ HITINFO_FULL_ABSORB
Definition: Unit.h:185
@ HITINFO_OFFHAND
Definition: Unit.h:182
@ HITINFO_GLANCING
Definition: Unit.h:196
@ HITINFO_CRITICALHIT
Definition: Unit.h:189
@ HITINFO_PARTIAL_RESIST
Definition: Unit.h:188
@ HITINFO_AFFECTS_VICTIM
Definition: Unit.h:181
@ MELEE_HIT_CRUSHING
Definition: Unit.h:717
@ MELEE_HIT_BLOCK
Definition: Unit.h:716
@ MELEE_HIT_CRIT
Definition: Unit.h:717
@ MELEE_HIT_EVADE
Definition: Unit.h:716
@ MELEE_HIT_DODGE
Definition: Unit.h:716
@ MELEE_HIT_MISS
Definition: Unit.h:716
@ MELEE_HIT_PARRY
Definition: Unit.h:716
@ MELEE_HIT_GLANCING
Definition: Unit.h:717
@ SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
Definition: SpellAuraDefines.h:232
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE
Definition: SpellAuraDefines.h:267
@ SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
Definition: SpellAuraDefines.h:226
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
Definition: SpellAuraDefines.h:266
@ PROC_EX_NONE
Definition: SpellMgr.h:193
@ PROC_EX_DODGE
Definition: SpellMgr.h:198
@ PROC_EX_BLOCK
Definition: SpellMgr.h:200
@ PROC_EX_CRITICAL_HIT
Definition: SpellMgr.h:195
@ PROC_EX_MISS
Definition: SpellMgr.h:196
@ PROC_EX_RESIST
Definition: SpellMgr.h:197
@ PROC_EX_FULL_BLOCK
Definition: SpellMgr.h:207
@ PROC_EX_ABSORB
Definition: SpellMgr.h:204
@ PROC_EX_PARRY
Definition: SpellMgr.h:199
@ PROC_EX_EVADE
Definition: SpellMgr.h:201
@ PROC_FLAG_DONE_MELEE_AUTO_ATTACK
Definition: SpellMgr.h:110
@ PROC_FLAG_DONE_MAINHAND_ATTACK
Definition: SpellMgr.h:140
@ PROC_FLAG_TAKEN_DAMAGE
Definition: SpellMgr.h:137
@ PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK
Definition: SpellMgr.h:111
@ PROC_FLAG_DONE_OFFHAND_ATTACK
Definition: SpellMgr.h:141
@ PROC_FLAG_NONE
Definition: SpellMgr.h:105
virtual void OnCalculateMeleeDamageReceived(uint32 &, Unit *)
Definition: UnitAI.h:368
uint32 damageSchoolMask
Definition: Unit.h:900
uint32 blocked_amount
Definition: Unit.h:906
MeleeHitOutcome hitOutCome
Definition: Unit.h:915
uint32 cleanDamage
Definition: Unit.h:914
uint32 TargetState
Definition: Unit.h:908
uint32 resist
Definition: Unit.h:903
uint32 HitInfo
Definition: Unit.h:907
bool isBlockCritical()
Definition: Unit.cpp:3090
uint32 MeleeDamageBonusTaken(Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition: Unit.cpp:13270
virtual SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition: Unit.cpp:5899
bool CanApplyResilience() const
Definition: Unit.h:2441
uint32 CalculateDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
Definition: Unit.cpp:2956
virtual uint32 GetShieldBlockValue() const =0
static void ApplyResilience(Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
Definition: Unit.cpp:19191
UnitAI * GetAI()
Definition: Unit.h:1328
static bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
Definition: Unit.cpp:1988
int32 GetTotalAuraModifier(AuraType auratype) const
Definition: Unit.cpp:5848
MeleeHitOutcome RollMeleeOutcomeAgainst(Unit const *victim, WeaponAttackType attType) const
Definition: Unit.cpp:2753
uint32 GetCreatureTypeMask() const
Definition: Unit.h:1542
uint32 MeleeDamageBonusDone(Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition: Unit.cpp:13068

References CalcDamageInfo::absorb, AddPct(), CalcDamageInfo::attacker, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, CalcArmorReducedDamage(), CalculateDamage(), CalcDamageInfo::cleanDamage, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, GetAI(), GetCreatureTypeMask(), GetLevel(), GetMeleeDamageSchoolMask(), GetShieldBlockValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), GetTotalAuraMultiplierByMiscMask(), Object::GetTypeId(), CalcDamageInfo::HitInfo, HITINFO_AFFECTS_VICTIM, HITINFO_BLOCK, HITINFO_CRITICALHIT, HITINFO_CRUSHING, HITINFO_GLANCING, HITINFO_MISS, HITINFO_NORMALSWING, HITINFO_OFFHAND, HITINFO_SWINGNOHITSOUND, CalcDamageInfo::hitOutCome, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), IsImmunedToDamageOrSchool(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, MeleeDamageBonusDone(), MeleeDamageBonusTaken(), OFF_ATTACK, UnitAI::OnCalculateMeleeDamageReceived(), PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_EVADE, PROC_EX_FULL_BLOCK, PROC_EX_IMMUNE, PROC_EX_MISS, PROC_EX_NONE, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_MELEE_AUTO_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_NONE, PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK, CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RANGED_ATTACK, CalcDamageInfo::resist, RollMeleeOutcomeAgainst(), SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_SCHOOL_MASK_NORMAL, sScriptMgr, CalcDamageInfo::target, CalcDamageInfo::TargetState, TYPEID_PLAYER, VICTIMSTATE_BLOCKS, VICTIMSTATE_DODGE, VICTIMSTATE_EVADES, VICTIMSTATE_HIT, VICTIMSTATE_INTACT, VICTIMSTATE_IS_IMMUNE, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ CalculateMinMaxDamage()

virtual void Unit::CalculateMinMaxDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
float &  minDamage,
float &  maxDamage,
uint8  damageIndex = 0 
)
pure virtual

Implemented in Creature, and Player.

Referenced by CalculateDamage(), and UpdateDamagePhysical().

◆ CalculateSpellDamage()

int32 Unit::CalculateSpellDamage ( Unit const *  target,
SpellInfo const *  spellProto,
uint8  effect_index,
int32 const *  basePoints = nullptr 
) const

◆ CalculateSpellDamageTaken()

void Unit::CalculateSpellDamageTaken ( SpellNonMeleeDamage damageInfo,
int32  damage,
SpellInfo const *  spellInfo,
WeaponAttackType  attackType = BASE_ATTACK,
bool  crit = false 
)
1298{
1299 if (damage < 0)
1300 return;
1301
1302 Unit* victim = damageInfo->target;
1303 if (!victim || !victim->IsAlive())
1304 return;
1305
1306 SpellSchoolMask damageSchoolMask = SpellSchoolMask(damageInfo->schoolMask);
1307 uint32 crTypeMask = victim->GetCreatureTypeMask();
1308
1309 // Script Hook For CalculateSpellDamageTaken -- Allow scripts to change the Damage post class mitigation calculations
1310 sScriptMgr->ModifySpellDamageTaken(damageInfo->target, damageInfo->attacker, damage, spellInfo);
1311
1312 if (victim->GetAI())
1313 {
1314 victim->GetAI()->OnCalculateSpellDamageReceived(damage, this);
1315 }
1316
1317 int32 cleanDamage = 0;
1318 if (Unit::IsDamageReducedByArmor(damageSchoolMask, spellInfo))
1319 {
1320 int32 oldDamage = damage;
1321 damage = Unit::CalcArmorReducedDamage(this, victim, damage, spellInfo, 0, attackType);
1322 cleanDamage = oldDamage - damage;
1323 }
1324
1325 bool blocked = false;
1326 // Per-school calc
1327 switch (spellInfo->DmgClass)
1328 {
1329 // Melee and Ranged Spells
1332 {
1333 // Physical Damage
1334 if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL)
1335 {
1336 // Get blocked status
1337 blocked = isSpellBlocked(victim, spellInfo, attackType);
1338 }
1339
1340 if (crit)
1341 {
1342 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1343
1344 // Calculate crit bonus
1345 uint32 crit_bonus = damage;
1346 // Apply crit_damage bonus for melee spells
1347 if (Player* modOwner = GetSpellModOwner())
1348 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
1349 damage += crit_bonus;
1350
1351 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1352 float critPctDamageMod = 0.0f;
1353 if (attackType == RANGED_ATTACK)
1355 else
1357
1358 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1359 critPctDamageMod += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellInfo->GetSchoolMask());
1360
1361 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1363
1364 if (critPctDamageMod != 0)
1365 AddPct(damage, critPctDamageMod);
1366 }
1367
1368 // Spell weapon based damage CAN BE crit & blocked at same time
1369 if (blocked)
1370 {
1371 damageInfo->blocked = victim->GetShieldBlockValue();
1372 // double blocked amount if block is critical
1373 if (victim->isBlockCritical())
1374 damageInfo->blocked *= 2;
1375 if (damage < int32(damageInfo->blocked))
1376 damageInfo->blocked = uint32(damage);
1377
1378 damage -= damageInfo->blocked;
1379 cleanDamage += damageInfo->blocked;
1380 }
1381
1382 int32 resilienceReduction = damage;
1383 if (CanApplyResilience())
1384 {
1385 if (attackType != RANGED_ATTACK)
1386 {
1387 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_MELEE);
1388 }
1389 else
1390 {
1391 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_RANGED);
1392 }
1393 }
1394
1395 resilienceReduction = damage - resilienceReduction;
1396 damage -= resilienceReduction;
1397 cleanDamage += resilienceReduction;
1398 break;
1399 }
1400 // Magical Attacks
1403 {
1404 // If crit add critical bonus
1405 if (crit)
1406 {
1407 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1408 damage = Unit::SpellCriticalDamageBonus(this, spellInfo, damage, victim);
1409 }
1410
1411 int32 resilienceReduction = damage;
1412 if (CanApplyResilience())
1413 {
1414 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_SPELL);
1415 }
1416
1417 resilienceReduction = damage - resilienceReduction;
1418 damage -= resilienceReduction;
1419 cleanDamage += resilienceReduction;
1420 break;
1421 }
1422 default:
1423 break;
1424 }
1425
1426 damageInfo->cleanDamage = std::max(0, cleanDamage);
1427 damageInfo->damage = std::max(0, damage);
1428
1429 // Calculate absorb resist
1430 if (damageInfo->damage > 0)
1431 {
1432 DamageInfo dmgInfo(*damageInfo, SPELL_DIRECT_DAMAGE);
1433 Unit::CalcAbsorbResist(dmgInfo);
1434 damageInfo->absorb = dmgInfo.GetAbsorb();
1435 damageInfo->resist = dmgInfo.GetResist();
1436 damageInfo->damage = dmgInfo.GetDamage();
1437 }
1438}
@ SPELL_DIRECT_DAMAGE
Definition: Unit.h:436
@ SPELLMOD_CRIT_DAMAGE_BONUS
Definition: SpellDefines.h:92
@ SPELL_DAMAGE_CLASS_RANGED
Definition: SharedDefines.h:1548
@ SPELL_DAMAGE_CLASS_MAGIC
Definition: SharedDefines.h:1546
@ SPELL_DAMAGE_CLASS_NONE
Definition: SharedDefines.h:1545
@ SPELL_DAMAGE_CLASS_MELEE
Definition: SharedDefines.h:1547
@ SPELL_HIT_TYPE_CRIT
Definition: SharedDefines.h:1536
virtual void OnCalculateSpellDamageReceived(int32 &, Unit *)
Definition: UnitAI.h:369
Unit * target
Definition: Unit.h:926
uint32 HitInfo
Definition: Unit.h:937
uint32 damage
Definition: Unit.h:929
uint32 absorb
Definition: Unit.h:932
Unit * attacker
Definition: Unit.h:927
uint32 schoolMask
Definition: Unit.h:931
uint32 cleanDamage
Definition: Unit.h:939
uint32 resist
Definition: Unit.h:933
uint32 blocked
Definition: Unit.h:936
bool isSpellBlocked(Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
Definition: Unit.cpp:3064
static uint32 SpellCriticalDamageBonus(Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
Definition: Unit.cpp:12275

References SpellNonMeleeDamage::absorb, AddPct(), ApplyResilience(), SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CalcAbsorbResist(), CalcArmorReducedDamage(), CanApplyResilience(), SpellNonMeleeDamage::cleanDamage, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, SpellNonMeleeDamage::damage, SpellInfo::DmgClass, DamageInfo::GetAbsorb(), GetAI(), GetCreatureTypeMask(), DamageInfo::GetDamage(), DamageInfo::GetResist(), SpellInfo::GetSchoolMask(), GetShieldBlockValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), isSpellBlocked(), UnitAI::OnCalculateSpellDamageReceived(), RANGED_ATTACK, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_DIRECT_DAMAGE, SPELL_HIT_TYPE_CRIT, SPELL_SCHOOL_MASK_NORMAL, SpellCriticalDamageBonus(), SPELLMOD_CRIT_DAMAGE_BONUS, sScriptMgr, and SpellNonMeleeDamage::target.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ CanApplyResilience()

◆ CanDualWield()

◆ CanEnterWater()

virtual bool Unit::CanEnterWater ( ) const
pure virtual

Implemented in Creature, and Player.

◆ CanFly()

◆ CanFreeMove()

bool Unit::CanFreeMove ( ) const
inline
1414 {
1417 }
@ UNIT_STATE_DISTRACTED
Definition: Unit.h:337
@ UNIT_STATE_CONFUSED
Definition: Unit.h:336
@ UNIT_STATE_FLEEING
Definition: Unit.h:332
@ UNIT_STATE_IN_FLIGHT
Definition: Unit.h:333
@ UNIT_STATE_STUNNED
Definition: Unit.h:328

References GetOwnerGUID(), HasUnitState(), UNIT_STATE_CONFUSED, UNIT_STATE_DISTRACTED, UNIT_STATE_FLEEING, UNIT_STATE_IN_FLIGHT, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by SpellInfo::CheckTarget(), and Creature::IsFreeToMove().

◆ CanHaveThreatList()

bool Unit::CanHaveThreatList ( ) const
14601{
14602 // only creatures can have threat list
14603 if (GetTypeId() != TYPEID_UNIT)
14604 return false;
14605
14606 // only alive units can have threat list
14607 if (!IsAlive() || isDying())
14608 return false;
14609
14610 // totems can not have threat list
14611 if (ToCreature()->IsTotem())
14612 return false;
14613
14614 // vehicles can not have threat list
14615 if (ToCreature()->IsVehicle() && GetMap()->IsBattlegroundOrArena())
14616 return false;
14617
14618 // summons can not have a threat list, unless they are controlled by a creature
14620 return false;
14621
14622 return true;
14623}
@ UNIT_MASK_CONTROLABLE_GUARDIAN
Definition: Unit.h:683
@ UNIT_MASK_GUARDIAN
Definition: Unit.h:677
bool IsPlayer() const
Definition: Object.h:194
Map * GetMap() const
Definition: Object.h:517
bool IsVehicle() const
Definition: Unit.h:1428
bool isDying() const
Definition: Unit.h:1823

References WorldObject::GetMap(), GetOwnerGUID(), Object::GetTypeId(), HasUnitTypeMask(), IsAlive(), isDying(), Object::IsPlayer(), IsTotem(), IsVehicle(), Object::ToCreature(), TYPEID_UNIT, UNIT_MASK_CONTROLABLE_GUARDIAN, UNIT_MASK_GUARDIAN, and UNIT_MASK_MINION.

Referenced by AddThreat(), Creature::CanPeriodicallyCallForAssistance(), ThreatMgr::ClearAllThreat(), DealDamage(), ScriptedAI::DoResetThreatList(), CreatureAI::DoZoneInCombat(), Spell::EffectTaunt(), Spell::EffectThreat(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleModTaunt(), Spell::HandleThreatSpells(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), Creature::SelectVictim(), TauntApply(), TauntFadeOut(), and Update().

◆ CanInstantCast()

bool Unit::CanInstantCast ( ) const
inline
2451{ return _instantCast; }

References _instantCast.

Referenced by ModSpellCastTime().

◆ CanModifyStats()

◆ CanProc()

bool Unit::CanProc ( )
inline
2334{return !m_procDeep;}

References m_procDeep.

Referenced by Spell::DoAllEffectOnTarget().

◆ CanRestoreMana()

bool Unit::CanRestoreMana ( SpellInfo const *  spellInfo) const
21498{
21499 // Aura of Despair exceptions
21500 switch (spellInfo->Id)
21501 {
21502 case 16666: // Demonic Rune
21503 case 27869: // Dark Rune
21504 case 30824: // Shamanistic Rage
21505 case 31786: // Spiritual Attunement
21506 case 31930: // Judgements of the Wise
21507 case 34075: // Aspect of the Viper
21508 case 34720: // Thrill of the hunt
21509 case 47755: // Rapture
21510 case 54425: // Improved Felhunter
21511 case 57319: // Blessing of Sanctuary
21512 case 63337: // Saronite Vapors (regenerate mana)
21513 case 63375: // Improved stormstrike
21514 case 64372: // Lifebloom
21515 case 68285: // Improved Leader of the Pack
21516 return true;
21517 case 54428: // Divine Plea - only with talent Guarded by the Light
21518 return HasSpell(53583);
21519 default:
21520 break;
21521 }
21522
21523 return false;
21524}
virtual bool HasSpell(uint32) const
Definition: Unit.h:1716

References HasSpell(), and SpellInfo::Id.

Referenced by IsImmunedToSpellEffect().

◆ CanSwim()

bool Unit::CanSwim ( ) const
virtual

this method checks the current flag of a unit

These flags can be set within the database or dynamically changed at runtime UNIT_FLAG_SWIMMING must be updated when a unit enters a swimmable area

Reimplemented in Creature.

20237{
20238 // Mirror client behavior, if this method returns false then client will not use swimming animation and for players will apply gravity as if there was no water
20240 return false;
20242 return true;
20244 return false;
20246 return true;
20248}
@ UNIT_FLAG2_UNUSED_6
Definition: Unit.h:506
@ UNIT_FLAG_CANNOT_SWIM
Definition: Unit.h:462
@ UNIT_FLAG_POSSESSED
Definition: Unit.h:472
@ UNIT_FLAG_SWIMMING
Definition: Unit.h:463
@ UNIT_FLAG_RENAME
Definition: Unit.h:452
@ UNIT_FLAG_PET_IN_COMBAT
Definition: Unit.h:459
bool HasUnitFlag2(UnitFlags2 flags) const
Definition: Unit.h:1500

References HasUnitFlag(), HasUnitFlag2(), UNIT_FLAG2_UNUSED_6, UNIT_FLAG_CANNOT_SWIM, UNIT_FLAG_PET_IN_COMBAT, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_POSSESSED, UNIT_FLAG_RENAME, and UNIT_FLAG_SWIMMING.

Referenced by Creature::CanSwim().

◆ CanUseAttackType()

◆ CastCustomSpell() [1/4]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
CustomSpellValues const &  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1253{
1254 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1255 if (!spellInfo)
1256 {
1257 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1259 }
1260
1261 SpellCastTargets targets;
1262 targets.SetUnitTarget(victim);
1263
1264 return CastSpell(targets, spellInfo, &value, triggerFlags, castItem, triggeredByAura, originalCaster);
1265}
#define LOG_ERROR(filterType__,...)
Definition: Log.h:157
@ SPELL_FAILED_SPELL_UNAVAILABLE
Definition: SharedDefines.h:1056
Definition: Spell.h:109
void SetUnitTarget(Unit *target)
Definition: Spell.cpp:238

References CastSpell(), Object::GetGUID(), LOG_ERROR, SpellCastTargets::SetUnitTarget(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastCustomSpell() [2/4]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1239{
1240 CustomSpellValues values;
1241 values.AddSpellMod(mod, value);
1242 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1243}
@ TRIGGERED_NONE
Definition: SpellDefines.h:131
SpellCastResult CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition: Unit.cpp:1226
Definition: SpellDefines.h:162
void AddSpellMod(SpellValueMod mod, int32 value)
Definition: SpellDefines.h:164

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastCustomSpell() [3/4]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1246{
1247 CustomSpellValues values;
1248 values.AddSpellMod(mod, value);
1249 return CastCustomSpell(spellId, values, target, triggerFlags, castItem, triggeredByAura, originalCaster);
1250}

References CustomSpellValues::AddSpellMod(), and CastCustomSpell().

◆ CastCustomSpell() [4/4]

SpellCastResult Unit::CastCustomSpell ( Unit victim,
uint32  spellId,
int32 const *  bp0,
int32 const *  bp1,
int32 const *  bp2,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1227{
1228 CustomSpellValues values;
1229 if (bp0)
1230 values.AddSpellMod(SPELLVALUE_BASE_POINT0, *bp0);
1231 if (bp1)
1232 values.AddSpellMod(SPELLVALUE_BASE_POINT1, *bp1);
1233 if (bp2)
1234 values.AddSpellMod(SPELLVALUE_BASE_POINT2, *bp2);
1235 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1236}
@ SPELLVALUE_BASE_POINT1
Definition: SpellDefines.h:115
@ SPELLVALUE_BASE_POINT2
Definition: SpellDefines.h:116
@ SPELLVALUE_BASE_POINT0
Definition: SpellDefines.h:114

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), SPELLVALUE_BASE_POINT0, SPELLVALUE_BASE_POINT1, SPELLVALUE_BASE_POINT2, TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

Referenced by spell_pri_guardian_spirit::Absorb(), spell_mage_fire_frost_ward::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_the_lich_king_necrotic_plague_jump::spell_the_lich_king_necrotic_plague_AuraScript::AfterDispel(), spell_dru_lifebloom::AfterRemove(), Player::ApplyEnchantment(), Player::ApplyEquipSpell(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), npc_gas_cloud::npc_gas_cloudAI::CastMainSpell(), CastPetAura(), spell_ruby_sanctum_rallying_shout::spell_ruby_sanctum_rallying_shout_SpellScript::CountAllies(), spell_igb_rocket_artillery_explosion::spell_igb_rocket_artillery_explosion_SpellScript::DamageGunship(), boss_leotheras_the_blind::DemonTime(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), Spell::EffectDestroyAllTotems(), Spell::EffectDispel(), Spell::EffectFeedPet(), Spell::EffectForceCast(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonType(), EnterVehicle(), EnterVehicleUnattackable(), AuraMunchingQueue::Execute(), TriggerWickedSpirit::Execute(), spell_sha_totem_of_wrath::HandleAfterCast(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_pri_shadow_word_death::HandleDamage(), spell_dk_corpse_explosion::HandleDamage(), spell_dru_lifebloom::HandleDispel(), spell_igb_burning_pitch::spell_igb_burning_pitch_SpellScript::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_deathbringer_blood_link::spell_deathbringer_blood_link_SpellScript::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_gen_dummy_trigger::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_pal_divine_storm_dummy::HandleDummy(), spell_sha_ancestral_awakening_proc::HandleDummy(), spell_sha_cleansing_totem_pulse::HandleDummy(), spell_warl_life_tap::HandleDummy(), spell_warr_last_stand::HandleDummy(), spell_warr_charge::HandleDummy(), spell_warr_slam::HandleDummy(), spell_warr_bloodthirst::HandleDummy(), HandleDummyAuraProc(), spell_egg_explosion::HandleDummyHitTarget(), spell_warr_execute::HandleEffect(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_serpentshrine_cavern_infection::HandleEffectRemove(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_ragin_flames_inferno::HandlePeriodic(), spell_dk_death_and_decay_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_zereketh_seed_of_corruption::HandleProc(), spell_deathbringer_blood_link_aura::spell_deathbringer_blood_link_AuraScript::HandleProc(), spell_deathbringer_blood_link_blood_beast_aura::spell_deathbringer_blood_link_blood_beast_aura_AuraScript::HandleProc(), spell_reliquary_of_souls_aura_of_desire::spell_reliquary_of_souls_aura_of_desire_AuraScript::HandleProc(), spell_black_temple_consuming_strikes::spell_black_temple_consuming_strikes_AuraScript::HandleProc(), spell_item_blade_ward_enchant::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), spell_dru_living_seed_proc::HandleProc(), spell_hun_ascpect_of_the_viper::HandleProc(), spell_sha_earth_shield::HandleProc(), spell_the_lich_king_dark_hunger::spell_the_lich_king_dark_hunger_AuraScript::HandleProc(), spell_yogg_saron_grim_reprisal::spell_yogg_saron_grim_reprisal_AuraScript::HandleProc(), spell_dk_wandering_plague_aura::HandleProc(), spell_dk_blood_gorged::HandleProc(), spell_dru_living_seed::HandleProc(), spell_gen_blade_warding::HandleProc(), spell_hun_glyph_of_arcane_shot::HandleProc(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_item_necrotic_touch::HandleProc(), spell_mage_burnout::HandleProc(), spell_pal_seal_of_command_aura::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pal_seal_of_righteousness::HandleProc(), spell_pri_divine_aegis::HandleProc(), spell_pri_glyph_of_prayer_of_healing::HandleProc(), spell_rog_blade_flurry::HandleProc(), spell_sha_item_mana_surge::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellWithValueAuraProc(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_igb_rocket_pack::spell_igb_rocket_pack_AuraScript::HandleRemove(), spell_warl_haunt_aura::HandleRemove(), spell_pal_lay_on_hands::HandleScript(), spell_kelthuzad_detonate_mana::spell_kelthuzad_detonate_mana_AuraScript::HandleScript(), spell_q12919_gymers_grab::HandleScript(), spell_gluth_decimate::spell_gluth_decimate_SpellScript::HandleScriptEffect(), spell_hun_chimera_shot::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), HandleSpellClick(), boss_akilzon::boss_akilzonAI::HandleStormSequence(), spell_halion_damage_aoe_summon::spell_halion_damage_aoe_summon_SpellScript::HandleSummon(), spell_putricide_mutated_transformation::spell_putricide_mutated_transformation_SpellScript::HandleSummon(), spell_putricide_mutated_plague::spell_putricide_mutated_plague_AuraScript::HandleTriggerSpell(), boss_najentus::JustEngagedWith(), boss_morogrim_tidewalker::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_frost_tomb::npc_frost_tombAI::npc_frost_tombAI(), spell_dru_tiger_s_fury::OnHit(), spell_gen_flurry_of_claws::OnPeriodic(), spell_blood_queen_essence_of_the_blood_queen::spell_blood_queen_essence_of_the_blood_queen_AuraScript::OnProc(), spell_pal_eye_for_an_eye::OnProc(), spell_warl_siphon_life::OnProc(), spell_warl_fel_synergy::OnProc(), spell_warr_improved_spell_reflection::OnProc(), spell_warr_damage_shield::OnProc(), spell_kalecgos_curse_of_boundless_agony::spell_kalecgos_curse_of_boundless_agony_AuraScript::OnRemove(), spell_halion_marks::spell_halion_marks_AuraScript::OnRemove(), spell_putricide_mutated_plague::spell_putricide_mutated_plague_AuraScript::OnRemove(), spell_the_lich_king_necrotic_plague::spell_the_lich_king_necrotic_plague_AuraScript::OnRemove(), spell_yogg_saron_malady_of_the_mind::spell_yogg_saron_malady_of_the_mind_AuraScript::OnRemove(), spell_sindragosa_instability::spell_sindragosa_instability_AuraScript::OnRemove(), spell_the_lich_king_necrotic_plague_jump::spell_the_lich_king_necrotic_plague_AuraScript::OnRemove(), spell_karazhan_overload::spell_karazhan_overload_AuraScript::PeriodicTick(), spell_blood_queen_pact_of_the_darkfallen_dmg::spell_blood_queen_pact_of_the_darkfallen_dmg_AuraScript::PeriodicTick(), spell_broggok_poison_cloud::PeriodicTick(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11198_take_down_tethyr::PrepareSpellScript(), spell_illidari_council_reflective_shield::spell_illidari_council_reflective_shield_AuraScript::ReflectDamage(), spell_pri_power_word_shield_aura::ReflectDamage(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), boss_magtheridon::ScheduleCombatEvents(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), boss_viscidus::SummonedCreatureDies(), spell_dk_anti_magic_shell_self::Trigger(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), spell_the_lich_king_life_siphon::spell_the_lich_king_life_siphon_SpellScript::TriggerHeal(), spell_pal_divine_storm::TriggerHeal(), spell_black_temple_shadow_inferno::spell_black_temple_shadow_inferno_AuraScript::Update(), spell_black_temple_spell_absorption::spell_black_temple_spell_absorption_AuraScript::Update(), boss_felblood_kaelthas::UpdateAI(), boss_alythess::boss_alythessAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_sathrovarr::boss_sathrovarrAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), npc_coren_direbrew::UpdateAI(), alliance_rifleman::alliance_riflemanAI::UpdateAI(), boss_huhuran::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_living_constellation::npc_living_constellationAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_gurtogg_bloodboil::boss_gurtogg_bloodboilAI::UpdateAI(), boss_mother_shahraz::boss_shahrazAI::UpdateAI(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::UpdateAI(), boss_essence_of_suffering::boss_essence_of_sufferingAI::UpdateAI(), boss_essence_of_anger::boss_essence_of_angerAI::UpdateAI(), boss_teron_gorefiend::UpdateAI(), boss_ahune::UpdateAI(), and boss_kaelthas::boss_kaelthasAI::UpdateAI().

◆ CastDelayedSpellWithPeriodicAmount()

void Unit::CastDelayedSpellWithPeriodicAmount ( Unit caster,
uint32  spellId,
AuraType  auraType,
int32  addAmount,
uint8  effectIndex = 0 
)
20563{
20564 for (AuraEffectList::iterator i = m_modAuras[auraType].begin(); i != m_modAuras[auraType].end(); ++i)
20565 {
20566 AuraEffect* aurEff = *i;
20567 if (aurEff->GetCasterGUID() != caster->GetGUID() || aurEff->GetId() != spellId || aurEff->GetEffIndex() != effectIndex || !aurEff->GetTotalTicks())
20568 continue;
20569
20570 addAmount += ((aurEff->GetOldAmount() * std::max<int32>(aurEff->GetTotalTicks() - int32(aurEff->GetTickNumber()), 0)) / aurEff->GetTotalTicks());
20571 break;
20572 }
20573
20574 // xinef: delay only for casting on different unit
20575 if (this == caster)
20576 caster->CastCustomSpell(spellId, SPELLVALUE_BASE_POINT0, addAmount, this, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_NO_PERIODIC_RESET), nullptr, nullptr, caster->GetGUID());
20577 else
20578 caster->m_Events.AddEvent(new AuraMunchingQueue(*caster, GetGUID(), addAmount, spellId), caster->m_Events.CalculateQueueTime(400));
20579}
TriggerCastFlags
Definition: SpellDefines.h:130
@ TRIGGERED_NO_PERIODIC_RESET
Will ignore equipped item requirements.
Definition: SpellDefines.h:150
uint64 CalculateQueueTime(uint64 delay) const
Definition: EventProcessor.cpp:164
Definition: Unit.cpp:20542
uint32 GetTickNumber() const
Definition: SpellAuraEffects.h:87
int32 GetOldAmount() const
Definition: SpellAuraEffects.h:116
uint32 GetId() const
Definition: SpellAuraEffects.cpp:432
int32 GetTotalTicks() const
Definition: SpellAuraEffects.cpp:7420
ObjectGuid GetCasterGUID() const
Definition: SpellAuraEffects.h:48

References EventProcessor::AddEvent(), EventProcessor::CalculateQueueTime(), CastCustomSpell(), AuraEffect::GetCasterGUID(), AuraEffect::GetEffIndex(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetOldAmount(), AuraEffect::GetTickNumber(), AuraEffect::GetTotalTicks(), m_Events, m_modAuras, SPELLVALUE_BASE_POINT0, TRIGGERED_FULL_MASK, and TRIGGERED_NO_PERIODIC_RESET.

Referenced by HandleDummyAuraProc(), spell_mage_ignite::HandleProc(), spell_dru_t10_balance_4p_bonus::HandleProc(), spell_sha_t10_restoration_4p_bonus::HandleProc(), spell_sha_t8_electrified::HandleProc(), and HandleProcTriggerSpell().

◆ CastPetAura()

void Unit::CastPetAura ( PetAura const *  aura)
17576{
17577 uint32 auraId = aura->GetAura(GetEntry());
17578 if (!auraId)
17579 return;
17580
17581 if (auraId == 35696) // Demonic Knowledge
17582 {
17583 int32 basePoints = aura->GetDamage();
17584 CastCustomSpell(this, auraId, &basePoints, nullptr, nullptr, true);
17585 }
17586 else
17587 CastSpell(this, auraId, true);
17588}

References CastCustomSpell(), CastSpell(), PetAura::GetAura(), PetAura::GetDamage(), and Object::GetEntry().

Referenced by Pet::CastPetAuras().

◆ CastSpell() [1/7]

SpellCastResult Unit::CastSpell ( float  x,
float  y,
float  z,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1268{
1269 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1270 if (!spellInfo)
1271 {
1272 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1274 }
1275
1276 SpellCastTargets targets;
1277 targets.SetDst(x, y, z, GetOrientation());
1278
1279 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1280}
void SetDst(float x, float y, float z, float orientation, uint32 mapId=MAPID_INVALID)
Definition: Spell.cpp:405

References CastSpell(), Object::GetGUID(), Position::GetOrientation(), LOG_ERROR, SpellCastTargets::SetDst(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [2/7]

SpellCastResult Unit::CastSpell ( GameObject go,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1283{
1284 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1285 if (!spellInfo)
1286 {
1287 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1289 }
1290
1291 SpellCastTargets targets;
1292 targets.SetGOTarget(go);
1293
1294 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1295}
void SetGOTarget(GameObject *target)
Definition: Spell.cpp:270

References CastSpell(), Object::GetGUID(), LOG_ERROR, SpellCastTargets::SetGOTarget(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [3/7]

SpellCastResult Unit::CastSpell ( SpellCastTargets const &  targets,
SpellInfo const *  spellInfo,
CustomSpellValues const *  value,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
Todo:
: this is a workaround - not needed anymore, but required for some scripts :(
1170{
1171 if (!spellInfo)
1172 {
1173 LOG_ERROR("entities.unit", "CastSpell: unknown spell by caster {}", GetGUID().ToString());
1175 }
1176
1178 if (!originalCaster && triggeredByAura)
1179 {
1180 originalCaster = triggeredByAura->GetCasterGUID();
1181 }
1182
1183 Spell* spell = new Spell(this, spellInfo, triggerFlags, originalCaster);
1184
1185 if (value)
1186 {
1187 for (CustomSpellValues::const_iterator itr = value->begin(); itr != value->end(); ++itr)
1188 {
1189 spell->SetSpellValue(itr->first, itr->second);
1190 }
1191 }
1192
1193 spell->m_CastItem = castItem;
1194 return spell->prepare(&targets, triggeredByAura);
1195}
void SetSpellValue(SpellValueMod mod, int32 value)
Definition: Spell.cpp:8391
Item * m_CastItem
Definition: Spell.h:521

References AuraEffect::GetCasterGUID(), Object::GetGUID(), LOG_ERROR, Spell::m_CastItem, Spell::prepare(), Spell::SetSpellValue(), SPELL_FAILED_SPELL_UNAVAILABLE, and Position::ToString().

Referenced by Player::_addSpell(), Player::_addTalentAurasAndSpells(), Spell::_cast(), _ExitVehicle(), Player::_LoadGlyphAuras(), Battleground::_ProcessResurrect(), spell_yogg_saron_protective_gaze::spell_yogg_saron_protective_gaze_AuraScript::Absorb(), spell_rog_cheat_death::Absorb(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Activate(), Player::ActivateSpec(), spell_halion_combustion_consumption::spell_halion_combustion_consumption_AuraScript::AddMarkStack(), Battleground::AddPlayer(), Arena::AddPlayer(), BattlegroundIC::AddPlayer(), BattlegroundMap::AddPlayerToMap(), Battleground::AddPlayerToResurrectQueue(), Pet::addSpell(), spell_dru_barkskin::AfterApply(), spell_dru_savage_roar_aura::AfterApply(), spell_astromancer_wrath_of_the_astromancer::spell_astromancer_wrath_of_the_astromancer_AuraScript::AfterRemove(), spell_gen_lifebloom::AfterRemove(), spell_oculus_stop_time::spell_oculus_stop_time_AuraScript::Apply(), spell_sha_earthbind_totem::Apply(), spell_warl_health_funnel::ApplyEffect(), Player::ApplyEnchantment(), spell_hun_lock_and_load::ApplyMarker(), npc_mograine::npc_mograineAI::AshbringerEvent(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::boss_yoggsaron_crusher_tentacleAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::boss_yoggsaron_death_orbAI(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::boss_yoggsaron_influence_tentacleAI(), Player::BuildPlayerRepop(), spell_igb_incinerating_blast::spell_igb_incinerating_blast_SpellScript::CalculateDamage(), npc_echo_of_medivh::CastChangeFacing(), npc_chesspiece::CastChangeFacing(), CastCustomSpell(), npc_hallows_end_soh::CastFires(), Player::CastItemCombatSpell(), npc_volatile_ooze::npc_volatile_oozeAI::CastMainSpell(), CastPetAura(), boss_mor_grayhoof::CastRandomSpell(), GameObject::CastSpell(), CastSpell(), spell_the_lich_king_defile::spell_the_lich_king_defile_SpellScript::ChangeDamageAndGrow(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), spell_eredar_twins_handle_touch::spell_eredar_twins_handle_touch_SpellScript::CheckCast(), spell_igb_cannon_blast::spell_igb_cannon_blast_SpellScript::CheckEnergy(), Spell::CheckItems(), spell_botanica_shift_form::spell_botanica_shift_form_AuraScript::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), spell_the_lich_king_shadow_trap_periodic::spell_the_lich_king_shadow_trap_periodic_SpellScript::CheckTargetCount(), spell_dk_raise_dead::ConsumeReagents(), spell_frost_giant_death_plague::spell_frost_giant_death_plague_SpellScript::CountTargets(), instance_blackrock_spire::instance_blackrock_spireMapScript::CreatureLooted(), violet_hold_trashAI::CreatureStartAttackDoor(), boss_garfrost::boss_garfrostAI::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), npc_mograine::npc_mograineAI::DamageTaken(), boss_muru::boss_muruAI::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), npc_crystalline_frayer::npc_crystalline_frayerAI::DamageTaken(), npc_collapsing_star::npc_collapsing_starAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), boss_illidan_stormrage::boss_illidan_stormrageAI::DamageTaken(), boss_alar::boss_alarAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), DealDamage(), DealMeleeDamage(), boss_twin_valkyrAI::DoAction(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_icc_severed_essence::npc_icc_severed_essenceAI::DoAction(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), npc_eris_hevenfire::npc_eris_hevenfireAI::DoAction(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_flame_leviathan::boss_flame_leviathanAI::DoAction(), boss_sacrolash::boss_sacrolashAI::DoAction(), boss_alythess::boss_alythessAI::DoAction(), boss_kalecgos::boss_kalecgosAI::DoAction(), boss_sathrovarr::boss_sathrovarrAI::DoAction(), npc_kalecgos_kj::npc_kalecgos_kjAI::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_black_knight::boss_black_knightAI::DoAction(), boss_jormungarAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_icc_blood_beast::npc_icc_blood_beastAI::DoAction(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_molten_golem::npc_molten_golemAI::DoAction(), boss_steelbreaker::boss_steelbreakerAI::DoAction(), npc_ulduar_bot_summon_trigger::npc_ulduar_bot_summon_triggerAI::DoAction(), boss_thorim_sif::boss_thorim_sifAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DoAction(), boss_yoggsaron_keeper::boss_yoggsaron_keeperAI::DoAction(), boss_illidari_council_memberAI::DoAction(), Spell::DoAllEffectOnTarget(), UnitAI::DoCast(), UnitAI::DoCastAOE(), boss_nightbane::DoCastOnFarAwayPlayers(), ScriptedAI::DoCastSpell(), InstanceScript::DoCastSpellOnPlayer(), InstanceScript::DoCastSpellOnPlayers(), UnitAI::DoCastToAllHostilePlayers(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), npc_midsummer_ribbon_pole_target::DoFireworkChecks(), npc_midsummer_ribbon_pole_target::DoGroundFlowerChecks(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), npc_midsummer_ribbon_pole_target::DoSpewLavaChecks(), boss_skeram::DoTeleport(), Spell::DoTriggersOnSpellHit(), Player::DuelComplete(), Spell::EffectActivateRune(), Spell::EffectApplyGlyph(), Spell::EffectCastButtons(), Spell::EffectDummy(), Spell::EffectEnergize(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectInebriate(), Spell::EffectSanctuary(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectStuck(), Spell::EffectSummonType(), Spell::EffectTaunt(), Spell::EffectTeleportUnits(), Spell::EffectTitanGrip(), Spell::EffectTriggerMissileSpell(), Spell::EffectTriggerRitualOfSummoning(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::EmpowerCultist(), boss_the_lich_king::boss_the_lich_kingAI::EnterEvadeMode(), boss_zuljin::boss_zuljinAI::EnterPhase(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), BattlegroundEY::EventTeamCapturedPoint(), BattleExperienceEvent::Execute(), OrcDeathEvent::Execute(), CastArmageddon::Execute(), UtherBatteredHiltEvent::Execute(), ShockVortexExplodeEvent::Execute(), ResetEncounterEvent::Execute(), FrostBombExplosion::Execute(), IceTombSummonEvent::Execute(), VileSpiritActivateEvent::Execute(), LichKingMovieEvent::Execute(), DelayedCastEvent::Execute(), DelayedCastMincharEvent::Execute(), ChargeRifts::Execute(), CosmicSmashDamageEvent::Execute(), CastRunesEvent::Execute(), BoomEvent::Execute(), SACActivateEvent::Execute(), VerasEnvenom::Execute(), CastQuill::Execute(), lapseTeleport::Execute(), boss_salramm::boss_salrammAI::ExplodeGhoul(), spell_festergut_blighted_spores::spell_festergut_blighted_spores_AuraScript::ExtraEffect(), spell_rotface_mutated_infection::spell_rotface_mutated_infection_AuraScript::ExtraRemoveEffect(), npc_dark_iron_attack_generator::FinishAttackDueToWin(), npc_azure_saboteur::npc_azure_saboteurAI::FinishPointReached(), boss_janalai::boss_janalaiAI::FireWall(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::FlyAway(), boss_archimonde::boss_archimondeAI::GainSoulCharge(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::GoSiphon(), go_soulwell::go_soulwellAI::GossipHello(), spell_cataclysm_breath::spell_cataclysm_breath_SpellScript::HandleAfterCast(), spell_dk_chains_of_ice::HandleAfterCast(), spell_mage_arcane_blast::HandleAfterCast(), spell_q13086_last_line_of_defence::HandleAfterCast(), spell_infected_worgen_bite::spell_infected_worgen_bite_AuraScript::HandleAfterEffectApply(), spell_dk_blood_boil::HandleAfterHit(), spell_dk_scourge_strike::HandleAfterHit(), spell_rog_deadly_poison::HandleAfterHit(), spell_warlords_rage::HandleAfterRemove(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), spell_felmyst_fog_of_corruption_charm::spell_felmyst_fog_of_corruption_charm_AuraScript::HandleApply(), spell_kiljaeden_vengeance_of_the_blue_flight::spell_kiljaeden_vengeance_of_the_blue_flight_AuraScript::HandleApply(), spell_boss_magus_telestra_summon_telestra_clones::spell_boss_magus_telestra_summon_telestra_clones_AuraScript::HandleApply(), spell_dru_enrage::HandleApply(), spell_rog_killing_spree::spell_rog_killing_spree_AuraScript::HandleApply(), spell_warr_vigilance::HandleApply(), spell_azjol_nerub_pound::HandleApplyAura(), BattlegroundIC::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_dk_death_grip::HandleBaseDummy(), misc_commandscript::HandleBindSightCommand(), spell_rotface_unstable_ooze_explosion_init::spell_rotface_unstable_ooze_explosion_init_SpellScript::HandleCast(), spell_commander_sarannis_summon_reinforcements::HandleCast(), cast_commandscript::HandleCastBackCommand(), cast_commandscript::HandleCastCommand(), cast_commandscript::HandleCastDestCommand(), cast_commandscript::HandleCastDistCommand(), cast_commandscript::HandleCastSelfCommand(), cast_commandscript::HandleCastTargetCommad(), spell_gen_mounted_charge::HandleChargeEffect(), spell_dk_corpse_explosion::HandleCorpseExplosion(), OutdoorPvPSI::HandleCustomSpell(), WorldSession::HandleDuelCancelledOpcode(), spell_icc_shattered_bones::spell_icc_shattered_bones_SpellScript::HandleDummy(), spell_corrupted_totems::HandleDummy(), spell_moroes_vanish::HandleDummy(), spell_karazhan_blink::spell_karazhan_blink_SpellScript::HandleDummy(), spell_ooze_zap::spell_ooze_zap_SpellScript::HandleDummy(), spell_saviana_conflagration_init::spell_saviana_conflagration_init_SpellScript::HandleDummy(), spell_igb_burning_pitch_selector::spell_igb_burning_pitch_selector_SpellScript::HandleDummy(), spell_igb_burning_pitch::spell_igb_burning_pitch_SpellScript::HandleDummy(), spell_q13007_iron_colossus::spell_q13007_iron_colossus_SpellScript::HandleDummy(), spell_illidan_found_target::spell_illidan_found_target_SpellScript::HandleDummy(), spell_leotheras_chaos_blast::HandleDummy(), spell_morogrim_tidewalker_watery_grave::HandleDummy(), spell_q10935_the_exorcism_of_colonel_jules::spell_q10935_the_exorcism_of_colonel_jules_SpellScript::HandleDummy(), spell_gen_focused_bursts::HandleDummy(), spell_shadowblink::HandleDummy(), spell_spawn_drakonid::HandleDummy(), spell_send_mug_target_picker::HandleDummy(), spell_hallows_end_candy::HandleDummy(), spell_hallows_end_bucket_lands::HandleDummy(), spell_midsummer_torch_catch::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_mana_burn_area::HandleDummy(), spell_voljin_war_drums::spell_voljin_war_drums_SpellScript::HandleDummy(), spell_voodoo::spell_voodoo_SpellScript::HandleDummy(), spell_sartharion_lava_strike::spell_sartharion_lava_strike_SpellScript::HandleDummy(), spell_halion_meteor_strike_targeting::spell_halion_meteor_strike_targeting_SpellScript::HandleDummy(), spell_halion_twilight_division::spell_halion_twilight_division_SpellScript::HandleDummy(), spell_drakkari_colossus_emerge::spell_drakkari_colossus_emerge_SpellScript::HandleDummy(), spell_drakkari_colossus_surge::spell_drakkari_colossus_surge_SpellScript::HandleDummy(), spell_putricide_ooze_eruption_searcher::spell_putricide_ooze_eruption_searcher_SpellScript::HandleDummy(), spell_voa_flaming_cinder::spell_voa_flaming_cinder_SpellScript::HandleDummy(), spell_q12096_q12092_dummy::spell_q12096_q12092_dummy_SpellScript::HandleDummy(), spell_vehicle_warhead_fuse::spell_vehicle_warhead_fuse_SpellScript::HandleDummy(), spell_q12589_shoot_rjr::spell_q12589_shoot_rjr_SpellScript::HandleDummy(), spell_najentus_needle_spine::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), spell_gen_cannibalize::HandleDummy(), spell_gen_gadgetzan_transporter_backfire::HandleDummy(), spell_gen_gnomish_transporter::HandleDummy(), spell_hun_masters_call::HandleDummy(), spell_hun_pet_carrion_feeder::HandleDummy(), spell_item_gnomish_universal_remote::HandleDummy(), spell_item_gnomish_shrink_ray::HandleDummy(), spell_item_trigger_spell::HandleDummy(), spell_item_deviate_fish::HandleDummy(), spell_item_flask_of_the_north::HandleDummy(), spell_item_make_a_wish::HandleDummy(), spell_item_mingos_fortune_generator::HandleDummy(), spell_item_net_o_matic::HandleDummy(), spell_item_noggenfogger_elixir::HandleDummy(), spell_item_savory_deviate_delight::HandleDummy(), spell_item_six_demon_bag::HandleDummy(), spell_item_underbelly_elixir::HandleDummy(), spell_item_vanquished_clutches::HandleDummy(), spell_item_purify_helboar_meat::HandleDummy(), spell_item_reindeer_transformation::HandleDummy(), spell_item_nigh_invulnerability::HandleDummy(), spell_item_poultryizer::HandleDummy(), spell_item_socrethars_stone::HandleDummy(), spell_item_demon_broiled_surprise::HandleDummy(), spell_item_complete_raptor_capture::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), spell_item_nitro_boots::HandleDummy(), spell_item_teach_language::HandleDummy(), spell_item_rocket_boots::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_item_greatmothers_soulcatcher::HandleDummy(), spell_mage_summon_water_elemental::HandleDummy(), spell_pal_blessing_of_faith::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pal_judgement_of_command::HandleDummy(), spell_pri_penance::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_q5206_test_fetid_skull::HandleDummy(), spell_q11396_11399_scourging_crystal_controller::HandleDummy(), spell_q11587_arcane_prisoner_rescue::HandleDummy(), spell_q11730_ultrasonic_screwdriver::HandleDummy(), spell_q12634_despawn_fruit_tosser::HandleDummy(), spell_q12683_take_sputum_sample::HandleDummy(), spell_q12937_relief_for_the_fallen::HandleDummy(), spell_q9452_cast_net::HandleDummy(), spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy::HandleDummy(), spell_q12308_escape_from_silverbrook::HandleDummy(), spell_q12641_death_comes_from_on_high::HandleDummy(), spell_rog_shiv::HandleDummy(), spell_sha_fire_nova::HandleDummy(), spell_warl_ritual_of_doom_effect::HandleDummy(), spell_warl_soulshatter::HandleDummy(), spell_warr_charge::HandleDummy(), spell_magtheridon_shadow_grasp::HandleDummyApply(), HandleDummyAuraProc(), spell_yogg_saron_destabilization_matrix::spell_yogg_saron_destabilization_matrix_SpellScript::HandleDummyEffect(), spell_yogg_saron_insane_periodic_trigger::spell_yogg_saron_insane_periodic_trigger_SpellScript::HandleDummyEffect(), spell_image_of_drakuru_reagent_check::HandleDummyEffect(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_talon_king_ikiss_blink::HandleDummyHitTarget(), spell_shadowfang_keep_forsaken_skills::spell_shadowfang_keep_forsaken_skills_AuraScript::HandleDummyTick(), spell_item_rocket_chicken::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_shadowfang_keep_haunting_spirits::spell_shadowfang_keep_haunting_spirits_AuraScript::HandleDummyTick(), spell_blood_council_shadow_prison::spell_blood_council_shadow_prison_AuraScript::HandleDummyTick(), spell_mark_of_nature::spell_mark_of_nature_SpellScript::HandleEffect(), spell_target_fissures::HandleEffect(), spell_mc_play_dead::spell_mc_play_dead_AuraScript::HandleEffectApply(), spell_midsummer_ribbon_pole::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_leotheras_insidious_whisper_aura::HandleEffectApply(), spell_serpentshrine_cavern_coilfang_water::HandleEffectApply(), spell_q12851_going_bearback::HandleEffectApply(), spell_oculus_soar::spell_oculus_soarAuraScript::HandleEffectPeriodic(), spell_gen_whisper_gulch_yogg_saron_whisper::HandleEffectPeriodic(), spell_rog_killing_spree::spell_rog_killing_spree_AuraScript::HandleEffectPeriodic(), spell_sha_earthbind_totem::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_warr_retaliation::HandleEffectProc(), spell_q11919_q11940_drake_hunt::spell_q11919_q11940_drake_hunt_AuraScript::HandleEffectRemove(), spell_teron_gorefiend_shadow_of_death::HandleEffectRemove(), spell_hydross_cleansing_field_command::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite_trigger_aura::HandleEffectRemove(), spell_q10930_big_bone_worm::spell_q10930_big_bone_worm_AuraScript::HandleEffectRemove(), spell_q10929_fumping::spell_q10929_fumping_AuraScript::HandleEffectRemove(), spell_flamewreath::HandleFinish(), spell_midsummer_fling_torch::HandleFinish(), spell_midsummer_juggling_torch::HandleFinish(), spell_wintergrasp_rp_gg::spell_wintergrasp_rp_gg_SpellScript::HandleFinish(), spell_dreamwalker_summoner::spell_dreamwalker_summoner_SpellScript::HandleForceCast(), spell_dreamwalker_summon_suppresser_effect::spell_dreamwalker_summon_suppresser_effect_SpellScript::HandleForceCast(), spell_ioc_bomb_blast_criteria::spell_ioc_bomb_blast_criteria_SpellScript::HandleGameObjectDamage(), OPvPCapturePointZM_GraveYard::HandleGossipOption(), spell_item_crazy_alchemists_potion::HandleHeal(), spell_magtheridon_quake::HandleHit(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::spell_sindragosa_frost_breath_SpellScript::HandleInfusion(), OutdoorPvPHP::HandleKillImpl(), OutdoorPvPNA::HandleKillImpl(), OutdoorPvPZM::HandleKillImpl(), BattlegroundIC::HandleKillUnit(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), spell_oculus_soar::spell_oculus_soarAuraScript::HandleOnEffectApply(), spell_oculus_rider_aura::spell_oculus_rider_auraAuraScript::HandleOnEffectApply(), spell_ticking_time_bomb::spell_ticking_time_bomb_AuraScript::HandleOnEffectRemove(), spell_delusions_of_jindo::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), spell_mark_of_frost_freeze::HandleOnHit(), spell_mutate_explode_bug::HandleOnHit(), spell_explode_trigger::HandleOnHit(), spell_blade_dance_targeting::HandleOnHit(), HandleOverrideClassScriptAuraProc(), aura_class_call_wild_magic::HandlePeriodic(), spell_shadow_sickle_periodic_damage::HandlePeriodic(), spell_hadronox_summon_periodic::spell_hadronox_summon_periodic_AuraScript::HandlePeriodic(), spell_halion_meteor_strike_spread::spell_halion_meteor_strike_spread_AuraScript::HandlePeriodic(), spell_sladran_grip_of_sladran::spell_sladran_grip_of_sladran_AuraScript::HandlePeriodic(), spell_algalon_phase_punch::spell_algalon_phase_punch_AuraScript::HandlePeriodic(), spell_close_rift::spell_close_rift_AuraScript::HandlePeriodic(), spell_serpentshrine_cavern_coilfang_water::HandlePeriodic(), spell_kaelthas_remote_toy::spell_kaelthas_remote_toy_AuraScript::HandlePeriodic(), spell_q10923_evil_draws_near_periodic::spell_q10923_evil_draws_near_periodic_AuraScript::HandlePeriodic(), spell_sha_totemic_mastery::HandlePeriodic(), spell_garr_separation_nexiety::spell_garr_separation_nexiety_AuraScript::HandlePeriodic(), spell_majordomo_separation_nexiety::spell_majordomo_separation_nexiety_AuraScript::HandlePeriodic(), spell_kiljaeden_shadow_spike::spell_kiljaeden_shadow_spike_AuraScript::HandlePeriodic(), spell_kiljaeden_armageddon_periodic::spell_kiljaeden_armageddon_periodic_AuraScript::HandlePeriodic(), spell_halion_twilight_cutter_periodic::spell_halion_twilight_cutter_periodic_AuraScript::HandlePeriodic(), spell_oculus_ride_ruby_emerald_amber_drake_que::spell_oculus_ride_ruby_emerald_amber_drake_que_AuraScript::HandlePeriodic(), spell_hun_sniper_training::HandlePeriodic(), spell_shadow_bolt_whirl::HandlePeriodic(), spell_voa_overcharge::spell_voa_overcharge_AuraScript::HandlePeriodicDummy(), AuraEffect::HandlePeriodicDummyAuraTick(), spell_magtheridon_shadow_grasp::HandlePeriodicRemove(), spell_igb_periodic_trigger_with_power_cost::spell_igb_periodic_trigger_with_power_cost_AuraScript::HandlePeriodicTick(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), spell_bronjahm_soulstorm_channel_ooc::spell_bronjahm_soulstorm_channel_ooc_AuraScript::HandlePeriodicTick(), spell_bronjahm_soulstorm_visual::spell_bronjahm_soulstorm_visual_AuraScript::HandlePeriodicTick(), spell_item_direbrew_remote_aura::HandlePeriodicTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceMoveByAI(), OutdoorPvPEP::HandlePlayerEnterZone(), OutdoorPvPHP::HandlePlayerEnterZone(), OutdoorPvPNA::HandlePlayerEnterZone(), OutdoorPvPSI::HandlePlayerEnterZone(), OutdoorPvPTF::HandlePlayerEnterZone(), OutdoorPvPZM::HandlePlayerEnterZone(), WorldSession::HandlePlayerLoginFromDB(), BattlegroundIC::HandlePlayerResurrect(), misc_commandscript::HandlePossessCommand(), spell_blood_queen_vampiric_bite::spell_blood_queen_vampiric_bite_SpellScript::HandlePresence(), spell_mark_of_malice::HandleProc(), spell_item_lil_phylactery::HandleProc(), spell_item_fate_rune_of_unsurpassed_vigor::HandleProc(), spell_mage_burning_determination::HandleProc(), spell_rog_tricks_of_the_trade::HandleProc(), spell_gyth_chromatic_protection::HandleProc(), spell_item_trauma::HandleProc(), spell_item_shadows_fate::HandleProc(), spell_utgarde_pinnacle_beast_mark::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_hun_improved_mend_pet::HandleProc(), spell_hun_misdirection::HandleProc(), spell_item_aegis_of_preservation::HandleProc(), spell_item_desperate_defense::HandleProc(), spell_mage_focus_magic::HandleProc(), spell_pal_blessing_of_sanctuary::HandleProc(), spell_pri_item_greater_heal_refund::HandleProc(), spell_pri_mana_leech::HandleProc(), spell_sha_item_lightning_shield_trigger::HandleProc(), spell_warr_vigilance::HandleProc(), spell_karazhan_temptation::HandleProc(), spell_dk_blood_caked_blade::HandleProc(), spell_dk_dancing_rune_weapon::HandleProc(), spell_gen_adaptive_warding::HandleProc(), spell_gen_moss_covered_feet::HandleProc(), spell_item_unsated_craving::HandleProc(), spell_item_shadowmourne::HandleProc(), spell_sha_item_lightning_shield::HandleProc(), spell_warl_glyph_of_shadowflame::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), spell_hun_lock_and_load::HandleProcs(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellAuraProc(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), AuraEffect::HandleRaidProcFromChargeAuraProc(), spell_dk_raise_dead::HandleRaiseDead(), spell_vael_burning_adrenaline::HandleRemove(), spell_kiljaeden_darkness::spell_kiljaeden_darkness_AuraScript::HandleRemove(), spell_entropius_void_zone_visual::spell_entropius_void_zone_visual_AuraScript::HandleRemove(), spell_igb_rocket_pack::spell_igb_rocket_pack_AuraScript::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_gen_mine_sweeper::HandleSchoolDMG(), spell_warl_shadowflame::HandleSchoolDMG(), spell_gen_bandage::HandleScript(), spell_pal_lay_on_hands::HandleScript(), spell_kormok_summon_bone_mages::HandleScript(), spell_kormok_summon_bone_minions::HandleScript(), spell_energize_aoe::spell_energize_aoe_SpellScript::HandleScript(), spell_saviana_conflagration_throwback::spell_saviana_conflagration_throwback_SpellScript::HandleScript(), spell_taldaram_glittering_sparks::spell_taldaram_glittering_sparks_SpellScript::HandleScript(), spell_blood_queen_bloodbolt::spell_blood_queen_bloodbolt_SpellScript::HandleScript(), spell_blood_queen_presence_of_the_darkfallen::spell_blood_queen_presence_of_the_darkfallen_SpellScript::HandleScript(), spell_igb_rocket_artillery::spell_igb_rocket_artillery_SpellScript::HandleScript(), spell_putricide_unstable_experiment::spell_putricide_unstable_experiment_SpellScript::HandleScript(), spell_sindragosa_icy_grip::spell_sindragosa_icy_grip_SpellScript::HandleScript(), spell_the_lich_king_jump::spell_the_lich_king_jump_SpellScript::HandleScript(), spell_the_lich_king_summon_spirit_bomb::spell_the_lich_king_summon_spirit_bomb_SpellScript::HandleScript(), spell_dreamwalker_summon_portal::spell_dreamwalker_summon_portal_SpellScript::HandleScript(), spell_dreamwalker_twisted_nightmares::spell_dreamwalker_twisted_nightmares_SpellScript::HandleScript(), spell_archavon_rock_shards::spell_archavon_rock_shards_SpellScript::HandleScript(), spell_wintergrasp_portal::spell_wintergrasp_portal_SpellScript::HandleScript(), spell_gen_create_lance::HandleScript(), spell_item_defibrillate::HandleScript(), spell_item_scroll_of_recall::HandleScript(), spell_shazzrah_gate_dummy::spell_shazzrah_gate_dummy_SpellScript::HandleScript(), spell_apothecary_lingering_fumes::HandleScript(), spell_apothecary_validate_area::HandleScript(), spell_apothecary_throw_cologne::HandleScript(), spell_apothecary_throw_perfume::HandleScript(), spell_hallows_end_trick::HandleScript(), spell_hallows_end_put_costume::HandleScript(), spell_hallows_end_trick_or_treat::HandleScript(), spell_winter_veil_mistletoe::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_ayamiss_swarmer_start_loop::HandleScript(), spell_moam_summon_mana_fiends::HandleScript(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), spell_mistress_kiss_area::spell_mistress_kiss_area_SpellScript::HandleScript(), spell_novos_summon_minions::spell_novos_summon_minions_SpellScript::HandleScript(), spell_festergut_gastric_bloat::spell_festergut_gastric_bloat_SpellScript::HandleScript(), spell_putricide_unbound_plague::spell_putricide_unbound_plague_SpellScript::HandleScript(), spell_putricide_choking_gas_bomb::spell_putricide_choking_gas_bomb_SpellScript::HandleScript(), spell_rotface_little_ooze_combine::spell_rotface_little_ooze_combine_SpellScript::HandleScript(), spell_rotface_large_ooze_combine::spell_rotface_large_ooze_combine_SpellScript::HandleScript(), spell_rotface_large_ooze_buff_combine::spell_rotface_large_ooze_buff_combine_SpellScript::HandleScript(), spell_the_lich_king_cast_back_to_caster::spell_the_lich_king_cast_back_to_caster_SpellScript::HandleScript(), spell_frost_giant_death_plague::spell_frost_giant_death_plague_SpellScript::HandleScript(), spell_yogg_saron_target_selectors::spell_yogg_saron_target_selectors_SpellScript::HandleScript(), spell_the_black_stalker_levitate::HandleScript(), spell_the_black_stalker_levitation_pulse::HandleScript(), spell_the_black_stalker_someone_grab_me::HandleScript(), spell_the_black_stalker_magnetic_pull::HandleScript(), spell_the_flag_of_ownership::HandleScript(), spell_gen_elune_candle::HandleScript(), spell_gen_teleporting::HandleScript(), spell_gen_dalaran_disguise::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_item_dimensional_ripper_area52::HandleScript(), spell_item_eggnog::HandleScript(), spell_q12735_song_of_cleansing::HandleScript(), spell_q13011_bear_flank_master::HandleScript(), spell_q12619_emblazon_runeblade_effect::HandleScript(), spell_q12919_gymers_grab::HandleScript(), spell_q12919_gymers_throw::HandleScript(), spell_q12641_death_comes_from_on_high_summon_ghouls::spell_q12641_death_comes_from_on_high_summon_ghouls_SpellScript::HandleScriptEffect(), spell_kalecgos_spectral_realm_dummy::spell_kalecgos_spectral_realm_dummy_SpellScript::HandleScriptEffect(), spell_entropius_negative_energy::spell_entropius_negative_energy_SpellScript::HandleScriptEffect(), spell_marrowgar_coldflame_bonestorm::spell_marrowgar_coldflame_SpellScript::HandleScriptEffect(), spell_yogg_saron_sanity_reduce::spell_yogg_saron_sanity_reduce_SpellScript::HandleScriptEffect(), spell_black_temple_bloodbolt::spell_black_temple_bloodbolt_SpellScript::HandleScriptEffect(), spell_lady_vashj_summon_sporebat::HandleScriptEffect(), spell_kaelthas_summon_weapons::spell_kaelthas_summon_weapons_SpellScript::HandleScriptEffect(), spell_kaelthas_gravity_lapse::spell_kaelthas_gravity_lapse_SpellScript::HandleScriptEffect(), spell_kaelthas_nether_beam::spell_kaelthas_nether_beam_SpellScript::HandleScriptEffect(), spell_gen_clone::HandleScriptEffect(), spell_gen_clone_weapon::HandleScriptEffect(), spell_gen_break_shield::HandleScriptEffect(), spell_gen_mounted_charge::HandleScriptEffect(), spell_gen_throw_shield::HandleScriptEffect(), spell_item_sleepy_willy::HandleScriptEffect(), spell_item_lil_xt::HandleScriptEffect(), spell_q12698_the_gift_that_keeps_on_giving::spell_q12698_the_gift_that_keeps_on_giving_SpellScript::HandleScriptEffect(), spell_death_knight_initiate_visual::HandleScriptEffect(), spell_q12779_an_end_to_all_things::HandleScriptEffect(), spell_brewfest_toss_mug::HandleScriptEffect(), spell_direbrew_summon_mole_machine_target_picker::HandleScriptEffect(), spell_request_second_mug::HandleScriptEffect(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), spell_dtk_summon_random_drakkari::spell_dtk_summon_random_drakkari_SpellScript::HandleScriptEffect(), spell_marrowgar_coldflame::spell_marrowgar_coldflame_SpellScript::HandleScriptEffect(), spell_arcane_chains_character_force_cast::spell_arcane_chains_character_force_cast_SpellScript::HandleScriptEffect(), spell_q12611_deathbolt::HandleScriptEffect(), spell_illidari_council_judgement::spell_illidari_council_judgement_SpellScript::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::spell_q10612_10613_the_fel_and_the_furious_SpellScript::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_hun_masters_call::HandleScriptEffect(), spell_item_mirrens_drinking_hat::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), spell_q1846_bending_shinbone::HandleScriptEffect(), spell_q14112_14145_chum_the_water::HandleScriptEffect(), WorldSession::HandleSelfResOpcode(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), HandleSpellClick(), spell_marrowgar_bone_spike_graveyard::spell_marrowgar_bone_spike_graveyard_SpellScript::HandleSpikes(), AuraEffect::HandleSpiritOfRedemption(), spell_gen_paralytic_poison::HandleStun(), spell_putricide_mutated_transformation::spell_putricide_mutated_transformation_SpellScript::HandleSummon(), spell_item_draenic_pale_ale::HandleSummon(), WorldSession::HandleTalentWipeConfirmOpcode(), spell_mother_shahraz_fatal_attraction::spell_mother_shahraz_fatal_attraction_SpellScript::HandleTeleportUnits(), spell_warl_drain_soul::HandleTick(), WorldSession::HandleTrainerBuySpellOpcode(), spell_trigger_spell_from_caster::spell_trigger_spell_from_caster_SpellScript::HandleTrigger(), spell_magic_eater_food::HandleTriggerSpell(), spell_winter_veil_racer_rocket_slam::HandleTriggerSpell(), spell_pal_righteous_defense::HandleTriggerSpellHit(), boss_onyxia::HandleWhelpSpam(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), boss_ichoron::boss_ichoronAI::IchoronDoCastToAllHostilePlayers(), spell_q10769_dissension_amongst_the_ranks_aura::if(), CharmInfo::InitCharmCreateSpells(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::InitFight(), boss_urok_doomhowl::boss_urok_doomhowlAI::InitializeAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::InitializeAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::InitializeAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::InitializeAI(), boss_gal_darah::boss_gal_darahAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), CharmInfo::InitPossessCreateSpells(), Guardian::InitStatsForLevel(), Totem::InitSummon(), boss_faction_championsAI::IsCCed(), npc_living_inferno::npc_living_infernoAI::IsSummonedBy(), TriggerAI::IsSummonedBy(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_bone_spike::npc_bone_spikeAI::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_pet_gen_fetch_ball::IsSummonedBy(), npc_kiljaeden_controller::npc_kiljaeden_controllerAI::JustDied(), npc_hallows_end_soh::JustDied(), boss_rajaxx::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), npc_swarm_scarab::npc_swarm_scarabAI::JustDied(), npc_phantom_hallucination::npc_phantom_hallucinationAI::JustDied(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::JustDied(), npc_gunship::npc_gunshipAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::JustDied(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::JustDied(), boss_steelbreaker::boss_steelbreakerAI::JustDied(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustDied(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustDied(), boss_freya_summons::boss_freya_summonsAI::JustDied(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vaporsAI::JustDied(), boss_yoggsaron_guardian_of_ys::boss_yoggsaron_guardian_of_ysAI::JustDied(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::JustDied(), boss_dalronn_the_controller::boss_dalronn_the_controllerAI::JustDied(), npc_ichor_globule::npc_ichor_globuleAI::JustDied(), boss_fathomguard_sharkkis::JustDied(), boss_fathomguard_tidalvess::JustDied(), boss_fathomguard_caribdis::JustDied(), CombatAI::JustDied(), npc_high_inquisitor_valroth::npc_high_inquisitor_valrothAI::JustDied(), boss_brutallus::boss_brutallusAI::JustDied(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_tharon_ja::boss_tharon_jaAI::JustDied(), boss_razuvious::boss_razuviousAI::JustDied(), boss_sapphiron::boss_sapphironAI::JustDied(), boss_anomalus::boss_anomalusAI::JustDied(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), boss_shade_of_akama::JustDied(), boss_teron_gorefiend::JustDied(), trigger_death::trigger_deathAI::JustDied(), CasterAI::JustEngagedWith(), boss_servant_quarters::JustEngagedWith(), npc_mograine::npc_mograineAI::JustEngagedWith(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::JustEngagedWith(), npc_hallows_end_soh::JustEngagedWith(), boss_eadric::boss_eadricAI::JustEngagedWith(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustEngagedWith(), boss_twin_valkyrAI::JustEngagedWith(), boss_garfrost::boss_garfrostAI::JustEngagedWith(), npc_stinky_icc::npc_stinky_iccAI::JustEngagedWith(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), npc_rimefang::npc_rimefangAI::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), boss_freya_summons::boss_freya_summonsAI::JustEngagedWith(), boss_vezax::boss_vezaxAI::JustEngagedWith(), boss_hodir::boss_hodirAI::JustEngagedWith(), boss_thorim::boss_thorimAI::JustEngagedWith(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::JustEngagedWith(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::JustEngagedWith(), boss_koralon::boss_koralonAI::JustEngagedWith(), boss_toravon::boss_toravonAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustEngagedWith(), boss_moragg::boss_moraggAI::JustEngagedWith(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::JustEngagedWith(), boss_essence_of_suffering::boss_essence_of_sufferingAI::JustEngagedWith(), boss_essence_of_desire::boss_essence_of_desireAI::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_watchkeeper_gargolmar::JustEngagedWith(), boss_gatewatcher_gyrokill::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), boss_sartharion::boss_sartharionAI::JustEngagedWith(), CombatAI::JustEngagedWith(), boss_ellris_duskhallow::JustEngagedWith(), boss_warlord_salaris::JustEngagedWith(), boss_garaxxas::JustEngagedWith(), boss_muru::boss_muruAI::JustEngagedWith(), boss_yauj::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_moorabi::boss_moorabiAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), boss_sapphiron::boss_sapphironAI::JustEngagedWith(), boss_keristrasza::boss_keristraszaAI::JustEngagedWith(), boss_steelbreaker::boss_steelbreakerAI::JustEngagedWith(), boss_gurtogg_bloodboil::boss_gurtogg_bloodboilAI::JustEngagedWith(), boss_mother_shahraz::boss_shahrazAI::JustEngagedWith(), boss_fathomlord_karathress::JustEngagedWith(), boss_fathomguard_sharkkis::JustEngagedWith(), boss_void_reaver::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustReachedHome(), boss_bronjahm::boss_bronjahmAI::JustReachedHome(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustReachedHome(), boss_gal_darah::boss_gal_darahAI::JustReachedHome(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::JustReachedHome(), boss_freya::boss_freyaAI::JustSummoned(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::JustSummoned(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_skeram::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_ragnaros::boss_ragnarosAI::JustSummoned(), boss_vexallus::JustSummoned(), boss_kiljaeden::boss_kiljaedenAI::JustSummoned(), npc_kalecgos_kj::npc_kalecgos_kjAI::JustSummoned(), boss_jindo::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_taldaram::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_gal_darah::boss_gal_darahAI::JustSummoned(), boss_prince_valanar_icc::boss_prince_valanarAI::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::JustSummoned(), boss_malygos::boss_malygosAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_svala::boss_svalaAI::JustSummoned(), boss_shirrak_the_dead_watcher::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), boss_grandmaster_vorpil::JustSummoned(), boss_gurtogg_bloodboil::boss_gurtogg_bloodboilAI::JustSummoned(), boss_illidan_stormrage::boss_illidan_stormrageAI::JustSummoned(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::JustSummoned(), boss_supremus::JustSummoned(), boss_veras_darkshadow::boss_veras_darkshadowAI::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::JustSummoned(), boss_archimonde::boss_archimondeAI::JustSummoned(), boss_broggok::JustSummoned(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::JustSummoned(), boss_ayamiss::JustSummoned(), Kill(), boss_azuregos::boss_azuregosAI::KilledUnit(), boss_anubrekhan::boss_anubrekhanAI::KilledUnit(), boss_doomwalker::boss_doomwalkerAI::KilledUnit(), npc_dark_iron_guzzler::KilledUnit(), boss_steelbreaker::boss_steelbreakerAI::KilledUnit(), emerald_dragonAI::KilledUnit(), boss_emeriss::boss_emerissAI::KilledUnit(), boss_felblood_kaelthas::LapseAction(), spell_mandokir_charge::LaunchHit(), Player::learnQuestRewardedSpells(), spell_taldaram_summon_flame_ball::spell_taldaram_summon_flame_ball_SpellScript::Load(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_fairbanks::npc_fairbanksAI::MoveInLineOfSight(), npc_brewfest_keg_thrower::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_love_in_air_snivel::MoveInLineOfSight(), boss_temporus::MoveInLineOfSight(), npc_medivh_bm::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), boss_doomwalker::boss_doomwalkerAI::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_spirit_shade::npc_spirit_shadeAI::MovementInform(), boss_selin_fireheart::MovementInform(), npc_unworthy_initiate::npc_unworthy_initiateAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_eck::boss_eckAI::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), boss_malygos::boss_malygosAI::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::MovementInform(), boss_headless_horseman::MovementInform(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), npc_wild_wyrm::npc_wild_wyrmAI::MovementInform(), boss_kagani_nightstrike::MovementInform(), npc_dark_iron_guzzler::MovementInform(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_assembly_lightning::npc_assembly_lightningAI::MovementInform(), boss_ymiron::boss_ymironAI::MovementInform(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), BattlegroundAB::NodeOccupied(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::npc_algalon_worm_holeAI(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_collapsing_star::npc_collapsing_starAI::npc_collapsing_starAI(), npc_concentrated_ball::npc_concentrated_ballAI::npc_concentrated_ballAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_frost_tomb::npc_frost_tombAI::npc_frost_tombAI(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_hol_monument::npc_hol_monumentAI::npc_hol_monumentAI(), npc_midsummer_torch_target::npc_midsummer_torch_target(), npc_power_spark::npc_power_sparkAI::npc_power_sparkAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::npc_ulduar_iron_constructAI(), npc_ulduar_toasty_fire::npc_ulduar_toasty_fireAI::npc_ulduar_toasty_fireAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), spell_shadowfang_keep_forsaken_skills::spell_shadowfang_keep_forsaken_skills_AuraScript::OnApply(), spell_direbrew_disarm::OnApply(), spell_love_is_in_the_air_romantic_picnic::OnApply(), spell_halion_combustion_consumption::spell_halion_combustion_consumption_AuraScript::OnApply(), spell_load_into_catapult::spell_load_into_catapult_AuraScript::OnApply(), spell_gen_damage_reduction_aura::OnApply(), spell_gruul_ground_slam_trigger::OnApply(), spell_hun_ascpect_of_the_viper::OnApply(), spell_hun_viper_attack_speed::OnApply(), spell_item_with_mount_speed::OnApply(), spell_blood_queen_vampiric_bite::spell_blood_queen_vampiric_bite_SpellScript::OnCast(), npc_chesspiece::OnCharmed(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_item_linken_boomerang::OnEffectLaunchTargetDisarm(), spell_item_linken_boomerang::OnEffectLaunchTargetStun(), npc_essence_of_twin::OnGossipHello(), npc_alchemist_adrianna::OnGossipHello(), go_inconspicuous_mine_car::OnGossipHello(), go_manticron_cube::OnGossipHello(), go_noblegarden_colored_egg::OnGossipHello(), go_seer_of_zebhalak::OnGossipHello(), go_jump_a_tron::OnGossipHello(), go_orb_of_domination::OnGossipHello(), go_scourge_enclosure::OnGossipHello(), go_strange_pool::OnGossipHello(), go_simon_cluster::OnGossipHello(), go_tablet_of_the_seven::OnGossipHello(), go_arcane_prison::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), npc_steward_of_time::OnGossipSelect(), npc_iruk::OnGossipSelect(), npc_zephyr::OnGossipSelect(), npc_taxi::OnGossipSelect(), npc_locksmith::OnGossipSelect(), npc_engineering_tele_trinket::OnGossipSelect(), npc_sayge::OnGossipSelect(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_lokhtos_darkbargainer::OnGossipSelect(), boss_gloomrel::OnGossipSelect(), npc_death_knight_initiate::OnGossipSelect(), npc_parqual_fintallas::OnGossipSelect(), npcs_riverbreeze_and_silversky::OnGossipSelect(), npc_braug_dimspirit::OnGossipSelect(), npc_avatar_of_freya::OnGossipSelect(), npc_adventurous_dwarf::OnGossipSelect(), npc_wg_demolisher_engineer::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), npc_wormhole::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), go_amberpine_outhouse::OnGossipSelect(), go_midsummer_bonfire::OnGossipSelect(), go_fel_crystalforge::OnGossipSelect(), go_bashir_crystalforge::OnGossipSelect(), go_apexis_relic::OnGossipSelect(), Player::OnGossipSelect(), lfg::LFGPlayerScript::OnMapChanged(), spell_apothecary_perfume_spill::OnPeriodic(), spell_apothecary_cologne_spill::OnPeriodic(), spell_muru_summon_blood_elves_periodic::spell_muru_summon_blood_elves_periodic_AuraScript::OnPeriodic(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_anubisath_mortal_strike::OnPeriodic(), spell_the_lich_king_soul_reaper::spell_the_lich_king_soul_reaper_AuraScript::OnPeriodic(), spell_yogg_saron_brain_link::spell_yogg_saron_brain_link_AuraScript::OnPeriodic(), spell_yogg_saron_empowered::spell_yogg_saron_empowered_AuraScript::OnPeriodic(), spell_illidan_tear_of_azzinoth_summon_channel::spell_illidan_tear_of_azzinoth_summon_channel_AuraScript::OnPeriodic(), spell_illidan_demon_transform1::spell_illidan_demon_transform1_AuraScript::OnPeriodic(), spell_illidan_cage_trap_stun::spell_illidan_cage_trap_stun_AuraScript::OnPeriodic(), spell_black_temple_dementia::spell_black_temple_dementia_AuraScript::OnPeriodic(), spell_npc22275_crystal_prison::spell_npc22275_crystal_prison_AuraScript::OnPeriodic(), spell_muru_darkness::spell_muru_darkness_AuraScript::OnPeriodic(), spell_mark_of_kazrogal::spell_mark_of_kazrogal_AuraScript::OnPeriodic(), spell_the_lich_king_vile_spirits::spell_the_lich_king_vile_spirits_AuraScript::OnPeriodic(), spell_assembly_rune_of_summoning::spell_assembly_rune_of_summoning_AuraScript::OnPeriodic(), spell_thorim_lightning_pillar_P2::spell_thorim_lightning_pillar_P2_AuraScript::OnPeriodic(), spell_illidan_demon_transform2::spell_illidan_demon_transform2_AuraScript::OnPeriodic(), spell_mark_of_kazzak::spell_mark_of_kazzak_AuraScript::OnPeriodic(), spell_karathress_power_of_tidalvess::OnPeriodic(), spell_karathress_power_of_caribdis::OnPeriodic(), spell_leotheras_demon_link::OnPeriodic(), spell_lurker_below_spout::OnPeriodic(), spell_gen_periodic_knock_away::OnPeriodic(), spell_gen_turkey_marker::OnPeriodic(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), BattlefieldWG::OnPlayerJoinWar(), spell_gen_obsidian_armor::OnProc(), npc_steward_of_time::OnQuestAccept(), npc_mikhail::OnQuestAccept(), npc_rocknot::OnQuestReward(), npc_thrall_bfu::OnQuestReward(), spell_kalecgos_spectral_realm::spell_kalecgos_spectral_realm_AuraScript::OnRemove(), spell_boss_salramm_steal_flesh::spell_boss_salramm_steal_flesh_AuraScript::OnRemove(), spell_azjol_nerub_web_wrap::spell_azjol_nerub_web_wrap_AuraScript::OnRemove(), spell_putricide_mutation_init::spell_putricide_mutation_init_AuraScript::OnRemove(), spell_the_lich_king_shadow_trap_visual::spell_the_lich_king_shadow_trap_visual_AuraScript::OnRemove(), spell_the_lich_king_harvest_soul::spell_the_lich_king_harvest_soul_AuraScript::OnRemove(), spell_icc_web_wrap::spell_icc_web_wrap_AuraScript::OnRemove(), spell_ioc_repair_turret::spell_ioc_repair_turret_AuraScript::OnRemove(), spell_kaelthas_flame_strike::spell_kaelthas_flame_strike_AuraScript::OnRemove(), spell_item_goblin_weather_machine_aura::OnRemove(), spell_warl_curse_of_doom::OnRemove(), boss_yoggsaron_descend_portal::boss_yoggsaron_descend_portalAI::OnSpellClick(), spell_item_shadowmourne_soul_fragment::OnStackChange(), at_hor_battered_hilt_throw::OnTrigger(), at_frozen_throne_teleport::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_stormwright_shelf::OnTrigger(), AreaTrigger_at_sholazar_waygate::OnTrigger(), npc_wintergarde_gryphon::PassengerBoarded(), npc_four_car_garage::npc_four_car_garageAI::PassengerBoarded(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), spell_quest_test_flight_charging::PerformKick(), spell_send_mug_control_aura::PeriodicTick(), spell_barreled_control_aura::PeriodicTick(), spell_dreamwalker_summon_suppresser::spell_dreamwalker_summon_suppresser_AuraScript::PeriodicTick(), spell_halion_twilight_phasing::spell_halion_twilight_phasing_SpellScript::Phase(), Battlefield::PlayerAskToLeave(), BattlegroundAV::PopulateNode(), spell_azjol_nerub_carrion_beetels::PrepareAuraScript(), spell_hodir_flash_freeze::spell_hodir_flash_freeze_AuraScript::PrepareAuraScript(), spell_anti_air_rocket_bomber::spell_anti_air_rocket_bomber_SpellScript::PrepareSpellScript(), spell_charge_shield_bomber::spell_charge_shield_bomber_SpellScript::PrepareSpellScript(), spell_fight_fire_bomber::spell_fight_fire_bomber_SpellScript::PrepareSpellScript(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11653_youre_not_so_big_now::PrepareSpellScript(), spell_q13369_fate_up_against_your_will::PrepareSpellScript(), SmartScript::ProcessAction(), ProcessCastaction(), Player::ProcessDelayedOperations(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::ProcessEvent(), ProcessTerrainStatusUpdate(), ProcessUnlearnAction(), BattlefieldWG::PromotePlayer(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), spell_gen_defend::RefreshVisualShields(), Vehicle::RemovePassenger(), spell_igb_below_zero::spell_igb_below_zero_SpellScript::RemovePassengers(), boss_keristrasza::boss_keristraszaAI::RemovePrison(), Player::ReportedAfkBy(), GuardAI::Reset(), boss_brutallus::boss_brutallusAI::Reset(), boss_sacrolash::boss_sacrolashAI::Reset(), boss_alythess::boss_alythessAI::Reset(), npc_demonic_vapor::npc_demonic_vaporAI::Reset(), npc_demonic_vapor_trail::npc_demonic_vapor_trailAI::Reset(), boss_kalec::boss_kalecAI::Reset(), boss_sathrovarr::boss_sathrovarrAI::Reset(), npc_kiljaeden_controller::npc_kiljaeden_controllerAI::Reset(), npc_singularity::npc_singularityAI::Reset(), npc_batrider::Reset(), npc_dark_iron_guzzler::Reset(), boss_headless_horseman_pumpkin::Reset(), npc_taretha::npc_tarethaAI::Reset(), npc_medivh_bm::Reset(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::Reset(), boss_halion::boss_halionAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_nerubian_burrower::npc_nerubian_burrowerAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_elemental::boss_drakkari_elementalAI::Reset(), npc_dark_nucleus::npc_dark_nucleusAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_raging_spirit::npc_raging_spiritAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_anomalus::boss_anomalusAI::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_bjarngrim::boss_bjarngrimAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_freya_lifebinder::boss_freya_lifebinderAI::Reset(), boss_freya_healthy_spore::boss_freya_healthy_sporeAI::Reset(), boss_freya_nature_bomb::boss_freya_nature_bombAI::Reset(), boss_thorim_lightning_orb::boss_thorim_lightning_orbAI::Reset(), boss_thorim_sif_blizzard::boss_thorim_sif_blizzardAI::Reset(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::Reset(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_yoggsaron_voice::boss_yoggsaron_voiceAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_frozen_orb::npc_frozen_orbAI::Reset(), npc_frozen_orb_stalker::npc_frozen_orb_stalkerAI::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::Reset(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::Reset(), npc_storm_cloud::npc_storm_cloudAI::Reset(), boss_illidan_stormrage::boss_illidan_stormrageAI::Reset(), npc_akama_shade::Reset(), boss_teron_gorefiend::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), boss_wrath_scryer_soccothrates::Reset(), npc_training_dummy::npc_training_dummyAI::Reset(), BfGraveyard::Resurrect(), Resurrect(), Player::ResurrectPlayer(), Player::RewardQuest(), boss_bjarngrim::boss_bjarngrimAI::RollStance(), boss_supremus::SchedulePhase(), boss_the_lurker_below::SchedulerPhaseOne(), Map::ScriptsProcess(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::SelectT(), npc_sayge::SendAction(), go_skull_pile::SendActionMenu(), npc_xt002_heart::npc_xt002_heartAI::SendEnergyToCorner(), Player::SendInitialPacketsAfterAddToMap(), Player::SendQuestUpdate(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), npc_eastvale_peasent::SetData(), SetModelVisible(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), npc_stable_master::npc_stable_masterAI::sGossipSelect(), npc_brewfest_keg_reciver::sGossipSelect(), npc_cairne_bloodhoof::npc_cairne_bloodhoofAI::sGossipSelect(), npc_chesspiece::sGossipSelect(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::sGossipSelect(), npc_zafod_boombox::npc_zafod_boomboxAI::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), boss_hodir::boss_hodirAI::SmallIcicles(), boss_zuljin::boss_zuljinAI::SpawnAdds(), boss_skadi_grauf::boss_skadi_graufAI::SpawnFlameTriggers(), boss_malchezaar::SpawnInfernal(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), boss_eadric::boss_eadricAI::SpellHit(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_ichor_globule::npc_ichor_globuleAI::SpellHit(), npc_vics_flying_machine::npc_vics_flying_machineAI::SpellHit(), npc_franklin::npc_franklinAI::SpellHit(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::SpellHit(), npc_dark_iron_guzzler::SpellHit(), boss_headless_horseman::SpellHit(), boss_thorim_pillar::boss_thorim_pillarAI::SpellHit(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), npc_living_constellation::npc_living_constellationAI::SpellHit(), boss_ignis::boss_ignisAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), npc_storm_cloud::npc_storm_cloudAI::SpellHit(), npc_soh_fire_trigger::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_midsummer_torch_target::SpellHit(), boss_magus_telestra::boss_magus_telestraAI::SpellHit(), boss_thorim::boss_thorimAI::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_bronjahm::boss_bronjahmAI::SpellHitTarget(), npc_demonic_vapor_trail::npc_demonic_vapor_trailAI::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_rotface::boss_rotfaceAI::SpellHitTarget(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), boss_hodir::boss_hodirAI::SpellHitTarget(), npc_ulduar_rocket_strike_trigger::npc_ulduar_rocket_strike_triggerAI::SpellHitTarget(), npc_q24545_lich_king::npc_q24545_lich_kingAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), boss_epoch::boss_epochAI::SpellHitTarget(), boss_sapphiron::boss_sapphironAI::SpellHitTarget(), boss_skadi_grauf::boss_skadi_graufAI::SpellHitTarget(), boss_shirrak_the_dead_watcher::SpellHitTarget(), npc_pet_gen_soul_trader_beacon::SpellHitTarget(), Battleground::SpiritofCompetitionEvent(), boss_ionar::boss_ionarAI::Split(), boss_heigan::boss_heiganAI::StartFightPhase(), npc_finklestein::npc_finklesteinAI::StartNextTask(), boss_ahune::StartPhase1(), Player::StoreItem(), spell_dk_ghoul_explode::Suicide(), boss_anzu::SummonBroods(), boss_ahune::SummonedCreatureDespawn(), boss_anubrekhan::boss_anubrekhanAI::SummonedCreatureDies(), boss_cthun::SummonedCreatureDies(), boss_vexallus::SummonedCreatureDies(), boss_paletress::boss_paletressAI::SummonMemory(), go_wind_stone::go_wind_stoneAI::SummonNPC(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), spell_igb_check_for_players::spell_igb_check_for_players_SpellScript::TeleportPlayer(), BattlegroundSA::TeleportToEntrancePosition(), spell_midsummer_fling_torch::ThrowNextTorch(), TriggerBurningPitch(), npc_orb_carrier::npc_orb_carrierAI::TriggerCutter(), spell_koralon_meteor_fists::spell_koralon_meteor_fists_AuraScript::TriggerFists(), spell_flame_warder_meteor_fists::spell_flame_warder_meteor_fists_AuraScript::TriggerFists(), spell_gen_holiday_buff_food::TriggerFoodBuff(), spell_karazhan_brittle_bones::spell_karazhan_brittle_bones_AuraScript::Update(), spell_black_temple_curse_of_the_bleakheart::spell_black_temple_curse_of_the_bleakheart_AuraScript::Update(), spell_mother_shahraz_random_periodic::spell_mother_shahraz_random_periodic_AuraScript::Update(), spell_mother_shahraz_beam_periodic::spell_mother_shahraz_beam_periodic_AuraScript::Update(), spell_mother_shahraz_saber_lash::spell_mother_shahraz_saber_lash_AuraScript::Update(), spell_illidari_council_deadly_strike::spell_illidari_council_deadly_strike_AuraScript::Update(), spell_black_temple_charge_rage::spell_black_temple_charge_rage_AuraScript::Update(), Pet::Update(), GameObject::Update(), TotemAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_image_of_medivh::npc_image_of_medivhAI::UpdateAI(), boss_felblood_kaelthas::UpdateAI(), boss_priestess_delrissa::UpdateAI(), boss_priestess_lackey_commonAI::UpdateAI(), boss_kagani_nightstrike::UpdateAI(), boss_ellris_duskhallow::UpdateAI(), boss_eramas_brightblaze::UpdateAI(), boss_yazzai::UpdateAI(), boss_warlord_salaris::UpdateAI(), boss_garaxxas::UpdateAI(), boss_apoko::UpdateAI(), boss_zelfan::UpdateAI(), boss_selin_fireheart::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_brutallus::boss_brutallusAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_sacrolash::boss_sacrolashAI::UpdateAI(), boss_alythess::boss_alythessAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), npc_demonic_vapor_trail::npc_demonic_vapor_trailAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kalec::boss_kalecAI::UpdateAI(), boss_sathrovarr::boss_sathrovarrAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), npc_kalecgos_kj::npc_kalecgos_kjAI::UpdateAI(), boss_muru::boss_muruAI::UpdateAI(), boss_entropius::boss_entropiusAI::UpdateAI(), npc_singularity::npc_singularityAI::UpdateAI(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::UpdateAI(), boss_fenstalker::boss_fenstalkerAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_brewfest_super_brew_trigger::UpdateAI(), npc_hallows_end_train_fire::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_headless_horseman_head::UpdateAI(), boss_headless_horseman_pumpkin::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), npc_giant_infernal::npc_giant_infernalAI::UpdateAI(), npc_gargoyle::npc_gargoyleAI::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), npc_time_rift::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_tharnarian::npc_tharnarianAI::UpdateAI(), boss_taldaram::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), npc_halion_controller::npc_halion_controllerAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_swarm_scarab::npc_swarm_scarabAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_druid::npc_toc_druidAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_paladin::npc_toc_paladinAI::UpdateAI(), npc_toc_priest::npc_toc_priestAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), npc_pos_icicle_trigger::npc_pos_icicle_triggerAI::UpdateAI(), npc_pos_collapsing_icicle::npc_pos_collapsing_icicleAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_anubrekhan::boss_anubrekhanAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::UpdateAI(), boss_heigan::boss_heiganAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razuvious::boss_razuviousAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_naxxramas_misc::boss_naxxramas_miscAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), npc_scion_of_eternity::npc_scion_of_eternityAI::UpdateAI(), npc_alexstrasza::npc_alexstraszaAI::UpdateAI(), boss_anomalus::boss_anomalusAI::UpdateAI(), boss_commander_stoutbeard::boss_commander_stoutbeardAI::UpdateAI(), boss_keristrasza::boss_keristraszaAI::UpdateAI(), boss_magus_telestra::boss_magus_telestraAI::UpdateAI(), boss_ormorok::boss_ormorokAI::UpdateAI(), npc_crystal_spike::npc_crystal_spikeAI::UpdateAI(), npc_crystalline_frayer::npc_crystalline_frayerAI::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir::boss_sjonnirAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::UpdateAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_lifebinder::boss_freya_lifebinderAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_freya_nature_bomb::boss_freya_nature_bombAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_saronite_animus::npc_ulduar_saronite_animusAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), npc_ulduar_icicle::npc_ulduar_icicleAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), npc_ulduar_proximity_mine::npc_ulduar_proximity_mineAI::UpdateAI(), npc_ulduar_emergency_fire_bot::npc_ulduar_emergency_fire_botAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_watcher::npc_ulduar_dark_rune_watcherAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_thorim_trap::boss_thorim_trapAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), npc_xt002_pummeller::npc_xt002_pummellerAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron_guardian_of_ys::boss_yoggsaron_guardian_of_ysAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), boss_yoggsaron_keeper::boss_yoggsaron_keeperAI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), boss_keleseth::boss_kelesethAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::UpdateAI(), boss_dalronn_the_controller::boss_dalronn_the_controllerAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), npc_beryl_sorcerer::npc_beryl_sorcererAI::UpdateAI(), npc_thassarian::npc_thassarianAI::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::UpdateAI(), npc_jungle_punch_target::npc_jungle_punch_targetAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_wg_queue::npc_wg_queueAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_gurtogg_bloodboil::boss_gurtogg_bloodboilAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), boss_mother_shahraz::boss_shahrazAI::UpdateAI(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::UpdateAI(), boss_essence_of_suffering::boss_essence_of_sufferingAI::UpdateAI(), boss_essence_of_desire::boss_essence_of_desireAI::UpdateAI(), boss_essence_of_anger::boss_essence_of_angerAI::UpdateAI(), npc_akama_shade::UpdateAI(), npc_creature_generator_akama::UpdateAI(), boss_supremus::UpdateAI(), boss_teron_gorefiend::UpdateAI(), boss_gathios_the_shatterer::boss_gathios_the_shattererAI::UpdateAI(), boss_high_nethermancer_zerevor::boss_high_nethermancer_zerevorAI::UpdateAI(), boss_lady_malande::boss_lady_malandeAI::UpdateAI(), boss_veras_darkshadow::boss_veras_darkshadowAI::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_ahune::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), boss_alar::boss_alarAI::UpdateAI(), boss_kaelthas::boss_kaelthasAI::UpdateAI(), npc_invis_infernal_caster::npc_invis_infernal_casterAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), trigger_periodic::trigger_periodicAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::UpdateAI(), npc_q24545_vegard_dummy::npc_q24545_vegard_dummyAI::UpdateAI(), boss_illidari_council::boss_illidari_councilAI::UpdateAI(), Player::UpdateAreaDependentAuras(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_akama_illidan::npc_akama_illidanAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdatePhase(), Player::UpdateZoneDependentAuras(), GameObject::Use(), Player::VehicleSpellInitialize(), boss_bjarngrim::boss_bjarngrimAI::WaypointReached(), npc_arthas::npc_arthasAI::WaypointReached(), and npc_engineer_helice::npc_engineer_heliceAI::WaypointReached().

◆ CastSpell() [4/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1215{
1216 return CastSpell(victim, spellInfo, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1217}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [5/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1220{
1221 SpellCastTargets targets;
1222 targets.SetUnitTarget(victim);
1223 return CastSpell(targets, spellInfo, nullptr, triggerFlags, castItem, triggeredByAura, originalCaster);
1224}

References CastSpell(), and SpellCastTargets::SetUnitTarget().

◆ CastSpell() [6/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1198{
1199 return CastSpell(victim, spellId, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1200}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [7/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1203{
1204 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1205 if (!spellInfo)
1206 {
1207 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1209 }
1210
1211 return CastSpell(victim, spellInfo, triggerFlags, castItem, triggeredByAura, originalCaster);
1212}

References CastSpell(), Object::GetGUID(), LOG_ERROR, SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastStop()

◆ ChangeSeat()

void Unit::ChangeSeat ( int8  seatId,
bool  next = true 
)
19974{
19975 if (!m_vehicle)
19976 return;
19977
19978 if (seatId < 0)
19979 {
19980 seatId = m_vehicle->GetNextEmptySeat(GetTransSeat(), next);
19981 if (seatId < 0)
19982 return;
19983 }
19984 else if (seatId == GetTransSeat() || !m_vehicle->HasEmptySeat(seatId))
19985 return;
19986
19988 if (!m_vehicle->AddPassenger(this, seatId))
19989 ABORT();
19990}
int8 GetNextEmptySeat(int8 seatId, bool next) const
Definition: Vehicle.cpp:235
bool HasEmptySeat(int8 seatId) const
Definition: Vehicle.cpp:218

References ABORT, Vehicle::AddPassenger(), Vehicle::GetNextEmptySeat(), WorldObject::GetTransSeat(), Vehicle::HasEmptySeat(), m_vehicle, and Vehicle::RemovePassenger().

Referenced by _EnterVehicle(), and WorldSession::HandleChangeSeatsOnControlledVehicle().

◆ CleanupBeforeRemoveFromMap()

void Unit::CleanupBeforeRemoveFromMap ( bool  finalCleanup)
15729{
15731 return;
15732
15733 // This needs to be before RemoveFromWorld to make GetCaster() return a valid pointer on aura removal
15735
15736 if (IsInWorld()) // not in world and not being removed atm
15738
15739 ASSERT(GetGUID());
15740
15741 // A unit may be in removelist and not in world, but it is still in grid
15742 // and may have some references during delete
15745
15746 if (finalCleanup)
15747 m_cleanupDone = true;
15748
15749 m_Events.KillAllEvents(false); // non-delatable (currently casted spells) will not deleted now but it will deleted at call in Map::RemoveAllObjectsInRemoveList
15750 CombatStop();
15755 GetMotionMaster()->Clear(false); // remove different non-standard movement generators.
15756}
void KillAllEvents(bool force)
Definition: EventProcessor.cpp:82
void deleteReferences(bool removeFromMap=false)
Definition: HostileRefMgr.cpp:125
void ClearAllThreat()
Definition: ThreatMgr.cpp:417
void CombatStop(bool includingCast=false)
Definition: Unit.cpp:10440
void RemoveAllGameObjects()
Definition: Unit.cpp:6201
void ClearComboPoints()
Definition: Unit.cpp:17129
void ClearComboPointHolders()
Definition: Unit.cpp:17184
HostileRefMgr & getHostileRefMgr()
Definition: Unit.h:2163
void RemoveFromWorld() override
Definition: Unit.cpp:15682
void RemoveAllAuras()
Definition: Unit.cpp:5259
ThreatMgr & GetThreatMgr()
Definition: Unit.h:2159
void Clear(bool reset=true)
Definition: MotionMaster.h:165

References ASSERT, MotionMaster::Clear(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearComboPoints(), CombatStop(), HostileRefMgr::deleteReferences(), Object::GetGUID(), getHostileRefMgr(), GetMotionMaster(), GetThreatMgr(), InterruptNonMeleeSpells(), IsDuringRemoveFromWorld(), Object::IsInWorld(), EventProcessor::KillAllEvents(), m_cleanupDone, m_Events, RemoveAllAuras(), RemoveAllGameObjects(), and RemoveFromWorld().

Referenced by CleanupsBeforeDelete().

◆ CleanupsBeforeDelete()

void Unit::CleanupsBeforeDelete ( bool  finalCleanup = true)
overridevirtual

Reimplemented from WorldObject.

15759{
15760 if (GetTransport())
15761 {
15763 SetTransport(nullptr);
15766 }
15767
15768 CleanupBeforeRemoveFromMap(finalCleanup);
15769}
void RemoveMovementFlag(uint32 flag)
Definition: Object.h:321
void Reset()
Definition: Object.h:275
void SetTransport(Transport *t)
Definition: Object.h:593
virtual void RemovePassenger(WorldObject *passenger, bool withAll=false)=0
void CleanupBeforeRemoveFromMap(bool finalCleanup)
Definition: Unit.cpp:15728

References CleanupBeforeRemoveFromMap(), WorldObject::GetTransport(), WorldObject::m_movementInfo, MOVEMENTFLAG_ONTRANSPORT, MovementInfo::RemoveMovementFlag(), Transport::RemovePassenger(), MovementInfo::TransportInfo::Reset(), WorldObject::SetTransport(), and MovementInfo::transport.

Referenced by Player::CleanupsBeforeDelete(), npc_commandscript::HandleNpcAddCommand(), and Map::RemoveAllObjectsInRemoveList().

◆ ClearAllReactives()

void Unit::ClearAllReactives ( )
17193{
17194 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
17195 m_reactiveTimer[i] = 0;
17196
17203}
@ CLASS_HUNTER
Definition: SharedDefines.h:143
@ CLASS_WARRIOR
Definition: SharedDefines.h:141
@ AURA_STATE_DEFENSE
Definition: SharedDefines.h:1292
@ AURA_STATE_HUNTER_PARRY
Definition: SharedDefines.h:1298
uint8 getClass() const
Definition: Unit.h:1438
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition: Unit.cpp:10546

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), getClass(), Object::GetTypeId(), HasAuraState(), m_reactiveTimer, MAX_REACTIVE, ModifyAuraState(), and TYPEID_PLAYER.

Referenced by Player::ActivateSpec(), npc_mograine::npc_mograineAI::DamageTaken(), and setDeathState().

◆ ClearComboPointHolders()

void Unit::ClearComboPointHolders ( )
17185{
17186 while (!m_ComboPointHolders.empty())
17187 {
17188 (*m_ComboPointHolders.begin())->ClearComboPoints(); // this also removes it from m_comboPointHolders
17189 }
17190}

References ClearComboPoints(), and m_ComboPointHolders.

Referenced by CreatureAI::_EnterEvadeMode(), CleanupBeforeRemoveFromMap(), npc_mograine::npc_mograineAI::DamageTaken(), Player::RemoveFromWorld(), and setDeathState().

◆ ClearComboPoints()

void Unit::ClearComboPoints ( )
17130{
17131 if (!m_comboTarget)
17132 {
17133 return;
17134 }
17135
17136 // remove Premed-like effects
17137 // (NB: this Aura retains the CP while it's active - now that CP have reset, it shouldn't be there anymore)
17139
17140 m_comboPoints = 0;
17143 m_comboTarget = nullptr;
17144}
@ SPELL_AURA_RETAIN_COMBO_POINTS
Definition: SpellAuraDefines.h:211

References m_comboPoints, m_comboTarget, RemoveAurasByType(), RemoveComboPointHolder(), SendComboPoints(), and SPELL_AURA_RETAIN_COMBO_POINTS.

Referenced by Spell::_handle_finish_phase(), CleanupBeforeRemoveFromMap(), ClearAllReactives(), ClearComboPointHolders(), Player::DuelComplete(), Player::RemoveFromWorld(), Player::setDeathState(), and UpdateReactives().

◆ ClearDiminishings()

void Unit::ClearDiminishings ( )
inline
1344{ m_Diminishing.clear(); }

References m_Diminishing.

Referenced by setDeathState().

◆ ClearInCombat()

void Unit::ClearInCombat ( )
13798{
13799 m_CombatTimer = 0;
13801
13802 // Player's state will be cleared in Player::UpdateContestedPvP
13803 if (Creature* creature = ToCreature())
13804 {
13805 if (creature->GetCreatureTemplate() && creature->GetCreatureTemplate()->unit_flags & UNIT_FLAG_IMMUNE_TO_PC)
13806 SetImmuneToPC(true); // set immunity state to the one from db on evade
13807
13810 ReplaceAllDynamicFlags(creature->GetCreatureTemplate()->dynamicflags);
13811
13812 creature->SetAssistanceTimer(0);
13813
13814 // Xinef: will be recalculated at follow movement generator initialization
13815 if (!IsPet() && !IsCharmed())
13816 return;
13817 }
13818 else if (Player* player = ToPlayer())
13819 {
13820 player->UpdatePotionCooldown();
13821 if (player->getClass() == CLASS_DEATH_KNIGHT)
13822 for (uint8 i = 0; i < MAX_RUNES; ++i)
13823 player->SetGracePeriod(i, 0);
13824 }
13825
13826 if (Player* player = this->ToPlayer())
13827 {
13828 sScriptMgr->OnPlayerLeaveCombat(player);
13829 }
13830}
#define MAX_RUNES
Definition: Player.h:399
@ UNIT_STATE_ATTACK_PLAYER
Definition: Unit.h:339
@ UNIT_FLAG_IN_COMBAT
Definition: Unit.h:467
@ UNIT_FLAG_IMMUNE_TO_PC
Definition: Unit.h:456
@ CLASS_DEATH_KNIGHT
Definition: SharedDefines.h:146
void ReplaceAllDynamicFlags(uint32 flag) override
Definition: Unit.h:1338
bool IsCharmed() const
Definition: Unit.h:1885
bool IsPet() const
Definition: Unit.h:1425
void SetImmuneToPC(bool apply, bool keepCombat=false)
Definition: Unit.cpp:13601
void RemoveUnitFlag(UnitFlags flags)
Definition: Unit.h:1496

References CLASS_DEATH_KNIGHT, ClearUnitState(), Object::HasDynamicFlag(), IsCharmed(), IsPet(), m_CombatTimer, MAX_RUNES, RemoveUnitFlag(), ReplaceAllDynamicFlags(), SetImmuneToPC(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_DYNFLAG_TAPPED, UNIT_FLAG_IMMUNE_TO_PC, UNIT_FLAG_IN_COMBAT, and UNIT_STATE_ATTACK_PLAYER.

Referenced by CombatStop(), Player::LoadFromDB(), and Update().

◆ ClearInPetCombat()

◆ ClearUnitState()

void Unit::ClearUnitState ( uint32  f)
inline
1411{ m_state &= ~f; }

References m_state.

Referenced by Spell::_cast(), HomeMovementGenerator< Creature >::_setTargetLocation(), Attack(), FollowerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), AttackStop(), ClearInCombat(), boss_thorim::boss_thorimAI::DisableThorim(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), HomeMovementGenerator< Creature >::DoFinalize(), WaypointMovementGenerator< Creature >::DoFinalize(), RandomMovementGenerator< T >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), RandomMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), Spell::EffectResurrectPet(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_ayamiss::EnterEvadeMode(), SmartAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), TimedFleeingMovementGenerator::Finalize(), RotateMovementGenerator::Finalize(), DistractMovementGenerator::Finalize(), AssistanceDistractMovementGenerator::Finalize(), Spell::finish(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), SmartAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), MotionMaster::MoveTargetedHome(), WaypointMovementGenerator< Creature >::OnArrived(), Creature::ReleaseFocus(), RemoveCharmedBy(), MotionTransport::RemovePassenger(), boss_ayamiss::Reset(), boss_hungarfen::Reset(), Player::ResetContestedPvP(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SetClientControl(), SetControlled(), Creature::setDeathState(), Player::setDeathState(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), Player::SetIsSpectator(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), spell_putricide_ooze_channel::spell_putricide_ooze_channel_SpellScript::StartAttack(), StopMoving(), StopMovingOnCurrentPos(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), and boss_kaelthas::boss_kaelthasAI::UpdateAI().

◆ CombatStart()

void Unit::CombatStart ( Unit target,
bool  initialAggro = true 
)
13620{
13621 // Xinef: Dont allow to start combat with triggers
13622 if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsTrigger())
13623 return;
13624
13625 if (initialAggro)
13626 {
13627 // Make player victim stand up automatically
13628 if (victim->getStandState() && victim->IsPlayer())
13629 {
13630 victim->SetStandState(UNIT_STAND_STATE_STAND);
13631 }
13632
13633 if (!victim->IsInCombat() && victim->GetTypeId() != TYPEID_PLAYER && !victim->ToCreature()->HasReactState(REACT_PASSIVE) && victim->ToCreature()->IsAIEnabled)
13634 {
13635 if (victim->IsPet())
13636 victim->ToCreature()->AI()->AttackedBy(this); // PetAI has special handler before AttackStart()
13637 else
13638 {
13639 victim->ToCreature()->AI()->AttackStart(this);
13640 // if the target is an NPC with a pet or minion, pet should react.
13641 if (Unit* victimControlledUnit = victim->GetFirstControlled())
13642 {
13643 victimControlledUnit->SetInCombatWith(this);
13644 SetInCombatWith(victimControlledUnit);
13645 victimControlledUnit->AddThreat(this, 0.0f);
13646 }
13647 }
13648
13649 // if unit has an owner, put owner in combat.
13650 if (Unit* victimOwner = victim->GetOwner())
13651 {
13652 if (!(victimOwner->IsInCombatWith(this)))
13653 {
13654 /* warding off to not take over aggro for no reason
13655 Using only AddThreat causes delay in attack */
13656 if (!victimOwner->IsInCombat() && victimOwner->IsAIEnabled)
13657 {
13658 victimOwner->ToCreature()->AI()->AttackStart(this);
13659 }
13660 victimOwner->SetInCombatWith(this);
13661 SetInCombatWith(victimOwner);
13662 victimOwner->AddThreat(this, 0.0f);
13663 }
13664 }
13665 }
13666
13667 bool alreadyInCombat = IsInCombat();
13668
13669 SetInCombatWith(victim);
13670 victim->SetInCombatWith(this);
13671
13672 // Xinef: If pet started combat - put owner in combat
13673 if (!alreadyInCombat && IsInCombat())
13674 {
13675 if (Unit* owner = GetOwner())
13676 {
13677 owner->SetInCombatWith(victim);
13678 victim->SetInCombatWith(owner);
13679 }
13680 }
13681 }
13682
13683 Unit* who = victim->GetCharmerOrOwnerOrSelf();
13684 if (who->GetTypeId() == TYPEID_PLAYER)
13685 SetContestedPvP(who->ToPlayer());
13686
13688 if (player && who->IsPvP() && (who->GetTypeId() != TYPEID_PLAYER || !player->duel || player->duel->Opponent != who))
13689 {
13690 player->UpdatePvP(true);
13692 }
13693}
@ REACT_PASSIVE
Definition: Unit.h:1035
@ UNIT_STAND_STATE_STAND
Definition: Unit.h:53
@ AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT
Definition: SpellDefines.h:67
void UpdatePvP(bool state, bool _override=false)
Definition: PlayerUpdates.cpp:1484
Unit * GetCharmerOrOwnerOrSelf() const
Definition: Unit.h:1862
void SetContestedPvP(Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
Definition: Unit.cpp:17513
Unit * GetFirstControlled() const
Definition: Unit.cpp:11069
bool IsInCombat() const
Definition: Unit.h:1702

References Creature::AI(), CreatureAI::AttackedBy(), UnitAI::AttackStart(), AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetFirstControlled(), GetOwner(), getStandState(), Object::GetTypeId(), Creature::HasReactState(), IsAIEnabled, IsInCombat(), IsPet(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), REACT_PASSIVE, RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), SetStandState(), Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, UNIT_STAND_STATE_STAND, and Player::UpdatePvP().

Referenced by AttackerStateUpdate(), Spell::CheckCast(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectTaunt(), and AssistDelayEvent::Execute().

◆ CombatStartOnCast()

void Unit::CombatStartOnCast ( Unit target,
bool  initialAggro = true,
uint32  duration = 0 
)
13696{
13697 // Xinef: Dont allow to start combat with triggers
13698 if (target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->IsTrigger())
13699 return;
13700
13701 if (initialAggro)
13702 {
13703 SetInCombatWith(target, duration);
13704
13705 // Xinef: If pet started combat - put owner in combat
13706 if (Unit* owner = GetOwner())
13707 owner->SetInCombatWith(target, duration);
13708 }
13709
13710 Unit* who = target->GetCharmerOrOwnerOrSelf();
13711 if (who->GetTypeId() == TYPEID_PLAYER)
13712 SetContestedPvP(who->ToPlayer());
13713
13715 if (player && who->IsPvP() && (who->GetTypeId() != TYPEID_PLAYER || !player->duel || player->duel->Opponent != who))
13716 {
13717 player->UpdatePvP(true);
13719 }
13720}
bool IsTrigger() const
Definition: Creature.h:77

References AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetOwner(), Object::GetTypeId(), IsPvP(), Creature::IsTrigger(), RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, and Player::UpdatePvP().

Referenced by Spell::_cast().

◆ CombatStop()

void Unit::CombatStop ( bool  includingCast = false)
10441{
10442 if (includingCast && IsNonMeleeSpellCast(false))
10444
10445 AttackStop();
10447 if (GetTypeId() == TYPEID_PLAYER)
10448 ToPlayer()->SendAttackSwingCancelAttack(); // melee and ranged forced attack cancel
10449 ClearInCombat();
10450
10451 // xinef: just in case
10454}
void SendAttackSwingCancelAttack()
Definition: PlayerMisc.cpp:140
bool IsPetInCombat() const
Definition: Unit.h:1705
void ClearInPetCombat()
Definition: Unit.cpp:13832
void RemoveAllAttackers()
Definition: Unit.cpp:10483
void ClearInCombat()
Definition: Unit.cpp:13797
bool AttackStop()
Definition: Unit.cpp:10407

References AttackStop(), ClearInCombat(), ClearInPetCombat(), Object::GetTypeId(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), IsPetInCombat(), RemoveAllAttackers(), Player::SendAttackSwingCancelAttack(), Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by CreatureAI::_EnterEvadeMode(), PetAI::_stopAttack(), Player::ActivateTaxiPathTo(), CleanupBeforeRemoveFromMap(), CombatStopWithPets(), boss_felblood_kaelthas::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::npc_crystalline_frayerAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), npc_calvin_montague::npc_calvin_montagueAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_akama_illidan::npc_akama_illidanAI::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSanctuary(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), TotemAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), hyjalAI::EnterEvadeMode(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::FlyAway(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleCombatStopCommand(), spell_q11919_q11940_drake_hunt::spell_q11919_q11940_drake_hunt_AuraScript::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), npc_commandscript::HandleNpcDeleteCommand(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), SmartScript::ProcessAction(), Player::RemovePet(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), setDeathState(), npc_crusade_persuaded::npc_crusade_persuadedAI::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), Player::TeleportTo(), Totem::UnSummon(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ CombatStopWithPets()

void Unit::CombatStopWithPets ( bool  includingCast = false)
10457{
10458 CombatStop(includingCast);
10459
10460 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10461 (*itr)->CombatStop(includingCast);
10462}

References CombatStop(), and m_Controlled.

Referenced by DealDamage(), WorldSession::HandleDuelCancelledOpcode(), Player::SetGameMaster(), Player::SetGMVisible(), and Player::UpdateArea().

◆ CountPctFromCurHealth()

uint32 Unit::CountPctFromCurHealth ( int32  pct) const
inline
1464{ return CalculatePct(GetHealth(), pct); }
uint32 GetHealth() const
Definition: Unit.h:1454

References CalculatePct(), and GetHealth().

Referenced by spell_gen_leeching_swarm::spell_gen_leeching_swarm_AuraScript::HandleEffectPeriodic().

◆ CountPctFromMaxHealth()

uint32 Unit::CountPctFromMaxHealth ( int32  pct) const
inline
1463{ return CalculatePct(GetMaxHealth(), pct); }
uint32 GetMaxHealth() const
Definition: Unit.h:1455

References CalculatePct(), and GetMaxHealth().

Referenced by spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_dk_anti_magic_shell_self::CalculateAmount(), spell_dk_vampiric_blood::CalculateAmount(), boss_ichoron::boss_ichoronAI::DoAction(), Spell::EffectHeal(), Spell::EffectHealPct(), Spell::EffectResurrect(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonType(), spell_dk_death_strike::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_warr_last_stand::HandleDummy(), HandleDummyAuraProc(), spell_alar_ember_blast::spell_alar_ember_blast_SpellScript::HandleForceCast(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), boss_harbinger_skyriss::JustSummoned(), boss_hadronox::boss_hadronoxAI::KilledUnit(), Pet::LoadPetFromDB(), boss_vaelastrasz::boss_vaelAI::Reset(), boss_zuljin::boss_zuljinAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), npc_phase_hunter::npc_phase_hunterAI::UpdateAI(), and npc_injured_patient::npc_injured_patientAI::UpdateAI().

◆ CreateTamedPetFrom() [1/2]

Pet * Unit::CreateTamedPetFrom ( Creature creatureTarget,
uint32  spell_id = 0 
)
17606{
17607 if (GetTypeId() != TYPEID_PLAYER)
17608 return nullptr;
17609
17610 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17611
17612 if (!pet->CreateBaseAtCreature(creatureTarget))
17613 {
17614 delete pet;
17615 return nullptr;
17616 }
17617
17618 uint8 level = creatureTarget->GetLevel() + 5 < GetLevel() ? (GetLevel() - 5) : creatureTarget->GetLevel();
17619
17620 if (!InitTamedPet(pet, level, spell_id))
17621 {
17622 delete pet;
17623 return nullptr;
17624 }
17625
17626 return pet;
17627}
@ HUNTER_PET
Definition: PetDefines.h:32
bool CreateBaseAtCreature(Creature *creature)
Definition: Pet.cpp:935
bool InitTamedPet(Pet *pet, uint8 level, uint32 spell_id)
Definition: Unit.cpp:17649

References Pet::CreateBaseAtCreature(), GetLevel(), Object::GetTypeId(), HUNTER_PET, InitTamedPet(), Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by Player::CreatePet(), Spell::EffectCreateTamedPet(), and Spell::EffectTameCreature().

◆ CreateTamedPetFrom() [2/2]

Pet * Unit::CreateTamedPetFrom ( uint32  creatureEntry,
uint32  spell_id = 0 
)
17630{
17631 if (GetTypeId() != TYPEID_PLAYER)
17632 return nullptr;
17633
17634 CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(creatureEntry);
17635 if (!creatureInfo)
17636 return nullptr;
17637
17638 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17639
17640 if (!pet->CreateBaseAtCreatureInfo(creatureInfo, this) || !InitTamedPet(pet, GetLevel(), spell_id))
17641 {
17642 delete pet;
17643 return nullptr;
17644 }
17645
17646 return pet;
17647}
bool CreateBaseAtCreatureInfo(CreatureTemplate const *cinfo, Unit *owner)
Definition: Pet.cpp:970

References Pet::CreateBaseAtCreatureInfo(), GetLevel(), Object::GetTypeId(), HUNTER_PET, InitTamedPet(), sObjectMgr, Object::ToPlayer(), and TYPEID_PLAYER.

◆ CreateVehicleKit()

bool Unit::CreateVehicleKit ( uint32  id,
uint32  creatureEntry 
)
18980{
18981 VehicleEntry const* vehInfo = sVehicleStore.LookupEntry(id);
18982 if (!vehInfo)
18983 return false;
18984
18985 m_vehicleKit = new Vehicle(this, vehInfo, creatureEntry);
18988 return true;
18989}
DBCStorage< VehicleEntry > sVehicleStore(VehicleEntryfmt)
@ UPDATEFLAG_VEHICLE
Definition: UpdateData.h:46
@ UNIT_MASK_VEHICLE
Definition: Unit.h:680

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, sVehicleStore, UNIT_MASK_VEHICLE, and UPDATEFLAG_VEHICLE.

Referenced by Creature::CreateFromProto(), AuraEffect::HandleAuraSetVehicle(), Mount(), and npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit().

◆ DealDamage()

uint32 Unit::DealDamage ( Unit attacker,
Unit victim,
uint32  damage,
CleanDamage const *  cleanDamage = nullptr,
DamageEffectType  damagetype = DIRECT_DAMAGE,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  spellProto = nullptr,
bool  durabilityLoss = true,
bool  allowGM = false,
Spell const *  spell = nullptr 
)
static
816{
817 // Xinef: initialize damage done for rage calculations
818 // Xinef: its rare to modify damage in hooks, however training dummy's sets damage to 0
819 uint32 rage_damage = damage + ((cleanDamage != nullptr) ? cleanDamage->absorbed_damage : 0);
820
821 //if (attacker)
822 {
823 if (victim->IsAIEnabled)
824 victim->GetAI()->DamageTaken(attacker, damage, damagetype, damageSchoolMask);
825
826 if (attacker && attacker->IsAIEnabled)
827 attacker->GetAI()->DamageDealt(victim, damage, damagetype);
828 }
829
830 // Hook for OnDamage Event
831 sScriptMgr->OnDamage(attacker, victim, damage);
832
833 if (victim->GetTypeId() == TYPEID_PLAYER && attacker != victim)
834 {
835 // Signal to pets that their owner was attacked
836 Pet* pet = victim->ToPlayer()->GetPet();
837
838 if (pet && pet->IsAlive())
839 pet->AI()->OwnerAttackedBy(attacker);
840 }
841
842 //Dont deal damage to unit if .cheat god is enable.
843 if (victim->GetTypeId() == TYPEID_PLAYER)
844 {
845 if (victim->ToPlayer()->GetCommandStatus(CHEAT_GOD))
846 {
847 return 0;
848 }
849 }
850
851 // Signal the pet it was attacked so the AI can respond if needed
852 if (victim->GetTypeId() == TYPEID_UNIT && attacker != victim && victim->IsPet() && victim->IsAlive())
853 victim->ToPet()->AI()->AttackedBy(attacker);
854
855 if (damagetype != NODAMAGE)
856 {
857 // interrupting auras with AURA_INTERRUPT_FLAG_DAMAGE before checking !damage (absorbed damage breaks that type of auras)
858 if (spellProto)
859 {
860 if (!spellProto->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
862 }
863 else
865
866 // interrupt spells with SPELL_INTERRUPT_FLAG_ABORT_ON_DMG on absorbed damage (no dots)
867 if (!damage && damagetype != DOT && cleanDamage && cleanDamage->absorbed_damage)
868 {
869 if (victim != attacker && victim->GetTypeId() == TYPEID_PLAYER)
870 {
871 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
872 {
873 if (spell->getState() == SPELL_STATE_PREPARING)
874 {
875 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
876 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
877 {
878 victim->InterruptNonMeleeSpells(false);
879 }
880 }
881 }
882 }
883 }
884
885 // We're going to call functions which can modify content of the list during iteration over it's elements
886 // Let's copy the list so we can prevent iterator invalidation
888 // copy damage to casters of this aura
889 for (AuraEffectList::iterator i = vCopyDamageCopy.begin(); i != vCopyDamageCopy.end(); ++i)
890 {
891 // Check if aura was removed during iteration - we don't need to work on such auras
892 if (!((*i)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
893 continue;
894 // check damage school mask
895 if (((*i)->GetMiscValue() & damageSchoolMask) == 0)
896 continue;
897
898 Unit* shareDamageTarget = (*i)->GetCaster();
899 if (!shareDamageTarget)
900 continue;
901 SpellInfo const* spell = (*i)->GetSpellInfo();
902
903 uint32 shareDamage = CalculatePct(damage, (*i)->GetAmount());
904
905 uint32 shareAbsorb = 0;
906 uint32 shareResist = 0;
907
908 if (shareDamageTarget->IsImmunedToDamageOrSchool(damageSchoolMask))
909 {
910 shareAbsorb = shareDamage;
911 shareDamage = 0;
912 }
913 else
914 {
915 DamageInfo sharedDamageInfo(attacker, shareDamageTarget, shareDamage, spellProto, damageSchoolMask, damagetype);
916 Unit::CalcAbsorbResist(sharedDamageInfo, true);
917 shareAbsorb = sharedDamageInfo.GetAbsorb();
918 shareResist = sharedDamageInfo.GetResist();
919 shareDamage = sharedDamageInfo.GetDamage();
920 Unit::DealDamageMods(shareDamageTarget, shareDamage, &shareAbsorb);
921 }
922
923 if (attacker && shareDamageTarget->GetTypeId() == TYPEID_PLAYER)
924 {
925 attacker->SendSpellNonMeleeDamageLog(shareDamageTarget, spell, shareDamage, damageSchoolMask, shareAbsorb, shareResist, damagetype == DIRECT_DAMAGE, 0, false, true);
926 }
927
928 Unit::DealDamage(attacker, shareDamageTarget, shareDamage, cleanDamage, NODAMAGE, damageSchoolMask, spellProto, false, false, damageSpell);
929 }
930 }
931
932 // Rage from Damage made (only from direct weapon damage)
933 if (attacker && cleanDamage && damagetype == DIRECT_DAMAGE && attacker != victim && attacker->getPowerType() == POWER_RAGE)
934 {
935 uint32 weaponSpeedHitFactor;
936
937 switch (cleanDamage->attackType)
938 {
939 case BASE_ATTACK:
940 case OFF_ATTACK:
941 {
942 weaponSpeedHitFactor = uint32(attacker->GetAttackTime(cleanDamage->attackType) / 1000.0f * (cleanDamage->attackType == BASE_ATTACK ? 3.5f : 1.75f));
943 if (cleanDamage->hitOutCome == MELEE_HIT_CRIT)
944 weaponSpeedHitFactor *= 2;
945
946 attacker->RewardRage(rage_damage, weaponSpeedHitFactor, true);
947 break;
948 }
949 case RANGED_ATTACK:
950 break;
951 default:
952 break;
953 }
954 }
955
956 if (!damage)
957 {
958 // Rage from absorbed damage
959 if (cleanDamage && cleanDamage->absorbed_damage)
960 {
961 if (victim->getPowerType() == POWER_RAGE)
962 victim->RewardRage(cleanDamage->absorbed_damage, 0, false);
963
964 if (attacker && attacker->getPowerType() == POWER_RAGE )
965 attacker->RewardRage(cleanDamage->absorbed_damage, 0, true);
966 }
967
968 return 0;
969 }
970
971 LOG_DEBUG("entities.unit", "DealDamageStart");
972
973 uint32 health = victim->GetHealth();
974 LOG_DEBUG("entities.unit", "deal dmg:{} to health:{} ", damage, health);
975
976 // duel ends when player has 1 or less hp
977 bool duel_hasEnded = false;
978 bool duel_wasMounted = false;
979 if (victim->GetTypeId() == TYPEID_PLAYER && victim->ToPlayer()->duel && damage >= (health - 1))
980 {
981 // xinef: situation not possible earlier, just return silently.
982 if (!attacker)
983 return 0;
984
985 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
986 if (victim->ToPlayer()->duel->Opponent == attacker || victim->ToPlayer()->duel->Opponent->GetGUID() == attacker->GetOwnerGUID())
987 damage = health - 1;
988
989 duel_hasEnded = true;
990 }
991 else if (victim->IsVehicle() && damage >= (health - 1) && victim->GetCharmer() && victim->GetCharmer()->GetTypeId() == TYPEID_PLAYER)
992 {
993 Player* victimRider = victim->GetCharmer()->ToPlayer();
994
995 if (victimRider && victimRider->duel && victimRider->duel->IsMounted)
996 {
997 // xinef: situation not possible earlier, just return silently.
998 if (!attacker)
999 return 0;
1000
1001 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
1002 if (victimRider->duel->Opponent == attacker || victimRider->duel->Opponent->GetGUID() == attacker->GetCharmerGUID())
1003 damage = health - 1;
1004
1005 duel_wasMounted = true;
1006 duel_hasEnded = true;
1007 }
1008 }
1009
1010 if (attacker && attacker != victim)
1011 if (Player* killer = attacker->GetCharmerOrOwnerPlayerOrPlayerItself())
1012 {
1013 // pussywizard: don't allow GMs to deal damage in normal way (this leaves no evidence in logs!), they have commands to do so
1014 //if (!allowGM && killer->GetSession()->GetSecurity() && killer->GetSession()->GetSecurity() <= SEC_ADMINISTRATOR)
1015 // return 0;
1016
1017 if (Battleground* bg = killer->GetBattleground())
1018 {
1019 bg->UpdatePlayerScore(killer, SCORE_DAMAGE_DONE, damage);
1020 killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, damage, 0, victim); // pussywizard: InBattleground() optimization
1021 }
1022 //killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT, damage); // pussywizard: optimization
1023 }
1024
1025 if (victim->GetTypeId() == TYPEID_PLAYER)
1026 ;//victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage); // pussywizard: optimization
1027 else if (!victim->IsControlledByPlayer() || victim->IsVehicle())
1028 {
1029 if (!victim->ToCreature()->hasLootRecipient())
1030 victim->ToCreature()->SetLootRecipient(attacker);
1031
1032 if (!attacker || attacker->IsControlledByPlayer() || attacker->IsCreatedByPlayer())
1033 {
1034 uint32 unDamage = health < damage ? health : damage;
1035 bool damagedByPlayer = unDamage && attacker && (attacker->IsPlayer() || attacker->m_movedByPlayer != nullptr);
1036 victim->ToCreature()->LowerPlayerDamageReq(unDamage, damagedByPlayer);
1037 }
1038 }
1039
1040 if (health <= damage)
1041 {
1042 LOG_DEBUG("entities.unit", "DealDamage: victim just died");
1043
1044 //if (attacker && victim->GetTypeId() == TYPEID_PLAYER && victim != attacker)
1045 //victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, health); // pussywizard: optimization
1046 Unit::Kill(attacker, victim, durabilityLoss, cleanDamage ? cleanDamage->attackType : BASE_ATTACK, spellProto, damageSpell);
1047 }
1048 else
1049 {
1050 LOG_DEBUG("entities.unit", "DealDamageAlive");
1051
1052 //if (victim->GetTypeId() == TYPEID_PLAYER)
1053 // victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, damage); // pussywizard: optimization
1054
1055 victim->ModifyHealth(- (int32)damage);
1056
1057 if (damagetype == DIRECT_DAMAGE || damagetype == SPELL_DIRECT_DAMAGE)
1058 victim->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, spellProto ? spellProto->Id : 0);
1059
1060 if (victim->GetTypeId() != TYPEID_PLAYER)
1061 {
1062 // Part of Evade mechanics. DoT's and Thorns / Retribution Aura do not contribute to this
1063 if (damagetype != DOT && damage > 0 && !victim->GetOwnerGUID().IsPlayer() && (!spellProto || !spellProto->HasAura(SPELL_AURA_DAMAGE_SHIELD)))
1065
1066 if (attacker)
1067 {
1068 if (spellProto && victim->CanHaveThreatList() && !victim->HasUnitState(UNIT_STATE_EVADE) && !victim->IsInCombatWith(attacker))
1069 {
1070 victim->CombatStart(attacker, !(spellProto->AttributesEx3 & SPELL_ATTR3_SUPRESS_TARGET_PROCS));
1071 }
1072
1073 victim->AddThreat(attacker, float(damage), damageSchoolMask, spellProto);
1074 }
1075 }
1076 else // victim is a player
1077 {
1078 // random durability for items (HIT TAKEN)
1080 {
1083 }
1084 }
1085
1086 // Rage from damage received
1087 if (attacker != victim && victim->getPowerType() == POWER_RAGE)
1088 {
1089 uint32 rageDamage = damage + (cleanDamage ? cleanDamage->absorbed_damage : 0);
1090 victim->RewardRage(rageDamage, 0, false);
1091 }
1092
1093 if (attacker && attacker->GetTypeId() == TYPEID_PLAYER)
1094 {
1095 // random durability for items (HIT DONE)
1097 {
1099 attacker->ToPlayer()->DurabilityPointLossForEquipSlot(slot);
1100 }
1101 }
1102
1103 if (damagetype != NODAMAGE && damage && (!spellProto || !(spellProto->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC) || spellProto->HasAttribute(SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK))))
1104 {
1105 if (victim != attacker && victim->GetTypeId() == TYPEID_PLAYER) // does not support creature push_back
1106 {
1107 if (damagetype != DOT && !(damageSpell && damageSpell->m_targets.HasDstChannel()))
1108 {
1109 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
1110 {
1111 if (spell->getState() == SPELL_STATE_PREPARING)
1112 {
1113 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
1114 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
1115 {
1116 victim->InterruptNonMeleeSpells(false);
1117 }
1118 else if (interruptFlags & SPELL_INTERRUPT_FLAG_PUSH_BACK)
1119 {
1120 spell->Delayed();
1121 }
1122 }
1123 }
1124
1125 if (Spell* spell = victim->m_currentSpells[CURRENT_CHANNELED_SPELL])
1126 if (spell->getState() == SPELL_STATE_CASTING)
1127 {
1128 if ((spell->m_spellInfo->ChannelInterruptFlags & CHANNEL_FLAG_DELAY) != 0)
1129 {
1130 spell->DelayedChannel();
1131 }
1132 }
1133 }
1134 }
1135 }
1136
1137 // last damage from duel opponent
1138 if (duel_hasEnded)
1139 {
1140 Player* he = duel_wasMounted ? victim->GetCharmer()->ToPlayer() : victim->ToPlayer();
1141
1142 ASSERT_NODEBUGINFO(he && he->duel);
1143
1144 if (duel_wasMounted) // In this case victim==mount
1145 victim->SetHealth(1);
1146 else
1147 he->SetHealth(1);
1148
1149 he->duel->Opponent->CombatStopWithPets(true);
1150 he->CombatStopWithPets(true);
1151
1152 he->CastSpell(he, 7267, true); // beg
1154 }
1155 }
1156
1157 LOG_DEBUG("entities.unit", "DealDamageEnd returned {} damage", damage);
1158
1159 return damage;
1160}
#define ASSERT_NODEBUGINFO
Definition: Errors.h:69
bool roll_chance_f(float chance)
Definition: Random.h:53
@ SCORE_DAMAGE_DONE
Definition: BattlegroundScore.h:33
#define MAX_AGGRO_RESET_TIME
Definition: CreatureData.h:32
@ CHEAT_GOD
Definition: Player.h:991
EquipmentSlots
Definition: Player.h:674
@ EQUIPMENT_SLOT_END
Definition: Player.h:695
@ NODAMAGE
Definition: Unit.h:439
@ CURRENT_CHANNELED_SPELL
Definition: Unit.h:992
@ CURRENT_GENERIC_SPELL
Definition: Unit.h:991
@ SPELL_AURA_DAMAGE_SHIELD
Definition: SpellAuraDefines.h:78
@ SPELL_AURA_SHARE_DAMAGE_PCT
Definition: SpellAuraDefines.h:363
@ SPELL_STATE_PREPARING
Definition: Spell.h:224
@ SPELL_STATE_CASTING
Definition: Spell.h:225
@ CHANNEL_FLAG_DELAY
Definition: SpellDefines.h:39
@ AURA_INTERRUPT_FLAG_TAKE_DAMAGE
Definition: SpellDefines.h:45
@ AURA_INTERRUPT_FLAG_DIRECT_DAMAGE
Definition: SpellDefines.h:68
@ SPELL_INTERRUPT_FLAG_ABORT_ON_DMG
Definition: SpellDefines.h:31
@ SPELL_INTERRUPT_FLAG_PUSH_BACK
Definition: SpellDefines.h:28
@ RATE_DURABILITY_LOSS_DAMAGE
Definition: IWorld.h:511
@ ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE
Definition: DBCEnums.h:138
@ POWER_RAGE
Definition: SharedDefines.h:270
@ SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK
Definition: SharedDefines.h:647
@ SPELL_ATTR3_TREAT_AS_PERIODIC
Definition: SharedDefines.h:518
@ SPELL_ATTR3_SUPRESS_TARGET_PROCS
Definition: SharedDefines.h:510
@ DUEL_WON
Definition: SharedDefines.h:3613
@ SPELL_ATTR4_REACTIVE_DAMAGE_PROC
Definition: SharedDefines.h:544
virtual void DamageTaken(Unit *, uint32 &, DamageEffectType, SpellSchoolMask)
Definition: UnitAI.h:356
virtual void DamageDealt(Unit *, uint32 &, DamageEffectType)
Definition: UnitAI.h:351
virtual void OwnerAttackedBy(Unit *)
Definition: CreatureAI.h:170
virtual void AttackedBy(Unit *)
Definition: CreatureAI.h:147
void SetLootRecipient(Unit *unit, bool withGroup=true)
Definition: Creature.cpp:1258
void SetLastDamagedTime(time_t val)
Definition: Creature.cpp:3600
void LowerPlayerDamageReq(uint32 unDamage, bool damagedByPlayer=true)
Definition: Creature.cpp:3706
CreatureAI * AI() const
Definition: Creature.h:136
bool IsPlayer() const
Definition: ObjectGuid.h:170
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition: PlayerUpdates.cpp:2131
void DurabilityPointLossForEquipSlot(EquipmentSlots slot)
Definition: Player.cpp:4732
Pet * GetPet() const
Definition: Player.cpp:8819
bool GetCommandStatus(uint32 command) const
Definition: Player.h:1166
int32 ModifyHealth(int32 val)
Definition: Unit.cpp:14079
Pet * ToPet()
Definition: Unit.h:2412
bool IsCreatedByPlayer() const
Definition: Unit.h:1843
Unit * GetCharmer() const
Definition: Unit.cpp:10607
static void Kill(Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
Definition: Unit.cpp:17956
void RewardRage(uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
Definition: Unit.cpp:20407
void SetHealth(uint32 val)
Definition: Unit.cpp:15464
ObjectGuid GetCharmerGUID() const
Definition: Unit.h:1834
Powers getPowerType() const
Definition: Unit.h:1473
void CombatStopWithPets(bool includingCast=false)
Definition: Unit.cpp:10456
uint32 ChannelInterruptFlags
Definition: SpellInfo.h:352
uint32 InterruptFlags
Definition: SpellInfo.h:350

References CleanDamage::absorbed_damage, ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, AddThreat(), Creature::AI(), ASSERT_NODEBUGINFO, CreatureAI::AttackedBy(), CleanDamage::attackType, SpellInfo::AttributesEx3, AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, AURA_INTERRUPT_FLAG_TAKE_DAMAGE, BASE_ATTACK, CalcAbsorbResist(), CalculatePct(), CanHaveThreatList(), CastSpell(), CHANNEL_FLAG_DELAY, CHEAT_GOD, CombatStart(), CombatStopWithPets(), CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, UnitAI::DamageDealt(), UnitAI::DamageTaken(), DealDamage(), DealDamageMods(), DIRECT_DAMAGE, DOT, Player::duel, DUEL_WON, Player::DuelComplete(), Player::DurabilityPointLossForEquipSlot(), EQUIPMENT_SLOT_END, DamageInfo::GetAbsorb(), GetAI(), GetAttackTime(), GetAuraEffectsByType(), GetCharmer(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), Player::GetCommandStatus(), DamageInfo::GetDamage(), GameTime::GetGameTime(), Object::GetGUID(), GetHealth(), GetOwnerGUID(), Player::GetPet(), getPowerType(), DamageInfo::GetResist(), Object::GetTypeId(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellCastTargets::HasDstChannel(), Creature::hasLootRecipient(), HasUnitState(), CleanDamage::hitOutCome, SpellInfo::Id, InterruptNonMeleeSpells(), IsAIEnabled, IsAlive(), IsControlledByPlayer(), IsCreatedByPlayer(), IsImmunedToDamageOrSchool(), IsInCombatWith(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), IsVehicle(), Kill(), LOG_DEBUG, Creature::LowerPlayerDamageReq(), m_currentSpells, m_movedByPlayer, Spell::m_targets, MAX_AGGRO_RESET_TIME, MELEE_HIT_CRIT, ModifyHealth(), NODAMAGE, OFF_ATTACK, CreatureAI::OwnerAttackedBy(), POWER_RAGE, RANGED_ATTACK, RATE_DURABILITY_LOSS_DAMAGE, RemoveAurasWithInterruptFlags(), RewardRage(), roll_chance_f(), SCORE_DAMAGE_DONE, SendSpellNonMeleeDamageLog(), SetHealth(), Creature::SetLastDamagedTime(), Creature::SetLootRecipient(), SPELL_ATTR3_SUPRESS_TARGET_PROCS, SPELL_ATTR3_TREAT_AS_PERIODIC, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK, SPELL_AURA_DAMAGE_SHIELD, SPELL_AURA_SHARE_DAMAGE_PCT, SPELL_DIRECT_DAMAGE, SPELL_INTERRUPT_FLAG_ABORT_ON_DMG, SPELL_INTERRUPT_FLAG_PUSH_BACK, SPELL_STATE_CASTING, SPELL_STATE_PREPARING, sScriptMgr, sWorld, Object::ToCreature(), ToPet(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, UNIT_STATE_EVADE, Player::UpdateAchievementCriteria(), and urand().

Referenced by CalcAbsorbResist(), DealDamage(), DealMeleeDamage(), DealSpellDamage(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), Spell::EffectInstaKill(), Player::EnvironmentalDamage(), spell_mt_phoenix_burn::HandleAfterCast(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), spell_svala_ritual_strike::spell_svala_ritual_strike_SpellScript::HandleDummyEffect(), spell_lady_vashj_magic_barrier::HandleEffectRemove(), spell_alar_ember_blast::spell_alar_ember_blast_SpellScript::HandleForceCast(), spell_algalon_collapse::spell_algalon_collapse_AuraScript::HandlePeriodic(), spell_kaelthas_burn::spell_kaelthas_burn_AuraScript::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_gluth_decimate::spell_gluth_decimate_SpellScript::HandleScriptEffect(), boss_akilzon::boss_akilzonAI::HandleStormSequence(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::JustDied(), spell_valkyr_touch::spell_valkyr_touchAuraScript::PrepareAuraScript(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), boss_archimonde::boss_archimondeAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ DealDamageMods()

◆ DealHeal()

int32 Unit::DealHeal ( Unit healer,
Unit victim,
uint32  addhealth 
)
static
10946{
10947 int32 gain = 0;
10948
10949 if (healer)
10950 {
10951 if (victim->IsAIEnabled)
10952 victim->GetAI()->HealReceived(healer, addhealth);
10953
10954 if (healer->IsAIEnabled)
10955 healer->GetAI()->HealDone(victim, addhealth);
10956 }
10957
10958 if (addhealth)
10959 gain = victim->ModifyHealth(int32(addhealth));
10960
10961 // Hook for OnHeal Event
10962 sScriptMgr->OnHeal(healer, victim, (uint32&)gain);
10963
10964 Unit* unit = healer;
10965
10966 if (healer && healer->GetTypeId() == TYPEID_UNIT && healer->ToCreature()->IsTotem())
10967 unit = healer->GetOwner();
10968
10969 if (!unit)
10970 return gain;
10971
10972 if (Player* player = unit->ToPlayer())
10973 {
10974 if (Battleground* bg = player->GetBattleground())
10975 bg->UpdatePlayerScore(player, SCORE_HEALING_DONE, gain);
10976
10977 // use the actual gain, as the overheal shall not be counted, skip gain 0 (it ignored anyway in to criteria)
10978 if (gain && player->InBattleground()) // pussywizard: InBattleground() optimization
10979 player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, gain, 0, victim);
10980
10981 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED, addhealth); // pussywizard: optimization
10982 }
10983
10984 /*if (Player* player = victim->ToPlayer())
10985 {
10986 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED, gain); // pussywizard: optimization
10987 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED, addhealth); // pussywizard: optimization
10988 }*/
10989
10990 return gain;
10991}
@ SCORE_HEALING_DONE
Definition: BattlegroundScore.h:34
@ ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE
Definition: DBCEnums.h:177
virtual void HealReceived(Unit *, uint32 &)
Definition: UnitAI.h:359
virtual void HealDone(Unit *, uint32 &)
Definition: UnitAI.h:365

References ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, GetAI(), GetOwner(), Object::GetTypeId(), UnitAI::HealDone(), UnitAI::HealReceived(), IsAIEnabled, IsTotem(), ModifyHealth(), SCORE_HEALING_DONE, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), and TYPEID_UNIT.

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), HealBySpell(), and npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI().

◆ DealMeleeDamage()

void Unit::DealMeleeDamage ( CalcDamageInfo damageInfo,
bool  durabilityLoss 
)
Todo:
: Move this to a packet handler
1832{
1833 Unit* victim = damageInfo->target;
1834
1835 auto canTakeMeleeDamage = [&]()
1836 {
1837 return victim->IsAlive() && !victim->HasUnitState(UNIT_STATE_IN_FLIGHT) && (victim->GetTypeId() != TYPEID_UNIT || !victim->ToCreature()->IsEvadingAttacks());
1838 };
1839
1840 if (!canTakeMeleeDamage())
1841 {
1842 return;
1843 }
1844
1845 // Hmmmm dont like this emotes client must by self do all animations
1846 if (damageInfo->HitInfo & HITINFO_CRITICALHIT)
1848 if (damageInfo->blocked_amount && damageInfo->TargetState != VICTIMSTATE_BLOCKS)
1850
1851 if (damageInfo->TargetState == VICTIMSTATE_PARRY)
1852 {
1853 // Get attack timers
1854 float offtime = float(victim->getAttackTimer(OFF_ATTACK));
1855 float basetime = float(victim->getAttackTimer(BASE_ATTACK));
1856 // Reduce attack time
1857 if (victim->haveOffhandWeapon() && offtime < basetime)
1858 {
1859 float percent20 = victim->GetAttackTime(OFF_ATTACK) * 0.20f;
1860 float percent60 = 3.0f * percent20;
1861 if (offtime > percent20 && offtime <= percent60)
1862 victim->setAttackTimer(OFF_ATTACK, uint32(percent20));
1863 else if (offtime > percent60)
1864 {
1865 offtime -= 2.0f * percent20;
1866 victim->setAttackTimer(OFF_ATTACK, uint32(offtime));
1867 }
1868 }
1869 else
1870 {
1871 float percent20 = victim->GetAttackTime(BASE_ATTACK) * 0.20f;
1872 float percent60 = 3.0f * percent20;
1873 if (basetime > percent20 && basetime <= percent60)
1874 victim->setAttackTimer(BASE_ATTACK, uint32(percent20));
1875 else if (basetime > percent60)
1876 {
1877 basetime -= 2.0f * percent20;
1878 victim->setAttackTimer(BASE_ATTACK, uint32(basetime));
1879 }
1880 }
1881 }
1882
1883 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1884 {
1885 if (!canTakeMeleeDamage() || (!damageInfo->damages[i].damage && !damageInfo->damages[i].absorb && !damageInfo->damages[i].resist))
1886 {
1887 continue;
1888 }
1889
1890 // Call default DealDamage
1891 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->damages[i].absorb, damageInfo->attackType, damageInfo->hitOutCome);
1892 Unit::DealDamage(this, victim, damageInfo->damages[i].damage, &cleanDamage, DIRECT_DAMAGE, SpellSchoolMask(damageInfo->damages[i].damageSchoolMask), nullptr, durabilityLoss);
1893 }
1894
1895 // If this is a creature and it attacks from behind it has a probability to daze it's victim
1896 if ((damageInfo->damages[0].damage + damageInfo->damages[1].damage) && ((damageInfo->hitOutCome == MELEE_HIT_CRIT || damageInfo->hitOutCome == MELEE_HIT_CRUSHING || damageInfo->hitOutCome == MELEE_HIT_NORMAL || damageInfo->hitOutCome == MELEE_HIT_GLANCING) &&
1897 GetTypeId() != TYPEID_PLAYER && !ToCreature()->IsControlledByPlayer() && !victim->HasInArc(M_PI, this)
1898 && (victim->GetTypeId() == TYPEID_PLAYER || !victim->ToCreature()->isWorldBoss()) && !victim->IsVehicle()))
1899 {
1900 // -probability is between 0% and 40%
1901 // 20% base chance
1902 float Probability = 20.0f;
1903
1904 // there is a newbie protection, at level 10 just 7% base chance; assuming linear function
1905 if (victim->GetLevel() < 30)
1906 Probability = 0.65f * victim->GetLevel() + 0.5f;
1907
1908 uint32 VictimDefense = victim->GetDefenseSkillValue();
1909 uint32 AttackerMeleeSkill = GetUnitMeleeSkill();
1910
1911 // xinef: fix daze mechanics
1912 Probability -= ((float)VictimDefense - AttackerMeleeSkill) * 0.1428f;
1913
1914 if (Probability > 40.0f)
1915 Probability = 40.0f;
1916
1917 if (roll_chance_f(std::max(0.0f, Probability)))
1918 CastSpell(victim, 1604, true);
1919 }
1920
1921 if (GetTypeId() == TYPEID_PLAYER)
1922 ToPlayer()->CastItemCombatSpell(victim, damageInfo->attackType, damageInfo->procVictim, damageInfo->procEx);
1923
1924 // Do effect if any damage done to target
1925 if (damageInfo->damages[0].damage + damageInfo->damages[1].damage)
1926 {
1927 // We're going to call functions which can modify content of the list during iteration over it's elements
1928 // Let's copy the list so we can prevent iterator invalidation
1930 for (AuraEffectList::const_iterator dmgShieldItr = vDamageShieldsCopy.begin(); dmgShieldItr != vDamageShieldsCopy.end(); ++dmgShieldItr)
1931 {
1932 SpellInfo const* i_spellProto = (*dmgShieldItr)->GetSpellInfo();
1933 // Damage shield can be resisted...
1934 if (SpellMissInfo missInfo = victim->SpellHitResult(this, i_spellProto, false))
1935 {
1936 victim->SendSpellMiss(this, i_spellProto->Id, missInfo);
1937 continue;
1938 }
1939
1940 // ...or immuned
1941 if (IsImmunedToDamageOrSchool(i_spellProto))
1942 {
1943 victim->SendSpellDamageImmune(this, i_spellProto->Id);
1944 continue;
1945 }
1946
1947 uint32 damage = uint32(std::max(0, (*dmgShieldItr)->GetAmount())); // xinef: done calculated at amount calculation
1948
1949 if (Unit* caster = (*dmgShieldItr)->GetCaster())
1950 {
1951 damage = caster->SpellDamageBonusDone(this, i_spellProto, damage, SPELL_DIRECT_DAMAGE, (*dmgShieldItr)->GetEffIndex());
1952 damage = this->SpellDamageBonusTaken(caster, i_spellProto, damage, SPELL_DIRECT_DAMAGE);
1953 }
1954
1955 uint32 absorb = 0;
1956
1957 DamageInfo dmgInfo(victim, this, damage, i_spellProto, i_spellProto->GetSchoolMask(), SPELL_DIRECT_DAMAGE);
1958 Unit::CalcAbsorbResist(dmgInfo);
1959 absorb = dmgInfo.GetAbsorb();
1960 damage = dmgInfo.GetDamage();
1961
1962 Unit::DealDamageMods(this, damage, &absorb);
1963
1965 WorldPacket data(SMSG_SPELLDAMAGESHIELD, (8 + 8 + 4 + 4 + 4 + 4));
1966 data << victim->GetGUID();
1967 data << GetGUID();
1968 data << uint32(i_spellProto->Id);
1969 data << uint32(damage); // Damage
1970 int32 overkill = int32(damage) - int32(GetHealth());
1971 data << uint32(overkill > 0 ? overkill : 0); // Overkill
1972 data << uint32(i_spellProto->GetSchoolMask());
1973 victim->SendMessageToSet(&data, true);
1974
1975 Unit::DealDamage(victim, this, damage, 0, SPELL_DIRECT_DAMAGE, i_spellProto->GetSchoolMask(), i_spellProto, true);
1976 }
1977 }
1978}
@ EMOTE_ONESHOT_WOUND_CRITICAL
Definition: SharedDefines.h:1924
@ EMOTE_ONESHOT_PARRY_SHIELD
Definition: SharedDefines.h:1930
SpellMissInfo
Definition: SharedDefines.h:1518
@ SMSG_SPELLDAMAGESHIELD
Definition: Opcodes.h:621
bool isWorldBoss() const
Definition: Creature.h:116
bool HasInArc(float arcangle, const Position *pos, float targetRadius=0.0f) const
Definition: Position.cpp:140
void CastItemCombatSpell(Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
Definition: Player.cpp:7112
uint32 GetUnitMeleeSkill(Unit const *target=nullptr) const
Definition: Unit.h:1650
void SendSpellMiss(Unit *target, uint32 spellID, SpellMissInfo missInfo)
Definition: Unit.cpp:6383
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition: Unit.cpp:3588
void SendSpellDamageImmune(Unit *target, uint32 spellId)
Definition: Unit.cpp:6407
SpellMissInfo SpellHitResult(Unit *victim, SpellInfo const *spell, bool canReflect=false)
Definition: Unit.cpp:3434
uint32 SpellDamageBonusTaken(Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
Definition: Unit.cpp:11785
void HandleEmoteCommand(uint32 emoteId)
Definition: Unit.cpp:1980
SpellSchoolMask GetSchoolMask() const
Definition: SpellInfo.cpp:1974

References CalcDamageInfo::absorb, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, CalcAbsorbResist(), Player::CastItemCombatSpell(), CastSpell(), CalcDamageInfo::cleanDamage, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, DealDamage(), DealDamageMods(), DIRECT_DAMAGE, EMOTE_ONESHOT_PARRY_SHIELD, EMOTE_ONESHOT_WOUND_CRITICAL, DamageInfo::GetAbsorb(), GetAttackTime(), getAttackTimer(), GetAuraEffectsByType(), DamageInfo::GetDamage(), GetDefenseSkillValue(), Object::GetGUID(), GetHealth(), GetLevel(), SpellInfo::GetSchoolMask(), Object::GetTypeId(), GetUnitMeleeSkill(), HandleEmoteCommand(), Position::HasInArc(), HasUnitState(), haveOffhandWeapon(), CalcDamageInfo::HitInfo, HITINFO_CRITICALHIT, CalcDamageInfo::hitOutCome, SpellInfo::Id, IsAlive(), IsControlledByPlayer(), Creature::IsEvadingAttacks(), IsImmunedToDamageOrSchool(), IsVehicle(), Creature::isWorldBoss(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_GLANCING, MELEE_HIT_NORMAL, OFF_ATTACK, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::resist, roll_chance_f(), WorldObject::SendMessageToSet(), SendSpellDamageImmune(), SendSpellMiss(), setAttackTimer(), SMSG_SPELLDAMAGESHIELD, SPELL_AURA_DAMAGE_SHIELD, SPELL_DIRECT_DAMAGE, SpellDamageBonusTaken(), SpellHitResult(), CalcDamageInfo::target, CalcDamageInfo::TargetState, Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, UNIT_STATE_IN_FLIGHT, VICTIMSTATE_BLOCKS, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ DealSpellDamage()

void Unit::DealSpellDamage ( SpellNonMeleeDamage damageInfo,
bool  durabilityLoss,
Spell const *  spell = nullptr 
)
1441{
1442 if (damageInfo == 0)
1443 return;
1444
1445 Unit* victim = damageInfo->target;
1446
1447 if (!victim)
1448 return;
1449
1450 if (!victim->IsAlive() || victim->IsInFlight() || (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks()))
1451 return;
1452
1453 SpellInfo const* spellProto = damageInfo->spellInfo;
1454 if (!spellProto)
1455 {
1456 LOG_DEBUG("entities.unit", "Unit::DealSpellDamage has wrong damageInfo");
1457 return;
1458 }
1459
1460 // Call default DealDamage
1461 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->absorb, BASE_ATTACK, MELEE_HIT_NORMAL);
1462 Unit::DealDamage(this, victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss, false, spell);
1463}
SpellInfo const * spellInfo
Definition: Unit.h:928
bool IsInFlight() const
Definition: Unit.h:1690

References SpellNonMeleeDamage::absorb, BASE_ATTACK, SpellNonMeleeDamage::cleanDamage, SpellNonMeleeDamage::damage, DealDamage(), Object::GetTypeId(), IsAlive(), Creature::IsEvadingAttacks(), IsInFlight(), LOG_DEBUG, MELEE_HIT_NORMAL, SpellNonMeleeDamage::schoolMask, SPELL_DIRECT_DAMAGE, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToCreature(), and TYPEID_UNIT.

Referenced by Spell::DoAllEffectOnTarget(), spell_sindragosa_s_fury::spell_sindragosa_s_fury_SpellScript::HandleDummy(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ DelayOwnedAuras()

void Unit::DelayOwnedAuras ( uint32  spellId,
ObjectGuid  caster,
int32  delaytime 
)
5401{
5402 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5403 for (; range.first != range.second; ++range.first)
5404 {
5405 Aura* aura = range.first->second;
5406 if (!caster || aura->GetCasterGUID() == caster)
5407 {
5408 if (aura->GetDuration() < delaytime)
5409 aura->SetDuration(0);
5410 else
5411 aura->SetDuration(aura->GetDuration() - delaytime);
5412
5413 // update for out of range group members (on 1 slot use)
5415 LOG_DEBUG("spells.aura", "Aura {} partially interrupted on unit {}, new duration: {} ms", aura->GetId(), GetGUID().ToString(), aura->GetDuration());
5416 }
5417 }
5418}
std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
Definition: Unit.h:1309
int32 GetDuration() const
Definition: SpellAuras.h:133
void SetNeedClientUpdateForTargets() const
Definition: SpellAuras.cpp:1272
void SetDuration(int32 duration, bool withMods=false)
Definition: SpellAuras.cpp:882

References Aura::GetCasterGUID(), Aura::GetDuration(), Object::GetGUID(), Aura::GetId(), LOG_DEBUG, m_ownedAuras, Aura::SetDuration(), Aura::SetNeedClientUpdateForTargets(), and Position::ToString().

◆ DeleteCharmInfo()

void Unit::DeleteCharmInfo ( )
15807{
15808 if (!m_charmInfo)
15809 return;
15810
15812 delete m_charmInfo;
15813 m_charmInfo = nullptr;
15814}
void RestoreState()
Definition: Unit.cpp:15835

References m_charmInfo, and CharmInfo::RestoreState().

Referenced by RemoveCharmedBy().

◆ DeMorph()

void Unit::DeMorph ( )
4302{
4304}
uint32 GetNativeDisplayId() const
Definition: Unit.h:2184
virtual void SetDisplayId(uint32 modelId)
Definition: Unit.cpp:17030

References GetNativeDisplayId(), and SetDisplayId().

Referenced by modify_commandscript::HandleMorphResetCommand().

◆ DisableRotate()

void Unit::DisableRotate ( bool  apply)
18530{
18531 if (GetTypeId() != TYPEID_UNIT)
18532 return;
18533
18534 if (apply)
18538}
@ UNIT_STATE_POSSESSED
Definition: Unit.h:341
void SetUnitFlag(UnitFlags flags)
Definition: Unit.h:1495

References Object::GetTypeId(), HasUnitState(), RemoveUnitFlag(), SetUnitFlag(), TYPEID_UNIT, UNIT_FLAG_POSSESSED, and UNIT_STATE_POSSESSED.

Referenced by boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), boss_thorim::boss_thorimAI::DisableThorim(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_anub_arak::boss_anub_arakAI::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::boss_ignisAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_ignis::boss_ignisAI::Reset(), boss_kologarn::boss_kologarnAI::Reset(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::Reset(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ DisableSpline()

◆ Dismount()

void Unit::Dismount ( )
13519{
13520 if (!IsMounted())
13521 return;
13522
13525
13526 if (Player* thisPlayer = ToPlayer())
13527 {
13528 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13529 data << GetPackGUID();
13530 data << uint32(GameTime::GetGameTime().count()); // Packet counter
13531 data << thisPlayer->GetCollisionHeight();
13532 thisPlayer->GetSession()->SendPacket(&data);
13533 }
13534
13535 WorldPacket data(SMSG_DISMOUNT, 8);
13536 data << GetPackGUID();
13537 SendMessageToSet(&data, true);
13538
13539 // dismount as a vehicle
13541 {
13542 // Send other players that we are no longer a vehicle
13543 data.Initialize(SMSG_PLAYER_VEHICLE_DATA, 8 + 4);
13544 data << GetPackGUID();
13545 data << uint32(0);
13546 ToPlayer()->SendMessageToSet(&data, true);
13547 // Remove vehicle from player
13549 }
13550
13552
13553 // only resummon old pet if the player is already added to a map
13554 // this prevents adding a pet to a not created map which would otherwise cause a crash
13555 // (it could probably happen when logging in after a previous crash)
13556 if (Player* player = ToPlayer())
13557 {
13558 sScriptMgr->AnticheatSetUnderACKmount(player);
13559
13560 if (Pet* pPet = player->GetPet())
13561 {
13562 if (pPet->HasUnitFlag(UNIT_FLAG_STUNNED) && !pPet->HasUnitState(UNIT_STATE_STUNNED))
13563 pPet->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13564 }
13565 else
13566 player->ResummonPetTemporaryUnSummonedIfAny();
13567
13568 // xinef: if we have charmed npc, remove stun also
13569 if (Unit* charm = player->GetCharm())
13570 if (charm->GetTypeId() == TYPEID_UNIT && !charm->HasUnitState(UNIT_STATE_STUNNED))
13571 charm->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13572 }
13573}
@ UNIT_FIELD_MOUNTDISPLAYID
Definition: UpdateFields.h:126
@ UNIT_FLAG_STUNNED
Definition: Unit.h:466
@ UNIT_FLAG_MOUNT
Definition: Unit.h:475
@ AURA_INTERRUPT_FLAG_NOT_MOUNTED
Definition: SpellDefines.h:50
@ SMSG_PLAYER_VEHICLE_DATA
Definition: Opcodes.h:1221
@ SMSG_MOVE_SET_COLLISION_HGT
Definition: Opcodes.h:1332
@ SMSG_DISMOUNT
Definition: Opcodes.h:970
void SendMessageToSet(WorldPacket const *data, bool self) const override
Definition: Player.h:1989
void RemoveVehicleKit()
Definition: Unit.cpp:18991

References AURA_INTERRUPT_FLAG_NOT_MOUNTED, GetCharm(), GameTime::GetGameTime(), Object::GetPackGUID(), Object::GetTypeId(), GetVehicleKit(), WorldPacket::Initialize(), IsMounted(), RemoveAurasWithInterruptFlags(), RemoveUnitFlag(), RemoveVehicleKit(), WorldObject::SendMessageToSet(), Player::SendMessageToSet(), Object::SetUInt32Value(), SMSG_DISMOUNT, SMSG_MOVE_SET_COLLISION_HGT, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, UNIT_FLAG_STUNNED, and UNIT_STATE_STUNNED.

Referenced by _EnterVehicle(), Player::CleanupAfterTaxiFlight(), FlightPathMovementGenerator::DoFinalize(), BattlegroundWS::EventPlayerClickedOnFlag(), AuraEffect::HandleAuraMounted(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_mount_check::spell_mount_check_AuraScript::HandleEffectPeriodic(), npc_scarlet_courier::npc_scarlet_courierAI::JustEngagedWith(), boss_mandokir::boss_mandokirAI::JustEngagedWith(), boss_captain_skarloc::MovementInform(), spell_chapter5_light_of_dawn_aura::spell_chapter5_light_of_dawn_aura_AuraScript::OnApply(), Creature::setDeathState(), SetInCombatState(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), npc_magister_aledis::StartFight(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), and npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached().

◆ EnergizeBySpell()

void Unit::EnergizeBySpell ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11266{
11267 int32 gainedPower = victim->ModifyPower(powerType, damage, false);
11268
11269 if (powerType != POWER_HAPPINESS && gainedPower)
11270 {
11271 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID);
11272 victim->getHostileRefMgr().threatAssist(this, float(gainedPower) * 0.5f, spellInfo);
11273 }
11274
11275 SendEnergizeSpellLog(victim, spellID, damage, powerType);
11276}
@ POWER_HAPPINESS
Definition: SharedDefines.h:273
void threatAssist(Unit *victim, float baseThreat, SpellInfo const *threatSpell=nullptr)
Definition: HostileRefMgr.cpp:35
void SendEnergizeSpellLog(Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
Definition: Unit.cpp:11254

References getHostileRefMgr(), ModifyPower(), POWER_HAPPINESS, SendEnergizeSpellLog(), sSpellMgr, and HostileRefMgr::threatAssist().

Referenced by Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerDrain(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ EnterVehicle()

void Unit::EnterVehicle ( Unit base,
int8  seatId = -1 
)
19895{
19897
19898 if (Player* player = ToPlayer())
19899 {
19900 sScriptMgr->AnticheatSetUnderACKmount(player);
19901 sScriptMgr->AnticheatSetSkipOnePacketForASH(player, true);
19902 }
19903}
@ VEHICLE_SPELL_RIDE_HARDCODED
Definition: VehicleDefines.h:53
@ TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE
Will ignore caster aura states including combat requirements and death state.
Definition: SpellDefines.h:144

References CastCustomSpell(), SPELLVALUE_BASE_POINT0, sScriptMgr, Object::ToPlayer(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, and VEHICLE_SPELL_RIDE_HARDCODED.

Referenced by debug_commandscript::HandleDebugEnterVehicleCommand(), WorldSession::HandleEnterPlayerVehicle(), boss_mimiron::boss_mimironAI::JustEngagedWith(), npc_pilgrims_bounty_chair::UpdateAI(), and boss_mimiron::boss_mimironAI::UpdateAI().

◆ EnterVehicleUnattackable()

void Unit::EnterVehicleUnattackable ( Unit base,
int8  seatId = -1 
)

◆ ExecuteDelayedUnitAINotifyEvent()

void Unit::ExecuteDelayedUnitAINotifyEvent ( )
20868{
20870 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20871 return;
20872
20873 Acore::AIRelocationNotifier notifier(*this);
20874 float radius = 60.0f;
20875 Cell::VisitAllObjects(this, notifier, radius);
20876}
@ NOTIFY_AI_RELOCATION
Definition: Object.h:63
void RemoveFromNotify(uint16 f)
Definition: Object.h:553
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:207
Definition: GridNotifiers.h:89

References IsDuringRemoveFromWorld(), Object::IsInWorld(), NOTIFY_AI_RELOCATION, WorldObject::RemoveFromNotify(), and Cell::VisitAllObjects().

Referenced by Update().

◆ ExecuteDelayedUnitRelocationEvent()

void Unit::ExecuteDelayedUnitRelocationEvent ( )
20761{
20763 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20764 return;
20765
20766 if (this->HasSharedVision())
20767 for (SharedVisionList::const_iterator itr = this->GetSharedVisionList().begin(); itr != this->GetSharedVisionList().end(); ++itr)
20768 if (Player* player = (*itr))
20769 {
20770 if (player->IsOnVehicle(this) || !player->IsInWorld() || player->IsDuringRemoveFromWorld()) // players on vehicles have their own event executed (due to passenger relocation)
20771 continue;
20772 WorldObject* viewPoint = player;
20773 if (player->m_seer && player->m_seer->IsInWorld())
20774 viewPoint = player->m_seer;
20775 if (!viewPoint->IsPositionValid() || !player->IsPositionValid())
20776 continue;
20777
20778 if (Unit* active = viewPoint->ToUnit())
20779 {
20780 //if (active->IsVehicle()) // always check original unit here, last notify position is not relocated
20781 // active = player;
20782
20783 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20784 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20785 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20786 float distsq = dx * dx + dy * dy + dz * dz;
20787 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20788 if (distsq < mindistsq)
20789 continue;
20790
20791 // this will be relocated below sharedvision!
20792 //active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20793 }
20794
20795 Acore::PlayerRelocationNotifier relocateNoLarge(*player, false); // visit only objects which are not large; default distance
20796 Cell::VisitAllObjects(viewPoint, relocateNoLarge, player->GetSightRange() + VISIBILITY_INC_FOR_GOBJECTS);
20797 relocateNoLarge.SendToSelf();
20798 Acore::PlayerRelocationNotifier relocateLarge(*player, true); // visit only large objects; maximum distance
20799 Cell::VisitAllObjects(viewPoint, relocateLarge, MAX_VISIBILITY_DISTANCE);
20800 relocateLarge.SendToSelf();
20801 }
20802
20803 if (Player* player = this->ToPlayer())
20804 {
20805 WorldObject* viewPoint = player;
20806 if (player->m_seer && player->m_seer->IsInWorld())
20807 viewPoint = player->m_seer;
20808
20809 if (viewPoint->GetMapId() != player->GetMapId() || !viewPoint->IsPositionValid() || !player->IsPositionValid())
20810 return;
20811
20812 if (Unit* active = viewPoint->ToUnit())
20813 {
20814 if (active->IsVehicle())
20815 active = player;
20816
20817 if (!player->GetFarSightDistance())
20818 {
20819 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20820 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20821 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20822 float distsq = dx * dx + dy * dy + dz * dz;
20823
20824 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20825 if (distsq < mindistsq)
20826 return;
20827
20828 active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20829 }
20830 }
20831
20832 Acore::PlayerRelocationNotifier relocateNoLarge(*player, false); // visit only objects which are not large; default distance
20833 Cell::VisitAllObjects(viewPoint, relocateNoLarge, player->GetSightRange() + VISIBILITY_INC_FOR_GOBJECTS);
20834 relocateNoLarge.SendToSelf();
20835
20836 if (!player->GetFarSightDistance())
20837 {
20838 Acore::PlayerRelocationNotifier relocateLarge(*player, true); // visit only large objects; maximum distance
20839 Cell::VisitAllObjects(viewPoint, relocateLarge, MAX_VISIBILITY_DISTANCE);
20840 relocateLarge.SendToSelf();
20841 }
20842
20844 }
20845 else if (Creature* unit = this->ToCreature())
20846 {
20847 if (!unit->IsPositionValid())
20848 return;
20849
20850 float dx = unit->m_last_notify_position.GetPositionX() - unit->GetPositionX();
20851 float dy = unit->m_last_notify_position.GetPositionY() - unit->GetPositionY();
20852 float dz = unit->m_last_notify_position.GetPositionZ() - unit->GetPositionZ();
20853 float distsq = dx * dx + dy * dy + dz * dz;
20854 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(unit->FindMap()->GetEntry()->map_type);
20855 if (distsq < mindistsq)
20856 return;
20857
20858 unit->m_last_notify_position.Relocate(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ());
20859
20860 Acore::CreatureRelocationNotifier relocate(*unit);
20861 Cell::VisitAllObjects(unit, relocate, unit->GetVisibilityRange() + VISIBILITY_COMPENSATION);
20862
20864 }
20865}
@ NOTIFY_VISIBILITY_CHANGED
Definition: Object.h:64
#define MAX_VISIBILITY_DISTANCE
Definition: ObjectDefines.h:31
#define VISIBILITY_INC_FOR_GOBJECTS
Definition: ObjectDefines.h:28
#define VISIBILITY_COMPENSATION
Definition: ObjectDefines.h:26
Unit * ToUnit()
Definition: Object.h:200
void AddToNotify(uint16 f)
Definition: Object.cpp:2932
bool IsPositionValid() const
Definition: Position.cpp:175
uint32 GetMapId() const
Definition: Position.h:276
SharedVisionList const & GetSharedVisionList()
Definition: Unit.h:1903
bool HasSharedVision() const
Definition: Unit.h:1906
Definition: GridNotifiers.h:73
Definition: GridNotifiers.h:81
static float GetReqMoveDistSq(uint32 map_type)
Definition: DynamicVisibility.h:53

References WorldObject::AddToNotify(), WorldLocation::GetMapId(), Position::GetPositionX(), DynamicVisibilityMgr::GetReqMoveDistSq(), GetSharedVisionList(), HasSharedVision(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Position::IsPositionValid(), MAX_VISIBILITY_DISTANCE, NOTIFY_AI_RELOCATION, NOTIFY_VISIBILITY_CHANGED, WorldObject::RemoveFromNotify(), Acore::VisibleNotifier::SendToSelf(), Object::ToCreature(), Object::ToPlayer(), Object::ToUnit(), VISIBILITY_COMPENSATION, VISIBILITY_INC_FOR_GOBJECTS, and Cell::VisitAllObjects().

◆ ExitVehicle()

void Unit::ExitVehicle ( Position const *  exitPosition = nullptr)

This function can be called at upper level code to initialize an exit from the passenger's side.

The following call would not even be executed successfully as the SPELL_AURA_CONTROL_VEHICLE unapply handler already calls _ExitVehicle without specifying an exitposition. The subsequent call below would return on if (!m_vehicle).

To do: We need to allow SPELL_AURA_CONTROL_VEHICLE unapply handlers in spellscripts to specify exit coordinates and either store those per passenger, or we need to init spline movement based on those coordinates in unapply handlers, and relocate exiting passengers based on Unit::moveSpline data. Either way, Coming Soon(TM)

19993{
19995 if (!m_vehicle)
19996 return;
19997
19999 if (Player* player = ToPlayer())
20000 {
20001 player->SetCanTeleport(true);
20002 }
20006 /*_ExitVehicle(exitPosition);*/
20013
20014 if (Player* player = ToPlayer())
20015 {
20016 sScriptMgr->AnticheatSetUnderACKmount(player);
20017 sScriptMgr->AnticheatSetSkipOnePacketForASH(player, true);
20018 }
20019}
Unit * GetVehicleBase() const
Definition: Unit.cpp:19006

References Object::GetGUID(), GetVehicleBase(), m_vehicle, RemoveAurasByType(), SPELL_AURA_CONTROL_VEHICLE, sScriptMgr, and Object::ToPlayer().

Referenced by _EnterVehicle(), Player::ActivateTaxiPathTo(), boss_mimiron::boss_mimironAI::EnterEvadeMode(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::EnterEvadeMode(), npc_ulduar_vx001::npc_ulduar_vx001AI::EnterEvadeMode(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::EnterEvadeMode(), WorldSession::HandleDismissControlledVehicle(), spell_warhead_detonate::spell_warhead_detonate_SpellScript::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_ulduar_squeezed_lifeless::spell_ulduar_squeezed_lifeless_SpellScript::HandleInstaKill(), WorldSession::HandleRequestVehicleExit(), spell_vehicle_throw_passenger::spell_vehicle_throw_passenger_SpellScript::HandleScript(), boss_kologarn_arms::boss_kologarn_armsAI::JustDied(), Player::ProcessDelayedOperations(), RemoveFromWorld(), Player::StopCastingCharm(), and Player::TeleportTo().

◆ FindCurrentSpellBySpellId()

◆ FinishSpell()

void Unit::FinishSpell ( CurrentSpellTypes  spellType,
bool  ok = true 
)
4040{
4041 Spell* spell = m_currentSpells[spellType];
4042 if (!spell)
4043 return;
4044
4045 if (spellType == CURRENT_CHANNELED_SPELL)
4046 spell->SendChannelUpdate(0);
4047
4048 spell->finish(ok);
4049}
void SendChannelUpdate(uint32 time)
Definition: Spell.cpp:5167

References CURRENT_CHANNELED_SPELL, Spell::finish(), m_currentSpells, and Spell::SendChannelUpdate().

Referenced by AuraEffect::HandleFeignDeath(), AuraEffect::HandleModStealth(), npc_risen_archmage::npc_risen_archmageAI::JustEngagedWith(), boss_lord_marrowgar::UpdateAI(), and GameObject::Use().

◆ GetAffectingPlayer()

Player * Unit::GetAffectingPlayer ( ) const
10625{
10626 if (!GetCharmerOrOwnerGUID())
10627 return const_cast<Unit*>(this)->ToPlayer();
10628
10629 if (Unit* owner = GetCharmerOrOwner())
10631
10632 return nullptr;
10633}
Unit * GetCharmerOrOwner() const
Definition: Unit.h:1861
ObjectGuid GetCharmerOrOwnerGUID() const
Definition: Unit.h:1844

References GetCharmerOrOwner(), GetCharmerOrOwnerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), and Object::ToPlayer().

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), GetFactionReactionTo(), and GetReactionTo().

◆ GetAI()

UnitAI * Unit::GetAI ( )
inline
1328{ return i_AI; }

References i_AI.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), spell_algalon_big_bang::spell_algalon_big_bang_SpellScript::CheckTargets(), DealDamage(), DealHeal(), spell_send_mug_target_picker::FilterTargets(), spell_blood_queen_bloodbolt::spell_blood_queen_bloodbolt_SpellScript::FilterTargets(), npc_dream_fog::npc_dream_fogAI::GetRandomUnitFromDragonThreatList(), spell_kaelthas_resurrection::spell_kaelthas_resurrection_SpellScript::HandleBeforeCast(), BattlegroundIC::HandleCapturedNodes(), spell_send_mug_target_picker::HandleDummy(), spell_mount_check::spell_mount_check_AuraScript::HandleEffectPeriodic(), spell_random_aggro::HandleOnHit(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_frostwarden_handler_focus_fire::spell_frostwarden_handler_focus_fire_SpellScript::HandleScript(), spell_pursue::spell_pursue_SpellScript::HandleScript(), spell_xt002_gravity_bomb_damage::spell_xt002_gravity_bomb_damage_SpellScript::HandleScript(), spell_the_lich_king_quake::spell_the_lich_king_quake_SpellScript::HandleSendEvent(), npc_risen_guardian::npc_risen_guardianAI::IsSummonedBy(), npc_risen_guardian::npc_risen_guardianAI::KilledUnit(), ModifyPower(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), achievement_respect_your_elders::OnCheck(), achievement_hadronox_denied::OnCheck(), achievement_watch_him_die::OnCheck(), achievement_better_off_dred::OnCheck(), achievement_oh_novos::OnCheck(), achievement_share_the_love::OnCheck(), achievement_snakes_whyd_it_have_to_be_snakes::OnCheck(), achievement_im_on_a_boat::OnCheck(), achievement_all_you_can_eat::OnCheck(), achievement_been_waiting_long_time::OnCheck(), achievement_neck_deep_in_vile::OnCheck(), achievement_portal_jockey::OnCheck(), achievement_chaos_theory::OnCheck(), achievement_split_personality::OnCheck(), achievement_algalon_he_feeds_on_your_tears::OnCheck(), achievement_algalon_herald_of_the_titans::OnCheck(), achievement_flame_leviathan_towers::OnCheck(), achievement_flame_leviathan_shutout::OnCheck(), achievement_freya_getting_back_to_nature::OnCheck(), achievement_freya_knock_on_wood::OnCheck(), achievement_yogg_saron_drive_me_crazy::OnCheck(), achievement_yogg_saron_kiss_and_make_up::OnCheck(), achievement_intense_cold::OnCheck(), achievement_once_bitten_twice_shy::OnCheck(), spell_xt002_gravity_bomb_aura::spell_xt002_gravity_bomb_aura_AuraScript::OnPeriodic(), spell_marrowgar_coldflame::spell_marrowgar_coldflame_SpellScript::SelectTarget(), and boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::SpellHit().

◆ GetAllMinionsByEntry()

void Unit::GetAllMinionsByEntry ( std::list< Creature * > &  Minions,
uint32  entry 
)
10846{
10847 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
10848 {
10849 Unit* unit = *itr;
10850 ++itr;
10851 if (unit->GetEntry() == entry && unit->GetTypeId() == TYPEID_UNIT
10852 && unit->ToCreature()->IsSummon()) // minion, actually
10853 Minions.push_back(unit->ToCreature());
10854 }
10855}
bool IsSummon() const
Definition: Unit.h:1422

References Object::GetEntry(), Object::GetTypeId(), IsSummon(), m_Controlled, Object::ToCreature(), and TYPEID_UNIT.

Referenced by spell_item_gift_of_the_harvester::spell_item_gift_of_the_harvester_SpellScript::CheckRequirement().

◆ GetAPMultiplier()

float Unit::GetAPMultiplier ( WeaponAttackType  attType,
bool  normalized 
)
17484{
17485 if (!normalized || GetTypeId() != TYPEID_PLAYER)
17486 return float(GetAttackTime(attType)) / 1000.0f;
17487
17488 Item* Weapon = ToPlayer()->GetWeaponForAttack(attType, true);
17489 if (!Weapon)
17490 return 2.4f; // fist attack
17491
17492 switch (Weapon->GetTemplate()->InventoryType)
17493 {
17494 case INVTYPE_2HWEAPON:
17495 return 3.3f;
17496 case INVTYPE_RANGED:
17498 case INVTYPE_THROWN:
17499 return 2.8f;
17500 case INVTYPE_WEAPON:
17503 default:
17504 return Weapon->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER ? 1.7f : 2.4f;
17505 }
17506}
@ ITEM_SUBCLASS_WEAPON_DAGGER
Definition: ItemTemplate.h:368
@ INVTYPE_RANGED
Definition: ItemTemplate.h:280
@ INVTYPE_THROWN
Definition: ItemTemplate.h:290
@ INVTYPE_RANGEDRIGHT
Definition: ItemTemplate.h:291
@ INVTYPE_WEAPON
Definition: ItemTemplate.h:278
@ INVTYPE_WEAPONMAINHAND
Definition: ItemTemplate.h:286
@ INVTYPE_WEAPONOFFHAND
Definition: ItemTemplate.h:287
@ INVTYPE_2HWEAPON
Definition: ItemTemplate.h:282
Weapon
Definition: boss_arlokk.cpp:76
Definition: Item.h:214
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
Definition: PlayerStorage.cpp:516

References GetAttackTime(), Object::GetTypeId(), Player::GetWeaponForAttack(), INVTYPE_2HWEAPON, INVTYPE_RANGED, INVTYPE_RANGEDRIGHT, INVTYPE_THROWN, INVTYPE_WEAPON, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, ITEM_SUBCLASS_WEAPON_DAGGER, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and MeleeDamageBonusDone().

◆ GetAppliedAuras() [1/2]

◆ GetAppliedAuras() [2/2]

AuraApplicationMap const & Unit::GetAppliedAuras ( ) const
inline
1939{ return m_appliedAuras; }

References m_appliedAuras.

◆ GetArmor()

◆ getAttackerForHelper()

Unit * Unit::getAttackerForHelper ( ) const
inline
1379 {
1380 if (GetVictim() != nullptr)
1381 return GetVictim();
1382
1383 if (!IsEngaged())
1384 return nullptr;
1385
1386 if (!m_attackers.empty())
1387 return *(m_attackers.begin());
1388
1389 return nullptr;
1390 }
bool IsEngaged() const
Definition: Unit.h:1699
Unit * GetVictim() const
Definition: Unit.h:1398

References GetVictim(), IsEngaged(), and m_attackers.

Referenced by Creature::_IsTargetAcceptable(), Creature::CanStartAttack(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), PetAI::SelectNextTarget(), Creature::SelectVictim(), SetControlled(), TotemAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), and PetAI::UpdateAI().

◆ getAttackers()

◆ GetAttackTime()

◆ getAttackTimer()

◆ GetAura()

Aura * Unit::GetAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5520{
5521 AuraApplication* aurApp = GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask);
5522 return aurApp ? aurApp->GetBase() : nullptr;
5523}
AuraApplication * GetAuraApplication(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition: Unit.cpp:5500

References GetAuraApplication(), and AuraApplication::GetBase().

Referenced by Player::_addSpell(), Pet::addSpell(), spell_mage_burning_determination::CheckProc(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_freya::boss_freyaAI::DoAction(), Spell::DoTriggersOnSpellHit(), Spell::EffectScriptEffect(), Spell::EffectTitanGrip(), Spell::EffectWeaponDmg(), getOrphanGUID(), spell_dk_scourge_strike::HandleAfterHit(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterAdd(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), HandleDummyAuraProc(), spell_yogg_saron_sanity_well::spell_yogg_saron_sanity_well_AuraScript::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_sindragosa_frost_breath::spell_sindragosa_frost_breath_SpellScript::HandleInfusion(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_putricide_unstable_experiment::spell_putricide_unstable_experiment_SpellScript::HandleScript(), spell_festergut_gastric_bloat::spell_festergut_gastric_bloat_SpellScript::HandleScript(), spell_putricide_eat_ooze::spell_putricide_eat_ooze_SpellScript::HandleScript(), spell_rotface_large_ooze_combine::spell_rotface_large_ooze_combine_SpellScript::HandleScript(), spell_yogg_saron_sanity_reduce::spell_yogg_saron_sanity_reduce_SpellScript::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), npc_spiritual_insight::npc_spiritual_insightAI::IsSummonedBy(), npc_gunship::npc_gunshipAI::JustDied(), npc_brew_bubble::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), spell_hodir_flash_freeze::spell_hodir_flash_freeze_AuraScript::PrepareAuraScript(), spell_charge_shield_bomber::spell_charge_shield_bomber_SpellScript::PrepareSpellScript(), Player::ProcessDelayedOperations(), BattlefieldWG::PromotePlayer(), RemoveAurasDueToSpellBySteal(), Player::ResurrectPlayer(), SetAuraStack(), boss_anomalus::boss_anomalusAI::SetData(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_pilgrims_bounty_chair::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), boss_sindragosa::boss_sindragosaAI::SpellHitTarget(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::SpellHitTarget(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::SpellHitTarget(), npc_twilight_summon::npc_twilight_summonAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ GetAuraApplication()

AuraApplication * Unit::GetAuraApplication ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5501{
5502 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5503 for (; range.first != range.second; ++range.first)
5504 {
5505 AuraApplication* app = range.first->second;
5506 Aura const* aura = app->GetBase();
5507
5508 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
5509 && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5510 && (!itemCasterGUID || aura->GetCastItemGUID() == itemCasterGUID)
5511 && (!except || except != app))
5512 {
5513 return app;
5514 }
5515 }
5516 return nullptr;
5517}
std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
Definition: Unit.h:1312
uint8 GetEffectMask() const
Definition: SpellAuras.h:176
ObjectGuid GetCastItemGUID() const
Definition: SpellAuras.h:103

References AuraApplication::GetBase(), Aura::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetEffectMask(), and m_appliedAuras.

Referenced by AuraApplication::_Remove(), GetAura(), GetAuraApplicationOfRankedSpell(), HasAura(), and Spell::UpdateChanneledTargetList().

◆ GetAuraApplicationOfRankedSpell()

AuraApplication * Unit::GetAuraApplicationOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5526{
5527 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5528 while (rankSpell)
5529 {
5530 if (AuraApplication* aurApp = GetAuraApplication(rankSpell, casterGUID, itemCasterGUID, reqEffMask, except))
5531 return aurApp;
5532 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5533 }
5534 return nullptr;
5535}

References GetAuraApplication(), and sSpellMgr.

Referenced by spell_warl_drain_soul::CheckProc(), and GetAuraOfRankedSpell().

◆ GetAuraCount()

◆ GetAuraEffect() [1/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5473{
5474 AuraEffectList const& auras = GetAuraEffectsByType(type);
5475 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5476 {
5477 SpellInfo const* spell = (*i)->GetSpellInfo();
5478 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5479 {
5480 if (casterGUID && (*i)->GetCasterGUID() != casterGUID)
5481 continue;
5482 return (*i);
5483 }
5484 }
5485 return nullptr;
5486}
bool HasFlag(uint32 p1=0, uint32 p2=0, uint32 p3=0) const
Definition: Util.h:468
flag96 SpellFamilyFlags
Definition: SpellInfo.h:386
uint32 SpellFamilyName
Definition: SpellInfo.h:385

References GetAuraEffectsByType(), flag96::HasFlag(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

◆ GetAuraEffect() [2/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  name,
uint32  iconId,
uint8  effIndex 
) const
5459{
5460 AuraEffectList const& auras = GetAuraEffectsByType(type);
5461 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5462 {
5463 if (effIndex != (*itr)->GetEffIndex())
5464 continue;
5465 SpellInfo const* spell = (*itr)->GetSpellInfo();
5466 if (spell->SpellIconID == iconId && spell->SpellFamilyName == name)
5467 return *itr;
5468 }
5469 return nullptr;
5470}
uint32 SpellIconID
Definition: SpellInfo.h:378

References GetAuraEffectsByType(), SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

◆ GetAuraEffect() [3/3]

AuraEffect * Unit::GetAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5433{
5434 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5435 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5436 {
5437 if (itr->second->HasEffect(effIndex)
5438 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5439 {
5440 return itr->second->GetBase()->GetEffect(effIndex);
5441 }
5442 }
5443 return nullptr;
5444}

References m_appliedAuras.

Referenced by CalculateSpellAmount(), Spell::CanAutoCast(), spell_mage_ice_barrier::CheckCast(), spell_pri_power_word_shield::CheckCast(), spell_mage_molten_armor::CheckProc(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectWeaponDmg(), ConflagrateAuraStateDelayEvent::Execute(), spell_dru_t10_restoration_4p_bonus::FilterTargets(), GetAuraEffectOfRankedSpell(), GetDummyAuraEffect(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), spell_dk_raise_ally::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_warr_execute::HandleEffect(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pri_divine_aegis::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleShapeshiftBoosts(), spell_warl_drain_soul::HandleTick(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), Guardian::InitStatsForLevel(), npc_anzu_spirit::IsSummonedBy(), MeleeDamageBonusDone(), ModSpellDuration(), spell_dk_death_and_decay::RecalculateDamage(), RemoveAurasDueToSpellByDispel(), SpellDamageBonusDone(), SpellHealingBonusTaken(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), and npc_hallows_end_train_fire::UpdateAI().

◆ GetAuraEffectDummy()

AuraEffect * Unit::GetAuraEffectDummy ( uint32  spellid) const
5489{
5491 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5492 {
5493 if ((*itr)->GetId() == spellid)
5494 return *itr;
5495 }
5496
5497 return nullptr;
5498}
@ SPELL_AURA_DUMMY
Definition: SpellAuraDefines.h:67

References GetAuraEffectsByType(), and SPELL_AURA_DUMMY.

Referenced by Spell::EffectWeaponDmg(), Aura::HandleAuraSpecificMods(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), Guardian::InitStatsForLevel(), Kill(), spell_dk_death_and_decay::RecalculateDamage(), Player::RemoveSpellMods(), and SpellHealingBonusTaken().

◆ GetAuraEffectOfRankedSpell()

AuraEffect * Unit::GetAuraEffectOfRankedSpell ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5447{
5448 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5449 while (rankSpell)
5450 {
5451 if (AuraEffect* aurEff = GetAuraEffect(rankSpell, effIndex, caster))
5452 return aurEff;
5453 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5454 }
5455 return nullptr;
5456}
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition: Unit.cpp:5432

References GetAuraEffect(), and sSpellMgr.

Referenced by spell_mage_fire_frost_ward::Absorb(), spell_sha_earthbind_totem::Apply(), spell_sha_earthliving_weapon::CheckProc(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), SpellPctDamageModsDone(), and spell_mage_incanters_absorbtion_base_AuraScript::Trigger().

◆ GetAuraEffectsByType()

AuraEffectList const & Unit::GetAuraEffectsByType ( AuraType  type) const
inline
1981{ return m_modAuras[type]; }

References m_modAuras.

Referenced by Player::_ApplyWeaponDependentAuraMods(), Spell::_cast(), AuraApplication::_HandleEffect(), KillRewarder::_RewardXP(), CalcAbsorbResist(), CalcArmorReducedDamage(), CalcHealAbsorb(), AuraEffect::CalculateAmount(), Spell::CheckCast(), Spell::CheckCasterAuras(), DealDamage(), DealMeleeDamage(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), spell_dk_wandering_plague::FilterTargets(), GetAuraEffect(), GetAuraEffectDummy(), GetDoTsByCaster(), GetMagicHitRedirectTarget(), GetMaxNegativeAuraModifier(), GetMaxNegativeAuraModifierByAffectMask(), GetMaxNegativeAuraModifierByMiscMask(), GetMaxNegativeAuraModifierByMiscValue(), GetMaxPositiveAuraModifier(), GetMaxPositiveAuraModifierByAffectMask(), GetMaxPositiveAuraModifierByMiscMask(), GetMaxPositiveAuraModifierByMiscValue(), Player::getMaxTimer(), GetMeleeHitRedirectTarget(), GetPhaseByAuras(), Player::GetResurrectionSpellId(), Player::GetRuneBaseCooldown(), GetTotalAuraModifier(), GetTotalAuraModifierAreaExclusive(), GetTotalAuraModifierByAffectMask(), GetTotalAuraModifierByMiscMask(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByAffectMask(), GetTotalAuraMultiplierByMiscMask(), GetTotalAuraMultiplierByMiscValue(), GetUnitCriticalChance(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), AuraEffect::HandleAuraTransform(), AuraEffect::HandleDetectAmore(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), HandleDummyAuraProc(), Spell::HandleLaunchPhase(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleMirrorImageDataRequest(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleNoReagentUseAura(), spell_illidari_council_judgement::spell_illidari_council_judgement_SpellScript::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), HasAuraState(), HasAuraTypeWithAffectMask(), HasAuraTypeWithCaster(), HasAuraTypeWithFamilyFlags(), HasAuraTypeWithMiscvalue(), HasAuraTypeWithTriggerSpell(), HasAuraTypeWithValue(), HasBreakableByDamageAuraType(), HasVisibleAuraType(), IsImmunedToSpellEffect(), IsScriptOverriden(), SpellInfo::IsStrongerAuraActive(), Player::isTotalImmune(), list_commandscript::ListAurasCommand(), MeleeDamageBonusDone(), MeleeDamageBonusTaken(), MeleeSpellHitResult(), Spell::PrepareTriggersExecutedOnHit(), processDummyAuras(), spell_dru_enrage::RecalculateBaseArmor(), Creature::Regenerate(), Player::Regenerate(), Player::RegenerateAll(), Creature::RegenerateHealth(), Player::RegenerateHealth(), Creature::Respawn(), RestoreDisplayId(), Player::RewardQuest(), Spell::SelectImplicitAreaTargets(), Spell::SelectImplicitConeTargets(), PetAI::SelectNextTarget(), Creature::SelectVictim(), Player::SendInitialPacketsAfterAddToMap(), SetControlled(), Player::SetEntryPoint(), Player::SetSkill(), SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SpellBaseHealingBonusDone(), SpellBaseHealingBonusTaken(), SpellDamageBonusDone(), SpellDamageBonusTaken(), SpellHealingBonusDone(), SpellHealingBonusTaken(), SpellHitResult(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), Player::SummonPet(), Player::TeleportTo(), SimpleCharmedAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), Player::UpdateArmor(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCharmedAI(), Player::UpdateExpertise(), Player::UpdateManaRegen(), Player::UpdateRating(), Player::UpdateResistances(), UpdateSpeed(), and Player::UpdateStats().

◆ GetAuraOfRankedSpell()

Aura * Unit::GetAuraOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5538{
5539 AuraApplication* aurApp = GetAuraApplicationOfRankedSpell(spellId, casterGUID, itemCasterGUID, reqEffMask);
5540 return aurApp ? aurApp->GetBase() : nullptr;
5541}
AuraApplication * GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition: Unit.cpp:5525

References GetAuraApplicationOfRankedSpell(), and AuraApplication::GetBase().

Referenced by Aura::HandleAuraSpecificMods().

◆ GetCastingTimeForBonus()

uint32 Unit::GetCastingTimeForBonus ( SpellInfo const *  spellProto,
DamageEffectType  damagetype,
uint32  CastingTime 
) const
17344{
17345 // Not apply this to creature casted spells with casttime == 0
17346 if (CastingTime == 0 && GetTypeId() == TYPEID_UNIT && !IsPet())
17347 return 3500;
17348
17349 if (CastingTime > 7000) CastingTime = 7000;
17350 if (CastingTime < 1500) CastingTime = 1500;
17351
17352 if (damagetype == DOT && !spellProto->IsChanneled())
17353 CastingTime = 3500;
17354
17355 int32 overTime = 0;
17356 uint8 effects = 0;
17357 bool DirectDamage = false;
17358 bool AreaEffect = false;
17359
17360 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; i++)
17361 {
17362 switch (spellProto->Effects[i].Effect)
17363 {
17369 case SPELL_EFFECT_HEAL:
17370 DirectDamage = true;
17371 break;
17373 switch (spellProto->Effects[i].ApplyAuraName)
17374 {
17378 if (spellProto->GetDuration())
17379 overTime = spellProto->GetDuration();
17380 break;
17381 default:
17382 // -5% per additional effect
17383 ++effects;
17384 break;
17385 }
17386 default:
17387 break;
17388 }
17389
17390 if (spellProto->Effects[i].IsTargetingArea())
17391 AreaEffect = true;
17392 }
17393
17394 // Combined Spells with Both Over Time and Direct Damage
17395 if (overTime > 0 && DirectDamage)
17396 {
17397 // mainly for DoTs which are 3500 here otherwise
17398 uint32 OriginalCastTime = spellProto->CalcCastTime();
17399 if (OriginalCastTime > 7000) OriginalCastTime = 7000;
17400 if (OriginalCastTime < 1500) OriginalCastTime = 1500;
17401 // Portion to Over Time
17402 float PtOT = (overTime / 15000.0f) / ((overTime / 15000.0f) + (OriginalCastTime / 3500.0f));
17403
17404 if (damagetype == DOT)
17405 CastingTime = uint32(CastingTime * PtOT);
17406 else if (PtOT < 1.0f)
17407 CastingTime = uint32(CastingTime * (1 - PtOT));
17408 else
17409 CastingTime = 0;
17410 }
17411
17412 // Area Effect Spells receive only half of bonus
17413 if (AreaEffect)
17414 CastingTime /= 2;
17415
17416 // 50% for damage and healing spells for leech spells from damage bonus and 0% from healing
17417 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
17418 {
17419 if (spellProto->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH ||
17420 (spellProto->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && spellProto->Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_LEECH))
17421 {
17422 CastingTime /= 2;
17423 break;
17424 }
17425 }
17426
17427 // -5% of total per any additional effect
17428 for (uint8 i = 0; i < effects; ++i)
17429 CastingTime *= 0.95f;
17430
17431 return CastingTime;
17432}
@ SPELL_AURA_PERIODIC_DAMAGE
Definition: SpellAuraDefines.h:66
@ SPELL_AURA_PERIODIC_HEAL
Definition: SpellAuraDefines.h:71
@ SPELL_AURA_PERIODIC_LEECH
Definition: SpellAuraDefines.h:116
@ SPELL_EFFECT_POWER_BURN
Definition: SharedDefines.h:840
@ SPELL_EFFECT_HEALTH_LEECH
Definition: SharedDefines.h:787
@ SPELL_EFFECT_HEAL
Definition: SharedDefines.h:788
@ SPELL_EFFECT_ENVIRONMENTAL_DAMAGE
Definition: SharedDefines.h:785
@ SPELL_EFFECT_POWER_DRAIN
Definition: SharedDefines.h:786
@ SPELL_EFFECT_SCHOOL_DAMAGE
Definition: SharedDefines.h:780
@ SPELL_EFFECT_APPLY_AURA
Definition: SharedDefines.h:784

References SpellInfo::CalcCastTime(), DOT, SpellInfo::Effects, SpellInfo::GetDuration(), Object::GetTypeId(), SpellInfo::IsChanneled(), IsPet(), MAX_SPELL_EFFECTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_EFFECT_APPLY_AURA, SPELL_EFFECT_ENVIRONMENTAL_DAMAGE, SPELL_EFFECT_HEAL, SPELL_EFFECT_HEALTH_LEECH, SPELL_EFFECT_POWER_BURN, SPELL_EFFECT_POWER_DRAIN, SPELL_EFFECT_SCHOOL_DAMAGE, and TYPEID_UNIT.

Referenced by CalculateDefaultCoefficient().

◆ GetCharm()

Unit * Unit::GetCharm ( ) const
10666{
10667 if (ObjectGuid charm_guid = GetCharmGUID())
10668 {
10669 if (Unit* pet = ObjectAccessor::GetUnit(*this, charm_guid))
10670 return pet;
10671
10672 LOG_ERROR("entities.unit", "Unit::GetCharm: Charmed creature {} not exist.", charm_guid.ToString());
10674 }
10675
10676 return nullptr;
10677}
@ UNIT_FIELD_CHARM
Definition: UpdateFields.h:86
Unit * GetUnit(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:202
void SetGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:723
ObjectGuid GetCharmGUID() const
Definition: Unit.h:1836

References ObjectGuid::Empty, GetCharmGUID(), ObjectAccessor::GetUnit(), LOG_ERROR, Object::SetGuidValue(), and UNIT_FIELD_CHARM.

Referenced by Spell::_cast(), AddPetAura(), spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Dismount(), Spell::finish(), GetFirstControlled(), spell_warl_eye_of_kilrogg::HandleAuraApply(), spell_warl_eye_of_kilrogg::HandleAuraRemove(), spell_dk_raise_ally::HandleDummy(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), WorldSession::HandleRequestPetInfo(), isPossessing(), Mount(), Player::PossessSpellInitialize(), RemovePetAura(), Spell::SelectImplicitCasterObjectTargets(), SetSpeed(), npc_pilgrims_bounty_chair::SpellHitTarget(), and Player::StopCastingCharm().

◆ GetCharmer()

◆ GetCharmerGUID()

◆ GetCharmerOrOwner()

◆ GetCharmerOrOwnerGUID()

◆ GetCharmerOrOwnerOrOwnGUID()

◆ GetCharmerOrOwnerOrSelf()

Unit * Unit::GetCharmerOrOwnerOrSelf ( ) const
inline
1863 {
1864 if (Unit* u = GetCharmerOrOwner())
1865 return u;
1866
1867 return (Unit*)this;
1868 }

References GetCharmerOrOwner().

Referenced by CombatStart(), CombatStartOnCast(), GetPartyMembers(), GetReactionTo(), IsInPartyWith(), IsInRaidWith(), SetInCombatWith(), and TotemAI::UpdateAI().

◆ GetCharmerOrOwnerPlayerOrPlayerItself()

Player * Unit::GetCharmerOrOwnerPlayerOrPlayerItself ( ) const
10616{
10618 if (guid.IsPlayer())
10619 return ObjectAccessor::GetPlayer(*this, guid);
10620
10621 return const_cast<Unit*>(this)->ToPlayer();
10622}
Player * GetPlayer(Map const *, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:223

References GetCharmerOrOwnerGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), and Object::ToPlayer().

Referenced by Spell::_handle_finish_phase(), spell_sha_earthbind_totem::Apply(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), BuildValuesUpdate(), spell_q12237_rescue_villager::CheckCast(), spell_q12237_drop_off_villager::CheckCast(), CombatStart(), CombatStartOnCast(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), DealDamage(), Spell::EffectGameObjectSetDestructionState(), Spell::EffectKillCredit(), Spell::EffectKillCreditPersonal(), Spell::EffectSummonPet(), GetAffectingPlayer(), Object::GetUpdateFieldData(), spell_gen_charmed_unit_spell_cooldown::HandleCast(), spell_q13007_iron_colossus::spell_q13007_iron_colossus_SpellScript::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_q12851_going_bearback::HandleEffectApply(), spell_q12726_song_of_wind_and_water::spell_q12726_song_of_wind_and_water_SpellScript::HandleHealPct(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::spell_q10612_10613_the_fel_and_the_furious_SpellScript::HandleScriptEffect(), spell_q10769_dissension_amongst_the_ranks::HandleScriptEffect(), npc_pet_gen_valkyr_guardian::InitializeAI(), isTargetableForAttack(), GuardAI::JustDied(), boss_kurinnaxx::JustDied(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustDied(), npc_darnavan::npc_darnavanAI::JustDied(), npc_four_car_garage::npc_four_car_garageAI::JustDied(), npc_scion_of_eternity::npc_scion_of_eternityAI::JustDied(), Kill(), Condition::Meets(), GameObject::ModifyHealth(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), SmartScript::ProcessAction(), ProcessTerrainStatusUpdate(), Pet::RemoveSpellCooldown(), Spell::SendSpellCooldown(), SetCharm(), SetContestedPvP(), SetInCombatState(), Creature::SetLootRecipient(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::SpellHit(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), and Creature::UpdateEntry().

◆ GetCharmGUID()

◆ GetCharmInfo()

◆ getClass()

uint8 Unit::getClass ( ) const
inline
1438{ return GetByteValue(UNIT_FIELD_BYTES_0, 1); }
@ UNIT_FIELD_BYTES_0
Definition: UpdateFields.h:95
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition: Object.cpp:323

References Object::GetByteValue(), and UNIT_FIELD_BYTES_0.

Referenced by Player::_ApplyItemBonuses(), Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), Player::ActivateSpec(), Player::ActivateTaxiPathTo(), ArenaTeam::AddMember(), Player::AddSpellMod(), Player::ApplyEnchantment(), Player::CalculateTalentsPoints(), SpellEffectInfo::CalcValue(), Group::CanJoinBattlegroundQueue(), Player::CanResummonPet(), Player::CanRollForItemInLFG(), Player::CanUseItem(), Spell::CheckCast(), Spell::CheckRuneCost(), ClearAllReactives(), Player::Create(), WorldSession::DoLootRelease(), Player::DuelComplete(), Spell::EffectActivateRune(), Spell::EffectCreateTamedPet(), Spell::EffectSummonPet(), Spell::EffectTameCreature(), Player::EquipItem(), spell_class_call_handler::FilterTargets(), Player::FindEquipSlot(), boss_archimonde::boss_archimondeAI::GainSoulCharge(), getClassMask(), Graveyard::GetClosestGraveyard(), GetDebugInfo(), Player::GetDodgeFromAgility(), SocialMgr::GetFriendInfo(), Player::GetMeleeCritFromAgility(), Player::GetMissPercentageFromDefence(), Player::GetNPCIfCanInteractWith(), spell_gen_on_tournament_mount::GetPennatSpellId(), Player::GetPlayerName(), Player::GetRatingMultiplier(), Player::GetSpec(), Player::GetSpellCritFromIntellect(), Player::GetStartPosition(), Player::GiveLevel(), AuraEffect::HandleAuraConvertRune(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), WorldSession::HandleAutostoreLootItemOpcode(), WorldSession::HandleBattlemasterJoinOpcode(), spell_item_flask_of_the_north::HandleDummy(), spell_item_refocus::HandleDummy(), HandleDummyAuraProc(), learn_commandscript::HandleLearnAllMySpellsCommand(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), AuraEffect::HandlePeriodicDummyAuraTick(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), HandleProcTriggerSpell(), ArenaSpectator::HandleResetCommand(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), spell_gen_pet_summoned::HandleScript(), ArenaSpectator::HandleSpectatorSpectateCommand(), Player::InitDataForForm(), Player::InitDisplayIds(), Player::InitRunes(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Vehicle::Install(), Creature::isCanTrainingAndResetTalentsOf(), Pet::IsPermanentPetFor(), Creature::IsValidTrainerForPlayer(), Kill(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), spell_dk_blood_boil::Load(), Player::LoadFromDB(), Pet::LoadPetFromDB(), AchievementCriteriaData::Meets(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), npc_bunthen_plainswind::OnGossipHello(), npc_silva_filnaveth::OnGossipHello(), npc_bunthen_plainswind::OnGossipSelect(), npc_silva_filnaveth::OnGossipSelect(), ClassCallSelector::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), Player::PrepareGossipMenu(), ProcDamageAndSpellFor(), Player::RegenerateAll(), RemoveCharmedBy(), Player::RewardHonor(), Spell::SendSpellGo(), SetCharmedBy(), Guild::Member::SetStats(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Player::StoreNewItemInBestSlots(), Spell::TakeRunePower(), Player::TeleportTo(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::UpdateAI(), Player::UpdateAttackPowerAndDamage(), Player::UpdateDodgePercentage(), Player::UpdateParryPercentage(), lfg::LFGMgr::UpdateRaidBrowser(), UpdateReactives(), and Player::UpdateSkillsForLevel().

◆ getClassMask()

◆ GetCollisionHeight()

float Unit::GetCollisionHeight ( ) const
overridevirtual

Return collision height sent to client.

Reimplemented from WorldObject.

21388{
21389 float scaleMod = GetObjectScale(); // 99% sure about this
21390 float defaultHeight = DEFAULT_COLLISION_HEIGHT * scaleMod;
21391
21392 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
21393 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
21394 float collisionHeight = 0.0f;
21395
21396 if (IsMounted())
21397 {
21399 {
21400 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
21401 {
21402 collisionHeight = scaleMod * (mountModelData->MountHeight + modelData->CollisionHeight * modelData->Scale * displayInfo->scale * 0.5f);
21403 }
21404 }
21405 }
21406 else
21407 collisionHeight = scaleMod * modelData->CollisionHeight * modelData->Scale * displayInfo->scale;
21408
21409 return collisionHeight == 0.0f ? defaultHeight : collisionHeight;
21410}
DBCStorage< CreatureDisplayInfoEntry > sCreatureDisplayInfoStore(CreatureDisplayInfofmt)
DBCStorage< CreatureModelDataEntry > sCreatureModelDataStore(CreatureModelDatafmt)
#define DEFAULT_COLLISION_HEIGHT
Definition: ObjectDefines.h:50
float GetObjectScale() const
Definition: Object.h:112
Definition: DBCStructure.h:721
uint32 ModelId
Definition: DBCStructure.h:723
float scale
Definition: DBCStructure.h:726
Definition: DBCStructure.h:775
float Scale
Definition: DBCStructure.h:780
float CollisionHeight
Definition: DBCStructure.h:791

References CreatureModelDataEntry::CollisionHeight, DEFAULT_COLLISION_HEIGHT, GetNativeDisplayId(), Object::GetObjectScale(), Object::GetUInt32Value(), IsMounted(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by DynObjAura::FillTargetMap(), WorldObject::GetNearPoint(), GetRandomContactPoint(), WorldSession::HandleMovementOpcodes(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Spell::SelectImplicitCasterDestTargets(), spell_spawn_blood_pool::SetDest(), WorldObject::UpdateAllowedPositionZ(), and Creature::UpdateMovementFlags().

◆ GetCollisionRadius()

float Unit::GetCollisionRadius ( ) const
overridevirtual

this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the radius also takes in consideration the mount size

Returns
float The radius of a unit

Reimplemented from WorldObject.

21382{
21383 return GetCollisionWidth() / 2;
21384}
float GetCollisionWidth() const override
this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by...
Definition: Unit.cpp:21344

References GetCollisionWidth().

Referenced by GetMeleeAttackPoint(), and Creature::Update().

◆ GetCollisionWidth()

float Unit::GetCollisionWidth ( ) const
overridevirtual

this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the diameter also takes in consideration the mount size

Returns
float The diameter of a unit

Dismounting case - use basic default model data

Reimplemented from WorldObject.

21345{
21346 if (GetTypeId() == TYPEID_PLAYER)
21347 return GetObjectSize();
21348
21349 float scaleMod = GetObjectScale(); // 99% sure about this
21350 float objectSize = GetObjectSize();
21351 float defaultSize = DEFAULT_WORLD_OBJECT_SIZE * scaleMod;
21352
21354 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
21355 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
21356
21357 if (IsMounted())
21358 {
21360 {
21361 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
21362 {
21363 if (G3D::fuzzyGt(mountModelData->CollisionWidth, modelData->CollisionWidth))
21364 modelData = mountModelData;
21365 }
21366 }
21367 }
21368
21369 float collisionWidth = scaleMod * modelData->CollisionWidth * modelData->Scale * displayInfo->scale * 2;
21370 // if the objectSize is the default value or the creature is mounted and we have a DBC value, then we can retrieve DBC value instead
21371 return G3D::fuzzyGt(collisionWidth, 0.0f) && (G3D::fuzzyEq(objectSize,defaultSize) || IsMounted()) ? collisionWidth : objectSize;
21372}
#define DEFAULT_WORLD_OBJECT_SIZE
Definition: ObjectDefines.h:45
float GetObjectSize() const
Definition: Object.cpp:2759
float CollisionWidth
Definition: DBCStructure.h:790

References CreatureModelDataEntry::CollisionWidth, DEFAULT_WORLD_OBJECT_SIZE, GetNativeDisplayId(), Object::GetObjectScale(), WorldObject::GetObjectSize(), Object::GetTypeId(), Object::GetUInt32Value(), IsMounted(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, TYPEID_PLAYER, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by GetCollisionRadius().

◆ GetCombatRatingDamageReduction()

uint32 Unit::GetCombatRatingDamageReduction ( CombatRating  cr,
float  rate,
float  cap,
uint32  damage 
) const
private
19460{
19461 float percent = std::min(GetCombatRatingReduction(cr) * rate, cap);
19462 return CalculatePct(damage, percent);
19463}
float GetCombatRatingReduction(CombatRating cr) const
Definition: Unit.cpp:19447

References CalculatePct(), and GetCombatRatingReduction().

Referenced by GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritDamageReduction(), and GetSpellDamageReduction().

◆ GetCombatRatingReduction()

float Unit::GetCombatRatingReduction ( CombatRating  cr) const
private
19448{
19449 if (Player const* player = ToPlayer())
19450 return player->GetRatingBonusValue(cr);
19451 // Player's pet get resilience from owner
19452 else if (IsPet() && GetOwner())
19453 if (Player* owner = GetOwner()->ToPlayer())
19454 return owner->GetRatingBonusValue(cr);
19455
19456 return 0.0f;
19457}

References GetOwner(), IsPet(), and Object::ToPlayer().

Referenced by GetCombatRatingDamageReduction(), GetMeleeCritChanceReduction(), GetRangedCritChanceReduction(), and GetSpellCritChanceReduction().

◆ GetCombatReach()

◆ GetCombatTimer()

uint32 Unit::GetCombatTimer ( ) const
inline
1712{ return m_CombatTimer; }

References m_CombatTimer.

Referenced by Spell::DoSpellHitOnUnit(), and SetInCombatState().

◆ GetComboPoints() [1/2]

uint8 Unit::GetComboPoints ( ObjectGuid const &  guid) const
inline
2305{ return (m_comboTarget && m_comboTarget->GetGUID() == guid) ? m_comboPoints : 0; }

References Object::GetGUID(), m_comboPoints, and m_comboTarget.

◆ GetComboPoints() [2/2]

uint8 Unit::GetComboPoints ( Unit const *  who = nullptr) const
inline

--------—Combo point system----------------—

2304{ return (who && m_comboTarget != who) ? 0 : m_comboPoints; }

References m_comboPoints, and m_comboTarget.

Referenced by CalcSpellDuration(), SpellEffectInfo::CalcValue(), Spell::CheckCast(), and Spell::EffectSchoolDMG().

◆ GetComboTarget()

Unit * Unit::GetComboTarget ( ) const
inline
2306{ return m_comboTarget; }

References m_comboTarget.

Referenced by Player::DuelComplete(), and HandleProcTriggerSpell().

◆ GetComboTargetGUID()

ObjectGuid const Unit::GetComboTargetGUID ( ) const
inline

◆ GetCreateHealth()

◆ GetCreateMana()

◆ GetCreatePowers()

uint32 Unit::GetCreatePowers ( Powers  power) const
15647{
15648 // Only hunter pets have POWER_FOCUS and POWER_HAPPINESS
15649 switch (power)
15650 {
15651 case POWER_MANA:
15652 return GetCreateMana();
15653 case POWER_RAGE:
15654 return 1000;
15655 case POWER_FOCUS:
15656 return (GetTypeId() == TYPEID_PLAYER || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 100);
15657 case POWER_ENERGY:
15658 return 100;
15659 case POWER_HAPPINESS:
15660 return (GetTypeId() == TYPEID_PLAYER || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 1050000);
15661 case POWER_RUNIC_POWER:
15662 return 1000;
15663 case POWER_RUNE:
15664 return 0;
15665 case POWER_HEALTH:
15666 return 0;
15667 default:
15668 break;
15669 }
15670
15671 return 0;
15672}
@ POWER_HEALTH
Definition: SharedDefines.h:278
@ POWER_RUNIC_POWER
Definition: SharedDefines.h:275
@ POWER_ENERGY
Definition: SharedDefines.h:272
@ POWER_RUNE
Definition: SharedDefines.h:274
@ POWER_FOCUS
Definition: SharedDefines.h:271
uint32 GetCreateMana() const
Definition: Unit.h:2055

References GetCreateMana(), Object::GetTypeId(), HUNTER_PET, IsPet(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_HEALTH, POWER_MANA, POWER_RAGE, POWER_RUNE, POWER_RUNIC_POWER, and TYPEID_PLAYER.

Referenced by Pet::CreateBaseAtTamed(), HandleDummyAuraProc(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), setPowerType(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ GetCreateStat()

float Unit::GetCreateStat ( Stats  stat) const
inline

◆ GetCreatorGUID()

ObjectGuid Unit::GetCreatorGUID ( ) const
inline
@ UNIT_FIELD_CREATEDBY
Definition: UpdateFields.h:91

References Object::GetGuidValue(), and UNIT_FIELD_CREATEDBY.

Referenced by Condition::Meets().

◆ GetCreatureType()

uint32 Unit::GetCreatureType ( ) const
15169{
15170 if (GetTypeId() == TYPEID_PLAYER)
15171 {
15173 SpellShapeshiftEntry const* ssEntry = sSpellShapeshiftStore.LookupEntry(form);
15174 if (ssEntry && ssEntry->creatureType > 0)
15175 return ssEntry->creatureType;
15176 else
15178 }
15179 else
15180 return ToCreature()->GetCreatureTemplate()->type;
15181}
DBCStorage< SpellShapeshiftEntry > sSpellShapeshiftStore(SpellShapeshiftfmt)
ShapeshiftForm
Definition: Unit.h:89
@ CREATURE_TYPE_HUMANOID
Definition: SharedDefines.h:2634
uint32 type
Definition: CreatureData.h:215
ShapeshiftForm GetShapeshiftForm() const
Definition: Unit.h:2085
Definition: DBCStructure.h:1817
int32 creatureType
Definition: DBCStructure.h:1823

References CREATURE_TYPE_HUMANOID, SpellShapeshiftEntry::creatureType, Creature::GetCreatureTemplate(), GetShapeshiftForm(), Object::GetTypeId(), sSpellShapeshiftStore, Object::ToCreature(), CreatureTemplate::type, and TYPEID_PLAYER.

Referenced by Creature::CanStartAttack(), spell_utgarde_pinnacle_beast_mark::CheckProc(), Spell::EffectKnockBack(), spell_dk_death_pact::FilterTargets(), GetCreatureTypeMask(), GetUnitParryChance(), AuraEffect::HandleAuraEmpathy(), spell_dru_starfall_dummy::HandleDummy(), IsCritter(), CreatureAI::MoveInLineOfSight(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnUnitDeath(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), SetInCombatState(), and Creature::UpdateMoveInLineOfSightState().

◆ GetCreatureTypeMask()

uint32 Unit::GetCreatureTypeMask ( ) const
inline
1543 {
1544 uint32 creatureType = GetCreatureType();
1545 return (creatureType >= 1) ? (1 << (creatureType - 1)) : 0;
1546 }
uint32 GetCreatureType() const
Definition: Unit.cpp:15168

References GetCreatureType().

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), SpellInfo::CheckTargetCreatureType(), MeleeDamageBonusDone(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ GetCritterGUID()

ObjectGuid Unit::GetCritterGUID ( ) const
inline

◆ GetCurrentSpell() [1/2]

◆ GetCurrentSpell() [2/2]

Spell * Unit::GetCurrentSpell ( uint32  spellType) const
inline
2076{ return m_currentSpells[spellType]; }

References m_currentSpells.

◆ GetCurrentSpellCastTime()

int32 Unit::GetCurrentSpellCastTime ( uint32  spell_id) const
4105{
4106 if (Spell const* spell = FindCurrentSpellBySpellId(spell_id))
4107 return spell->GetCastTime();
4108 return 0;
4109}
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition: Unit.cpp:4096

References FindCurrentSpellBySpellId().

Referenced by CasterAI::JustEngagedWith(), CasterAI::UpdateAI(), and boss_mandokir::boss_mandokirAI::UpdateAI().

◆ getDeathState()

◆ GetDebugInfo()

std::string Unit::GetDebugInfo ( ) const
overridevirtual

Reimplemented from WorldObject.

21582{
21583 std::stringstream sstr;
21584 sstr << WorldObject::GetDebugInfo() << "\n"
21585 << std::boolalpha
21586 << "AliveState: " << IsAlive()
21587 << " UnitMovementFlags: " << GetUnitMovementFlags() << " ExtraUnitMovementFlags: " << GetExtraUnitMovementFlags()
21588 << " Class: " << std::to_string(getClass());
21589 return sstr.str();
21590}
std::string GetDebugInfo() const override
Definition: Object.cpp:2472

References getClass(), WorldObject::GetDebugInfo(), GetExtraUnitMovementFlags(), GetUnitMovementFlags(), and IsAlive().

Referenced by UnitAI::GetDebugInfo(), Creature::GetDebugInfo(), and Player::GetDebugInfo().

◆ GetDefaultMovementType()

MovementGeneratorType Unit::GetDefaultMovementType ( ) const
virtual

-------—End of Pet responses methods-------—

Reimplemented in Creature.

16914{
16915 return IDLE_MOTION_TYPE;
16916}
@ IDLE_MOTION_TYPE
Definition: MotionMaster.h:37

References IDLE_MOTION_TYPE.

◆ GetDefenseSkillValue()

uint32 Unit::GetDefenseSkillValue ( Unit const *  target = nullptr) const
3589{
3590 if (GetTypeId() == TYPEID_PLAYER)
3591 {
3592 // in PvP use full skill instead current skill value
3593 uint32 value = (target && target->GetTypeId() == TYPEID_PLAYER)
3596 value += uint32(ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL));
3597 return value;
3598 }
3599 else
3600 return GetUnitMeleeSkill(target);
3601}
@ CR_DEFENSE_SKILL
Definition: Unit.h:405
@ SKILL_DEFENSE
Definition: SharedDefines.h:2881
uint16 GetSkillValue(uint32 skill) const
Definition: Player.cpp:5367
uint16 GetMaxSkillValue(uint32 skill) const
Definition: Player.cpp:5384

References CR_DEFENSE_SKILL, Player::GetMaxSkillValue(), Player::GetSkillValue(), Object::GetTypeId(), GetUnitMeleeSkill(), SKILL_DEFENSE, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by spell_pal_ardent_defender::Absorb(), DealMeleeDamage(), GetUnitCriticalChance(), RollMeleeOutcomeAgainst(), SpellTakenCritChance(), Player::UpdateBlockPercentage(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetDiminishing()

DiminishingLevels Unit::GetDiminishing ( DiminishingGroup  group)
14994{
14995 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
14996 {
14997 if (i->DRGroup != group)
14998 continue;
14999
15000 if (!i->hitCount)
15001 return DIMINISHING_LEVEL_1;
15002
15003 if (!i->hitTime)
15004 return DIMINISHING_LEVEL_1;
15005
15006 // If last spell was casted more than 15 seconds ago - reset the count.
15007 if (i->stack == 0 && getMSTimeDiff(i->hitTime, GameTime::GetGameTimeMS().count()) > 15000)
15008 {
15009 i->hitCount = DIMINISHING_LEVEL_1;
15010 return DIMINISHING_LEVEL_1;
15011 }
15012 // or else increase the count.
15013 else
15014 return DiminishingLevels(i->hitCount);
15015 }
15016 return DIMINISHING_LEVEL_1;
15017}
uint32 getMSTimeDiff(uint32 oldMSTime, uint32 newMSTime)
Definition: Timer.h:110

References DIMINISHING_LEVEL_1, GameTime::GetGameTimeMS(), getMSTimeDiff(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ GetDirectTransport()

TransportBase * Unit::GetDirectTransport ( ) const

Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)

19032{
19033 if (Vehicle* veh = GetVehicle())
19034 return veh;
19035 return GetTransport();
19036}
Vehicle * GetVehicle() const
Definition: Unit.h:2368

References WorldObject::GetTransport(), and GetVehicle().

Referenced by Movement::TransportPathTransform::operator()(), SmartScript::ProcessAction(), CharmInfo::SaveStayPosition(), WaypointMovementGenerator< Creature >::StartMove(), and UpdateSplinePosition().

◆ GetDiseasesByCaster()

uint32 Unit::GetDiseasesByCaster ( ObjectGuid  casterGUID,
uint8  mode = 0 
)
5760{
5761 static const AuraType diseaseAuraTypes[] =
5762 {
5763 SPELL_AURA_PERIODIC_DAMAGE, // Frost Fever and Blood Plague
5764 SPELL_AURA_LINKED, // Crypt Fever and Ebon Plague
5766 };
5767
5768 ObjectGuid drwGUID;
5769
5770 if (Player* playerCaster = ObjectAccessor::GetPlayer(*this, casterGUID))
5771 drwGUID = playerCaster->getRuneWeaponGUID();
5772
5773 uint32 diseases = 0;
5774 for (uint8 index = 0; diseaseAuraTypes[index] != SPELL_AURA_NONE; ++index)
5775 {
5776 for (AuraEffectList::iterator i = m_modAuras[diseaseAuraTypes[index]].begin(); i != m_modAuras[diseaseAuraTypes[index]].end();)
5777 {
5778 // Get auras with disease dispel type by caster
5779 if ((*i)->GetSpellInfo()->Dispel == DISPEL_DISEASE
5780 && ((*i)->GetCasterGUID() == casterGUID || (*i)->GetCasterGUID() == drwGUID)) // if its caster or his dancing rune weapon
5781 {
5782 ++diseases;
5783
5784 if (mode == 1)
5785 {
5786 RemoveAura((*i)->GetId(), (*i)->GetCasterGUID());
5787 i = m_modAuras[diseaseAuraTypes[index]].begin();
5788 continue;
5789 }
5790 // used for glyph of scourge strike
5791 else if (mode == 2)
5792 {
5793 Aura* aura = (*i)->GetBase();
5794 if (aura && !aura->IsRemoved() && aura->GetDuration() > 0)
5795 if ((aura->GetApplyTime() + aura->GetMaxDuration() / 1000 + 8) > (GameTime::GetGameTime().count() + aura->GetDuration() / 1000))
5796 aura->SetDuration(aura->GetDuration() + 3000);
5797 }
5798 }
5799 ++i;
5800 }
5801 }
5802 return diseases;
5803}
AuraType
Definition: SpellAuraDefines.h:62
@ SPELL_AURA_LINKED
Definition: SpellAuraDefines.h:347
@ SPELL_AURA_NONE
Definition: SpellAuraDefines.h:63
@ DISPEL_DISEASE
Definition: SharedDefines.h:1375
int32 GetMaxDuration() const
Definition: SpellAuras.h:129
time_t GetApplyTime() const
Definition: SpellAuras.h:128

References DISPEL_DISEASE, Aura::GetApplyTime(), Aura::GetDuration(), GameTime::GetGameTime(), Aura::GetMaxDuration(), ObjectAccessor::GetPlayer(), Aura::IsRemoved(), m_modAuras, RemoveAura(), Aura::SetDuration(), SPELL_AURA_LINKED, SPELL_AURA_NONE, and SPELL_AURA_PERIODIC_DAMAGE.

Referenced by Spell::EffectWeaponDmg(), MeleeDamageBonusDone(), and SpellPctDamageModsDone().

◆ GetDispellableAuraList()

void Unit::GetDispellableAuraList ( Unit caster,
uint32  dispelMask,
DispelChargesList dispelList,
SpellInfo const *  dispelSpell 
)
5544{
5545 // we should not be able to dispel diseases if the target is affected by unholy blight
5546 if (dispelMask & (1 << DISPEL_DISEASE) && HasAura(50536))
5547 dispelMask &= ~(1 << DISPEL_DISEASE);
5548
5549 ReputationRank rank = GetReactionTo(caster, IsCharmed());
5550 bool positive = rank >= REP_FRIENDLY;
5551
5552 // Neutral unit not at war with caster should be treated as a friendly unit
5553 if (rank == REP_NEUTRAL)
5554 {
5555 if (Player* casterPlayer = caster->GetAffectingPlayer())
5556 {
5557 if (FactionTemplateEntry const* factionTemplateEntry = GetFactionTemplateEntry())
5558 {
5559 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
5560 {
5561 if (factionEntry->CanBeSetAtWar())
5562 {
5563 positive = !casterPlayer->GetReputationMgr().IsAtWar(factionEntry);
5564 }
5565 }
5566 }
5567 }
5568 }
5569
5570 Unit::VisibleAuraMap const* visibleAuras = GetVisibleAuras();
5571 for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
5572 {
5573 Aura* aura = itr->second->GetBase();
5574
5575 // don't try to remove passive auras
5576 if (aura->IsPassive())
5577 continue;
5578
5579 if (aura->GetSpellInfo()->GetDispelMask() & dispelMask)
5580 {
5581 if (aura->GetSpellInfo()->Dispel == DISPEL_MAGIC)
5582 {
5583 // do not remove positive auras if friendly target
5584 // negative auras if non-friendly target
5585 if (itr->second->IsPositive() == positive)
5586 continue;
5587 }
5588
5589 // Banish should only be dispelled by Mass Dispel
5590 if (aura->GetSpellInfo()->Mechanic == MECHANIC_BANISH && !dispelSpell->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
5591 {
5592 continue;
5593 }
5594
5595 // The charges / stack amounts don't count towards the total number of auras that can be dispelled.
5596 // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell
5597 // Polymorph instead of 1 / (5 + 1) -> 16%.
5598 bool dispel_charges = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_REMOVES_CHARGES);
5599 uint8 charges = dispel_charges ? aura->GetCharges() : aura->GetStackAmount();
5600 if (charges > 0)
5601 dispelList.push_back(std::make_pair(aura, charges));
5602 }
5603 }
5604}
@ SPELL_ATTR7_DISPEL_REMOVES_CHARGES
Definition: SharedDefines.h:651
@ MECHANIC_BANISH
Definition: SharedDefines.h:1343
@ SPELL_ATTR0_NO_IMMUNITIES
Definition: SharedDefines.h:411
@ REP_FRIENDLY
Definition: SharedDefines.h:184
@ DISPEL_MAGIC
Definition: SharedDefines.h:1373
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition: Unit.cpp:5636
std::map< uint8, AuraApplication * > VisibleAuraMap
Definition: Unit.h:1324
VisibleAuraMap const * GetVisibleAuras()
Definition: Unit.h:2165
uint8 GetStackAmount() const
Definition: SpellAuras.h:148
uint8 GetCharges() const
Definition: SpellAuras.h:141
bool IsPassive() const
Definition: SpellAuras.cpp:1096
uint32 Mechanic
Definition: SpellInfo.h:321
uint32 Dispel
Definition: SpellInfo.h:320

References SpellInfo::Dispel, DISPEL_DISEASE, DISPEL_MAGIC, GetAffectingPlayer(), Aura::GetCharges(), SpellInfo::GetDispelMask(), GetFactionTemplateEntry(), GetReactionTo(), Aura::GetSpellInfo(), Aura::GetStackAmount(), GetVisibleAuras(), SpellInfo::HasAttribute(), HasAura(), IsCharmed(), Aura::IsPassive(), SpellInfo::Mechanic, MECHANIC_BANISH, REP_FRIENDLY, REP_NEUTRAL, sFactionStore, SPELL_ATTR0_NO_IMMUNITIES, and SPELL_ATTR7_DISPEL_REMOVES_CHARGES.

Referenced by Spell::EffectDispel().

◆ GetDisplayId()

uint32 Unit::GetDisplayId ( ) const
inline

References Object::GetUInt32Value(), and UNIT_FIELD_DISPLAYID.

Referenced by boss_jormungarAI::AttackStart(), WorldSession::BuildPartyMemberStatsChangedPacket(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), Pet::CreateBaseAtCreature(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), boss_jormungarAI::DoAction(), GetDisplayRace(), AuraEffect::HandleAuraCloneCaster(), spell_gen_model_visible::HandleEffectApply(), WorldSession::HandleMirrorImageDataRequest(), npc_commandscript::HandleNpcGuidCommand(), npc_commandscript::HandleNpcInfoCommand(), WorldSession::HandleRequestPartyMemberStatsOpcode(), spell_death_knight_initiate_visual::HandleScriptEffect(), wp_commandscript::HandleWpShowCommand(), Guardian::InitStatsForLevel(), IsInDisallowedMountForm(), boss_tharon_ja::boss_tharon_jaAI::JustDied(), npc_scholomance_occultist::npc_scholomance_occultistAI::JustEngagedWith(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::KilledUnit(), boss_devourer_of_souls::boss_devourer_of_soulsAI::KilledUnit(), achievement_less_rabi::OnCheck(), WretchedGhoulCleaner::operator()(), boss_leotheras_the_blind::Reset(), boss_jormungarAI::ScheduleEvents(), Creature::SetObjectScale(), boss_halion::boss_halionAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), and boss_leotheras_the_blind::UpdateAI().

◆ GetDisplayRace()

DisplayRace Unit::GetDisplayRace ( ) const
inline
DisplayRace GetDisplayRaceFromModelId(uint32 modelId) const
Definition: Unit.cpp:21306
uint32 GetDisplayId() const
Definition: Unit.h:2182

References GetDisplayId(), and GetDisplayRaceFromModelId().

Referenced by AuraEffect::HandleAuraTransform().

◆ GetDisplayRaceFromModelId()

DisplayRace Unit::GetDisplayRaceFromModelId ( uint32  modelId) const
21307{
21308 if (CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(modelId))
21309 {
21310 if (CreatureDisplayInfoExtraEntry const* displayExtra = sCreatureDisplayInfoExtraStore.LookupEntry(display->ExtendedDisplayInfoID))
21311 {
21312 return DisplayRace(displayExtra->DisplayRaceID);
21313 }
21314 }
21315 return DisplayRace::None;
21316}
DBCStorage< CreatureDisplayInfoExtraEntry > sCreatureDisplayInfoExtraStore(CreatureDisplayInfoExtrafmt)
DisplayRace
Definition: SharedDefines.h:111
Definition: DBCStructure.h:739

References sCreatureDisplayInfoExtraStore, and sCreatureDisplayInfoStore.

Referenced by GetDisplayRace().

◆ GetDoTsByCaster()

uint32 Unit::GetDoTsByCaster ( ObjectGuid  casterGUID) const
5806{
5807 static const AuraType diseaseAuraTypes[] =
5808 {
5812 };
5813
5814 uint32 dots = 0;
5815 for (AuraType const* itr = &diseaseAuraTypes[0]; itr && itr[0] != SPELL_AURA_NONE; ++itr)
5816 {
5817 Unit::AuraEffectList const& auras = GetAuraEffectsByType(*itr);
5818 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5819 {
5820 // Get auras by caster
5821 if ((*i)->GetCasterGUID() == casterGUID)
5822 ++dots;
5823 }
5824 }
5825 return dots;
5826}
@ SPELL_AURA_PERIODIC_DAMAGE_PERCENT
Definition: SpellAuraDefines.h:152

References GetAuraEffectsByType(), SPELL_AURA_NONE, SPELL_AURA_PERIODIC_DAMAGE, and SPELL_AURA_PERIODIC_DAMAGE_PERCENT.

Referenced by SpellPctDamageModsDone().

◆ GetDummyAuraEffect()

◆ GetDynamicFlags()

◆ GetDynObject()

DynamicObject * Unit::GetDynObject ( uint32  spellId)
6067{
6068 if (m_dynObj.empty())
6069 return nullptr;
6070 for (DynObjectList::const_iterator i = m_dynObj.begin(); i != m_dynObj.end(); ++i)
6071 {
6072 DynamicObject* dynObj = *i;
6073 if (dynObj->GetSpellId() == spellId)
6074 return dynObj;
6075 }
6076 return nullptr;
6077}
Definition: DynamicObject.h:35
uint32 GetSpellId() const
Definition: DynamicObject.h:58

References DynamicObject::GetSpellId(), and m_dynObj.

Referenced by Spell::DelayedChannel(), and WorldSession::HandleFarSightOpcode().

◆ GetEffectiveResistChance()

float Unit::GetEffectiveResistChance ( Unit const *  owner,
SpellSchoolMask  schoolMask,
Unit const *  victim 
)
static
2094{
2095 float victimResistance = float(victim->GetResistance(schoolMask));
2096 if (owner)
2097 {
2098 // Xinef: pets inherit 100% of masters penetration
2099 // Xinef: excluding traps
2100 Player const* player = owner->GetSpellModOwner();
2101 if (player && owner->GetEntry() != WORLD_TRIGGER)
2102 {
2103 victimResistance += float(player->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2104 victimResistance -= float(player->GetSpellPenetrationItemMod());
2105 }
2106 else
2107 victimResistance += float(owner->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2108 }
2109
2110 victimResistance = std::max(victimResistance, 0.0f);
2111 if (owner)
2112 victimResistance += std::max((float(victim->GetLevel()) - float(owner->GetLevel())) * 5.0f, 0.0f);
2113
2114 static uint32 const BOSS_LEVEL = 83;
2115 static float const BOSS_RESISTANCE_CONSTANT = 510.0f;
2116 uint32 level = victim->GetLevel();
2117 float resistanceConstant = 0.0f;
2118
2119 if (level == BOSS_LEVEL)
2120 resistanceConstant = BOSS_RESISTANCE_CONSTANT;
2121 else
2122 resistanceConstant = level * 5.0f;
2123
2124 return victimResistance / (victimResistance + resistanceConstant);
2125}
int32 GetSpellPenetrationItemMod() const
Definition: Player.h:1935

References Object::GetEntry(), GetLevel(), GetResistance(), GetSpellModOwner(), Player::GetSpellPenetrationItemMod(), GetTotalAuraModifierByMiscMask(), SPELL_AURA_MOD_TARGET_RESISTANCE, and WORLD_TRIGGER.

Referenced by CalcAbsorbResist(), and MagicSpellHitResult().

◆ GetExtraUnitMovementFlags()

uint16 Unit::GetExtraUnitMovementFlags ( ) const
inline

◆ GetFaction()

uint32 Unit::GetFaction ( ) const
inline

References Object::GetUInt32Value(), and UNIT_FIELD_FACTIONTEMPLATE.

Referenced by npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::AttackStart(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::AttackStart(), BuildValuesUpdate(), Creature::CanAssistTo(), spell_q10985_light_of_the_naaru::CheckProc(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), Spell::EffectDuel(), Spell::EffectSummonType(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::EnterEvadeMode(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::EnterEvadeMode(), AuctionListItemsDelayEvent::Execute(), npc_chesspiece::GetDefaultOrientationForTeam(), GetFactionTemplateEntry(), GetReactionTo(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListOwnerItemsEvent(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleGossipHelloOpcode(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcGuidCommand(), npc_commandscript::HandleNpcInfoCommand(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandlePlayerLoginFromDB(), TempSummon::InitStats(), InitTamedPet(), IsFriendly(), IsInPartyWith(), IsInRaidWith(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), npc_escortAI::JustRespawned(), FollowerAI::JustRespawned(), SmartAI::JustRespawned(), boss_volkhan::boss_volkhanAI::JustSummoned(), boss_archimonde::boss_archimondeAI::JustSummoned(), Pet::LoadPetFromDB(), npc_chesspiece::npc_chesspiece(), npc_plucky::npc_pluckyAI::npc_pluckyAI(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::npc_taskmaster_fizzuleAI(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::OnPlayerEnter(), npc_eris_hevenfire::OnQuestAccept(), npc_cork_gizelton::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::Reset(), WorldSession::SendAuctionHello(), SetCharmedBy(), Player::SetGameMaster(), npc_chesspiece::sGossipHello(), boss_malchezaar::SpawnInfernal(), Spell::SummonGuardian(), Player::SummonPet(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), npc_chesspiece::UpdateAI(), boss_archimonde::boss_archimondeAI::UpdateAI(), npc_giant_infernal::npc_giant_infernalAI::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), and Creature::UpdateMoveInLineOfSightState().

◆ GetFactionReactionTo()

ReputationRank Unit::GetFactionReactionTo ( FactionTemplateEntry const *  factionTemplateEntry,
Unit const *  target 
) const
10193{
10194 // always neutral when no template entry found
10195 if (!factionTemplateEntry)
10196 return REP_NEUTRAL;
10197
10198 FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry();
10199 if (!targetFactionTemplateEntry)
10200 return REP_NEUTRAL;
10201
10202 // xinef: check forced reputation for self also
10203 if (Player const* selfPlayerOwner = GetAffectingPlayer())
10204 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(target->GetFactionTemplateEntry()))
10205 return *repRank;
10206
10207 if (Player const* targetPlayerOwner = target->GetAffectingPlayer())
10208 {
10209 // check contested flags
10210 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10211 && targetPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10212 return REP_HOSTILE;
10213 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(factionTemplateEntry))
10214 return *repRank;
10215 if (!target->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10216 {
10217 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
10218 {
10219 if (factionEntry->CanHaveReputation())
10220 {
10221 // CvP case - check reputation, don't allow state higher than neutral when at war
10222 ReputationRank repRank = targetPlayerOwner->GetReputationMgr().GetRank(factionEntry);
10223 if (targetPlayerOwner->GetReputationMgr().IsAtWar(factionEntry))
10224 repRank = std::min(REP_NEUTRAL, repRank);
10225 return repRank;
10226 }
10227 }
10228 }
10229 }
10230
10231 // common faction based check
10232 if (factionTemplateEntry->IsHostileTo(*targetFactionTemplateEntry))
10233 return REP_HOSTILE;
10234 if (factionTemplateEntry->IsFriendlyTo(*targetFactionTemplateEntry))
10235 return REP_FRIENDLY;
10236 if (targetFactionTemplateEntry->IsFriendlyTo(*factionTemplateEntry))
10237 return REP_FRIENDLY;
10238 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS)
10239 return REP_HOSTILE;
10240 // neutral by default
10241 return REP_NEUTRAL;
10242}
@ PLAYER_FLAGS_CONTESTED_PVP
Definition: Player.h:483
@ UNIT_FLAG2_IGNORE_REPUTATION
Definition: Unit.h:490
@ FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS
Definition: DBCEnums.h:340
@ FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
Definition: DBCEnums.h:339

References FactionTemplateEntry::faction, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS, FactionTemplateEntry::factionFlags, GetAffectingPlayer(), GetFactionTemplateEntry(), HasUnitFlag2(), FactionTemplateEntry::IsFriendlyTo(), FactionTemplateEntry::IsHostileTo(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HOSTILE, REP_NEUTRAL, sFactionStore, and UNIT_FLAG2_IGNORE_REPUTATION.

Referenced by GetReactionTo().

◆ GetFactionTemplateEntry()

FactionTemplateEntry const * Unit::GetFactionTemplateEntry ( ) const
10043{
10044 FactionTemplateEntry const* entry = sFactionTemplateStore.LookupEntry(GetFaction());
10045 if (!entry)
10046 {
10047 static ObjectGuid guid; // prevent repeating spam same faction problem
10048
10049 if (GetGUID() != guid)
10050 {
10051 if (Player const* player = ToPlayer())
10052 LOG_ERROR("entities.unit", "Player {} has invalid faction (faction template id) #{}", player->GetName(), GetFaction());
10053 else if (Creature const* creature = ToCreature())
10054 LOG_ERROR("entities.unit", "Creature (template id: {}) has invalid faction (faction template id) #{}", creature->GetCreatureTemplate()->Entry, GetFaction());
10055 else
10056 LOG_ERROR("entities.unit", "Unit (name={}, type={}) has invalid faction (faction template id) #{}", GetName(), uint32(GetTypeId()), GetFaction());
10057
10058 guid = GetGUID();
10059 }
10060 }
10061 return entry;
10062}
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
std::string const & GetName() const
Definition: Object.h:446

References GetFaction(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), LOG_ERROR, sFactionTemplateStore, Object::ToCreature(), and Object::ToPlayer().

Referenced by _IsValidAttackTarget(), BuildValuesUpdate(), Player::CanUseBattlegroundObject(), HostileRefMgr::deleteReferencesForFaction(), Spell::EffectGameObjectDamage(), GetDispellableAuraList(), GetFactionReactionTo(), GetReactionTo(), Player::GetReputationPriceDiscount(), IsContestedGuard(), IsHostileToPlayers(), IsNeutralToAll(), and npc_chesspiece::OnCharmed().

◆ GetFirstControlled()

Unit * Unit::GetFirstControlled ( ) const
11070{
11071 // Sequence: charmed, pet, other guardians
11072 Unit* unit = GetCharm();
11073 if (!unit)
11074 if (ObjectGuid guid = GetMinionGUID())
11075 unit = ObjectAccessor::GetUnit(*this, guid);
11076
11077 return unit;
11078}
ObjectGuid GetMinionGUID() const
Definition: Unit.h:1832

References GetCharm(), GetMinionGUID(), and ObjectAccessor::GetUnit().

Referenced by Player::CharmSpellInitialize(), CombatStart(), WorldSession::HandlePetSetAction(), and RemoveCharmedBy().

◆ GetFirstMinion()

Minion * Unit::GetFirstMinion ( ) const
10636{
10637 if (ObjectGuid pet_guid = GetMinionGUID())
10638 {
10639 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10640 if (pet->HasUnitTypeMask(UNIT_MASK_MINION))
10641 return (Minion*)pet;
10642
10643 LOG_ERROR("entities.unit", "Unit::GetFirstMinion: Minion {} not exist.", pet_guid.ToString());
10644 const_cast<Unit*>(this)->SetMinionGUID(ObjectGuid::Empty);
10645 }
10646
10647 return nullptr;
10648}
Creature * GetCreatureOrPetOrVehicle(WorldObject const &, ObjectGuid const)
Definition: ObjectAccessor.cpp:237
void SetMinionGUID(ObjectGuid guid)
Definition: Unit.h:1833

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetMinionGUID(), LOG_ERROR, SetMinionGUID(), and UNIT_MASK_MINION.

◆ GetFollowAngle()

◆ GetGameObject()

GameObject * Unit::GetGameObject ( uint32  spellId) const
6108{
6109 for (GameObjectList::const_iterator itr = m_gameObj.begin(); itr != m_gameObj.end(); ++itr)
6110 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6111 if (go->GetSpellId() == spellId)
6112 return go;
6113
6114 return nullptr;
6115}

References ObjectAccessor::GetGameObject(), and m_gameObj.

Referenced by Player::GetGameObjectIfCanInteractWith(), and Player::TeleportTo().

◆ getGender()

◆ GetGuardianPet()

Guardian * Unit::GetGuardianPet ( ) const
10651{
10652 if (ObjectGuid pet_guid = GetPetGUID())
10653 {
10654 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10655 if (pet->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10656 return (Guardian*)pet;
10657
10658 LOG_FATAL("entities.unit", "Unit::GetGuardianPet: Guardian {} not exist.", pet_guid.ToString());
10659 const_cast<Unit*>(this)->SetPetGUID(ObjectGuid::Empty);
10660 }
10661
10662 return nullptr;
10663}
#define LOG_FATAL(filterType__,...)
Definition: Log.h:153
Definition: TemporarySummon.h:95
void SetPetGUID(ObjectGuid guid)
Definition: Unit.h:1837
ObjectGuid GetPetGUID() const
Definition: Unit.h:1838

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetPetGUID(), LOG_FATAL, SetPetGUID(), and UNIT_MASK_GUARDIAN.

Referenced by spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Spell::EffectSummonPet(), GetNextRandomRaidMemberOrPet(), AuraEffect::HandleAuraDummy(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), AuraEffect::HandleModDamageDone(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), Spell::SelectImplicitCasterObjectTargets(), and SetMinion().

◆ GetHealth()

uint32 Unit::GetHealth ( ) const
inline
@ UNIT_FIELD_HEALTH
Definition: UpdateFields.h:96

References Object::GetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_SaveCharacter(), spell_yogg_saron_protective_gaze::spell_yogg_saron_protective_gaze_AuraScript::Absorb(), spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), Spell::CheckPower(), CountPctFromCurHealth(), boss_eregos::boss_eregosAI::DamageTaken(), boss_gyth::boss_gythAI::DamageTaken(), boss_razorgore::boss_razorgoreAI::DamageTaken(), boss_majordomo::boss_majordomoAI::DamageTaken(), boss_ragnaros::boss_ragnarosAI::DamageTaken(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_julianne::DamageTaken(), boss_romulo::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_kiljaeden::boss_kiljaedenAI::DamageTaken(), boss_muru::boss_muruAI::DamageTaken(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::DamageTaken(), boss_halazzi::boss_halazziAI::DamageTaken(), npc_halazzi_lynx::npc_halazzi_lynxAI::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), npc_amanitar_mushrooms::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_announcer_toc5::npc_announcer_toc5AI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_ick::boss_ickAI::DamageTaken(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::DamageTaken(), boss_drakkari_colossus::boss_drakkari_colossusAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), npc_crystalline_frayer::npc_crystalline_frayerAI::DamageTaken(), npc_collapsing_star::npc_collapsing_starAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_illidan_stormrage::boss_illidan_stormrageAI::DamageTaken(), npc_akama_illidan::npc_akama_illidanAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_shattered_hand_scout::DamageTaken(), boss_alar::boss_alarAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_hor_leader_second::npc_hor_leader_secondAI::DamageTaken(), npc_ice_tomb::npc_ice_tombAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_thekal::DamageTaken(), npc_garr_firesworn::npc_garr_fireswornAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_kalecgos::boss_kalecgosAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), SmartAI::DamageTaken(), npc_calvin_montague::npc_calvin_montagueAI::DamageTaken(), boss_sathrovarr::boss_sathrovarrAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kologarn::boss_kologarnAI::DamageTaken(), boss_kologarn_arms::boss_kologarn_armsAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), DealDamage(), DealMeleeDamage(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), boss_zuljin::boss_zuljinAI::DoMeleeAttackIfReady(), Spell::EffectHealMaxHealth(), Spell::EffectInstaKill(), Pet::FillPetInfo(), boss_supremus::FindHatefulStrikeTarget(), GetHealthGain(), GetHealthPct(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_rajaxx_thundercrash::HandleDamageCalc(), misc_commandscript::HandleDieCommand(), HandleDummyAuraProc(), spell_oculus_soar::spell_oculus_soarAuraScript::HandleEffectPeriodic(), Player::HandleFall(), npc_commandscript::HandleNpcInfoCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), boss_akilzon::boss_akilzonAI::HandleStormSequence(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), IsFullHealth(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::JustDied(), npc_dirt_mound::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), Kill(), ModifyHealth(), spell_xt002_gravity_bomb_aura::spell_xt002_gravity_bomb_aura_AuraScript::OnPeriodic(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), Creature::ResetPlayerDamageReq(), Player::SaveHealthBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), SendAttackStateUpdate(), SendSpellNonMeleeDamageLog(), SendSpellNonMeleeReflectLog(), SetMaxHealth(), boss_eadric::boss_eadricAI::SpellHit(), boss_headless_horseman_head::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), boss_ouro::Submerge(), boss_ahune::SummonedCreatureDespawn(), Aura::Update(), boss_zuljin::boss_zuljinAI::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_archimonde::boss_archimondeAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_ahune::UpdateAI(), npc_phase_hunter::npc_phase_hunterAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), Player::UpdateCharmedAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ GetHealthGain()

int32 Unit::GetHealthGain ( int32  dVal)
14112{
14113 int32 gain = 0;
14114
14115 if (dVal == 0)
14116 return 0;
14117
14118 int32 curHealth = (int32)GetHealth();
14119
14120 int32 val = dVal + curHealth;
14121 if (val <= 0)
14122 {
14123 return -curHealth;
14124 }
14125
14126 int32 maxHealth = (int32)GetMaxHealth();
14127
14128 if (val < maxHealth)
14129 gain = dVal;
14130 else if (curHealth != maxHealth)
14131 gain = maxHealth - curHealth;
14132
14133 return gain;
14134}

References GetHealth(), and GetMaxHealth().

Referenced by Spell::DoAllEffectOnTarget().

◆ GetHealthPct()

◆ getHostileRefMgr()

◆ GetHoverHeight()

float Unit::GetHoverHeight ( ) const
inline

◆ GetInterruptMask()

uint32 Unit::GetInterruptMask ( ) const
inline
2176{ return m_interruptMask; }

References m_interruptMask.

◆ GetLastDamagedTargetGuid()

ObjectGuid const & Unit::GetLastDamagedTargetGuid ( ) const
inline
1587{ return _lastDamagedTargetGuid; }

References _lastDamagedTargetGuid.

◆ GetLastExtraAttackSpell()

uint32 Unit::GetLastExtraAttackSpell ( ) const
inline
1584{ return _lastExtraAttackSpell; }

References _lastExtraAttackSpell.

Referenced by HandleProcTriggerSpell().

◆ getLevel()

uint8 Unit::getLevel ( ) const
inline
Deprecated:
Use GetLevel() instead!
@ UNIT_FIELD_LEVEL
Definition: UpdateFields.h:114

References Object::GetUInt32Value(), and UNIT_FIELD_LEVEL.

Referenced by GetLevel(), Pet::GetNativeObjectScale(), and PlayerMenu::SendQuestGiverQuestDetails().

◆ GetLevel()

uint8 Unit::GetLevel ( ) const
inline
1432{ return getLevel(); }
uint8 getLevel() const
Definition: Unit.h:1431

References getLevel().

Referenced by Player::_ApplyItemBonuses(), Player::_ApplyWeaponDamage(), KillRewarder::_InitGroupData(), Pet::_LoadAuras(), KillRewarder::_RewardPlayer(), KillRewarder::_RewardXP(), Player::_SaveCharacter(), Player::_SaveStats(), spell_pal_ardent_defender::Absorb(), Pet::addSpell(), Spell::AddUnitTarget(), Player::ApplyEnchantment(), AuraEffect::AuraEffect(), BattlegroundMgr::BuildBattlegroundListPacket(), WorldSession::BuildPartyMemberStatsChangedPacket(), CalcArmorReducedDamage(), SpellInfo::CalcPowerCost(), SpellEffectInfo::CalcRadius(), spell_gen_disabled_above_63::CalculateAmount(), spell_item_arcane_shroud::CalculateAmount(), spell_item_the_eye_of_diminution::CalculateAmount(), CalculateLevelPenalty(), CalculateMeleeDamage(), Player::CalculateMinMaxDamage(), Player::CalculateReputationGain(), Player::CalculateTalentsPoints(), SpellEffectInfo::CalcValue(), Player::CanEquipItem(), Group::CanJoinBattlegroundQueue(), Player::CanSeeStartQuest(), Player::CanUseItem(), Player::CheckAreaExploreAndOutdoor(), spell_hun_tame_beast::CheckCast(), Spell::CheckCast(), Spell::CheckEffectTarget(), spell_gen_proc_above_75::CheckLevel(), spell_gen_proc_reduced_above_60::CheckProc(), spell_item_green_whelp_armor::CheckProc(), Pet::CreateBaseAtTamed(), Player::CreatePet(), CreateTamedPetFrom(), DealMeleeDamage(), DoLowUnlearnCost(), DoMedUnlearnCost(), Spell::DoSpellHitOnUnit(), Spell::EffectAddHonor(), Spell::EffectApplyGlyph(), Spell::EffectDuel(), Spell::EffectEnergize(), Spell::EffectSchoolDMG(), Spell::EffectSkinning(), Spell::EffectTameCreature(), Pet::FillPetInfo(), lfg::LFGMgr::FinishDungeon(), Acore::XP::Gain(), Player::GetAverageItemLevel(), Player::GetAverageItemLevelForDF(), Player::GetBarberShopCost(), Player::GetBGAccessByLevel(), Pet::GetCurrentFoodBenefitLevel(), npc_wg_quest_giver::GetDialogStatus(), Player::GetDodgeFromAgility(), GetEffectiveResistChance(), SocialMgr::GetFriendInfo(), getLevelForTarget(), Creature::getLevelForTarget(), GetMaxSkillValueForLevel(), Player::GetMeleeCritFromAgility(), Player::GetQuestDialogStatus(), Player::GetQuestLevel(), Player::GetRatingMultiplier(), Creature::GetShieldBlockValue(), Player::GetSpellCritFromIntellect(), Player::GetsRecruitAFriendBonus(), Player::GetTrainerSpellState(), GetUnitMeleeSkill(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), WorldSession::HandleAcceptGrantLevel(), OutdoorPvPSI::HandleAreaTrigger(), WorldSession::HandleArenaTeamInviteOpcode(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBattlefieldStatusOpcode(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), WorldSession::HandleCastSpellOpcode(), Player::HandleDrowning(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLfgPlayerLockInfoRequestOpcode(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), WorldSession::HandleMessagechatOpcode(), npc_commandscript::HandleNpcInfoCommand(), WorldSession::HandleOfferPetitionOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandlePetitionSignOpcode(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), spell_pri_divine_aegis::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), reset_commandscript::HandleResetLevelCommand(), spell_wintergrasp_portal::spell_wintergrasp_portal_SpellScript::HandleScript(), spell_item_scroll_of_recall::HandleScript(), WorldSession::HandleSendMail(), player_settings_commandscript::HandleSettingsAnnouncerFlags(), Player::InitGlyphsForLevel(), lfg::LFGMgr::InitializeLockedDungeons(), Pet::InitLevelupSpellsForLevel(), Puppet::InitStats(), TempSummon::InitStats(), Player::InitStatsForLevel(), Pet::InitTalentForLevel(), Player::InitTaxiNodesForLevel(), Battlefield::InvitePlayerToWar(), Creature::isCanTrainingAndResetTalentsOf(), Player::isHonorOrXPTarget(), Player::LearnDefaultSkill(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), AchievementCriteriaData::Meets(), MeleeSpellHitResult(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), spell_item_with_mount_speed::OnApply(), item_generic_limit_chance_above_60::OnCastItemCombatSpell(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), Player::OnGossipSelect(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), Player::PrepareGossipMenu(), Player::Regenerate(), Player::RegenerateHealth(), Player::RemovedInsignia(), Pet::removeSpell(), Pet::resetTalents(), Player::ResurrectPlayer(), Player::RewardHonor(), Player::RewardQuest(), RewardRage(), Player::RewardReputation(), RollMeleeOutcomeAgainst(), ArenaTeam::Roster(), Player::Satisfy(), Player::SatisfyQuestLevel(), Pet::SavePetToDB(), CalendarMgr::SendCalendarEvent(), CalendarMgr::SendCalendarEventInvite(), WorldSession::SendLfgPlayerReward(), WorldSession::SendLfgRoleCheckUpdate(), Player::SendLoot(), PlayerMenu::SendQuestGiverOfferReward(), PlayerMenu::SendQuestGiverQuestDetails(), PlayerMenu::SendQuestQueryResponse(), Player::SendQuestReward(), ObjectMgr::SendServerMail(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), Player::SetRestBonus(), Guild::Member::SetStats(), SpellPctDamageModsDone(), Spell::SummonGuardian(), Player::SummonPet(), Pet::SynchronizeLevelWithOwner(), Aura::Update(), npc_pet_hunter_snake_trap::UpdateAI(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCombatSkills(), Creature::UpdateEntry(), lfg::LFGMgr::UpdateRaidBrowser(), and GameObject::Use().

◆ getLevelForTarget()

◆ GetMagicHitRedirectTarget()

Unit * Unit::GetMagicHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo 
)
11014{
11015 // Patch 1.2 notes: Spell Reflection no longer reflects abilities
11016 if (spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR1_NO_REDIRECTION) || spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
11017 return victim;
11018
11020 for (Unit::AuraEffectList::const_iterator itr = magnetAuras.begin(); itr != magnetAuras.end(); ++itr)
11021 {
11022 if (Unit* magnet = (*itr)->GetBase()->GetUnitOwner())
11023 if (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11024 //&& spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK
11025 && _IsValidAttackTarget(magnet, spellInfo)
11026 /*&& IsWithinLOSInMap(magnet)*/)
11027 {
11028 // Xinef: We should choose minimum between flight time and queue time as in reflect, however we dont know flight time at this point, use arbitrary small number
11029 magnet->m_Events.AddEvent(new RedirectSpellEvent(*magnet, victim->GetGUID(), *itr), magnet->m_Events.CalculateQueueTime(100));
11030
11031 if (magnet->IsTotem())
11032 {
11033 uint64 queueTime = magnet->m_Events.CalculateQueueTime(100);
11034 if (spellInfo->Speed > 0.0f)
11035 {
11036 float dist = GetDistance(magnet->GetPositionX(), magnet->GetPositionY(), magnet->GetPositionZ());
11037 if (dist < 5.0f)
11038 dist = 5.0f;
11039 queueTime = magnet->m_Events.CalculateTime((uint64)floor(dist / spellInfo->Speed * 1000.0f));
11040 }
11041
11042 magnet->m_Events.AddEvent(new KillMagnetEvent(*magnet), queueTime);
11043 }
11044
11045 return magnet;
11046 }
11047 }
11048 return victim;
11049}
std::uint64_t uint64
Definition: Define.h:107
@ SPELL_AURA_SPELL_MAGNET
Definition: SpellAuraDefines.h:159
@ SPELL_ATTR1_NO_REDIRECTION
Definition: SharedDefines.h:422
@ SPELL_ATTR0_IS_ABILITY
Definition: SharedDefines.h:386
Definition: TotemAI.h:48
float GetDistance(WorldObject const *obj) const
Definition: Object.cpp:1245
bool _IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
Definition: Unit.cpp:13865
Definition: Unit.h:2683

References _IsValidAttackTarget(), SpellInfo::CheckExplicitTarget(), GetAuraEffectsByType(), WorldObject::GetDistance(), Object::GetGUID(), SpellInfo::HasAttribute(), SpellInfo::Speed, SPELL_ATTR0_IS_ABILITY, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_NO_REDIRECTION, SPELL_AURA_SPELL_MAGNET, and SPELL_CAST_OK.

Referenced by Spell::SelectExplicitTargets().

◆ GetMaxHealth()

uint32 Unit::GetMaxHealth ( ) const
inline
@ UNIT_FIELD_MAXHEALTH
Definition: UpdateFields.h:104

References Object::GetUInt32Value(), and UNIT_FIELD_MAXHEALTH.

Referenced by Player::_SaveStats(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_viscidus::boss_viscidus(), WorldSession::BuildPartyMemberStatsChangedPacket(), spell_item_skull_of_impeding_doom::CalculateDamageAmount(), CountPctFromMaxHealth(), boss_eregos::boss_eregosAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_alar::boss_alarAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_twinemperorsAI::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_heated_battle::npc_heated_battleAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), Spell::EffectHealMaxHealth(), Spell::EffectSummonPet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), Acore::XP::Gain(), GetHealthGain(), GetHealthPct(), npc_echo_of_medivh::GetPiece(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), HandleAuraProc(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), spell_oculus_soar::spell_oculus_soarAuraScript::HandleEffectPeriodic(), Player::HandleFall(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcInfoCommand(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_stinky_precious_decimate::spell_stinky_precious_decimate_SpellScript::HandleScript(), IsFullHealth(), boss_twin_valkyrAI::JustEngagedWith(), boss_sister_svalna::boss_sister_svalnaAI::JustEngagedWith(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), Player::outDebugValues(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), boss_kalecgos::boss_kalecgosAI::Reset(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetFullHealth(), SetHealth(), boss_headless_horseman::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), boss_viscidus::SummonedCreatureDies(), boss_headless_horseman::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_phase_hunter::npc_phase_hunterAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxNegativeAuraModifier()

int32 Unit::GetMaxNegativeAuraModifier ( AuraType  auratype) const
5888{
5889 int32 modifier = 0;
5890
5891 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5892 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5893 if ((*i)->GetAmount() < modifier)
5894 modifier = (*i)->GetAmount();
5895
5896 return modifier;
5897}

References GetAuraEffectsByType().

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), SpellHealingBonusTaken(), boss_shade_of_akama::UpdateAI(), and UpdateSpeed().

◆ GetMaxNegativeAuraModifierByAffectMask()

int32 Unit::GetMaxNegativeAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6043{
6044 int32 modifier = 0;
6045
6046 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6047 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6048 {
6049 if ((*i)->IsAffectedOnSpell(affectedSpell) && (*i)->GetAmount() < modifier)
6050 modifier = (*i)->GetAmount();
6051 }
6052
6053 return modifier;
6054}

References GetAuraEffectsByType().

◆ GetMaxNegativeAuraModifierByMiscMask()

int32 Unit::GetMaxNegativeAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
5939{
5940 int32 modifier = 0;
5941
5942 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5943 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5944 {
5945 if ((*i)->GetMiscValue()& misc_mask && (*i)->GetAmount() < modifier)
5946 modifier = (*i)->GetAmount();
5947 }
5948
5949 return modifier;
5950}

References GetAuraEffectsByType().

Referenced by SpellTakenCritChance().

◆ GetMaxNegativeAuraModifierByMiscValue()

int32 Unit::GetMaxNegativeAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
5991{
5992 int32 modifier = 0;
5993
5994 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5995 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5996 {
5997 if ((*i)->GetMiscValue() == misc_value && (*i)->GetAmount() < modifier)
5998 modifier = (*i)->GetAmount();
5999 }
6000
6001 return modifier;
6002}

References GetAuraEffectsByType().

Referenced by MagicSpellHitResult(), and ModSpellDuration().

◆ GetMaxPositiveAuraModifier()

int32 Unit::GetMaxPositiveAuraModifier ( AuraType  auratype)
5874{
5875 int32 modifier = 0;
5876
5877 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5878 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5879 {
5880 if ((*i)->GetAmount() > modifier)
5881 modifier = (*i)->GetAmount();
5882 }
5883
5884 return modifier;
5885}

References GetAuraEffectsByType().

Referenced by CalculateSpellAmount(), AuraEffect::HandlePeriodicHealAurasTick(), Player::RewardHonor(), SpellHealingBonusTaken(), and UpdateSpeed().

◆ GetMaxPositiveAuraModifierByAffectMask()

int32 Unit::GetMaxPositiveAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6029{
6030 int32 modifier = 0;
6031
6032 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6033 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6034 {
6035 if ((*i)->IsAffectedOnSpell(affectedSpell) && (*i)->GetAmount() > modifier)
6036 modifier = (*i)->GetAmount();
6037 }
6038
6039 return modifier;
6040}

References GetAuraEffectsByType().

◆ GetMaxPositiveAuraModifierByMiscMask()

int32 Unit::GetMaxPositiveAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask,
const AuraEffect except = nullptr 
) const
5925{
5926 int32 modifier = 0;
5927
5928 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5929 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5930 {
5931 if (except != (*i) && (*i)->GetMiscValue()& misc_mask && (*i)->GetAmount() > modifier)
5932 modifier = (*i)->GetAmount();
5933 }
5934
5935 return modifier;
5936}

References GetAuraEffectsByType(), and AuraEffect::GetMiscValue().

Referenced by AuraEffect::HandleAuraModResistanceExclusive(), and SpellTakenCritChance().

◆ GetMaxPositiveAuraModifierByMiscValue()

int32 Unit::GetMaxPositiveAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
5977{
5978 int32 modifier = 0;
5979
5980 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5981 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5982 {
5983 if ((*i)->GetMiscValue() == misc_value && (*i)->GetAmount() > modifier)
5984 modifier = (*i)->GetAmount();
5985 }
5986
5987 return modifier;
5988}

References GetAuraEffectsByType().

Referenced by MagicSpellHitResult().

◆ GetMaxPower()

uint32 Unit::GetMaxPower ( Powers  power) const
inline
1476{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power); }
@ UNIT_FIELD_MAXPOWER1
Definition: UpdateFields.h:105

References Object::GetUInt32Value(), and UNIT_FIELD_MAXPOWER1.

Referenced by Player::_SaveStats(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), spell_gen_replenishment_aura::CalculateAmount(), spell_item_skull_of_impeding_doom::CalculateManaLeechAmount(), Spell::CheckItems(), Player::Create(), boss_shade_of_aran::DamageTaken(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerBurn(), Spell::EffectResurrect(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), GetPowerPct(), Player::GiveLevel(), HandleAuraProc(), Aura::HandleAuraSpecificMods(), HandleDummyAuraProc(), modify_commandscript::HandleModifyEnergyCommand(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_hun_ascpect_of_the_viper::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_kelthuzad_detonate_mana::spell_kelthuzad_detonate_mana_AuraScript::HandleScript(), spell_gen_pet_summoned::HandleScript(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), boss_curator::JustEngagedWith(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), ModifyPowerPct(), boss_shade_of_aran::OnPowerUpdate(), Acore::PowerPctOrderPred::operator()(), Player::outDebugValues(), spell_item_oracle_ablutions::PrepareSpellScript(), SmartScript::ProcessAction(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), spell_bronjahm_magic_bane::spell_bronjahm_magic_bane_SpellScript::RecalculateDamage(), Creature::Regenerate(), Player::Regenerate(), boss_curator::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetPower(), setPowerType(), Player::SummonPet(), boss_selin_fireheart::UpdateAI(), boss_moam::UpdateAI(), boss_faction_championsAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), Player::UpdateCharmedAI(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxSkillValueForLevel()

uint16 Unit::GetMaxSkillValueForLevel ( Unit const *  target = nullptr) const
inline
1561{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }
uint8 getLevelForTarget(WorldObject const *) const override
Definition: Unit.h:1433

References GetLevel(), and getLevelForTarget().

Referenced by Player::GetMaxSkillValueForLevel(), GetUnitCriticalChance(), GetWeaponSkillValue(), isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), and SpellTakenCritChance().

◆ GetMechanicResistChance()

int32 Unit::GetMechanicResistChance ( SpellInfo const *  spell)
3098{
3099 if (!spell)
3100 return 0;
3101 int32 resist_mech = 0;
3102 for (uint8 eff = 0; eff < MAX_SPELL_EFFECTS; ++eff)
3103 {
3104 if (!spell->Effects[eff].IsEffect())
3105 break;
3106 int32 effect_mech = spell->GetEffectMechanic(eff);
3107 if (effect_mech)
3108 {
3110 if (resist_mech < temp)
3111 resist_mech = temp;
3112 }
3113 }
3114 return resist_mech;
3115}
@ SPELL_AURA_MOD_MECHANIC_RESISTANCE
Definition: SpellAuraDefines.h:180
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:5952

References SpellInfo::Effects, SpellInfo::GetEffectMechanic(), GetTotalAuraModifierByMiscValue(), MAX_SPELL_EFFECTS, and SPELL_AURA_MOD_MECHANIC_RESISTANCE.

Referenced by MagicSpellHitResult(), and MeleeSpellHitResult().

◆ GetMeleeAttackPoint()

bool Unit::GetMeleeAttackPoint ( Unit attacker,
Position pos 
)
2640{
2641 if (!attacker)
2642 {
2643 return false;
2644 }
2645
2646 AttackerSet attackers = getAttackers();
2647
2648 if (attackers.size() <= 1) // if the attackers are not more than one
2649 {
2650 return false;
2651 }
2652
2653 float meleeReach = GetExactDist2d(attacker);
2654 if (meleeReach <= 0)
2655 {
2656 return false;
2657 }
2658
2659 float minAngle = 0;
2660 Unit *refUnit = nullptr;
2661 uint32 validAttackers = 0;
2662
2663 double attackerSize = attacker->GetCollisionRadius();
2664
2665 for (const auto& otherAttacker: attackers)
2666 {
2667 // if the otherAttacker is not valid, skip
2668 if (!otherAttacker || otherAttacker->GetGUID() == attacker->GetGUID() ||
2669 !otherAttacker->IsWithinMeleeRange(this) || otherAttacker->isMoving())
2670 {
2671 continue;
2672 }
2673
2674 float curretAngle = atan(attacker->GetExactDist2d(otherAttacker) / meleeReach);
2675 if (minAngle == 0 || curretAngle < minAngle)
2676 {
2677 minAngle = curretAngle;
2678 refUnit = otherAttacker;
2679 }
2680
2681 validAttackers++;
2682 }
2683
2684 if (!validAttackers || !refUnit)
2685 {
2686 return false;
2687 }
2688
2689 float contactDist = attackerSize + refUnit->GetCollisionRadius();
2690 float requiredAngle = atan(contactDist / meleeReach);
2691 float attackersAngle = atan(attacker->GetExactDist2d(refUnit) / meleeReach);
2692
2693 // in instance: the more attacker there are, the higher will be the tollerance
2694 // outside: creatures should not intersecate
2695 float angleTollerance = attacker->GetMap()->IsDungeon() ? requiredAngle - requiredAngle * tanh(validAttackers / 5.0f) : requiredAngle;
2696
2697 if (attackersAngle > angleTollerance)
2698 {
2699 return false;
2700 }
2701
2702 double angle = atan(contactDist / meleeReach);
2703
2704 float angularRadius = frand(0.1f, 0.3f) + angle;
2705 int8 direction = (urand(0, 1) ? -1 : 1);
2706 float currentAngle = GetAngle(refUnit);
2707 float absAngle = currentAngle + angularRadius * direction;
2708
2709 float x, y, z;
2710 float distance = meleeReach - GetObjectSize();
2711 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle);
2712
2713 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2714 {
2715 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle * -1); // try the other side
2716
2717 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2718 {
2719 return false;
2720 }
2721 }
2722
2723 pos.Relocate(x, y, z);
2724
2725 return true;
2726}
std::int8_t int8
Definition: Define.h:106
float frand(float min, float max)
Definition: Random.cpp:57
void GetNearPoint(WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
Definition: Object.cpp:2614
float GetExactDist2d(const float x, const float y) const
Definition: Position.h:166
float GetCollisionRadius() const override
this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by t...
Definition: Unit.cpp:21381
std::unordered_set< Unit * > AttackerSet
Definition: Unit.h:1304
AttackerSet const & getAttackers() const
Definition: Unit.h:1395
bool IsDungeon() const
Definition: Map.h:448

References frand(), Position::GetAngle(), getAttackers(), GetCollisionRadius(), Position::GetExactDist2d(), Object::GetGUID(), WorldObject::GetMap(), WorldObject::GetNearPoint(), WorldObject::GetObjectSize(), Map::IsDungeon(), Position::Relocate(), and urand().

Referenced by MotionMaster::MoveCircleTarget().

◆ GetMeleeCritChanceReduction()

float Unit::GetMeleeCritChanceReduction ( ) const
inline

◆ GetMeleeCritDamageReduction()

uint32 Unit::GetMeleeCritDamageReduction ( uint32  damage) const
inline
1598{ return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_MELEE, 2.2f, 33.0f, damage); }
uint32 GetCombatRatingDamageReduction(CombatRating cr, float rate, float cap, uint32 damage) const
Definition: Unit.cpp:19459

References CR_CRIT_TAKEN_MELEE, and GetCombatRatingDamageReduction().

Referenced by ApplyResilience(), and processDummyAuras().

◆ GetMeleeDamageReduction()

uint32 Unit::GetMeleeDamageReduction ( uint32  damage) const
inline

◆ GetMeleeDamageSchoolMask()

virtual SpellSchoolMask Unit::GetMeleeDamageSchoolMask ( WeaponAttackType  attackType = BASE_ATTACK,
uint8  damageIndex = 0 
) const
pure virtual

Implemented in Player, and Creature.

Referenced by CalculateMeleeDamage().

◆ GetMeleeHitRedirectTarget()

Unit * Unit::GetMeleeHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo = nullptr 
)
11052{
11054 for (AuraEffectList::const_iterator i = hitTriggerAuras.begin(); i != hitTriggerAuras.end(); ++i)
11055 {
11056 if (Unit* magnet = (*i)->GetBase()->GetCaster())
11057 if (_IsValidAttackTarget(magnet, spellInfo) && magnet->IsWithinLOSInMap(this)
11058 && (!spellInfo || (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11059 && spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK)))
11060 if (roll_chance_i((*i)->GetAmount()))
11061 {
11062 (*i)->GetBase()->DropCharge(AURA_REMOVE_BY_EXPIRE);
11063 return magnet;
11064 }
11065 }
11066 return victim;
11067}
bool roll_chance_i(int chance)
Definition: Random.h:59
@ SPELL_AURA_ADD_CASTER_HIT_TRIGGER
Definition: SpellAuraDefines.h:174

References _IsValidAttackTarget(), AURA_REMOVE_BY_EXPIRE, SpellInfo::CheckExplicitTarget(), SpellInfo::CheckTarget(), GetAuraEffectsByType(), roll_chance_i(), SPELL_AURA_ADD_CASTER_HIT_TRIGGER, and SPELL_CAST_OK.

Referenced by AttackerStateUpdate(), spell_dk_dancing_rune_weapon::HandleProc(), and Spell::SelectExplicitTargets().

◆ GetMeleeRange()

float Unit::GetMeleeRange ( Unit const *  target) const
699{
700 float range = GetCombatReach() + target->GetCombatReach() + 4.0f / 3.0f;
701 return std::max(range, NOMINAL_MELEE_RANGE);
702}
#define NOMINAL_MELEE_RANGE
Definition: ObjectDefines.h:48
float GetCombatReach() const override
Definition: Unit.h:1359

References GetCombatReach(), and NOMINAL_MELEE_RANGE.

Referenced by GetRandomContactPoint(), IsWithinMeleeRange(), and CreatureAI::MoveBackwardsChecks().

◆ GetMeleeReach()

float Unit::GetMeleeReach ( ) const
inline
1360{ float reach = m_floatValues[UNIT_FIELD_COMBATREACH]; return reach > MIN_MELEE_REACH ? reach : MIN_MELEE_REACH; }
#define MIN_MELEE_REACH
Definition: ObjectDefines.h:47

References Object::m_floatValues, MIN_MELEE_REACH, and UNIT_FIELD_COMBATREACH.

Referenced by boss_veknilash::JustEngagedWith(), and npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI().

◆ GetMinionGUID()

ObjectGuid Unit::GetMinionGUID ( ) const
inline
@ UNIT_FIELD_SUMMON
Definition: UpdateFields.h:87

References Object::GetGuidValue(), and UNIT_FIELD_SUMMON.

Referenced by GetFirstControlled(), GetFirstMinion(), and OutDebugInfo().

◆ GetModelForForm()

uint32 Unit::GetModelForForm ( ShapeshiftForm  form,
uint32  spellId 
) const
19466{
19467 // Hardcoded cases
19468 switch (spellId)
19469 {
19470 case 7090: // Bear form
19471 return 29414;
19472 case 35200: // Roc form
19473 return 4877;
19474 default:
19475 break;
19476 }
19477
19478 if (GetTypeId() == TYPEID_PLAYER)
19479 {
19480 switch (form)
19481 {
19482 case FORM_CAT:
19483 // Based on Hair color
19484 if (getRace() == RACE_NIGHTELF)
19485 {
19486 uint8 hairColor = GetByteValue(PLAYER_BYTES, 3);
19487 switch (hairColor)
19488 {
19489 case 7: // Violet
19490 case 8:
19491 return 29405;
19492 case 3: // Light Blue
19493 return 29406;
19494 case 0: // Green
19495 case 1: // Light Green
19496 case 2: // Dark Green
19497 return 29407;
19498 case 4: // White
19499 return 29408;
19500 default: // original - Dark Blue
19501 return 892;
19502 }
19503 }
19504 // Based on Skin color
19505 else if (getRace() == RACE_TAUREN)
19506 {
19507 uint8 skinColor = GetByteValue(PLAYER_BYTES, 0);
19508 // Male
19509 if (getGender() == GENDER_MALE)
19510 {
19511 switch (skinColor)
19512 {
19513 case 12: // White
19514 case 13:
19515 case 14:
19516 case 18: // Completly White
19517 return 29409;
19518 case 9: // Light Brown
19519 case 10:
19520 case 11:
19521 return 29410;
19522 case 6: // Brown
19523 case 7:
19524 case 8:
19525 return 29411;
19526 case 0: // Dark
19527 case 1:
19528 case 2:
19529 case 3: // Dark Grey
19530 case 4:
19531 case 5:
19532 return 29412;
19533 default: // original - Grey
19534 return 8571;
19535 }
19536 }
19537 // Female
19538 else switch (skinColor)
19539 {
19540 case 10: // White
19541 return 29409;
19542 case 6: // Light Brown
19543 case 7:
19544 return 29410;
19545 case 4: // Brown
19546 case 5:
19547 return 29411;
19548 case 0: // Dark
19549 case 1:
19550 case 2:
19551 case 3:
19552 return 29412;
19553 default: // original - Grey
19554 return 8571;
19555 }
19556 }
19558 return 892;
19559 else
19560 return 8571;
19561 case FORM_DIREBEAR:
19562 case FORM_BEAR:
19563 // Based on Hair color
19564 if (getRace() == RACE_NIGHTELF)
19565 {
19566 uint8 hairColor = GetByteValue(PLAYER_BYTES, 3);
19567 switch (hairColor)
19568 {
19569 case 0: // Green
19570 case 1: // Light Green
19571 case 2: // Dark Green
19572 return 29413; // 29415?
19573 case 6: // Dark Blue
19574 return 29414;
19575 case 4: // White
19576 return 29416;
19577 case 3: // Light Blue
19578 return 29417;
19579 default: // original - Violet
19580 return 2281;
19581 }
19582 }
19583 // Based on Skin color
19584 else if (getRace() == RACE_TAUREN)
19585 {
19586 uint8 skinColor = GetByteValue(PLAYER_BYTES, 0);
19587 // Male
19588 if (getGender() == GENDER_MALE)
19589 {
19590 switch (skinColor)
19591 {
19592 case 0: // Dark (Black)
19593 case 1:
19594 case 2:
19595 return 29418;
19596 case 3: // White
19597 case 4:
19598 case 5:
19599 case 12:
19600 case 13:
19601 case 14:
19602 return 29419;
19603 case 9: // Light Brown/Grey
19604 case 10:
19605 case 11:
19606 case 15:
19607 case 16:
19608 case 17:
19609 return 29420;
19610 case 18: // Completly White
19611 return 29421;
19612 default: // original - Brown
19613 return 2289;
19614 }
19615 }
19616 // Female
19617 else switch (skinColor)
19618 {
19619 case 0: // Dark (Black)
19620 case 1:
19621 return 29418;
19622 case 2: // White
19623 case 3:
19624 return 29419;
19625 case 6: // Light Brown/Grey
19626 case 7:
19627 case 8:
19628 case 9:
19629 return 29420;
19630 case 10: // Completly White
19631 return 29421;
19632 default: // original - Brown
19633 return 2289;
19634 }
19635 }
19637 return 2281;
19638 else
19639 return 2289;
19640 case FORM_FLIGHT:
19642 return 20857;
19643 return 20872;
19644 case FORM_FLIGHT_EPIC:
19646 return 21243;
19647 return 21244;
19648 default:
19649 break;
19650 }
19651 }
19652
19653 uint32 modelid = 0;
19654 SpellShapeshiftEntry const* formEntry = sSpellShapeshiftStore.LookupEntry(form);
19655 if (formEntry && formEntry->modelID_A)
19656 {
19657 // Take the alliance modelid as default
19658 if (GetTypeId() != TYPEID_PLAYER)
19659 return formEntry->modelID_A;
19660 else
19661 {
19663 modelid = formEntry->modelID_A;
19664 else
19665 modelid = formEntry->modelID_H;
19666
19667 // If the player is horde but there are no values for the horde modelid - take the alliance modelid
19668 if (!modelid && Player::TeamIdForRace(getRace()) == TEAM_HORDE)
19669 modelid = formEntry->modelID_A;
19670 }
19671 }
19672
19673 return modelid;
19674}
@ PLAYER_BYTES
Definition: UpdateFields.h:181
@ FORM_DIREBEAR
Definition: Unit.h:98
@ FORM_FLIGHT_EPIC
Definition: Unit.h:115
@ FORM_CAT
Definition: Unit.h:91
@ FORM_FLIGHT
Definition: Unit.h:117
@ FORM_BEAR
Definition: Unit.h:95
@ GENDER_MALE
Definition: SharedDefines.h:61
@ RACE_NIGHTELF
Definition: SharedDefines.h:74
@ RACE_TAUREN
Definition: SharedDefines.h:76
@ TEAM_ALLIANCE
Definition: SharedDefines.h:760
@ TEAM_HORDE
Definition: SharedDefines.h:761
static TeamId TeamIdForRace(uint8 race)
Definition: Player.cpp:5745
uint8 getGender() const
Definition: Unit.h:1440
uint8 getRace(bool original=false) const
Definition: Unit.cpp:21287
uint32 modelID_H
Definition: DBCStructure.h:1827
uint32 modelID_A
Definition: DBCStructure.h:1826

References FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_FLIGHT, FORM_FLIGHT_EPIC, GENDER_MALE, Object::GetByteValue(), getGender(), getRace(), Object::GetTypeId(), SpellShapeshiftEntry::modelID_A, SpellShapeshiftEntry::modelID_H, PLAYER_BYTES, RACE_NIGHTELF, RACE_TAUREN, sSpellShapeshiftStore, TEAM_ALLIANCE, TEAM_HORDE, Player::TeamIdForRace(), and TYPEID_PLAYER.

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), and RestoreDisplayId().

◆ GetModelForTotem()

uint32 Unit::GetModelForTotem ( PlayerTotemType  totemType)
19677{
19678 switch (getRace())
19679 {
19680 case RACE_ORC:
19681 {
19682 switch (totemType)
19683 {
19684 case SUMMON_TYPE_TOTEM_FIRE: // fire
19685 return 30758;
19686 case SUMMON_TYPE_TOTEM_EARTH: // earth
19687 return 30757;
19688 case SUMMON_TYPE_TOTEM_WATER: // water
19689 return 30759;
19690 case SUMMON_TYPE_TOTEM_AIR: // air
19691 return 30756;
19692 }
19693 break;
19694 }
19695 case RACE_DWARF:
19696 {
19697 switch (totemType)
19698 {
19699 case SUMMON_TYPE_TOTEM_FIRE: // fire
19700 return 30754;
19701 case SUMMON_TYPE_TOTEM_EARTH: // earth
19702 return 30753;
19703 case SUMMON_TYPE_TOTEM_WATER: // water
19704 return 30755;
19705 case SUMMON_TYPE_TOTEM_AIR: // air
19706 return 30736;
19707 }
19708 break;
19709 }
19710 case RACE_TROLL:
19711 {
19712 switch (totemType)
19713 {
19714 case SUMMON_TYPE_TOTEM_FIRE: // fire
19715 return 30762;
19716 case SUMMON_TYPE_TOTEM_EARTH: // earth
19717 return 30761;
19718 case SUMMON_TYPE_TOTEM_WATER: // water
19719 return 30763;
19720 case SUMMON_TYPE_TOTEM_AIR: // air
19721 return 30760;
19722 }
19723 break;
19724 }
19725 case RACE_TAUREN:
19726 {
19727 switch (totemType)
19728 {
19729 case SUMMON_TYPE_TOTEM_FIRE: // fire
19730 return 4589;
19731 case SUMMON_TYPE_TOTEM_EARTH: // earth
19732 return 4588;
19733 case SUMMON_TYPE_TOTEM_WATER: // water
19734 return 4587;
19735 case SUMMON_TYPE_TOTEM_AIR: // air
19736 return 4590;
19737 }
19738 break;
19739 }
19740 case RACE_DRAENEI:
19741 {
19742 switch (totemType)
19743 {
19744 case SUMMON_TYPE_TOTEM_FIRE: // fire
19745 return 19074;
19746 case SUMMON_TYPE_TOTEM_EARTH: // earth
19747 return 19073;
19748 case SUMMON_TYPE_TOTEM_WATER: // water
19749 return 19075;
19750 case SUMMON_TYPE_TOTEM_AIR: // air
19751 return 19071;
19752 }
19753 break;
19754 }
19755 default: // One standard for other races.
19756 {
19757 switch (totemType)
19758 {
19759 case SUMMON_TYPE_TOTEM_FIRE: // fire
19760 return 4589;
19761 case SUMMON_TYPE_TOTEM_EARTH: // earth
19762 return 4588;
19763 case SUMMON_TYPE_TOTEM_WATER: // water
19764 return 4587;
19765 case SUMMON_TYPE_TOTEM_AIR: // air
19766 return 4590;
19767 }
19768 break;
19769 }
19770 }
19771 return 0;
19772}
@ SUMMON_TYPE_TOTEM_EARTH
Definition: Unit.h:1234
@ SUMMON_TYPE_TOTEM_WATER
Definition: Unit.h:1235
@ SUMMON_TYPE_TOTEM_FIRE
Definition: Unit.h:1233
@ SUMMON_TYPE_TOTEM_AIR
Definition: Unit.h:1236
@ RACE_TROLL
Definition: SharedDefines.h:78
@ RACE_ORC
Definition: SharedDefines.h:72
@ RACE_DRAENEI
Definition: SharedDefines.h:81
@ RACE_DWARF
Definition: SharedDefines.h:73

References getRace(), RACE_DRAENEI, RACE_DWARF, RACE_ORC, RACE_TAUREN, RACE_TROLL, SUMMON_TYPE_TOTEM_AIR, SUMMON_TYPE_TOTEM_EARTH, SUMMON_TYPE_TOTEM_FIRE, and SUMMON_TYPE_TOTEM_WATER.

◆ GetModifierValue()

float Unit::GetModifierValue ( UnitMods  unitMod,
UnitModifierType  modifierType 
) const
15275{
15276 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
15277 {
15278 LOG_ERROR("entities.unit", "attempt to access non-existing modifier value from UnitMods!");
15279 return 0.0f;
15280 }
15281
15282 if (modifierType == TOTAL_PCT && m_auraModifiersGroup[unitMod][modifierType] <= 0.0f)
15283 return 0.0f;
15284
15285 return m_auraModifiersGroup[unitMod][modifierType];
15286}
@ MODIFIER_TYPE_END
Definition: Unit.h:249

References LOG_ERROR, m_auraModifiersGroup, MODIFIER_TYPE_END, TOTAL_PCT, and UNIT_MOD_END.

Referenced by Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), Spell::EffectWeaponDmg(), Guardian::UpdateArmor(), Player::UpdateArmor(), Creature::UpdateAttackPowerAndDamage(), Guardian::UpdateAttackPowerAndDamage(), Player::UpdateAttackPowerAndDamage(), Guardian::UpdateDamagePhysical(), Guardian::UpdateMaxHealth(), Player::UpdateMaxHealth(), Guardian::UpdateMaxPower(), Player::UpdateMaxPower(), and Player::UpdateResistances().

◆ GetMotionMaster() [1/2]

MotionMaster * Unit::GetMotionMaster ( )
inline
2276{ return i_motionMaster; }

References i_motionMaster.

Referenced by _ExitVehicle(), HomeMovementGenerator< Creature >::_setTargetLocation(), PetAI::_stopAttack(), BattlegroundAV::AddAVCreature(), npc_mograine::npc_mograineAI::AshbringerEvent(), UnitAI::AttackStart(), FollowerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::boss_malygosAI::AttackStart(), npc_nexus_lord::npc_nexus_lordAI::AttackStart(), boss_illidan_stormrage::boss_illidan_stormrageAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), boss_alyson_antille::boss_alyson_antilleAI::AttackStart(), boss_gazakrothAI::AttackStart(), boss_slither::boss_slitherAI::AttackStart(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::AttackStart(), boss_magus_telestra::boss_magus_telestraAI::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_high_nethermancer_zerevor::boss_high_nethermancer_zerevorAI::AttackStart(), boss_lady_malande::boss_lady_malandeAI::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), UnitAI::AttackStartCaster(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CleanupBeforeRemoveFromMap(), boss_isalien::DamageTaken(), boss_julianne::DamageTaken(), npc_mograine::npc_mograineAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_leotheras_the_blind::DemonTime(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_chained_spirit::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_saurfang_event::npc_saurfang_eventAI::DoAction(), boss_professor_putricide::boss_professor_putricideAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), npc_argent_captainAI::DoAction(), npc_icc_spire_frostwyrm::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_living_mojo::npc_living_mojoAI::DoAction(), npc_power_spark::npc_power_sparkAI::DoAction(), npc_hover_disk::npc_hover_diskAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), boss_skadi::boss_skadiAI::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), boss_ambassador_hellmaw::DoAction(), npc_akama_illidan::npc_akama_illidanAI::DoAction(), boss_nazan::DoAction(), boss_ghazan::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), PetAI::DoAttack(), Creature::DoFleeToGetAssistance(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoStartMovement(), ScriptedAI::DoStartNoMovement(), go_commandscript::DoTeleport(), Spell::EffectCharge(), Spell::EffectChargeDest(), Spell::EffectDistract(), Spell::EffectJump(), Spell::EffectJumpDest(), Spell::EffectPullTowards(), Spell::EffectSummonType(), boss_jindo::EnterEvadeMode(), boss_nightbane::EnterEvadeMode(), npc_black_morass_summoned_add::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), npc_argent_captainAI::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), npc_burning_spirit::npc_burning_spiritAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_mrfloppy::npc_mrfloppyAI::EnterEvadeMode(), npc_pet_gen_argent_pony_bridle::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), hyjalAI::EnterEvadeMode(), boss_halazzi::boss_halazziAI::EnterPhase(), boss_zuljin::boss_zuljinAI::EnterPhase(), VehicleDespawnEvent::Execute(), RestoreAttack::Execute(), OrcMoveEvent::Execute(), NpcRunToHome::Execute(), UtherBatteredHiltEvent::Execute(), SlaveRunEvent::Execute(), DelayedMovementEvent::Execute(), DaranavanMoveEvent::Execute(), FrostwyrmLandEvent::Execute(), SACActivateEvent::Execute(), AssistanceMovementGenerator::Finalize(), npc_dark_iron_guzzler::FindNextKeg(), npc_hallows_end_soh::FinishEvent(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::FinishQuest(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::FlyAway(), Creature::FocusTarget(), CreatureGroup::FormationReset(), boss_volkhan::boss_volkhanAI::GoToAnvil(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_apothecary_lingering_fumes::HandleAfterCast(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), misc_commandscript::HandleAppearCommand(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), misc_commandscript::HandleComeToMeCommand(), spell_q12589_shoot_rjr::spell_q12589_shoot_rjr_SpellScript::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_q11919_q11940_drake_hunt::spell_q11919_q11940_drake_hunt_AuraScript::HandleEffectRemove(), spell_icc_geist_alarm::spell_icc_geist_alarm_SpellScript::HandleEvent(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoTicketCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), spell_item_toxic_wasteling::HandleJump(), AuraEffect::HandleModPossessPet(), misc_commandscript::HandleMovegensCommand(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), npc_commandscript::HandleNpcFollowCommand(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), npc_commandscript::HandleNpcUnFollowCommand(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePlayerLoginFromDB(), spell_entropius_black_hole_effect::spell_entropius_black_hole_effect_SpellScript::HandlePull(), spell_boss_magus_telestra_gravity_well::spell_boss_magus_telestra_gravity_well_SpellScript::HandlePull(), PetAI::HandleReturnMovement(), spell_the_lich_king_valkyr_target_search::spell_the_lich_king_valkyr_target_search_SpellScript::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_gen_ayamiss_swarmer_loop::HandleScript(), WorldSession::HandleSetRaidDifficultyOpcode(), spell_sindragosa_icy_grip_jump::spell_sindragosa_icy_grip_jump_SpellScript::HandleSpecial(), spell_item_draenic_pale_ale::HandleSummon(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), wp_commandscript::HandleWpLoadCommand(), wp_commandscript::HandleWpUnLoadCommand(), boss_captain_skarloc::InitializeAI(), boss_lieutenant_drake::InitializeAI(), boss_glob_of_viscidus::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), boss_eck::boss_eckAI::InitializeAI(), npc_preparations_for_war_vehicle::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), npc_pet_dk_dancing_rune_weapon::npc_pet_dk_dancing_rune_weaponAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), Totem::InitSummon(), boss_grand_warlock_nethekurse::IntroRP(), Creature::IsFreeToMove(), IsMutualChase(), boss_gahzranka::boss_gahzrankaAI::IsSummonedBy(), boss_aeonus::IsSummonedBy(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::IsSummonedBy(), npc_burning_spirit::npc_burning_spiritAI::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::IsSummonedBy(), npc_spirit_shade::npc_spirit_shadeAI::IsSummonedBy(), JumpTo(), npc_frost_wyrm::npc_frost_wyrmAI::JustDied(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), npc_gargoyle::npc_gargoyleAI::JustDied(), boss_ayamiss::JustDied(), npc_cyclone::JustEngagedWith(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_grandmaster_vorpil::JustEngagedWith(), boss_warlord_kalithresh::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_nazan::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_ayamiss::JustEngagedWith(), boss_jeklik::JustEngagedWith(), SmartAI::JustReachedHome(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::JustReachedHome(), boss_ghazan::JustReachedHome(), boss_grand_warlock_nethekurse::JustReachedHome(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), boss_auriaya::boss_auriayaAI::JustSummoned(), npc_frosthound::npc_frosthoundAI::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), boss_mekgineer_steamrigger::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_xevozz::boss_xevozzAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::JustSummoned(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::JustSummoned(), boss_vexallus::JustSummoned(), npc_kalecgos_kj::npc_kalecgos_kjAI::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_hadronox::boss_hadronoxAI::JustSummoned(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::JustSummoned(), boss_sartharion::boss_sartharionAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_akama_shade::JustSummoned(), npc_creature_generator_akama::JustSummoned(), boss_supremus::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), boss_mennu_the_betrayer::JustSummoned(), boss_kaelthas::boss_kaelthasAI::JustSummoned(), boss_mechano_lord_capacitus::JustSummoned(), npc_rinji::npc_rinjiAI::JustSummoned(), boss_archimonde::boss_archimondeAI::JustSummoned(), npc_maghar_captive::npc_maghar_captiveAI::JustSummoned(), boss_ayamiss::JustSummoned(), Player::KillPlayer(), KnockbackFrom(), spell_svalna_revive_champion::spell_svalna_revive_champion_SpellScript::Land(), CreatureGroup::LeaderMoveTo(), Player::LeaveBattleground(), Creature::Motion_Initialize(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), PetAI::MovementInform(), boss_ebonroc::boss_ebonrocAI::MovementInform(), boss_bug_trio::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_four_horsemen::boss_four_horsemenAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_cameron::MoveTheChildren(), boss_four_horsemen::boss_four_horsemenAI::MoveToCorner(), npc_concentrated_ball::npc_concentrated_ballAI::MoveToNextPoint(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), NearTeleportTo(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_collapsing_star::npc_collapsing_starAI::npc_collapsing_starAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_omen::npc_omenAI::npc_omenAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::npc_pos_after_first_bossAI(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vaporsAI::npc_ulduar_saronite_vaporsAI(), spell_halion_twilight_phasing::spell_halion_twilight_phasing_AuraScript::OnApply(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_kernobee::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), spell_chapter5_light_of_dawn_aura::spell_chapter5_light_of_dawn_aura_AuraScript::OnRemove(), spell_halion_twilight_phasing::spell_halion_twilight_phasing_AuraScript::OnRemove(), SplineHandler::operator()(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_oculus_drake::npc_oculus_drakeAI::PassengerBoarded(), npc_vics_flying_machine::npc_vics_flying_machineAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), boss_ambassador_hellmaw::PathEndReached(), boss_nefarian::PathEndReached(), PauseMovement(), SmartAI::PausePath(), PetSpellFail(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::PickNewLocation(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), propagateSpeedChange(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), RemoveCharmedBy(), boss_the_beast::boss_thebeastAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_kalec::boss_kalecAI::Reset(), npc_janalai_hatchling::npc_janalai_hatchlingAI::Reset(), boss_arlokk::boss_arlokkAI::Reset(), npc_zulian_prowler::npc_zulian_prowlerAI::Reset(), npc_batrider::Reset(), npc_brew_bubble::Reset(), boss_ayamiss::Reset(), boss_bug_trio::Reset(), boss_jedoga_shadowseeker::Reset(), npc_kinetic_bomb::npc_kinetic_bombAI::Reset(), npc_assembly_lightning::npc_assembly_lightningAI::Reset(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::Reset(), npc_xt002_boombot::npc_xt002_boombotAI::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_released_offspring_harkoa::npc_released_offspring_harkoaAI::Reset(), npc_voidtraveler::Reset(), boss_lady_vashj::Reset(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_infernal_attacker::npc_infernal_attackerAI::Reset(), npc_pet_gen_gnomish_flame_turret::Reset(), Creature::Respawn(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), ResumeMovement(), SmartAI::ResumePath(), Resurrect(), SmartAI::ReturnToLastOOCPos(), npc_escortAI::ReturnToLastPoint(), boss_magtheridon::ScheduleCombatEvents(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), boss_laj::ScheduleTasks(), boss_selin_fireheart::SelectNearestCrystal(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), WorldSession::SendDoFlight(), boss_sartharion::boss_sartharionAI::SendLavaWaves(), SetCharmedBy(), SmartAI::SetCombatMove(), SetConfused(), boss_grand_warlock_nethekurse::SetData(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::SetData(), gunship_npc_AI::SetData(), npc_enslaved_proto_drake::npc_enslaved_proto_drakeAI::SetData(), boss_the_beast::boss_thebeastAI::SetData(), npc_eastvale_peasent::SetData(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::SetData(), setDeathState(), Creature::setDeathState(), SetFeared(), SmartAI::SetFollow(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), SmartAI::SetForcedCombatMove(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::SetGUID(), SetInCombatState(), Player::SetMover(), SetSpeed(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_akama_illidan::npc_akama_illidanAI::sGossipSelect(), boss_thorim::boss_thorimAI::SpawnArenaNPCs(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_thrall_bfu::npc_thrall_bfuAI::SpawnWave(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::SpellHit(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::SpellHit(), npc_saurfang_event::npc_saurfang_eventAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_death_knight_initiate::npc_death_knight_initiateAI::SpellHit(), npc_crusade_persuaded::npc_crusade_persuadedAI::SpellHit(), npc_forest_frog::npc_forest_frogAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), npc_pet_gen_fetch_ball::SpellHitTarget(), boss_ionar::boss_ionarAI::Split(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_escortAI::Start(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), FollowerAI::StartFollow(), WaypointMovementGenerator< Creature >::StartMove(), npc_stillpine_capitive::npc_stillpine_capitiveAI::StartMoving(), SmartAI::StartPath(), SmartAI::StopFollow(), SmartAI::StopPath(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_vazruden_the_herald::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), Spell::SummonGuardian(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::SummonNextWave(), boss_nightbane::TakeOff(), Player::TeleportTo(), CreatureAI::TriggerAlert(), Pet::Update(), Update(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_gyth::boss_gythAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_nightbane::UpdateAI(), boss_felblood_kaelthas::UpdateAI(), boss_selin_fireheart::UpdateAI(), npc_eye_of_acherus::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_kalec::boss_kalecAI::UpdateAI(), npc_singularity::npc_singularityAI::UpdateAI(), npc_cameron::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_grand_magister_rommath::npc_grand_magister_rommathAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_akilzon_eagle::npc_akilzon_eagleAI::UpdateAI(), boss_halazzi::boss_halazziAI::UpdateAI(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::UpdateAI(), boss_janalai::boss_janalaiAI::UpdateAI(), npc_janalai_hatcher::npc_janalai_hatcherAI::UpdateAI(), npc_forest_frog::npc_forest_frogAI::UpdateAI(), npc_harrison_jones::npc_harrison_jonesAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_elder_kekek::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_doomfire_targetting::npc_doomfire_targettingAI::UpdateAI(), boss_archimonde::boss_archimondeAI::UpdateAI(), npc_giant_infernal::npc_giant_infernalAI::UpdateAI(), npc_frost_wyrm::npc_frost_wyrmAI::UpdateAI(), npc_gargoyle::npc_gargoyleAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), npc_twilight_volunteer::UpdateAI(), npc_taldaram_flamesphere::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::UpdateAI(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_emergency_fire_bot::npc_ulduar_emergency_fire_botAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_preparations_for_war_vehicle::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_minigob_manabonk::npc_minigob_manabonkAI::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_wintergarde_gryphon::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_venture_co_straggler::npc_venture_co_stragglerAI::UpdateAI(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), boss_shade_of_akama::UpdateAI(), npc_akama_shade::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), boss_alar::boss_alarAI::UpdateAI(), boss_kaelthas::boss_kaelthasAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_enslaved_netherwing_drake::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_demonic_vapor::npc_demonic_vaporAI::UpdateAI(), npc_batrider::UpdateAI(), npc_concentrated_ball::npc_concentrated_ballAI::UpdateAI(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::UpdateAI(), npc_xt002_boombot::npc_xt002_boombotAI::UpdateAI(), Player::UpdateCharmedAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_emily::npc_emilyAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ GetMotionMaster() [2/2]

const MotionMaster * Unit::GetMotionMaster ( ) const
inline
2277{ return i_motionMaster; }

References i_motionMaster.

◆ GetMountID()

◆ GetNativeDisplayId()

◆ GetNativeObjectScale()

virtual float Unit::GetNativeObjectScale ( ) const
inlinevirtual

Reimplemented in Creature, and Pet.

2180{ return 1.0f; }

Referenced by RecalculateObjectScale().

◆ GetNegStat()

float Unit::GetNegStat ( Stats  stat) const
inline
2058{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_NEGSTAT0.

◆ GetNextRandomRaidMemberOrPet()

Unit * Unit::GetNextRandomRaidMemberOrPet ( float  radius)
11109{
11110 Player* player = nullptr;
11111 if (GetTypeId() == TYPEID_PLAYER)
11112 player = ToPlayer();
11113 // Should we enable this also for charmed units?
11114 else if (GetTypeId() == TYPEID_UNIT && IsPet())
11115 player = GetOwner()->ToPlayer();
11116
11117 if (!player)
11118 return nullptr;
11119 Group* group = player->GetGroup();
11120 // When there is no group check pet presence
11121 if (!group)
11122 {
11123 // We are pet now, return owner
11124 if (player != this)
11125 return IsWithinDistInMap(player, radius) ? player : nullptr;
11126 Unit* pet = GetGuardianPet();
11127 // No pet, no group, nothing to return
11128 if (!pet)
11129 return nullptr;
11130 // We are owner now, return pet
11131 return IsWithinDistInMap(pet, radius) ? pet : nullptr;
11132 }
11133
11134 std::vector<Unit*> nearMembers;
11135 // reserve place for players and pets because resizing vector every unit push is unefficient (vector is reallocated then)
11136 nearMembers.reserve(group->GetMembersCount() * 2);
11137
11138 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
11139 if (Player* Target = itr->GetSource())
11140 {
11141 if (Target != this && !IsWithinDistInMap(Target, radius))
11142 continue;
11143
11144 // IsHostileTo check duel and controlled by enemy
11145 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
11146 nearMembers.push_back(Target);
11147
11148 // Push player's pet to vector
11149 if (Unit* pet = Target->GetGuardianPet())
11150 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
11151 nearMembers.push_back(pet);
11152 }
11153
11154 if (nearMembers.empty())
11155 return nullptr;
11156
11157 uint32 randTarget = urand(0, nearMembers.size() - 1);
11158 return nearMembers[randTarget];
11159}
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition: Object.cpp:1321
Group * GetGroup()
Definition: Player.h:2431
Guardian * GetGuardianPet() const
Definition: Unit.cpp:10650
Definition: Group.h:169
uint32 GetMembersCount() const
Definition: Group.h:245
GroupReference * GetFirstMember()
Definition: Group.h:243
Definition: GroupReference.h:27
GroupReference * next()
Definition: GroupReference.h:36

References Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), Group::GetMembersCount(), GetOwner(), Object::GetTypeId(), IsHostileTo(), IsPet(), WorldObject::IsWithinDistInMap(), GroupReference::next(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, and urand().

Referenced by HandleAuraRaidProcFromCharge(), and AuraEffect::HandleRaidProcFromChargeAuraProc().

◆ GetNpcFlags()

◆ GetOldFactionId()

uint32 Unit::GetOldFactionId ( ) const
inline
2478{ return _oldFactionId; }

References _oldFactionId.

Referenced by npc_chesspiece::OnCharmed().

◆ GetOwnedAura()

Aura * Unit::GetOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
Aura except = nullptr 
) const
4707{
4708 AuraMapBounds range = m_ownedAuras.equal_range(spellId);
4709 for (AuraMap::const_iterator itr = range.first; itr != range.second; ++itr)
4710 {
4711 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask)
4712 && (!casterGUID || itr->second->GetCasterGUID() == casterGUID)
4713 && (!itemCasterGUID || itr->second->GetCastItemGUID() == itemCasterGUID)
4714 && (!except || except != itr->second))
4715 {
4716 return itr->second;
4717 }
4718 }
4719 return nullptr;
4720}
std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
Definition: Unit.h:1308

References m_ownedAuras.

Referenced by _TryStackingOrRefreshingExistingAura().

◆ GetOwnedAuras() [1/2]

◆ GetOwnedAuras() [2/2]

AuraMap const & Unit::GetOwnedAuras ( ) const
inline
1929{ return m_ownedAuras; }

References m_ownedAuras.

◆ GetOwner()

Unit * Unit::GetOwner ( ) const
10600{
10601 if (ObjectGuid ownerGUID = GetOwnerGUID())
10602 return ObjectAccessor::GetUnit(*this, ownerGUID);
10603
10604 return nullptr;
10605}

References GetOwnerGUID(), and ObjectAccessor::GetUnit().

Referenced by _ExitVehicle(), Acore::AnyAoETargetUnitInObjectRangeCheck::AnyAoETargetUnitInObjectRangeCheck(), ApplyDiminishingToDuration(), ApplyResilience(), TotemAI::AttackStart(), spell_dk_anti_magic_zone::CalculateAmount(), Creature::CanStartAttack(), spell_dk_blood_gorged::CheckProc(), spell_pri_mana_leech::CheckProc(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), npc_calvin_montague::npc_calvin_montagueAI::DamageTaken(), DealHeal(), HostileRefMgr::deleteReferences(), npc_spring_rabbit::npc_spring_rabbitAI::DoAction(), Spell::DoAllEffectOnLaunchTarget(), Spell::DoAllEffectOnTarget(), PetAI::DoAttack(), Spell::EffectDispel(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), GetCharmerOrOwner(), GetCombatRatingReduction(), GetNextRandomRaidMemberOrPet(), GetReactionTo(), GetSpellModOwner(), spell_warl_seduction::HandleAuraApply(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_sha_healing_stream_totem::HandleDummy(), spell_q12277_wintergarde_mine_explosion::HandleDummy(), spell_sha_mana_tide_totem::HandleDummy(), HandleDummyAuraProc(), spell_mount_check::spell_mount_check_AuraScript::HandleEffectPeriodic(), spell_gen_gryphon_wyvern_mount_check::HandleEffectPeriodic(), spell_ioc_bomb_blast_criteria::spell_ioc_bomb_blast_criteria_SpellScript::HandleGameObjectDamage(), modify_commandscript::HandleModifyTalentCommand(), WorldSession::HandlePetActionHelper(), HandleProcTriggerSpell(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), npc_pet_dk_dancing_rune_weapon::npc_pet_dk_dancing_rune_weaponAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), IsAlwaysVisibleFor(), IsPetAura(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::JustDied(), Kill(), MagicSpellHitResult(), MeleeDamageBonusDone(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_khunok_the_behemoth::npc_khunok_the_behemothAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_hun_aspect_of_the_beast::OnPetApply(), Acore::MostHPMissingGroupInRange::operator()(), PetSpellFail(), RemoveFromWorld(), npc_target_dummy::npc_target_dummyAI::Reset(), npc_spring_rabbit::npc_spring_rabbitAI::Reset(), RestoreFaction(), Creature::SelectVictim(), SendPetActionFeedback(), SendPetAIReaction(), SendPetTalk(), SetHealth(), SetMaxHealth(), SetMaxPower(), SetPower(), setPowerType(), SetStunned(), SpellDamageBonusDone(), SpellHealingBonusDone(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and UpdateAuraForGroup().

◆ GetOwnerGUID()

ObjectGuid Unit::GetOwnerGUID ( ) const
inline
@ UNIT_FIELD_SUMMONEDBY
Definition: UpdateFields.h:90

References Object::GetGuidValue(), and UNIT_FIELD_SUMMONEDBY.

Referenced by Pet::AddToWorld(), npc_living_mojo::npc_living_mojoAI::AttackStart(), BuildValuesUpdate(), PetAI::CanAttack(), CanFreeMove(), CanHaveThreatList(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), DealDamage(), Spell::DoAllEffectOnTarget(), FollowMovementGenerator< T >::DoUpdate(), GetCharmerOrOwnerGUID(), GetOwner(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModInvisibilityDetect(), AuraEffect::HandleModStealth(), AuraEffect::HandleModStealthDetect(), AuraEffect::HandleModStealthLevel(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetRename(), HandleSpellClick(), Creature::HasMechanicTemplateImmunity(), Creature::IsDungeonBoss(), Creature::IsImmuneToKnockback(), isInAccessiblePlaceFor(), Kill(), Creature::LoadSpellTemplateImmunity(), Condition::Meets(), instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_venomhide_hatchling::OnGossipHello(), Acore::MostHPMissingGroupInRange::operator()(), PlayerOrPetCheck::operator()(), OutDebugInfo(), PetAI::ReceiveEmote(), Creature::Regenerate(), RemoveAllControlled(), RemoveEvadeAuras(), Pet::SavePetToDB(), SetMinion(), SetOwnerGUID(), SpellPctDamageModsDone(), Map::SummonCreature(), NPCStaveQuestAI::UnitIsUnfair(), Creature::Update(), and npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI().

◆ GetPartyMembers()

void Unit::GetPartyMembers ( std::list< Unit * > &  units)
19084{
19085 Unit* owner = GetCharmerOrOwnerOrSelf();
19086 Group* group = nullptr;
19087 if (owner->GetTypeId() == TYPEID_PLAYER)
19088 group = owner->ToPlayer()->GetGroup();
19089
19090 if (group)
19091 {
19092 uint8 subgroup = owner->ToPlayer()->GetSubGroup();
19093
19094 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
19095 {
19096 Player* Target = itr->GetSource();
19097
19098 // IsHostileTo check duel and controlled by enemy
19099 if (Target && Target->IsInMap(owner) && Target->GetSubGroup() == subgroup && !IsHostileTo(Target))
19100 {
19101 if (Target->IsAlive())
19102 TagUnitMap.push_back(Target);
19103
19104 for (Unit::ControlSet::iterator iterator = Target->m_Controlled.begin(); iterator != Target->m_Controlled.end(); ++iterator)
19105 {
19106 if (Unit* pet = *iterator)
19107 if (pet->IsGuardian() && pet->IsAlive())
19108 TagUnitMap.push_back(pet);
19109 }
19110 }
19111 }
19112 }
19113 else
19114 {
19115 if (owner->IsAlive())
19116 TagUnitMap.push_back(owner);
19117
19118 for (Unit::ControlSet::iterator itr = owner->m_Controlled.begin(); itr != owner->m_Controlled.end(); ++itr)
19119 {
19120 if (Unit* pet = *itr)
19121 if (pet->IsGuardian() && pet->IsAlive())
19122 TagUnitMap.push_back(pet);
19123 }
19124 }
19125}
uint8 GetSubGroup() const
Definition: Player.h:2435

References GetCharmerOrOwnerOrSelf(), Group::GetFirstMember(), Player::GetGroup(), Player::GetSubGroup(), Object::GetTypeId(), IsAlive(), IsHostileTo(), WorldObject::IsInMap(), m_Controlled, GroupReference::next(), Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by spell_warr_improved_spell_reflection_trigger_aura::HandleRemove().

◆ GetPetGUID()

◆ GetPhaseByAuras()

uint32 Unit::GetPhaseByAuras ( ) const
19303{
19304 uint32 currentPhase = 0;
19306 if (!phases.empty())
19307 for (AuraEffectList::const_iterator itr = phases.begin(); itr != phases.end(); ++itr)
19308 currentPhase |= (*itr)->GetMiscValue();
19309
19310 return currentPhase;
19311}
@ SPELL_AURA_PHASE
Definition: SpellAuraDefines.h:324

References GetAuraEffectsByType(), and SPELL_AURA_PHASE.

Referenced by Player::GetPhaseMaskForSpawn(), AuraEffect::HandlePhase(), and Player::SetGameMaster().

◆ GetPosStat()

float Unit::GetPosStat ( Stats  stat) const
inline
2057{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_POSSTAT0.

◆ GetPower()

uint32 Unit::GetPower ( Powers  power) const
inline
1475{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power); }
@ UNIT_FIELD_POWER1
Definition: UpdateFields.h:97

References Object::GetUInt32Value(), and UNIT_FIELD_POWER1.

Referenced by PetAI::_canMeleeAttack(), Player::_SaveCharacter(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), Creature::CanCastSpell(), Spell::CheckItems(), Spell::CheckPower(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), Spell::EffectCastButtons(), Spell::EffectWeaponDmg(), Pet::FillPetInfo(), Pet::GetHappinessState(), GetPowerPct(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), AuraEffect::HandleObsModPowerAuraTick(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetAbandon(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_pal_lay_on_hands::HandleScript(), Player::InitStatsForLevel(), npc_obsidian_destroyer::JustEngagedWith(), spell_gen_replenishment_aura::Load(), Pet::LoseHappiness(), ModifyPower(), spell_mark_of_kazrogal::spell_mark_of_kazrogal_AuraScript::OnPeriodic(), spell_mark_of_kazzak::spell_mark_of_kazzak_AuraScript::OnPeriodic(), Acore::PowerPctOrderPred::operator()(), SmartScript::ProcessAction(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::Regenerate(), Player::Regenerate(), Creature::RegenerateHealth(), Player::SaveManaBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), ScriptedAI::SelectSpell(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetMaxPower(), SetPower(), setPowerType(), spell_igb_incinerating_blast::spell_igb_incinerating_blast_SpellScript::StoreEnergy(), Aura::Update(), boss_selin_fireheart::UpdateAI(), boss_moam::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), PetAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ GetPowerPct()

float Unit::GetPowerPct ( Powers  power) const
inline
1465{ return GetMaxPower(power) ? 100.f * GetPower(power) / GetMaxPower(power) : 0.0f; }
uint32 GetMaxPower(Powers power) const
Definition: Unit.h:1476
uint32 GetPower(Powers power) const
Definition: Unit.h:1475

References GetMaxPower(), and GetPower().

Referenced by npc_obsidian_destroyer::JustEngagedWith(), npc_obsidian_eradicator::JustEngagedWith(), npc_obsidian_nullifier::JustEngagedWith(), boss_curator::JustEngagedWith(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), and boss_hazzarah::UpdateAI().

◆ getPowerType()

Powers Unit::getPowerType ( ) const
inline
1473{ return Powers(GetByteValue(UNIT_FIELD_BYTES_0, 3)); }
Powers
Definition: SharedDefines.h:268

References Object::GetByteValue(), and UNIT_FIELD_BYTES_0.

Referenced by boss_marli::_chargePlayer(), Player::ActivateSpec(), WorldSession::BuildPartyMemberStatsChangedPacket(), Creature::CanCastSpell(), Spell::CheckCast(), spell_pal_blessing_of_sanctuary::CheckProc(), Player::Create(), DealDamage(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectSummonPet(), spell_chain_burn::FilterTargets(), spell_moam_mana_drain_filter::FilterTargets(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), HandleDummyAuraProc(), AuraEffect::HandleObsModPowerAuraTick(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_gen_pet_summoned::HandleScript(), Player::InitDataForForm(), ManaVoidSelector::operator()(), LeechingThrowSelector::operator()(), PowerUsersSelector::operator()(), spell_item_oracle_ablutions::PrepareSpellScript(), Player::ResetAllPowers(), boss_faction_championsAI::SelectEnemyCaster(), setDeathState(), SetMaxPower(), SetPower(), Pet::Update(), Creature::Update(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_hazzarah::UpdateAI(), boss_faction_championsAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetPowerTypeByAuraGroup()

Powers Unit::GetPowerTypeByAuraGroup ( UnitMods  unitMod) const
15393{
15394 switch (unitMod)
15395 {
15396 case UNIT_MOD_RAGE:
15397 return POWER_RAGE;
15398 case UNIT_MOD_FOCUS:
15399 return POWER_FOCUS;
15400 case UNIT_MOD_ENERGY:
15401 return POWER_ENERGY;
15402 case UNIT_MOD_HAPPINESS:
15403 return POWER_HAPPINESS;
15404 case UNIT_MOD_RUNE:
15405 return POWER_RUNE;
15407 return POWER_RUNIC_POWER;
15408 default:
15409 case UNIT_MOD_MANA:
15410 return POWER_MANA;
15411 }
15412}
@ UNIT_MOD_RUNE
Definition: Unit.h:273
@ UNIT_MOD_ENERGY
Definition: Unit.h:271
@ UNIT_MOD_FOCUS
Definition: Unit.h:270
@ UNIT_MOD_HAPPINESS
Definition: Unit.h:272
@ UNIT_MOD_MANA
Definition: Unit.h:268
@ UNIT_MOD_RAGE
Definition: Unit.h:269
@ UNIT_MOD_RUNIC_POWER
Definition: Unit.h:274

References POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNE, POWER_RUNIC_POWER, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RUNE, and UNIT_MOD_RUNIC_POWER.

Referenced by HandleStatModifier().

◆ GetPPMProcChance()

float Unit::GetPPMProcChance ( uint32  WeaponSpeed,
float  PPM,
SpellInfo const *  spellProto 
) const
13446{
13447 // proc per minute chance calculation
13448 if (PPM <= 0)
13449 return 0.0f;
13450
13451 // Apply chance modifer aura
13452 if (spellProto)
13453 if (Player* modOwner = GetSpellModOwner())
13454 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_PROC_PER_MINUTE, PPM);
13455
13456 return floor((WeaponSpeed * PPM) / 600.0f); // result is chance in percents (probability = Speed_in_sec * (PPM / 60))
13457}
@ SPELLMOD_PROC_PER_MINUTE
Definition: SpellDefines.h:103

References GetSpellModOwner(), SpellInfo::Id, and SPELLMOD_PROC_PER_MINUTE.

Referenced by Player::CastItemCombatSpell(), and IsTriggeredAtSpellProcEvent().

◆ GetProcAurasTriggeredOnEvent()

void Unit::GetProcAurasTriggeredOnEvent ( std::list< AuraApplication * > &  aurasTriggeringProc,
std::list< AuraApplication * > *  procAuras,
ProcEventInfo  eventInfo 
)
16782{
16783 // use provided list of auras which can proc
16784 if (procAuras)
16785 {
16786 for (std::list<AuraApplication*>::iterator itr = procAuras->begin(); itr != procAuras->end(); ++itr)
16787 {
16788 ASSERT((*itr)->GetTarget() == this);
16789 if (!(*itr)->GetRemoveMode())
16790 if ((*itr)->GetBase()->IsProcTriggeredOnEvent(*itr, eventInfo))
16791 {
16792 (*itr)->GetBase()->PrepareProcToTrigger(*itr, eventInfo);
16793 aurasTriggeringProc.push_back(*itr);
16794 }
16795 }
16796 }
16797 // or generate one on our own
16798 else
16799 {
16800 for (AuraApplicationMap::iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16801 {
16802 if (itr->second->GetBase()->IsProcTriggeredOnEvent(itr->second, eventInfo))
16803 {
16804 itr->second->GetBase()->PrepareProcToTrigger(itr->second, eventInfo);
16805 aurasTriggeringProc.push_back(itr->second);
16806 }
16807 }
16808 }
16809}

References ASSERT, and GetAppliedAuras().

Referenced by TriggerAurasProcOnEvent().

◆ getRace()

uint8 Unit::getRace ( bool  original = false) const
21288{
21289 if (GetTypeId() == TYPEID_PLAYER)
21290 {
21291 if (original)
21292 return m_realRace;
21293 else
21294 return m_race;
21295 }
21296
21298}

References Object::GetByteValue(), Object::GetTypeId(), m_race, m_realRace, TYPEID_PLAYER, and UNIT_FIELD_BYTES_0.

Referenced by Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), Player::BuildPlayerRepop(), Corpse::BuildValuesUpdate(), Player::CreateCorpse(), GetModelForForm(), GetModelForTotem(), getRaceMask(), GetReactionTo(), Player::GetStartPosition(), Player::GetTeamId(), Player::GiveLevel(), WorldSession::HandleAlterAppearance(), AuraEffect::HandleAuraTransform(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Creature::IsValidTrainerForPlayer(), Channel::KickOrBan(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), RestoreFaction(), Player::RewardHonor(), WorldSession::SendNameQueryOpcode(), Player::SetGameMaster(), Player::StoreNewItemInBestSlots(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getRaceMask()

◆ GetRandomContactPoint()

bool Unit::GetRandomContactPoint ( Unit const *  target,
float &  x,
float &  y,
float &  z,
bool  force = false 
) const
720{
721 float combat_reach = GetCombatReach();
722 if (combat_reach < 0.1f) // sometimes bugged for players
723 combat_reach = DEFAULT_COMBAT_REACH;
724
725 uint32 attacker_number = getAttackers().size();
726 if (attacker_number > 0)
727 --attacker_number;
728 Creature const* c = obj->ToCreature();
729 if (c)
730 if (c->isWorldBoss() || c->IsDungeonBoss() || (obj->IsPet() && const_cast<Unit*>(obj)->ToPet()->isControlled()))
731 attacker_number = 0; // pussywizard: pets and bosses just come to target from their angle
732
733 GetNearPoint(obj, x, y, z, isMoving() ? (obj->GetCombatReach() > 7.75f ? obj->GetCombatReach() - 7.5f : 0.25f) : obj->GetCombatReach(), 0.0f,
734 GetAngle(obj) + (attacker_number ? (static_cast<float>(M_PI / 2) - static_cast<float>(M_PI) * (float)rand_norm()) * float(attacker_number) / combat_reach * 0.3f : 0));
735
736 // pussywizard
737 if (std::fabs(this->GetPositionZ() - z) > this->GetCollisionHeight() || !IsWithinLOS(x, y, z))
738 {
739 x = this->GetPositionX();
740 y = this->GetPositionY();
741 z = this->GetPositionZ();
742 obj->UpdateAllowedPositionZ(x, y, z);
743 }
744 float maxDist = GetMeleeRange(obj);
745 if (GetExactDistSq(x, y, z) >= maxDist * maxDist)
746 {
747 if (force)
748 {
749 x = this->GetPositionX();
750 y = this->GetPositionY();
751 z = this->GetPositionZ();
752 return true;
753 }
754 return false;
755 }
756 return true;
757}
#define DEFAULT_COMBAT_REACH
Definition: ObjectDefines.h:46
bool IsDungeonBoss() const
Definition: Creature.cpp:3080
bool IsWithinLOS(float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
Definition: Object.cpp:1326
float GetExactDistSq(float x, float y, float z) const
Definition: Position.h:170
bool isControlled() const
Definition: Pet.h:53
float GetCollisionHeight() const override
Return collision height sent to client.
Definition: Unit.cpp:21387
float GetMeleeRange(Unit const *target) const
Definition: Unit.cpp:698

References DEFAULT_COMBAT_REACH, Position::GetAngle(), getAttackers(), GetCollisionHeight(), GetCombatReach(), Position::GetExactDistSq(), GetMeleeRange(), WorldObject::GetNearPoint(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Pet::isControlled(), Creature::IsDungeonBoss(), isMoving(), IsPet(), WorldObject::IsWithinLOS(), Creature::isWorldBoss(), rand_norm(), Object::ToCreature(), ToPet(), and WorldObject::UpdateAllowedPositionZ().

Referenced by boss_bug_trio::DamageTaken(), and boss_bug_trio::DoFinalSpell().

◆ GetRangedCritChanceReduction()

float Unit::GetRangedCritChanceReduction ( ) const
inline

◆ GetRangedCritDamageReduction()

uint32 Unit::GetRangedCritDamageReduction ( uint32  damage) const
inline

◆ GetRangedDamageReduction()

uint32 Unit::GetRangedDamageReduction ( uint32  damage) const
inline

◆ GetReactionTo()

ReputationRank Unit::GetReactionTo ( Unit const *  target,
bool  checkOriginalFaction = false 
) const
10073{
10074 // always friendly to self
10075 if (this == target)
10076 return REP_FRIENDLY;
10077
10078 // always friendly to charmer or owner
10080 return REP_FRIENDLY;
10081
10082 Player const* selfPlayerOwner = GetAffectingPlayer();
10083 Player const* targetPlayerOwner = target->GetAffectingPlayer();
10084
10085 // check forced reputation to support SPELL_AURA_FORCE_REACTION
10086 if (selfPlayerOwner)
10087 {
10088 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10089 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10090 return *repRank;
10091 }
10092 else if (targetPlayerOwner)
10093 {
10094 if (FactionTemplateEntry const* selfFactionTemplateEntry = GetFactionTemplateEntry())
10095 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(selfFactionTemplateEntry))
10096 return *repRank;
10097 }
10098
10100 {
10101 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
10102 {
10103 if (selfPlayerOwner && targetPlayerOwner)
10104 {
10105 // always friendly to other unit controlled by player, or to the player himself
10106 if (selfPlayerOwner == targetPlayerOwner)
10107 return REP_FRIENDLY;
10108
10109 // duel - always hostile to opponent
10110 if (selfPlayerOwner->duel && selfPlayerOwner->duel->Opponent == targetPlayerOwner && selfPlayerOwner->duel->State == DUEL_STATE_IN_PROGRESS)
10111 return REP_HOSTILE;
10112
10113 // same group - checks dependant only on our faction - skip FFA_PVP for example
10114 if (selfPlayerOwner->IsInRaidWith(targetPlayerOwner))
10115 return REP_FRIENDLY; // return true to allow config option AllowTwoSide.Interaction.Group to work
10116 // however client seems to allow mixed group parties, because in 13850 client it works like:
10117 // return GetFactionReactionTo(GetFactionTemplateEntry(), target);
10118 }
10119
10120 // check FFA_PVP
10121 if (IsFFAPvP() && target->IsFFAPvP())
10122 return REP_HOSTILE;
10123
10124 if (selfPlayerOwner)
10125 {
10126 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10127 {
10128 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10129 return *repRank;
10130 if (!selfPlayerOwner->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10131 {
10132 if (FactionEntry const* targetFactionEntry = sFactionStore.LookupEntry(targetFactionTemplateEntry->faction))
10133 {
10134 if (targetFactionEntry->CanHaveReputation())
10135 {
10136 // check contested flags
10137 if (targetFactionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10138 && selfPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10139 return REP_HOSTILE;
10140
10141 // if faction has reputation, hostile state depends only from AtWar state
10142 if (selfPlayerOwner->GetReputationMgr().IsAtWar(targetFactionEntry))
10143 return REP_HOSTILE;
10144 return REP_FRIENDLY;
10145 }
10146 }
10147 }
10148 }
10149 }
10150 }
10151 }
10152
10153 ReputationRank repRank = REP_HATED;
10154 if (!sScriptMgr->IfNormalReaction(this, target, repRank))
10155 {
10156 return ReputationRank(repRank);
10157 }
10158
10159 FactionTemplateEntry const* factionTemplateEntry = nullptr;
10160 if (checkOriginalFaction)
10161 {
10162 if (GetTypeId() == TYPEID_PLAYER)
10163 {
10164 if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(getRace()))
10165 {
10166 factionTemplateEntry = sFactionTemplateStore.LookupEntry(rEntry->FactionID);
10167 }
10168 }
10169 else
10170 {
10171 Unit* owner = GetOwner();
10172 if (HasUnitTypeMask(UNIT_MASK_MINION) && owner)
10173 {
10174 factionTemplateEntry = sFactionTemplateStore.LookupEntry(owner->GetFaction());
10175 }
10176 else if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate())
10177 {
10178 factionTemplateEntry = sFactionTemplateStore.LookupEntry(cinfo->faction);
10179 }
10180 }
10181 }
10182
10183 if (!factionTemplateEntry)
10184 {
10185 factionTemplateEntry = GetFactionTemplateEntry();
10186 }
10187
10188 // do checks dependant only on our faction
10189 return GetFactionReactionTo(factionTemplateEntry, target);
10190}
DBCStorage< ChrRacesEntry > sChrRacesStore(ChrRacesEntryfmt)
@ REP_HATED
Definition: SharedDefines.h:180
bool HasPlayerFlag(PlayerFlags flags) const
Definition: Player.h:1100
ReputationRank GetFactionReactionTo(FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
Definition: Unit.cpp:10192
bool IsAtWar(uint32 faction_id) const
Definition: ReputationMgr.cpp:55
Definition: DBCStructure.h:679

References Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, GetAffectingPlayer(), GetCharmerOrOwnerOrSelf(), GetFaction(), GetFactionReactionTo(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetOwner(), getRace(), Player::GetReputationMgr(), Object::GetTypeId(), Player::HasPlayerFlag(), HasUnitFlag(), HasUnitFlag2(), HasUnitTypeMask(), ReputationMgr::IsAtWar(), IsFFAPvP(), IsInRaidWith(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HATED, REP_HOSTILE, sChrRacesStore, sFactionStore, sFactionTemplateStore, sScriptMgr, Object::ToCreature(), TYPEID_PLAYER, UNIT_FLAG2_IGNORE_REPUTATION, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_MINION.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), Player::GetNPCIfCanInteractWith(), IsFriendlyTo(), IsHostileTo(), and Condition::Meets().

◆ GetRedirectThreatPercent()

uint32 Unit::GetRedirectThreatPercent ( )
inline
uint32 GetThreatPct() const
Definition: Unit.h:966

References _redirectThreatInfo, and RedirectThreatInfo::GetThreatPct().

Referenced by ThreatMgr::DoAddThreat().

◆ GetRedirectThreatTarget()

◆ GetResistance() [1/2]

uint32 Unit::GetResistance ( SpellSchoolMask  mask) const
20589{
20590 int32 resist = -1;
20591 for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
20592 if (mask & (1 << i) && (resist < 0 || resist > int32(GetResistance(SpellSchools(i)))))
20593 resist = int32(GetResistance(SpellSchools(i)));
20594
20595 // resist value will never be negative here
20596 return uint32(resist);
20597}

References GetResistance(), MAX_SPELL_SCHOOL, and SPELL_SCHOOL_NORMAL.

◆ GetResistance() [2/2]

uint32 Unit::GetResistance ( SpellSchools  school) const
inline
1449{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_RESISTANCES) + school); }
@ UNIT_FIELD_RESISTANCES
Definition: UpdateFields.h:156

References Object::GetUInt32Value(), and UNIT_FIELD_RESISTANCES.

Referenced by Player::_SaveStats(), GetArmor(), GetEffectiveResistChance(), GetResistance(), and Player::outDebugValues().

◆ GetResistanceBuffMods()

float Unit::GetResistanceBuffMods ( SpellSchools  school,
bool  positive 
) const
inline

◆ GetShapeshiftForm()

◆ GetSharedVisionList()

◆ GetSheath()

SheathState Unit::GetSheath ( ) const
inline
SheathState
Definition: Unit.h:125

References Object::GetByteValue(), and UNIT_FIELD_BYTES_2.

◆ GetShieldBlockValue() [1/2]

virtual uint32 Unit::GetShieldBlockValue ( ) const
pure virtual

◆ GetShieldBlockValue() [2/2]

uint32 Unit::GetShieldBlockValue ( uint32  soft_cap,
uint32  hard_cap 
) const
inline
1637 {
1638 uint32 value = GetShieldBlockValue();
1639 if (value >= hard_cap)
1640 {
1641 value = (soft_cap + hard_cap) / 2;
1642 }
1643 else if (value > soft_cap)
1644 {
1645 value = soft_cap + ((value - soft_cap) / 2);
1646 }
1647
1648 return value;
1649 }

References GetShieldBlockValue().

◆ GetSingleCastAuras() [1/2]

AuraList & Unit::GetSingleCastAuras ( )
inline

◆ GetSingleCastAuras() [2/2]

AuraList const & Unit::GetSingleCastAuras ( ) const
inline
1983{ return m_scAuras; }

References m_scAuras.

◆ GetSpeed()

◆ GetSpeedRate()

◆ GetSpellCritChanceReduction()

float Unit::GetSpellCritChanceReduction ( ) const
inline

◆ GetSpellCritDamageReduction()

◆ GetSpellDamageReduction()

uint32 Unit::GetSpellDamageReduction ( uint32  damage) const
inline

◆ GetSpellMaxRangeForTarget()

float Unit::GetSpellMaxRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15134{
15135 if (!spellInfo->RangeEntry)
15136 {
15137 return 0;
15138 }
15139
15140 if (spellInfo->RangeEntry->RangeMax[1] == spellInfo->RangeEntry->RangeMax[0])
15141 {
15142 return spellInfo->GetMaxRange();
15143 }
15144
15145 if (!target)
15146 {
15147 return spellInfo->GetMaxRange(true);
15148 }
15149
15150 return spellInfo->GetMaxRange(!IsHostileTo(target));
15151}

References SpellInfo::GetMaxRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMax.

Referenced by spell_sha_fire_nova::CheckFireTotem(), Spell::CheckRange(), SpellTargetSelector::operator()(), ScriptedAI::SelectSpell(), GameObject::TriggeringLinkedGameObject(), and Pet::Update().

◆ GetSpellMinRangeForTarget()

float Unit::GetSpellMinRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15154{
15155 if (!spellInfo->RangeEntry)
15156 {
15157 return 0;
15158 }
15159
15160 if (spellInfo->RangeEntry->RangeMin[1] == spellInfo->RangeEntry->RangeMin[0])
15161 {
15162 return spellInfo->GetMinRange();
15163 }
15164
15165 return spellInfo->GetMinRange(!IsHostileTo(target));
15166}

References SpellInfo::GetMinRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMin.

Referenced by Spell::CheckRange(), SpellTargetSelector::operator()(), and ScriptedAI::SelectSpell().

◆ GetSpellModOwner()

Player * Unit::GetSpellModOwner ( ) const
16846{
16847 if (Player* player = const_cast<Unit*>(this)->ToPlayer())
16848 {
16849 return player;
16850 }
16851
16852 if (Unit* owner = GetOwner())
16853 {
16854 if (Player* player = owner->ToPlayer())
16855 {
16856 return player;
16857 }
16858 }
16859
16860 // Special handling for Eye of Kilrogg
16862 {
16863 if (TempSummon const* tempSummon = ToTempSummon())
16864 {
16865 if (Unit* summoner = tempSummon->GetSummonerUnit())
16866 {
16867 return summoner->ToPlayer();
16868 }
16869 }
16870 }
16871
16872 return nullptr;
16873}
@ NPC_EYE_OF_KILROGG
Definition: PetDefines.h:101
Definition: TemporarySummon.h:40

References Object::GetEntry(), GetOwner(), NPC_EYE_OF_KILROGG, Object::ToPlayer(), and ToTempSummon().

Referenced by Spell::_cast(), Creature::AddSpellCooldown(), ApplyEffectModifiers(), CalcArmorReducedDamage(), SpellEffectInfo::CalcDamageMultiplier(), Aura::CalcDispelChance(), Aura::CalcMaxCharges(), Aura::CalcMaxDuration(), AuraEffect::CalcPeriodicCritChance(), SpellInfo::CalcPowerCost(), Aura::CalcProcChance(), SpellEffectInfo::CalcRadius(), ThreatCalcHelper::calcThreat(), spell_dru_brambles_treant::CalculateAmount(), AuraEffect::CalculatePeriodic(), CalculateSpellDamageTaken(), SpellEffectInfo::CalcValueMultiplier(), Spell::cancel(), Spell::cast(), Spell::CheckRange(), Spell::CheckRuneCost(), Spell::EffectSummonPet(), Spell::EffectSummonType(), Spell::finish(), GetEffectiveResistChance(), SpellInfo::GetMaxRange(), GetPPMProcChance(), Spell::handle_delayed(), Spell::handle_immediate(), IsAlwaysDetectableFor(), SpellInfo::IsStrongerAuraActive(), IsTriggeredAtSpellProcEvent(), MagicSpellHitResult(), MeleeDamageBonusDone(), MeleeSpellMissChance(), ModSpellCastTime(), Spell::SelectImplicitChainTargets(), Aura::SetDuration(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellDoneCritChance(), SpellHealingBonusDone(), Spell::SummonGuardian(), Spell::TakePower(), Spell::TakeRunePower(), Spell::UpdateChanneledTargetList(), and Aura::UpdateOwner().

◆ GetSpellSchoolByAuraGroup()

SpellSchools Unit::GetSpellSchoolByAuraGroup ( UnitMods  unitMod) const
15332{
15334
15335 switch (unitMod)
15336 {
15338 school = SPELL_SCHOOL_HOLY;
15339 break;
15341 school = SPELL_SCHOOL_FIRE;
15342 break;
15344 school = SPELL_SCHOOL_NATURE;
15345 break;
15347 school = SPELL_SCHOOL_FROST;
15348 break;
15350 school = SPELL_SCHOOL_SHADOW;
15351 break;
15353 school = SPELL_SCHOOL_ARCANE;
15354 break;
15355
15356 default:
15357 break;
15358 }
15359
15360 return school;
15361}
@ UNIT_MOD_RESISTANCE_SHADOW
Definition: Unit.h:280
@ UNIT_MOD_RESISTANCE_FROST
Definition: Unit.h:279
@ UNIT_MOD_RESISTANCE_HOLY
Definition: Unit.h:276
@ UNIT_MOD_RESISTANCE_ARCANE
Definition: Unit.h:281
@ UNIT_MOD_RESISTANCE_FIRE
Definition: Unit.h:277
@ UNIT_MOD_RESISTANCE_NATURE
Definition: Unit.h:278
@ SPELL_SCHOOL_SHADOW
Definition: SharedDefines.h:288
@ SPELL_SCHOOL_NATURE
Definition: SharedDefines.h:286
@ SPELL_SCHOOL_FROST
Definition: SharedDefines.h:287
@ SPELL_SCHOOL_ARCANE
Definition: SharedDefines.h:289
@ SPELL_SCHOOL_FIRE
Definition: SharedDefines.h:285
@ SPELL_SCHOOL_HOLY
Definition: SharedDefines.h:284

References SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, and UNIT_MOD_RESISTANCE_SHADOW.

Referenced by HandleStatModifier().

◆ getStandState()

◆ GetStat()

◆ GetStatByAuraGroup()

Stats Unit::GetStatByAuraGroup ( UnitMods  unitMod) const
15364{
15365 Stats stat = STAT_STRENGTH;
15366
15367 switch (unitMod)
15368 {
15370 stat = STAT_STRENGTH;
15371 break;
15373 stat = STAT_AGILITY;
15374 break;
15376 stat = STAT_STAMINA;
15377 break;
15379 stat = STAT_INTELLECT;
15380 break;
15382 stat = STAT_SPIRIT;
15383 break;
15384
15385 default:
15386 break;
15387 }
15388
15389 return stat;
15390}
@ UNIT_MOD_STAT_INTELLECT
Definition: Unit.h:265
@ UNIT_MOD_STAT_SPIRIT
Definition: Unit.h:266
@ UNIT_MOD_STAT_STRENGTH
Definition: Unit.h:262
@ UNIT_MOD_STAT_AGILITY
Definition: Unit.h:263
@ UNIT_MOD_STAT_STAMINA
Definition: Unit.h:264
Stats
Definition: SharedDefines.h:257
@ STAT_SPIRIT
Definition: SharedDefines.h:262
@ STAT_INTELLECT
Definition: SharedDefines.h:261
@ STAT_AGILITY
Definition: SharedDefines.h:259
@ STAT_STRENGTH
Definition: SharedDefines.h:258
@ STAT_STAMINA
Definition: SharedDefines.h:260

References STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by HandleStatModifier().

◆ GetTarget()

◆ GetThreatMgr() [1/2]

ThreatMgr & Unit::GetThreatMgr ( )
inline
2159{ return m_ThreatMgr; }

References m_ThreatMgr.

Referenced by CreatureAI::_EnterEvadeMode(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_razorgore::boss_razorgoreAI::CanAIAttack(), boss_hazzarah::CanAIAttack(), boss_jindo::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_nethermancer_sepethrea::CanAIAttack(), boss_archimonde::boss_archimondeAI::CanUseFingerOfDeath(), boss_mor_grayhoof::CastRandomSpell(), CleanupBeforeRemoveFromMap(), boss_kiljaeden::boss_kiljaedenAI::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_crystalline_frayer::npc_crystalline_frayerAI::DamageTaken(), npc_magister_aledis::DamageTaken(), boss_ysondre::boss_ysondreAI::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), ScriptedAI::DoAddThreat(), boss_nightbane::DoCastOnFarAwayPlayers(), boss_archimonde::boss_archimondeAI::DoCastProtection(), UnitAI::DoCastToAllHostilePlayers(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoGetThreat(), ScriptedAI::DoModifyThreatByPercent(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), ScriptedAI::DoResetThreat(), ScriptedAI::DoResetThreatList(), Spell::EffectModifyThreatPercent(), Spell::EffectTaunt(), boss_faction_championsAI::EnemiesInRange(), boss_ragnaros::boss_ragnarosAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), boss_murmur::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), boss_ouro::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), hyjalAI::EnterEvadeMode(), TemporaryThreatModifierEvent::Execute(), StartMovementEvent::Execute(), boss_supremus::FindHatefulStrikeTarget(), npc_raging_flames::FixateRandomTarget(), SmartScript::GetTargets(), UnitAI::GetThreatMgr(), debug_commandscript::HandleDebugThreatListCommand(), spell_karazhan_blink::spell_karazhan_blink_SpellScript::HandleDummy(), spell_q11919_q11940_drake_hunt::spell_q11919_q11940_drake_hunt_AuraScript::HandleEffectRemove(), spell_enveloping_webs::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), HandleProcTriggerSpell(), PetAI::HandleReturnMovement(), spell_pursue::spell_pursue_SpellScript::HandleScript(), spell_gurtogg_eject::spell_gurtogg_eject_SpellScript::HandleScriptEffect(), spell_leotheras_whirlwind::HandleScriptEffect(), boss_attumen::IsSummonedBy(), boss_blackheart_the_inciter::JustEngagedWith(), boss_jindo::JustSummoned(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), Creature::ModifyThreatPercentTemp(), boss_bug_trio::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), spell_halion_twilight_phasing::spell_halion_twilight_phasing_AuraScript::OnApply(), spell_halion_twilight_phasing::spell_halion_twilight_phasing_AuraScript::OnRemove(), NonTankTargetSelector::operator()(), StoneGripTargetSelector::operator()(), boss_jeklik::PathEndReached(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), boss_talon_king_ikiss::Reset(), boss_faction_championsAI::SelectEnemyCaster(), npc_scholomance_occultist::npc_scholomance_occultistAI::SelectUnitCasting(), SendChangeCurrentVictimOpcode(), SendThreatListUpdate(), setDeathState(), SetPhaseMask(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), boss_ouro::SpellHitTarget(), spell_putricide_ooze_channel::spell_putricide_ooze_channel_SpellScript::StartAttack(), BossAI::TeleportCheaters(), Creature::Update(), Update(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_nefarian::UpdateAI(), boss_yazzai::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), boss_taldaram::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_alar::boss_alarAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_phase_hunter::npc_phase_hunterAI::UpdateAI(), boss_netherspite::UpdatePortals(), and CreatureAI::UpdateVictim().

◆ GetThreatMgr() [2/2]

ThreatMgr const & Unit::GetThreatMgr ( ) const
inline
2160{ return m_ThreatMgr; }

References m_ThreatMgr.

◆ GetTotalAttackPowerValue()

float Unit::GetTotalAttackPowerValue ( WeaponAttackType  attType,
Unit pVictim = nullptr 
) const
15415{
15416 if (attType == RANGED_ATTACK)
15417 {
15419 if( victim )
15420 ap += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
15421
15422 if (ap < 0)
15423 return 0.0f;
15425 }
15426 else
15427 {
15429 if( victim )
15430 ap += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
15431
15432 if (ap < 0)
15433 return 0.0f;
15435 }
15436}
@ UNIT_FIELD_ATTACK_POWER_MODS
Definition: UpdateFields.h:163
@ UNIT_FIELD_RANGED_ATTACK_POWER
Definition: UpdateFields.h:165
@ UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER
Definition: UpdateFields.h:167
@ UNIT_FIELD_ATTACK_POWER_MULTIPLIER
Definition: UpdateFields.h:164
@ UNIT_FIELD_ATTACK_POWER
Definition: UpdateFields.h:162
@ UNIT_FIELD_RANGED_ATTACK_POWER_MODS
Definition: UpdateFields.h:166
@ SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS
Definition: SpellAuraDefines.h:190
@ SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS
Definition: SpellAuraDefines.h:228
int32 GetInt32Value(uint16 index) const
Definition: Object.cpp:299

References Object::GetFloatValue(), Object::GetInt32Value(), GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, and UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER.

Referenced by spell_dk_ghoul_thrash::CalcDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_execute::HandleEffect(), spell_pal_seal_of_righteousness::HandleProc(), HandleProcTriggerSpell(), Spell::HandleThreatSpells(), Guardian::InitStatsForLevel(), SpellBaseDamageBonusDone(), SpellBaseHealingBonusDone(), SpellDamageBonusDone(), SpellHealingBonusDone(), Guardian::UpdateDamagePhysical(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetTotalAuraModifier()

◆ GetTotalAuraModifierAreaExclusive()

int32 Unit::GetTotalAuraModifierAreaExclusive ( AuraType  auratype) const
5829{
5830 int32 modifier = 0;
5831 int32 areaModifier = 0;
5832
5833 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5834 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5835 {
5836 if ((*i)->GetSpellInfo()->HasAreaAuraEffect())
5837 {
5838 if (areaModifier < (*i)->GetAmount())
5839 areaModifier = (*i)->GetAmount();
5840 }
5841 else
5842 modifier += (*i)->GetAmount();
5843 }
5844
5845 return modifier + areaModifier;
5846}

References GetAuraEffectsByType().

Referenced by Player::UpdateSpellCritChance().

◆ GetTotalAuraModifierByAffectMask()

int32 Unit::GetTotalAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6005{
6006 int32 modifier = 0;
6007
6008 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6009 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6010 if ((*i)->IsAffectedOnSpell(affectedSpell))
6011 modifier += (*i)->GetAmount();
6012
6013 return modifier;
6014}

References GetAuraEffectsByType().

◆ GetTotalAuraModifierByMiscMask()

int32 Unit::GetTotalAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
5900{
5901 int32 modifier = 0;
5902
5903 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5904 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5905 {
5906 if ((*i)->GetMiscValue()& misc_mask)
5907 modifier += (*i)->GetAmount();
5908 }
5909 return modifier;
5910}

References GetAuraEffectsByType().

Referenced by CalcArmorReducedDamage(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), GetEffectiveResistChance(), MagicSpellHitResult(), SpellCriticalDamageBonus(), SpellDamageBonusDone(), SpellDoneCritChance(), and Player::UpdateSpellCritChance().

◆ GetTotalAuraModifierByMiscValue()

int32 Unit::GetTotalAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
5953{
5954 int32 modifier = 0;
5955
5956 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5957 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5958 if ((*i)->GetMiscValue() == misc_value)
5959 modifier += (*i)->GetAmount();
5960
5961 return modifier;
5962}

References GetAuraEffectsByType().

Referenced by Player::CalculateReputationGain(), GetMechanicResistChance(), MeleeSpellHitResult(), ModSpellDuration(), Creature::Regenerate(), Player::Regenerate(), RollMeleeOutcomeAgainst(), and Player::UpdateManaRegen().

◆ GetTotalAuraModValue()

float Unit::GetTotalAuraModValue ( UnitMods  unitMod) const
15305{
15306 if (unitMod >= UNIT_MOD_END)
15307 {
15308 LOG_ERROR("entities.unit", "attempt to access non-existing UnitMods in GetTotalAuraModValue()!");
15309 return 0.0f;
15310 }
15311
15312 if (m_auraModifiersGroup[unitMod][TOTAL_PCT] <= 0.0f)
15313 return 0.0f;
15314
15315 float value = m_auraModifiersGroup[unitMod][BASE_VALUE];
15316 value *= m_auraModifiersGroup[unitMod][BASE_PCT];
15317 value += m_auraModifiersGroup[unitMod][TOTAL_VALUE];
15318 value *= m_auraModifiersGroup[unitMod][TOTAL_PCT];
15319
15320 return value;
15321}

References BASE_PCT, BASE_VALUE, LOG_ERROR, m_auraModifiersGroup, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_END.

Referenced by Creature::UpdateArmor(), Creature::UpdateMaxHealth(), Creature::UpdateMaxPower(), and Creature::UpdateResistances().

◆ GetTotalAuraMultiplier()

float Unit::GetTotalAuraMultiplier ( AuraType  auratype) const
5863{
5864 float multiplier = 1.0f;
5865
5866 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5867 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5868 AddPct(multiplier, (*i)->GetAmount());
5869
5870 return multiplier;
5871}

References AddPct(), and GetAuraEffectsByType().

Referenced by MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), SpellCriticalHealingBonus(), and UpdateSpeed().

◆ GetTotalAuraMultiplierByAffectMask()

float Unit::GetTotalAuraMultiplierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6017{
6018 float multiplier = 1.0f;
6019
6020 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6021 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6022 if ((*i)->IsAffectedOnSpell(affectedSpell))
6023 AddPct(multiplier, (*i)->GetAmount());
6024
6025 return multiplier;
6026}

References AddPct(), and GetAuraEffectsByType().

◆ GetTotalAuraMultiplierByMiscMask()

float Unit::GetTotalAuraMultiplierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
5913{
5914 float multiplier = 1.0f;
5915
5916 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5917 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5918 if (((*i)->GetMiscValue() & misc_mask))
5919 AddPct(multiplier, (*i)->GetAmount());
5920
5921 return multiplier;
5922}

References AddPct(), and GetAuraEffectsByType().

Referenced by CalculateAOEDamageReduction(), CalculateMeleeDamage(), MeleeDamageBonusTaken(), and SpellCriticalHealingBonus().

◆ GetTotalAuraMultiplierByMiscValue()

float Unit::GetTotalAuraMultiplierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
5965{
5966 float multiplier = 1.0f;
5967
5968 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5969 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5970 if ((*i)->GetMiscValue() == misc_value)
5971 AddPct(multiplier, (*i)->GetAmount());
5972
5973 return multiplier;
5974}

References AddPct(), and GetAuraEffectsByType().

Referenced by Player::UpdateManaRegen().

◆ GetTotalStatValue()

float Unit::GetTotalStatValue ( Stats  stat,
float  additionalValue = 0.0f 
) const
15289{
15290 UnitMods unitMod = UnitMods(static_cast<uint16>(UNIT_MOD_STAT_START) + stat);
15291
15292 if (m_auraModifiersGroup[unitMod][TOTAL_PCT] <= 0.0f)
15293 return 0.0f;
15294
15295 // value = ((base_value * base_pct) + total_value) * total_pct
15296 float value = m_auraModifiersGroup[unitMod][BASE_VALUE] + GetCreateStat(stat);
15297 value *= m_auraModifiersGroup[unitMod][BASE_PCT];
15298 value += m_auraModifiersGroup[unitMod][TOTAL_VALUE] + additionalValue;
15299 value *= m_auraModifiersGroup[unitMod][TOTAL_PCT];
15300
15301 return value;
15302}
UnitMods
Definition: Unit.h:261
@ UNIT_MOD_STAT_START
Definition: Unit.h:289
float GetCreateStat(Stats stat) const
Definition: Unit.h:2059

References BASE_PCT, BASE_VALUE, GetCreateStat(), m_auraModifiersGroup, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_STAT_START.

Referenced by Player::UpdateAllStats(), Guardian::UpdateStats(), and Player::UpdateStats().

◆ getTransForm()

◆ GetTransGUID()

◆ GetUnitBlockChance()

float Unit::GetUnitBlockChance ( ) const
3666{
3667 if (Player const* player = ToPlayer())
3668 {
3669 if (player->CanBlock())
3670 {
3671 Item* tmpitem = player->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
3672 if (tmpitem && !tmpitem->IsBroken() && tmpitem->GetTemplate()->Block)
3674 }
3675 // is player but has no block ability or no not broken shield equipped
3676 return 0.0f;
3677 }
3678 else
3679 {
3680 if (ToCreature()->IsTotem())
3681 return 0.0f;
3682 else
3683 {
3684 float block = 5.0f;
3686 return block > 0.0f ? block : 0.0f;
3687 }
3688 }
3689}
@ PLAYER_BLOCK_PERCENTAGE
Definition: UpdateFields.h:346
@ EQUIPMENT_SLOT_OFFHAND
Definition: Player.h:692
#define INVENTORY_SLOT_BAG_0
Definition: Player.h:671
@ SPELL_AURA_MOD_BLOCK_PERCENT
Definition: SpellAuraDefines.h:114
ItemTemplate const * GetTemplate() const
Definition: Item.cpp:545
bool IsBroken() const
Definition: Item.h:251
uint32 Block
Definition: ItemTemplate.h:683

References ItemTemplate::Block, EQUIPMENT_SLOT_OFFHAND, Object::GetFloatValue(), Item::GetTemplate(), GetTotalAuraModifier(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), IsTotem(), PLAYER_BLOCK_PERCENTAGE, SPELL_AURA_MOD_BLOCK_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitCriticalChance()

float Unit::GetUnitCriticalChance ( WeaponAttackType  attackType,
Unit const *  victim 
) const
3692{
3693 float crit;
3694
3695 if (GetTypeId() == TYPEID_PLAYER)
3696 {
3697 switch (attackType)
3698 {
3699 case BASE_ATTACK:
3701 break;
3702 case OFF_ATTACK:
3704 break;
3705 case RANGED_ATTACK:
3707 break;
3708 // Just for good manner
3709 default:
3710 crit = 0.0f;
3711 break;
3712 }
3713 }
3714 else
3715 {
3716 crit = 5.0f;
3719 }
3720
3721 // flat aura mods
3722 if (attackType == RANGED_ATTACK)
3723 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE);
3724 else
3725 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE);
3726
3727 AuraEffectList const& mTotalAuraList = victim->GetAuraEffectsByType(SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER);
3728 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
3729 {
3730 if (GetGUID() != (*i)->GetCasterGUID())
3731 continue;
3732
3733 crit += (*i)->GetAmount();
3734 }
3735
3736 // reduce crit chance from Rating for players
3737 if (attackType != RANGED_ATTACK)
3738 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_MELEE);
3739 else
3740 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_RANGED);
3741
3742 // Apply crit chance from defence skill
3743 crit += (int32(GetMaxSkillValueForLevel(victim)) - int32(victim->GetDefenseSkillValue(this))) * 0.04f;
3744
3745 // xinef: SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE should be calculated at the end
3746 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE);
3747
3748 if (crit < 0.0f)
3749 crit = 0.0f;
3750 return crit;
3751}
@ PLAYER_RANGED_CRIT_PERCENTAGE
Definition: UpdateFields.h:352
@ PLAYER_CRIT_PERCENTAGE
Definition: UpdateFields.h:351
@ PLAYER_OFFHAND_CRIT_PERCENTAGE
Definition: UpdateFields.h:353
@ SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER
Definition: SpellAuraDefines.h:371
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE
Definition: SpellAuraDefines.h:251
@ SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
Definition: SpellAuraDefines.h:260
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE
Definition: SpellAuraDefines.h:250
@ SPELL_AURA_MOD_CRIT_PCT
Definition: SpellAuraDefines.h:353
@ SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
Definition: SpellAuraDefines.h:115
uint16 GetMaxSkillValueForLevel(Unit const *target=nullptr) const
Definition: Unit.h:1561

References ApplyResilience(), BASE_ATTACK, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, GetAuraEffectsByType(), GetDefenseSkillValue(), Object::GetFloatValue(), Object::GetGUID(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), Object::GetTypeId(), OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_MOD_CRIT_PCT, SPELL_AURA_MOD_WEAPON_CRIT_PERCENT, and TYPEID_PLAYER.

Referenced by spell_dk_wandering_plague_aura::CheckProc(), and RollMeleeOutcomeAgainst().

◆ GetUnitDodgeChance()

float Unit::GetUnitDodgeChance ( ) const
3604{
3605 if (GetTypeId() == TYPEID_PLAYER)
3606 return ToPlayer()->GetRealDodge(); //GetFloatValue(PLAYER_DODGE_PERCENTAGE);
3607 else
3608 {
3609 if (ToCreature()->IsTotem())
3610 return 0.0f;
3611 else
3612 {
3613 float dodge = ToCreature()->isWorldBoss() ? 5.85f : 5.0f; // Xinef: bosses should have 6.5% dodge (5.9 + 0.6 from defense skill difference)
3615 return dodge > 0.0f ? dodge : 0.0f;
3616 }
3617 }
3618}
@ SPELL_AURA_MOD_DODGE_PERCENT
Definition: SpellAuraDefines.h:112
float GetRealDodge() const
Definition: Player.h:2571

References Player::GetRealDodge(), GetTotalAuraModifier(), Object::GetTypeId(), IsTotem(), Creature::isWorldBoss(), SPELL_AURA_MOD_DODGE_PERCENT, Object::ToCreature(), Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitFlags()

◆ GetUnitFlags2()

UnitFlags2 Unit::GetUnitFlags2 ( ) const
inline
@ UNIT_FIELD_FLAGS_2
Definition: UpdateFields.h:118
UnitFlags2
Definition: Unit.h:486

References Object::GetUInt32Value(), and UNIT_FIELD_FLAGS_2.

Referenced by npc_commandscript::HandleNpcInfoCommand().

◆ GetUnitMeleeSkill()

uint32 Unit::GetUnitMeleeSkill ( Unit const *  target = nullptr) const
inline
1650{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }

References GetLevel(), and getLevelForTarget().

Referenced by DealMeleeDamage(), GetDefenseSkillValue(), and GetWeaponSkillValue().

◆ GetUnitMissChance()

float Unit::GetUnitMissChance ( WeaponAttackType  attType) const
3651{
3652 float miss_chance = 5.00f;
3653
3654 if (Player const* player = ToPlayer())
3655 miss_chance += player->GetMissPercentageFromDefence();
3656
3657 if (attType == RANGED_ATTACK)
3659 else
3661
3662 return miss_chance;
3663}
@ SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE
Definition: SpellAuraDefines.h:247
@ SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE
Definition: SpellAuraDefines.h:248

References GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE, and Object::ToPlayer().

Referenced by MeleeSpellMissChance().

◆ GetUnitMovementFlags()

◆ GetUnitParryChance()

float Unit::GetUnitParryChance ( ) const
3621{
3622 float chance = 0.0f;
3623
3624 if (Player const* player = ToPlayer())
3625 {
3626 if (player->CanParry())
3627 {
3628 Item* tmpitem = player->GetWeaponForAttack(BASE_ATTACK, true);
3629 if (!tmpitem)
3630 tmpitem = player->GetWeaponForAttack(OFF_ATTACK, true);
3631
3632 if (tmpitem)
3633 chance = player->GetRealParry(); //GetFloatValue(PLAYER_PARRY_PERCENTAGE);
3634 }
3635 }
3636 else if (GetTypeId() == TYPEID_UNIT)
3637 {
3638 if (ToCreature()->isWorldBoss())
3639 chance = 13.4f; // + 0.6 by skill diff
3641 chance = 5.0f;
3642
3643 // Xinef: if aura is present, type should not matter
3645 }
3646
3647 return chance > 0.0f ? chance : 0.0f;
3648}
@ SPELL_AURA_MOD_PARRY_PERCENT
Definition: SpellAuraDefines.h:110

References BASE_ATTACK, CREATURE_TYPE_HUMANOID, GetCreatureType(), GetTotalAuraModifier(), Object::GetTypeId(), OFF_ATTACK, SPELL_AURA_MOD_PARRY_PERCENT, Object::ToCreature(), Object::ToPlayer(), and TYPEID_UNIT.

Referenced by spell_dk_spell_deflection::Absorb(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitState()

uint32 Unit::GetUnitState ( ) const
inline

◆ GetUnitTypeMask()

uint32 Unit::GetUnitTypeMask ( ) const
inline
1421{ return m_unitTypeMask; }

References m_unitTypeMask.

◆ GetVehicle()

Vehicle * Unit::GetVehicle ( ) const
inline
2368{ return m_vehicle; }

References m_vehicle.

Referenced by KillRewarder::_InitXP(), Vehicle::AddPassenger(), WorldSession::BuildPartyMemberStatsChangedPacket(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::CanAIAttack(), npc_raging_spirit::npc_raging_spiritAI::CanAIAttack(), npc_icc_lk_checktarget::npc_icc_lk_checktargetAI::CanAIAttack(), boss_flame_leviathan_defense_turret::boss_flame_leviathan_defense_turretAI::CanAIAttack(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::CheckAchievementCriteriaMeet(), Spell::CheckCast(), Spell::EffectJumpDest(), Spell::EffectKnockBack(), CreatureAI::EnterEvadeMode(), GetDirectTransport(), SmartScript::GetTargets(), GetTransGUID(), WorldSession::HandleAttackSwingOpcode(), WorldSession::HandleChangeSeatsOnControlledVehicle(), spell_switch_infragreen_bomber_station::spell_switch_infragreen_bomber_station_SpellScript::HandleDummy(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), Player::IsPetNeedBeTemporaryUnsummoned(), npc_nexus_lord::npc_nexus_lordAI::JustDied(), npc_scion_of_eternity::npc_scion_of_eternityAI::JustDied(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), achievement_flame_leviathan_garage::OnCheck(), achievement_wg_didnt_stand_a_chance::OnCheck(), npc_announcer_toc5::OnGossipHello(), BattlefieldWG::OnPlayerLeaveWar(), boss_flame_leviathan_overload_device::boss_flame_leviathan_overload_deviceAI::OnSpellClick(), VehicleCheck::operator()(), OutDebugInfo(), spell_fight_fire_bomber::spell_fight_fire_bomber_SpellScript::PrepareSpellScript(), Player::ProcessDelayedOperations(), Player::ProcessTerrainStatusUpdate(), Vehicle::RemovePassenger(), Creature::SelectVictim(), SetControlled(), Player::SetViewpoint(), lfg::LFGMgr::TeleportPlayer(), npc_pilgrims_bounty_chair::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_impaling_spear::npc_impaling_spearAI::UpdateAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::UpdateAI(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdatePosition(), UpdateSpeed(), GameObject::Use(), Acore::MessageDistDeliverer::Visit(), and Acore::MessageDistDelivererToHostile::Visit().

◆ GetVehicleBase()

Unit * Unit::GetVehicleBase ( ) const
19007{
19008 return m_vehicle ? m_vehicle->GetBase() : nullptr;
19009}

References Vehicle::GetBase(), and m_vehicle.

Referenced by boss_flame_leviathan::boss_flame_leviathanAI::AttackStart(), boss_flame_leviathan_defense_turret::boss_flame_leviathan_defense_turretAI::CanAIAttack(), WorldObject::CanNeverSee(), WorldObject::CanSeeOrDetect(), instance_oculus::instance_oculus_InstanceMapScript::CheckAchievementCriteriaMeet(), npc_bone_spike::npc_bone_spikeAI::DoAction(), ExitVehicle(), GetTransGUID(), GetVehicleCreatureBase(), spell_gen_on_tournament_mount::HandleApplyEffect(), WorldSession::HandleChangeSeatsOnControlledVehicle(), spell_svalna_remove_spear::spell_svalna_remove_spear_SpellScript::HandleScript(), spell_vehicle_grab_pyrite::spell_vehicle_grab_pyrite_SpellScript::HandleScript(), npc_scarlet_miner::npc_scarlet_minerAI::InitCartQuest(), npc_xt002_heart::npc_xt002_heartAI::JustSummoned(), achievement_wg_vehicular_gnomeslaughter::OnCheck(), OutDebugInfo(), spell_charge_shield_bomber::spell_charge_shield_bomber_SpellScript::PrepareSpellScript(), Spell::SelectImplicitCasterObjectTargets(), Movement::MoveSplineInit::SetFacing(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::SpellHit(), npc_q24545_lich_king::npc_q24545_lich_kingAI::SpellHitTarget(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), Player::UpdateAreaDependentAuras(), and UpdateSpeed().

◆ GetVehicleCreatureBase()

◆ GetVehicleKit()

Vehicle * Unit::GetVehicleKit ( ) const
inline
2367{ return m_vehicleKit; }

References m_vehicleKit.

Referenced by _EnterVehicle(), Creature::AddToWorld(), Creature::AIM_Initialize(), boss_xt002::boss_xt002AI::AttachHeart(), npc_salvaged_siege_engine::BeforeSpellClick(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::boss_deathbringer_saurfangAI(), Aura::CanStackWith(), spell_demolisher_ride_vehicle::spell_demolisher_ride_vehicle_SpellScript::CheckCast(), SmartAI::CheckConditions(), VehicleAI::CheckConditions(), Map::CreatureRelocation(), Dismount(), npc_orb_carrier::npc_orb_carrierAI::DoAction(), npc_ulduar_vx001::npc_ulduar_vx001AI::DoAction(), npc_hover_disk::npc_hover_diskAI::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), Spell::EffectTeleportUnits(), CreatureAI::EnterEvadeMode(), boss_ick::boss_ickAI::GetKrick(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::GetS3(), SmartScript::GetTargets(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraSetVehicle(), WorldSession::HandleCastSpellOpcode(), spell_q13280_13283_plant_battle_standard::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_q12919_gymers_throw::HandleScript(), HandleSpellClick(), IsOnVehicle(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), boss_gormok::boss_gormokAI::JustEngagedWith(), Mount(), npc_hover_disk::npc_hover_diskAI::MovementInform(), npc_enslaved_proto_drake::npc_enslaved_proto_drakeAI::MovementInform(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::MovementInform(), npc_vics_flying_machine::npc_vics_flying_machineAI::MovementInform(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::npc_high_overlord_saurfangAI(), npc_orb_carrier::npc_orb_carrierAI::npc_orb_carrierAI(), spell_systems_shutdown::spell_systems_shutdown_AuraScript::OnApply(), VehicleAI::OnCharmed(), spell_blood_queen_frenzied_bloodthirst::spell_blood_queen_frenzied_bloodthirst_AuraScript::OnRemove(), FlameLeviathanPursuedTargetSelector::operator()(), OutDebugInfo(), npc_wintergarde_gryphon::PassengerBoarded(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), Map::PlayerRelocation(), SmartScript::ProcessAction(), boss_skadi_grauf::boss_skadi_graufAI::RemoveSkadi(), Spell::SelectImplicitCasterObjectTargets(), SmartAI::SmartAI(), npc_wintergarde_gryphon::SpellHit(), npc_vics_flying_machine::npc_vics_flying_machineAI::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), npc_storm_cloud::npc_storm_cloudAI::SpellHit(), boss_flame_leviathan::boss_flame_leviathanAI::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::SpreadFire(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), npc_preparations_for_war_vehicle::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_wg_siege_machine::npc_wg_siege_machineAI::UpdateAI(), UpdateHeight(), and UpdateOrientation().

◆ GetVictim()

Unit * Unit::GetVictim ( ) const
inline
1398{ return m_attacking; }

References m_attacking.

Referenced by boss_marli::_chargePlayer(), PetAI::_needToStop(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), SmartAI::AssistPlayerInCombatAgainst(), PetAI::AttackedBy(), npc_calvin_montague::npc_calvin_montagueAI::AttackedBy(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), boss_malygos::boss_malygosAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), Object::BuildMovementUpdate(), Creature::CallAssistance(), Creature::CallForHelp(), TurretAI::CanAIAttack(), PetAI::CanAttack(), boss_attumen::CanMeleeHit(), boss_midnight::CanMeleeHit(), boss_swamplord_muselek::CanShootVictim(), boss_archimonde::boss_archimondeAI::CanUseFingerOfDeath(), Spell::CheckCast(), boss_mandokir::boss_mandokirAI::DamageDealt(), boss_garfrost::boss_garfrostAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_leotheras_the_blind::DemonTime(), boss_skadi::boss_skadiAI::DoAction(), UnitAI::DoCast(), boss_archimonde::boss_archimondeAI::DoCastDoomfire(), UnitAI::DoCastVictim(), ConfusedMovementGenerator< T >::DoFinalize(), Creature::DoFleeToGetAssistance(), UnitAI::DoMeleeAttackIfReady(), boss_zuljin::boss_zuljinAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), ScriptedAI::DoStopAttack(), Spell::EffectTaunt(), boss_ouro::Emerge(), boss_halazzi::boss_halazziAI::EnterPhase(), boss_zuljin::boss_zuljinAI::EnterPhase(), RestoreAttack::Execute(), StartMovementEvent::Execute(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::ExecuteEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::ExecuteEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::ExecuteEvent(), emerald_dragonAI::ExecuteEvent(), spell_shazzrah_gate_dummy::spell_shazzrah_gate_dummy_SpellScript::FilterTargets(), spell_malchezaar_enfeeble::FilterTargets(), spell_chain_burn::FilterTargets(), TimedFleeingMovementGenerator::Finalize(), getAttackerForHelper(), ThreatMgr::GetCurrentVictim(), Player::GetInitialVisiblePackets(), CreatureGroup::GetNewTargetForMember(), SmartScript::GetTargets(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), cast_commandscript::HandleCastTargetCommad(), spell_aggro_drones::HandleDummy(), spell_gen_threshalisk_charge::HandleDummy(), HandleDummyAuraProc(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_lurker_below_spout::HandleEffectRemove(), AuraEffect::HandleModPossessPet(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandleSetRaidDifficultyOpcode(), ChaseMovementGenerator< T >::HasLostTarget(), Spell::InitExplicitTargets(), RotateMovementGenerator::Initialize(), IsMutualChase(), boss_ouro::IsPlayerWithinMeleeRange(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), npc_malchezaar_axe::JustEngagedWith(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::JustEngagedWith(), npc_zealot_zath::JustEngagedWith(), npc_yor::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_nethermancer_sepethrea::JustEngagedWith(), boss_vem::JustEngagedWith(), boss_veklor::JustEngagedWith(), boss_midnight::JustSummoned(), boss_nightbane::JustSummoned(), boss_halazzi::boss_halazziAI::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), boss_the_black_stalker::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), npc_emily::npc_emilyAI::JustSummoned(), PetAI::KilledUnit(), boss_ick::boss_ickAI::KilledUnit(), boss_flame_leviathan::boss_flame_leviathanAI::KilledUnit(), spell_svalna_revive_champion::spell_svalna_revive_champion_SpellScript::Land(), CreatureGroup::LeaderMoveTo(), CreatureGroup::MemberEngagingTarget(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), alliance_rifleman::alliance_riflemanAI::MoveInLineOfSight(), npc_kerlonian::npc_kerlonianAI::MoveInLineOfSight(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_ringo::npc_ringoAI::MoveInLineOfSight(), boss_gluth::boss_gluthAI::MoveInLineOfSight(), npc_future_you::npc_future_youAI::MoveInLineOfSight(), npc_captain_saeed::npc_captain_saeedAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), boss_ayamiss::MovementInform(), boss_bug_trio::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), boss_kaelthas::boss_kaelthasAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_kagani_nightstrike::MovementInform(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), NecroticPlagueTargetCheck::operator()(), NonTankTargetSelector::operator()(), BoneStormMoveTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), UnboundPlagueTargetSelector::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), boss_nefarian::PathEndReached(), SmartScript::ProcessEvent(), SmartScript::ProcessEventsFor(), SmartScript::ProcessTimedAction(), npc_mograine::npc_mograineAI::PullCathedral(), boss_grobbulus::boss_grobbulusAI::PullChamberAdds(), Creature::ReleaseFocus(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_pet_hunter_snake_trap::Reset(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), Resurrect(), boss_magtheridon::ScheduleCombatEvents(), boss_the_lurker_below::SchedulerPhaseOne(), npc_giant_claw_tentacle::ScheduleTasks(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), PetAI::SelectNextTarget(), UnitAI::SelectTargetList(), SmartAI::SetCombatMove(), SetConfused(), SetFeared(), SmartAI::SetForcedCombatMove(), SetStunned(), boss_murmur::ShouldCastResonance(), boss_razorscale::boss_razorscaleAI::SpellHit(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), npc_escortAI::Start(), FollowerAI::StartFollow(), StopAttackFaction(), StopAttackingInvalidTarget(), SummonCroneIfReady(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), boss_dorothee::SummonTito(), TauntApply(), TauntFadeOut(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Pet::Update(), Creature::Update(), Player::Update(), CasterAI::UpdateAI(), ArcherAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_general_angerforge::boss_general_angerforgeAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_broodlord::boss_broodlordAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_nightbane::UpdateAI(), boss_felblood_kaelthas::UpdateAI(), boss_kagani_nightstrike::UpdateAI(), boss_ellris_duskhallow::UpdateAI(), boss_eramas_brightblaze::UpdateAI(), boss_yazzai::UpdateAI(), boss_warlord_salaris::UpdateAI(), boss_garaxxas::UpdateAI(), boss_zelfan::UpdateAI(), boss_selin_fireheart::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_brutallus::boss_brutallusAI::UpdateAI(), boss_sacrolash::boss_sacrolashAI::UpdateAI(), boss_alythess::boss_alythessAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kalec::boss_kalecAI::UpdateAI(), boss_sathrovarr::boss_sathrovarrAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::UpdateAI(), boss_fenstalker::boss_fenstalkerAI::UpdateAI(), boss_nalorakk::boss_nalorakkAI::UpdateAI(), boss_zuljin::boss_zuljinAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_frost_wyrm::npc_frost_wyrmAI::UpdateAI(), npc_gargoyle::npc_gargoyleAI::UpdateAI(), alliance_rifleman::alliance_riflemanAI::UpdateAI(), hyjalAI::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_muglash::npc_muglashAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), boss_taldaram::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), npc_twilight_summon::npc_twilight_summonAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_razuvious::boss_razuviousAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), boss_anomalus::boss_anomalusAI::UpdateAI(), boss_commander_stoutbeard::boss_commander_stoutbeardAI::UpdateAI(), boss_keristrasza::boss_keristraszaAI::UpdateAI(), npc_crystalline_frayer::npc_crystalline_frayerAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::UpdateAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_watcher::npc_ulduar_dark_rune_watcherAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_xt002_pummeller::npc_xt002_pummellerAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), boss_keleseth::boss_kelesethAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), npc_azure_invader::npc_azure_invaderAI::UpdateAI(), npc_azure_raider::npc_azure_raiderAI::UpdateAI(), npc_azure_captain::npc_azure_captainAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_gurtogg_bloodboil::boss_gurtogg_bloodboilAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), boss_mother_shahraz::boss_shahrazAI::UpdateAI(), boss_essence_of_desire::boss_essence_of_desireAI::UpdateAI(), boss_essence_of_anger::boss_essence_of_angerAI::UpdateAI(), boss_shade_of_akama::UpdateAI(), npc_akama_shade::UpdateAI(), boss_supremus::UpdateAI(), boss_gathios_the_shatterer::boss_gathios_the_shattererAI::UpdateAI(), boss_high_nethermancer_zerevor::boss_high_nethermancer_zerevorAI::UpdateAI(), boss_lady_malande::boss_lady_malandeAI::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), boss_alar::boss_alarAI::UpdateAI(), boss_kaelthas::boss_kaelthasAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), guard_shattrath_scryer::guard_shattrath_scryerAI::UpdateAI(), guard_shattrath_aldor::guard_shattrath_aldorAI::UpdateAI(), generic_creature::generic_creatureAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), PossessedAI::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_zuljin_vortex::npc_zuljin_vortexAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), npc_pet_gen_gnomish_flame_turret::UpdateAI(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_akama_illidan::npc_akama_illidanAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), Player::UpdateFFAPvPFlag(), Player::UpdateFFAPvPState(), SmartAI::UpdatePath(), boss_netherspite::UpdatePortals(), CreatureAI::UpdateVictim(), CreatureAI::UpdateVictimWithGaze(), and boss_hexlord_malacrass::boss_hex_lord_malacrassAI::UseAbility().

◆ GetVisibleAura()

AuraApplication * Unit::GetVisibleAura ( uint8  slot)
inline
2167 {
2168 VisibleAuraMap::iterator itr = m_visibleAuras.find(slot);
2169 if (itr != m_visibleAuras.end())
2170 return itr->second;
2171 return nullptr;
2172 }

References m_visibleAuras.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), AuraApplication::BuildUpdatePacket(), and WorldSession::HandleRequestPartyMemberStatsOpcode().

◆ GetVisibleAuras()

◆ GetWeaponDamageRange()

float Unit::GetWeaponDamageRange ( WeaponAttackType  attType,
WeaponDamageRange  type,
uint8  damageIndex = 0 
) const
15439{
15440 if (attType == OFF_ATTACK && !haveOffhandWeapon())
15441 return 0.0f;
15442
15443 return m_weaponDamage[attType][type][damageIndex];
15444}

References haveOffhandWeapon(), m_weaponDamage, and OFF_ATTACK.

Referenced by Player::_ApplyWeaponDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and Guardian::UpdateDamagePhysical().

◆ GetWeaponProcChance()

float Unit::GetWeaponProcChance ( ) const
13435{
13436 // normalized proc chance for weapon attack speed
13437 // (odd formula...)
13439 return (GetAttackTime(BASE_ATTACK) * 1.8f / 1000.0f);
13441 return (GetAttackTime(OFF_ATTACK) * 1.6f / 1000.0f);
13442 return 0;
13443}

References BASE_ATTACK, GetAttackTime(), haveOffhandWeapon(), isAttackReady(), and OFF_ATTACK.

Referenced by Player::CastItemCombatSpell().

◆ GetWeaponSkillValue()

uint32 Unit::GetWeaponSkillValue ( WeaponAttackType  attType,
Unit const *  target = nullptr 
) const
3754{
3755 uint32 value = 0;
3756 if (Player const* player = ToPlayer())
3757 {
3758 Item* item = player->GetWeaponForAttack(attType, true);
3759
3760 // feral or unarmed skill only for base attack
3761 if (attType != BASE_ATTACK && !item)
3762 return 0;
3763
3764 if (IsInFeralForm())
3765 return GetMaxSkillValueForLevel(); // always maximized SKILL_FERAL_COMBAT in fact
3766
3767 // weapon skill or (unarmed for base attack)
3768 uint32 skill = SKILL_UNARMED;
3769 if (item)
3770 skill = item->GetSkill();
3771
3772 // in PvP use full skill instead current skill value
3773 value = (target && target->IsControlledByPlayer())
3774 ? player->GetMaxSkillValue(skill)
3775 : player->GetSkillValue(skill);
3776 // Modify value from ratings
3777 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL));
3778 switch (attType)
3779 {
3780 case BASE_ATTACK:
3781 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_MAINHAND));
3782 break;
3783 case OFF_ATTACK:
3784 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_OFFHAND));
3785 break;
3786 case RANGED_ATTACK:
3787 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_RANGED));
3788 break;
3789 default:
3790 break;
3791 }
3792 }
3793 else
3794 value = GetUnitMeleeSkill(target);
3795 return value;
3796}
@ CR_WEAPON_SKILL_RANGED
Definition: Unit.h:426
@ CR_WEAPON_SKILL
Definition: Unit.h:404
@ CR_WEAPON_SKILL_OFFHAND
Definition: Unit.h:425
@ CR_WEAPON_SKILL_MAINHAND
Definition: Unit.h:424
@ SKILL_UNARMED
Definition: SharedDefines.h:2907
uint32 GetSkill()
Definition: Item.cpp:556
bool IsInFeralForm() const
Definition: Unit.h:2091

References BASE_ATTACK, CR_WEAPON_SKILL, CR_WEAPON_SKILL_MAINHAND, CR_WEAPON_SKILL_OFFHAND, CR_WEAPON_SKILL_RANGED, GetMaxSkillValueForLevel(), Item::GetSkill(), GetUnitMeleeSkill(), IsControlledByPlayer(), IsInFeralForm(), OFF_ATTACK, RANGED_ATTACK, SKILL_UNARMED, and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), and Player::UpdateCritPercentage().

◆ HandleAuraProc()

bool Unit::HandleAuraProc ( Unit victim,
uint32  damage,
Aura triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
bool *  handled 
)
private
8727{
8728 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
8729
8730 switch (dummySpell->SpellFamilyName)
8731 {
8733 switch (dummySpell->Id)
8734 {
8735 // Nevermelting Ice Crystal
8736 case 71564:
8737 RemoveAuraFromStack(71564);
8738 *handled = true;
8739 break;
8740 // Gaseous Bloat
8741 case 70672:
8742 case 72455:
8743 case 72832:
8744 case 72833:
8745 {
8746 if (Unit* caster = triggeredByAura->GetCaster())
8747 if (victim && caster->GetGUID() == victim->GetGUID())
8748 {
8749 *handled = true;
8750 uint32 stack = triggeredByAura->GetStackAmount();
8751 int32 const mod = (GetMap()->GetSpawnMode() & 1) ? 1500 : 1250;
8752 int32 dmg = 0;
8753 for (uint8 i = 1; i <= stack; ++i)
8754 dmg += mod * i;
8755 caster->CastCustomSpell(70701, SPELLVALUE_BASE_POINT0, dmg);
8756 }
8757 break;
8758 }
8759 // Ball of Flames Proc
8760 case 71756:
8761 case 72782:
8762 case 72783:
8763 case 72784:
8764 RemoveAuraFromStack(dummySpell->Id);
8765 *handled = true;
8766 break;
8767 // Discerning Eye of the Beast
8768 case 59915:
8769 {
8770 CastSpell(this, 59914, true); // 59914 already has correct basepoints in DBC, no need for custom bp
8771 *handled = true;
8772 break;
8773 }
8774 // Swift Hand of Justice
8775 case 59906:
8776 {
8777 int32 bp0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_0]. CalcValue());
8778 CastCustomSpell(this, 59913, &bp0, nullptr, nullptr, true);
8779 *handled = true;
8780 break;
8781 }
8782 }
8783
8784 break;
8785 case SPELLFAMILY_MAGE:
8786 {
8787 // Combustion
8788 switch (dummySpell->Id)
8789 {
8790 case 11129:
8791 {
8792 *handled = true;
8793 Unit* caster = triggeredByAura->GetCaster();
8794 if (!caster || !damage)
8795 return false;
8796
8797 // last charge and crit
8798 if (triggeredByAura->GetCharges() <= 1 && (procEx & PROC_EX_CRITICAL_HIT))
8799 return true; // charge counting (will removed)
8800
8801 CastSpell(this, 28682, true);
8802
8803 return procEx & PROC_EX_CRITICAL_HIT;
8804 }
8805 // Empowered Fire
8806 case 31656:
8807 case 31657:
8808 case 31658:
8809 {
8810 *handled = true;
8811
8812 SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(67545);
8813 if (!spInfo)
8814 return false;
8815
8816 int32 bp0 = int32(CalculatePct(GetMaxPower(POWER_MANA), spInfo->Effects[0].CalcValue()));
8817 CastCustomSpell(this, 67545, &bp0, nullptr, nullptr, true, nullptr, triggeredByAura->GetEffect(EFFECT_0), GetGUID());
8818 return true;
8819 }
8820 }
8821 break;
8822 }
8824 {
8825 // Blood of the North
8826 // Reaping
8827 // Death Rune Mastery
8828 // xinef: Icon 22 is used for item bonus, skip
8829 if (dummySpell->SpellIconID == 3041 || (dummySpell->SpellIconID == 22 && dummySpell->Id != 62459) || dummySpell->SpellIconID == 2622)
8830 {
8831 *handled = true;
8832 // Convert recently used Blood Rune to Death Rune
8833 if (Player* player = ToPlayer())
8834 {
8835 if (player->getClass() != CLASS_DEATH_KNIGHT)
8836 return false;
8837
8838 // xinef: not true
8839 //RuneType rune = ToPlayer()->GetLastUsedRune();
8840 // can't proc from death rune use
8841 //if (rune == RUNE_DEATH)
8842 // return false;
8843 AuraEffect* aurEff = triggeredByAura->GetEffect(EFFECT_0);
8844 if (!aurEff)
8845 return false;
8846
8847 // Reset amplitude - set death rune remove timer to 30s
8848 aurEff->ResetPeriodic(true);
8849 uint32 runesLeft;
8850
8851 if (dummySpell->SpellIconID == 2622)
8852 runesLeft = 2;
8853 else
8854 runesLeft = 1;
8855
8856 for (uint8 i = 0; i < MAX_RUNES && runesLeft; ++i)
8857 {
8858 if (dummySpell->SpellIconID == 2622)
8859 {
8860 if (player->GetCurrentRune(i) == RUNE_DEATH ||
8861 player->GetBaseRune(i) == RUNE_BLOOD)
8862 continue;
8863 }
8864 else
8865 {
8866 if (player->GetCurrentRune(i) == RUNE_DEATH ||
8867 player->GetBaseRune(i) != RUNE_BLOOD)
8868 continue;
8869 }
8870 if (player->GetRuneCooldown(i) != player->GetRuneBaseCooldown(i, false))
8871 continue;
8872
8873 --runesLeft;
8874 // Mark aura as used
8875 player->AddRuneByAuraEffect(i, RUNE_DEATH, aurEff);
8876 }
8877 return true;
8878 }
8879 return false;
8880 }
8881 break;
8882 }
8884 {
8885 switch (dummySpell->Id)
8886 {
8887 // Item - Warrior T10 Protection 4P Bonus
8888 case 70844:
8889 {
8890 int32 basepoints0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_1]. CalcValue());
8891 CastCustomSpell(this, 70845, &basepoints0, nullptr, nullptr, true);
8892 break;
8893 }
8894 default:
8895 break;
8896 }
8897 break;
8898 }
8899 case SPELLFAMILY_SHAMAN:
8900 {
8901 // Flurry
8902 if ((dummySpell->SpellFamilyFlags[1] & 0x00000200) != 0)
8903 {
8904 if (cooldown)
8905 {
8906 if (HasSpellCooldown(dummySpell->Id))
8907 {
8908 *handled = true;
8909 break;
8910 }
8911
8912 AddSpellCooldown(dummySpell->Id, 0, cooldown);
8913 }
8914 }
8915 break;
8916 }
8917 }
8918 return false;
8919}
@ RUNE_DEATH
Definition: Player.h:413
@ RUNE_BLOOD
Definition: Player.h:410
@ EFFECT_1
Definition: SharedDefines.h:32
@ EFFECT_0
Definition: SharedDefines.h:31
@ SPELLFAMILY_MAGE
Definition: SharedDefines.h:3531
@ SPELLFAMILY_GENERIC
Definition: SharedDefines.h:3528
@ SPELLFAMILY_WARRIOR
Definition: SharedDefines.h:3532
@ SPELLFAMILY_SHAMAN
Definition: SharedDefines.h:3539
@ SPELLFAMILY_DEATHKNIGHT
Definition: SharedDefines.h:3543
virtual bool HasSpellCooldown(uint32) const
Definition: Unit.h:2432
virtual void AddSpellCooldown(uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
Definition: Unit.h:2434
void RemoveAuraFromStack(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4871
uint8 GetSpawnMode() const
Definition: Map.h:420
void ResetPeriodic(bool resetPeriodicTimer=false)
Definition: SpellAuraEffects.h:89
AuraEffect * GetEffect(uint8 effIndex) const
Definition: SpellAuras.h:175

References AddSpellCooldown(), CalculatePct(), CastCustomSpell(), CastSpell(), CLASS_DEATH_KNIGHT, EFFECT_0, EFFECT_1, SpellInfo::Effects, Aura::GetCaster(), Aura::GetCharges(), Aura::GetEffect(), Object::GetGUID(), WorldObject::GetMap(), GetMaxHealth(), GetMaxPower(), Map::GetSpawnMode(), Aura::GetSpellInfo(), Aura::GetStackAmount(), HasSpellCooldown(), SpellInfo::Id, MAX_RUNES, POWER_MANA, PROC_EX_CRITICAL_HIT, RemoveAuraFromStack(), AuraEffect::ResetPeriodic(), RUNE_BLOOD, RUNE_DEATH, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_GENERIC, SPELLFAMILY_MAGE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, sSpellMgr, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromCharge()

bool Unit::HandleAuraRaidProcFromCharge ( AuraEffect triggeredByAura)
private
17906{
17907 // aura can be deleted at casts
17908 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17909
17910 uint32 damageSpellId;
17911 switch (spellProto->Id)
17912 {
17913 case 57949: // shiver
17914 damageSpellId = 57952;
17915 //animationSpellId = 57951; dummy effects for jump spell have unknown use (see also 41637)
17916 break;
17917 case 59978: // shiver
17918 damageSpellId = 59979;
17919 break;
17920 case 43593: // Cold Stare
17921 damageSpellId = 43594;
17922 break;
17923 default:
17924 LOG_ERROR("entities.unit", "Unit::HandleAuraRaidProcFromCharge, received unhandled spell: {}", spellProto->Id);
17925 return false;
17926 }
17927
17928 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17929
17930 // jumps
17931 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17932
17933 // current aura expire
17934 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17935
17936 // next target selection
17937 if (jumps > 0)
17938 {
17939 if (Unit* caster = triggeredByAura->GetCaster())
17940 {
17941 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17942 if (Unit* target = GetNextRandomRaidMemberOrPet(radius))
17943 {
17944 CastSpell(target, spellProto, true, nullptr, triggeredByAura, caster_guid);
17945 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17946 aura->SetCharges(jumps);
17947 }
17948 }
17949 }
17950
17951 CastSpell(this, damageSpellId, true, nullptr, triggeredByAura, caster_guid);
17952
17953 return true;
17954}
Unit * GetNextRandomRaidMemberOrPet(float radius)
Definition: Unit.cpp:11108
void SetCharges(uint8 charges)
Definition: SpellAuras.cpp:966

References CastSpell(), SpellInfo::Effects, AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), GetNextRandomRaidMemberOrPet(), AuraEffect::GetSpellInfo(), SpellInfo::Id, LOG_ERROR, and Aura::SetCharges().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromChargeWithValue()

bool Unit::HandleAuraRaidProcFromChargeWithValue ( AuraEffect triggeredByAura)
private
17817{
17818 // aura can be deleted at casts
17819 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17820 int32 heal = triggeredByAura->GetAmount();
17821 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17822
17823 // Currently only Prayer of Mending
17824 if (!(spellProto->SpellFamilyName == SPELLFAMILY_PRIEST && spellProto->SpellFamilyFlags[1] & 0x20))
17825 {
17826 LOG_DEBUG("spells.aura", "Unit::HandleAuraRaidProcFromChargeWithValue, received not handled spell: {}", spellProto->Id);
17827 return false;
17828 }
17829
17830 // jumps
17831 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17832
17833 // current aura expire
17834 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17835
17836 // next target selection
17837 if (jumps > 0)
17838 {
17839 if (Unit* caster = triggeredByAura->GetCaster())
17840 {
17841 // smart healing
17842 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17843 std::list<Unit*> nearMembers;
17844
17845 Player* player = nullptr;
17846 if (GetTypeId() == TYPEID_PLAYER)
17847 player = ToPlayer();
17848 else if (GetOwner())
17849 player = GetOwner()->ToPlayer();
17850
17851 if (player)
17852 {
17853 Group* group = player->GetGroup();
17854 if (!group)
17855 {
17856 if (player != this)
17857 {
17858 if (IsWithinDistInMap(player, radius))
17859 nearMembers.push_back(player);
17860 }
17861 else if (Unit* pet = GetGuardianPet())
17862 {
17863 if (IsWithinDistInMap(pet, radius))
17864 nearMembers.push_back(pet);
17865 }
17866 }
17867 else
17868 {
17869 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
17870 if (Player* Target = itr->GetSource())
17871 {
17872 if (Target != this && !IsWithinDistInMap(Target, radius))
17873 continue;
17874
17875 // IsHostileTo check duel and controlled by enemy
17876 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
17877 nearMembers.push_back(Target);
17878
17879 // Push player's pet to vector
17880 if (Unit* pet = Target->GetGuardianPet())
17881 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
17882 nearMembers.push_back(pet);
17883 }
17884 }
17885
17886 if (!nearMembers.empty())
17887 {
17888 nearMembers.sort(Acore::HealthPctOrderPred());
17889 if (Unit* target = nearMembers.front())
17890 {
17891 CastSpell(target, 41637 /*Dummy visual effect triggered by main spell cast*/, true);
17892 CastCustomSpell(target, spellProto->Id, &heal, nullptr, nullptr, true, nullptr, triggeredByAura, caster_guid);
17893 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17894 aura->SetCharges(jumps);
17895 }
17896 }
17897 }
17898 }
17899 }
17900
17901 // heal
17902 CastCustomSpell(this, 33110, &heal, nullptr, nullptr, true, nullptr, nullptr, caster_guid);
17903 return true;
17904}
@ SPELLFAMILY_PRIEST
Definition: SharedDefines.h:3534
Definition: Unit.h:2646

References CastCustomSpell(), CastSpell(), SpellInfo::Effects, AuraEffect::GetAmount(), AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), GetOwner(), AuraEffect::GetSpellInfo(), Object::GetTypeId(), SpellInfo::Id, IsHostileTo(), WorldObject::IsWithinDistInMap(), LOG_DEBUG, GroupReference::next(), Aura::SetCharges(), SPELLFAMILY_PRIEST, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by ProcDamageAndSpellFor().

◆ HandleDummyAuraProc()

bool Unit::HandleDummyAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
ProcEventInfo const &  eventInfo 
)
private
Todo:
: It should be moved to database, shouldn't it?
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
Todo:
: need more info (cooldowns/PPM)
6528{
6529 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
6530 uint32 effIndex = triggeredByAura->GetEffIndex();
6531 int32 triggerAmount = triggeredByAura->GetAmount();
6532 Spell const* spellProc = eventInfo.GetProcSpell();
6533
6534 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && GetTypeId() == TYPEID_PLAYER
6535 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
6536
6537 uint32 triggered_spell_id = 0;
6538 uint32 cooldown_spell_id = 0; // for random trigger, will be one of the triggered spell to avoid repeatable triggers
6539 // otherwise, it's the triggered_spell_id by default
6540 Unit* target = victim;
6541 int32 basepoints0 = 0;
6542 ObjectGuid originalCaster;
6543
6544 switch (dummySpell->SpellFamilyName)
6545 {
6547 {
6548 switch (dummySpell->Id)
6549 {
6550 // Overkill
6551 case 58426:
6552 {
6553 triggered_spell_id = 58427;
6554 break;
6555 }
6556 // Unstable Power
6557 case 24658:
6558 {
6559 if (!procSpell || procSpell->Id == 24659)
6560 return false;
6561 // Need remove one 24659 aura
6562 RemoveAuraFromStack(24659);
6563 return true;
6564 }
6565 // Restless Strength
6566 case 24661:
6567 {
6568 // Need remove one 24662 aura
6569 RemoveAuraFromStack(24662);
6570 return true;
6571 }
6572 // Mark of Malice
6573 case 33493:
6574 {
6575 if (triggeredByAura->GetBase()->GetCharges() > 1)
6576 return true;
6577
6578 target = this;
6579 triggered_spell_id = 33494;
6580 break;
6581 }
6582 // Twisted Reflection (boss spell)
6583 case 21063:
6584 triggered_spell_id = 21064;
6585 break;
6586 // Vampiric Aura (boss spell)
6587 case 38196:
6588 {
6589 basepoints0 = 3 * damage; // 300%
6590 if (basepoints0 < 0)
6591 return false;
6592
6593 triggered_spell_id = 31285;
6594 target = this;
6595 break;
6596 }
6597 // Aura of Madness (Darkmoon Card: Madness trinket)
6598 //=====================================================
6599 // 39511 Sociopath: +35 strength (Paladin, Rogue, Druid, Warrior)
6600 // 40997 Delusional: +70 attack power (Rogue, Hunter, Paladin, Warrior, Druid)
6601 // 40998 Kleptomania: +35 agility (Warrior, Rogue, Paladin, Hunter, Druid)
6602 // 40999 Megalomania: +41 damage/healing (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6603 // 41002 Paranoia: +35 spell/melee/ranged crit strike rating (All classes)
6604 // 41005 Manic: +35 haste (spell, melee and ranged) (All classes)
6605 // 41009 Narcissism: +35 intellect (Druid, Shaman, Priest, Warlock, Mage, Paladin, Hunter)
6606 // 41011 Martyr Complex: +35 stamina (All classes)
6607 // 41406 Dementia: Every 5 seconds either gives you +5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6608 // 41409 Dementia: Every 5 seconds either gives you -5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6609 case 39446:
6610 {
6611 if (GetTypeId() != TYPEID_PLAYER || !IsAlive())
6612 return false;
6613
6614 // Select class defined buff
6615 switch (getClass())
6616 {
6617 case CLASS_PALADIN: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6618 case CLASS_DRUID: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6619 triggered_spell_id = RAND(39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409);
6620 cooldown_spell_id = 39511;
6621 break;
6622 case CLASS_ROGUE: // 39511, 40997, 40998, 41002, 41005, 41011
6623 case CLASS_WARRIOR: // 39511, 40997, 40998, 41002, 41005, 41011
6624 case CLASS_DEATH_KNIGHT:
6625 triggered_spell_id = RAND(39511, 40997, 40998, 41002, 41005, 41011);
6626 cooldown_spell_id = 39511;
6627 break;
6628 case CLASS_PRIEST: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6629 case CLASS_SHAMAN: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6630 case CLASS_MAGE: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6631 case CLASS_WARLOCK: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6632 triggered_spell_id = RAND(40999, 41002, 41005, 41009, 41011, 41406, 41409);
6633 cooldown_spell_id = 40999;
6634 break;
6635 case CLASS_HUNTER: // 40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409
6636 triggered_spell_id = RAND(40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409);
6637 cooldown_spell_id = 40997;
6638 break;
6639 default:
6640 return false;
6641 }
6642
6643 target = this;
6644 if (roll_chance_i(10))
6645 ToPlayer()->Say("This is Madness!", LANG_UNIVERSAL);
6646 break;
6647 }
6648 // Sunwell Exalted Caster Neck (??? neck)
6649 // cast ??? Light's Wrath if Exalted by Aldor
6650 // cast ??? Arcane Bolt if Exalted by Scryers
6651 case 46569:
6652 return false; // old unused version
6653 // Sunwell Exalted Caster Neck (Shattered Sun Pendant of Acumen neck)
6654 // cast 45479 Light's Wrath if Exalted by Aldor
6655 // cast 45429 Arcane Bolt if Exalted by Scryers
6656 case 45481:
6657 {
6658 Player* player = ToPlayer();
6659 if (!player)
6660 return false;
6661
6662 // Get Aldor reputation rank
6663 if (player->GetReputationRank(932) == REP_EXALTED)
6664 {
6665 target = this;
6666 triggered_spell_id = 45479;
6667 break;
6668 }
6669 // Get Scryers reputation rank
6670 if (player->GetReputationRank(934) == REP_EXALTED)
6671 {
6672 // triggered at positive/self casts also, current attack target used then
6673 if (target && IsFriendlyTo(target))
6674 {
6675 target = GetVictim();
6676 if (!target)
6677 {
6678 target = player->GetSelectedUnit();
6679 if (!target)
6680 return false;
6681 }
6682 if (IsFriendlyTo(target))
6683 return false;
6684 }
6685
6686 triggered_spell_id = 45429;
6687 break;
6688 }
6689 return false;
6690 }
6691 // Sunwell Exalted Melee Neck (Shattered Sun Pendant of Might neck)
6692 // cast 45480 Light's Strength if Exalted by Aldor
6693 // cast 45428 Arcane Strike if Exalted by Scryers
6694 case 45482:
6695 {
6696 if (GetTypeId() != TYPEID_PLAYER)
6697 return false;
6698
6699 // Get Aldor reputation rank
6700 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6701 {
6702 target = this;
6703 triggered_spell_id = 45480;
6704 break;
6705 }
6706 // Get Scryers reputation rank
6707 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6708 {
6709 triggered_spell_id = 45428;
6710 break;
6711 }
6712 return false;
6713 }
6714 // Sunwell Exalted Tank Neck (Shattered Sun Pendant of Resolve neck)
6715 // cast 45431 Arcane Insight if Exalted by Aldor
6716 // cast 45432 Light's Ward if Exalted by Scryers
6717 case 45483:
6718 {
6719 if (GetTypeId() != TYPEID_PLAYER)
6720 return false;
6721
6722 // Get Aldor reputation rank
6723 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6724 {
6725 target = this;
6726 triggered_spell_id = 45432;
6727 break;
6728 }
6729 // Get Scryers reputation rank
6730 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6731 {
6732 target = this;
6733 triggered_spell_id = 45431;
6734 break;
6735 }
6736 return false;
6737 }
6738 // Sunwell Exalted Healer Neck (Shattered Sun Pendant of Restoration neck)
6739 // cast 45478 Light's Salvation if Exalted by Aldor
6740 // cast 45430 Arcane Surge if Exalted by Scryers
6741 case 45484:
6742 {
6743 if (GetTypeId() != TYPEID_PLAYER)
6744 return false;
6745
6746 // Get Aldor reputation rank
6747 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6748 {
6749 target = this;
6750 triggered_spell_id = 45478;
6751 break;
6752 }
6753 // Get Scryers reputation rank
6754 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6755 {
6756 triggered_spell_id = 45430;
6757 break;
6758 }
6759 return false;
6760 }
6761 // Kill command
6762 case 58914:
6763 {
6764 // Remove aura stack from pet
6765 RemoveAuraFromStack(58914);
6766 Unit* owner = GetOwner();
6767 if (!owner)
6768 return true;
6769 // reduce the owner's aura stack
6770 owner->RemoveAuraFromStack(34027);
6771 return true;
6772 }
6773 // Vampiric Touch (generic, used by some boss)
6774 case 52723:
6775 case 60501:
6776 {
6777 triggered_spell_id = 52724;
6778 basepoints0 = damage / 2;
6779 target = this;
6780 break;
6781 }
6782 // Divine purpose
6783 case 31871:
6784 case 31872:
6785 {
6786 // Roll chane
6787 if (!victim || !victim->IsAlive() || !roll_chance_i(triggerAmount))
6788 return false;
6789
6790 // Remove any stun effect on target
6792 return true;
6793 }
6794 // Glyph of Life Tap
6795 case 63320:
6796 {
6797 triggered_spell_id = 63321; // Life Tap
6798 break;
6799 }
6800 case 71519: // Deathbringer's Will Normal
6801 {
6802 if (GetTypeId() != TYPEID_PLAYER || HasSpellCooldown(71484))
6803 return false;
6804
6805 AddSpellCooldown(71484, 0, cooldown);
6806
6807 std::vector<uint32> RandomSpells;
6808 switch (getClass())
6809 {
6810 case CLASS_WARRIOR:
6811 case CLASS_PALADIN:
6812 case CLASS_DEATH_KNIGHT:
6813 RandomSpells.push_back(71484);
6814 RandomSpells.push_back(71491);
6815 RandomSpells.push_back(71492);
6816 break;
6817 case CLASS_SHAMAN:
6818 case CLASS_ROGUE:
6819 RandomSpells.push_back(71486);
6820 RandomSpells.push_back(71485);
6821 RandomSpells.push_back(71492);
6822 break;
6823 case CLASS_DRUID:
6824 RandomSpells.push_back(71484);
6825 RandomSpells.push_back(71485);
6826 RandomSpells.push_back(71492);
6827 break;
6828 case CLASS_HUNTER:
6829 RandomSpells.push_back(71486);
6830 RandomSpells.push_back(71491);
6831 RandomSpells.push_back(71485);
6832 break;
6833 default:
6834 return false;
6835 }
6836 if (RandomSpells.empty()) // shouldn't happen
6837 return false;
6838
6839 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
6840 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
6841 break;
6842 }
6843 case 71562: // Deathbringer's Will Heroic
6844 {
6845 if (GetTypeId() != TYPEID_PLAYER || HasSpellCooldown(71561))
6846 return false;
6847
6848 AddSpellCooldown(71561, 0, cooldown);
6849
6850 std::vector<uint32> RandomSpells;
6851 switch (getClass())
6852 {
6853 case CLASS_WARRIOR:
6854 case CLASS_PALADIN:
6855 case CLASS_DEATH_KNIGHT:
6856 RandomSpells.push_back(71561);
6857 RandomSpells.push_back(71559);
6858 RandomSpells.push_back(71560);
6859 break;
6860 case CLASS_SHAMAN:
6861 case CLASS_ROGUE:
6862 RandomSpells.push_back(71558);
6863 RandomSpells.push_back(71556);
6864 RandomSpells.push_back(71560);
6865 break;
6866 case CLASS_DRUID:
6867 RandomSpells.push_back(71561);
6868 RandomSpells.push_back(71556);
6869 RandomSpells.push_back(71560);
6870 break;
6871 case CLASS_HUNTER:
6872 RandomSpells.push_back(71558);
6873 RandomSpells.push_back(71559);
6874 RandomSpells.push_back(71556);
6875 break;
6876 default:
6877 return false;
6878 }
6879 if (RandomSpells.empty()) // shouldn't happen
6880 return false;
6881
6882 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
6883 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
6884 break;
6885 }
6886 // Freya, Petrified Bark
6887 case 62933:
6888 case 62337:
6889 {
6890 if (!victim)
6891 return false;
6892
6893 int32 dmg = damage;
6894 victim->CastCustomSpell(this, 62379, &dmg, 0, 0, true);
6895 return true;
6896 }
6897 // Trial of the Champion, Earth Shield
6898 case 67534:
6899 {
6900 const int32 dmg = (int32)damage;
6901 CastCustomSpell(this, 67535, &dmg, nullptr, nullptr, true, 0, triggeredByAura, triggeredByAura->GetCasterGUID());
6902 return true;
6903 }
6904 // Trial of the Crusader, Faction Champions, Retaliation
6905 case 65932:
6906 {
6907 // check attack comes not from behind
6908 if (!victim || !HasInArc(M_PI, victim))
6909 return false;
6910
6911 triggered_spell_id = 65934;
6912 break;
6913 }
6914 // Pit of Saron, Tyrannus, Overlord's Brand
6915 case 69172: // everything except for DoTs
6916 {
6917 if (!target)
6918 return false;
6919 if (Unit* caster = triggeredByAura->GetCaster())
6920 {
6922 {
6923 int32 dmg = 5.5f * damage;
6924 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
6925 }
6926 else
6927 {
6928 if (caster->GetVictim())
6929 {
6930 int32 dmg = damage;
6931 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
6932 }
6933 }
6934 }
6935 return true;
6936 }
6937 // Pit of Saron, Tyrannus, Overlord's Brand
6938 case 69173: // only DoTs
6939 {
6940 if (!target)
6941 return false;
6942 if (Unit* caster = triggeredByAura->GetCaster())
6943 {
6944 if (procEx & PROC_EX_INTERNAL_HOT)
6945 {
6946 int32 dmg = 5.5f * damage;
6947 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
6948 }
6949 else
6950 {
6951 if (caster->GetVictim())
6952 {
6953 int32 dmg = damage;
6954 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
6955 }
6956 }
6957 }
6958 return true;
6959 }
6960 // Icecrown Citadel, Lady Deathwhisper, Vampiric Might
6961 case 70674:
6962 {
6963 if (Unit* caster = triggeredByAura->GetCaster())
6964 {
6965 int32 dmg = 3 * damage;
6966 caster->CastCustomSpell(caster, 70677, &dmg, 0, 0, true);
6967 }
6968 return true;
6969 }
6970 // Item: Purified Shard of the Gods
6971 case 69755:
6972 {
6973 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69733 : 69729);
6974 break;
6975 }
6976 // Item: Shiny Shard of the Gods
6977 case 69739:
6978 {
6979 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69734 : 69730);
6980 break;
6981 }
6982 // VoA: Meteor Fists koralon
6983 case 66725:
6984 case 68161:
6985 {
6986 triggered_spell_id = 66765; // handled by spell_difficulty
6987 break;
6988 }
6989 }
6990 break;
6991 }
6992 case SPELLFAMILY_MAGE:
6993 {
6994 // Magic Absorption
6995 if (dummySpell->SpellIconID == 459) // only this spell has SpellIconID == 459 and dummy aura
6996 {
6997 if (getPowerType() != POWER_MANA)
6998 return false;
6999
7000 // mana reward
7001 basepoints0 = CalculatePct(int32(GetMaxPower(POWER_MANA)), triggerAmount);
7002 target = this;
7003 triggered_spell_id = 29442;
7004 break;
7005 }
7006 // Hot Streak
7007 if (dummySpell->SpellIconID == 2999)
7008 {
7009 if (effIndex != 0)
7010 return false;
7011 AuraEffect* counter = triggeredByAura->GetBase()->GetEffect(EFFECT_1);
7012 if (!counter)
7013 return true;
7014
7015 // Count spell criticals in a row in second aura
7016 if (procEx & PROC_EX_CRITICAL_HIT)
7017 {
7018 counter->SetAmount(counter->GetAmount() * 2);
7019 if (counter->GetAmount() < 100) // not enough
7020 return true;
7021 // Crititcal counted -> roll chance
7022 if (roll_chance_i(triggerAmount))
7023 CastSpell(this, 48108, true, castItem, triggeredByAura);
7024 }
7025 counter->SetAmount(25);
7026 return true;
7027 }
7028 // Incanter's Regalia set (add trigger chance to Mana Shield)
7029 if (dummySpell->SpellFamilyFlags[0] & 0x8000)
7030 {
7031 if (GetTypeId() != TYPEID_PLAYER)
7032 return false;
7033
7034 target = this;
7035 triggered_spell_id = 37436;
7036 break;
7037 }
7038 switch (dummySpell->Id)
7039 {
7040 // Glyph of Polymorph
7041 case 56375:
7042 {
7043 if (!target)
7044 return false;
7045 target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, ObjectGuid::Empty, target->GetAura(32409)); // SW:D shall not be removed.
7048 return true;
7049 }
7050 // Glyph of Icy Veins
7051 case 56374:
7052 {
7055 return true;
7056 }
7057 // Glyph of Ice Block
7058 case 56372:
7059 {
7060 Player* player = ToPlayer();
7061 if (!player)
7062 return false;
7063
7064 SpellCooldowns const cooldowns = player->GetSpellCooldowns();
7065 // remove cooldowns on all ranks of Frost Nova
7066 for (SpellCooldowns::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
7067 {
7068 SpellInfo const* cdSpell = sSpellMgr->GetSpellInfo(itr->first);
7069 // Frost Nova
7070 if (cdSpell && cdSpell->SpellFamilyName == SPELLFAMILY_MAGE
7071 && cdSpell->SpellFamilyFlags[0] & 0x00000040)
7072 player->RemoveSpellCooldown(cdSpell->Id, true);
7073 }
7074 break;
7075 }
7076 }
7077 break;
7078 }
7080 {
7081 switch (dummySpell->Id)
7082 {
7083 // Victorious
7084 case 32216:
7085 {
7086 RemoveAura(dummySpell->Id);
7087 return false;
7088 }
7089 }
7090
7091 // Second Wind
7092 if (dummySpell->SpellIconID == 1697)
7093 {
7094 // only for spells and hit/crit (trigger start always) and not start from self casted spells (5530 Mace Stun Effect for example)
7095 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
7096 return false;
7097 // Need stun or root mechanic
7098 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN))))
7099 return false;
7100
7101 switch (dummySpell->Id)
7102 {
7103 case 29838:
7104 triggered_spell_id = 29842;
7105 break;
7106 case 29834:
7107 triggered_spell_id = 29841;
7108 break;
7109 case 42770:
7110 triggered_spell_id = 42771;
7111 break;
7112 default:
7113 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled spell id: {} (SW)", dummySpell->Id);
7114 return false;
7115 }
7116
7117 target = this;
7118 break;
7119 }
7120 break;
7121 }
7123 {
7124 // Seed of Corruption
7125 if (dummySpell->SpellFamilyFlags[1] & 0x00000010)
7126 {
7127 if (procSpell && procSpell->SpellFamilyFlags[1] & 0x8000)
7128 return false;
7129 // if damage is more than need or target die from damage deal finish spell
7130 if (triggeredByAura->GetAmount() <= int32(damage) || GetHealth() <= damage)
7131 {
7132 // remember guid before aura delete
7133 ObjectGuid casterGuid = triggeredByAura->GetCasterGUID();
7134
7135 // Remove aura (before cast for prevent infinite loop handlers)
7136 RemoveAurasDueToSpell(triggeredByAura->GetId());
7137
7138 uint32 spell = sSpellMgr->GetSpellWithRank(27285, dummySpell->GetRank());
7139
7140 // Cast finish spell (triggeredByAura already not exist!)
7141 if (Unit* caster = ObjectAccessor::GetUnit(*this, casterGuid))
7142 {
7143 this->CastSpell(this, 37826, true); // VISUAL!
7144 caster->CastSpell(this, spell, true, castItem);
7145 }
7146
7147 return true; // no hidden cooldown
7148 }
7149
7150 // Damage counting
7151 triggeredByAura->SetAmount(triggeredByAura->GetAmount() - damage);
7152 return true;
7153 }
7154 // Seed of Corruption (Mobs cast) - no die req
7155 if (dummySpell->SpellFamilyFlags.IsEqual(0, 0, 0) && dummySpell->SpellIconID == 1932)
7156 {
7157 // if damage is more than need deal finish spell
7158 if (triggeredByAura->GetAmount() <= int32(damage))
7159 {
7160 // remember guid before aura delete
7161 ObjectGuid casterGuid = triggeredByAura->GetCasterGUID();
7162
7163 // Remove aura (before cast for prevent infinite loop handlers)
7164 RemoveAurasDueToSpell(triggeredByAura->GetId());
7165
7166 // Cast finish spell (triggeredByAura already not exist!)
7167 if (Unit* caster = ObjectAccessor::GetUnit(*this, casterGuid))
7168 {
7169 this->CastSpell(this, 37826, true); // VISUAL!
7170 caster->CastSpell(this, 32865, true, castItem);
7171 }
7172 return true; // no hidden cooldown
7173 }
7174 // Damage counting
7175 triggeredByAura->SetAmount(triggeredByAura->GetAmount() - damage);
7176 return true;
7177 }
7178 switch (dummySpell->Id)
7179 {
7180 // Nightfall
7181 case 18094:
7182 case 18095:
7183 // Glyph of corruption
7184 case 56218:
7185 {
7186 target = this;
7187 triggered_spell_id = 17941;
7188 break;
7189 }
7190 // Soul Leech
7191 case 30293:
7192 case 30295:
7193 case 30296:
7194 {
7195 // Improved Soul Leech
7196 AuraEffectList const& SoulLeechAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
7197 for (Unit::AuraEffectList::const_iterator i = SoulLeechAuras.begin(); i != SoulLeechAuras.end(); ++i)
7198 {
7199 if ((*i)->GetId() == 54117 || (*i)->GetId() == 54118)
7200 {
7201 if ((*i)->GetEffIndex() != 0)
7202 continue;
7203 basepoints0 = int32((*i)->GetAmount());
7204 target = GetGuardianPet();
7205 if (target)
7206 {
7207 // regen mana for pet
7208 CastCustomSpell(target, 54607, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7209 }
7210 // regen mana for caster
7211 CastCustomSpell(this, 59117, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7212 // Get second aura of spell for replenishment effect on party
7213 if (AuraEffect const* aurEff = (*i)->GetBase()->GetEffect(EFFECT_1))
7214 {
7215 // Replenishment - roll chance
7216 if (roll_chance_i(aurEff->GetAmount()))
7217 {
7218 CastSpell(this, 57669, true, castItem, triggeredByAura);
7219 }
7220 }
7221 break;
7222 }
7223 }
7224 // health
7225 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7226 target = this;
7227 triggered_spell_id = 30294;
7228 break;
7229 }
7230 // Shadowflame (Voidheart Raiment set bonus)
7231 case 37377:
7232 {
7233 triggered_spell_id = 37379;
7234 break;
7235 }
7236 // Pet Healing (Corruptor Raiment or Rift Stalker Armor)
7237 case 37381:
7238 {
7239 target = GetGuardianPet();
7240 if (!target)
7241 return false;
7242
7243 // heal amount
7244 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7245 triggered_spell_id = 37382;
7246 break;
7247 }
7248 // Shadowflame Hellfire (Voidheart Raiment set bonus)
7249 case 39437:
7250 {
7251 triggered_spell_id = 37378;
7252 break;
7253 }
7254 }
7255 break;
7256 }
7257 case SPELLFAMILY_PRIEST:
7258 {
7259 // Body and Soul
7260 if (dummySpell->SpellIconID == 2218)
7261 {
7262 // Proc only from Abolish desease on self cast
7263 if (procSpell->Id != 552 || victim != this || !roll_chance_i(triggerAmount))
7264 return false;
7265 triggered_spell_id = 64136;
7266 target = this;
7267 break;
7268 }
7269 switch (dummySpell->Id)
7270 {
7271 // Vampiric Embrace
7272 case 15286:
7273 {
7274 if (!victim || !victim->IsAlive() || procSpell->SpellFamilyFlags[1] & 0x80000)
7275 return false;
7276
7277 // heal amount
7278 int32 total = CalculatePct(int32(damage), triggerAmount);
7279 int32 team = total / 5;
7280 int32 self = total - team;
7281 CastCustomSpell(this, 15290, &team, &self, nullptr, true, castItem, triggeredByAura);
7282 return true; // no hidden cooldown
7283 }
7284 // Priest Tier 6 Trinket (Ashtongue Talisman of Acumen)
7285 case 40438:
7286 {
7287 // Shadow Word: Pain
7288 if (procSpell->SpellFamilyFlags[0] & 0x8000)
7289 triggered_spell_id = 40441;
7290 // Renew
7291 else if (procSpell->SpellFamilyFlags[0] & 0x40)
7292 triggered_spell_id = 40440;
7293 else
7294 return false;
7295
7296 target = this;
7297 break;
7298 }
7299 // Improved Shadowform
7300 case 47570:
7301 case 47569:
7302 {
7303 if (!roll_chance_i(triggerAmount))
7304 return false;
7305
7307 break;
7308 }
7309 // Glyph of Dispel Magic
7310 case 55677:
7311 {
7312 // Dispel Magic shares spellfamilyflag with abolish disease
7313 if (procSpell->SpellIconID != 74)
7314 return false;
7315 if (!target || !target->IsFriendlyTo(this))
7316 return false;
7317
7318 basepoints0 = int32(target->CountPctFromMaxHealth(triggerAmount));
7319 triggered_spell_id = 56131;
7320 break;
7321 }
7322 // Oracle Healing Bonus ("Garments of the Oracle" set)
7323 case 26169:
7324 {
7325 // heal amount
7326 basepoints0 = int32(CalculatePct(damage, 10));
7327 target = this;
7328 triggered_spell_id = 26170;
7329 break;
7330 }
7331 // Frozen Shadoweave (Shadow's Embrace set) warning! its not only priest set
7332 case 39372:
7333 {
7334 if (!procSpell || (procSpell->GetSchoolMask() & (SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_SHADOW)) == 0)
7335 return false;
7336
7337 // heal amount
7338 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7339 target = this;
7340 triggered_spell_id = 39373;
7341 break;
7342 }
7343 // Greater Heal (Vestments of Faith (Priest Tier 3) - 4 pieces bonus)
7344 case 28809:
7345 {
7346 triggered_spell_id = 28810;
7347 break;
7348 }
7349 // Priest T10 Healer 2P Bonus
7350 case 70770:
7351 // Flash Heal
7352 if (procSpell->SpellFamilyFlags[0] & 0x800)
7353 {
7354 triggered_spell_id = 70772;
7355 SpellInfo const* blessHealing = sSpellMgr->GetSpellInfo(triggered_spell_id);
7356 if (!blessHealing || !victim)
7357 return false;
7358 basepoints0 = int32(CalculatePct(damage, triggerAmount) / (blessHealing->GetMaxDuration() / blessHealing->Effects[0].Amplitude));
7359 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
7360 return true;
7361 }
7362 break;
7363 }
7364 break;
7365 }
7366 case SPELLFAMILY_DRUID:
7367 {
7368 switch (dummySpell->Id)
7369 {
7370 // Glyph of Innervate
7371 case 54832:
7372 {
7373 if (procSpell->SpellIconID != 62)
7374 return false;
7375
7376 int32 mana_perc = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcValue();
7377 basepoints0 = int32(CalculatePct(GetCreatePowers(POWER_MANA), mana_perc) / 10);
7378 triggered_spell_id = 54833;
7379 target = this;
7380 break;
7381 }
7382 // Glyph of Starfire
7383 case 54845:
7384 {
7385 triggered_spell_id = 54846;
7386 break;
7387 }
7388 // Glyph of Shred
7389 case 54815:
7390 {
7391 if (!target)
7392 return false;
7393
7394 // try to find spell Rip on the target
7395 if (AuraEffect const* AurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00800000, 0x0, 0x0, GetGUID()))
7396 {
7397 // Rip's max duration, note: spells which modifies Rip's duration also counted like Glyph of Rip
7398 uint32 CountMin = AurEff->GetBase()->GetMaxDuration();
7399
7400 // just Rip's max duration without other spells
7401 uint32 CountMax = AurEff->GetSpellInfo()->GetMaxDuration();
7402
7403 // add possible auras' and Glyph of Shred's max duration
7404 CountMax += 3 * triggerAmount * IN_MILLISECONDS; // Glyph of Shred -> +6 seconds
7405 CountMax += HasAura(54818) ? 4 * IN_MILLISECONDS : 0; // Glyph of Rip -> +4 seconds
7406 CountMax += HasAura(60141) ? 4 * IN_MILLISECONDS : 0; // Rip Duration/Lacerate Damage -> +4 seconds
7407
7408 // if min < max -> that means caster didn't cast 3 shred yet
7409 // so set Rip's duration and max duration
7410 if (CountMin < CountMax)
7411 {
7412 AurEff->GetBase()->SetDuration(AurEff->GetBase()->GetDuration() + triggerAmount * IN_MILLISECONDS);
7413 AurEff->GetBase()->SetMaxDuration(CountMin + triggerAmount * IN_MILLISECONDS);
7414 return true;
7415 }
7416 }
7417 // if not found Rip
7418 return false;
7419 }
7420 // Glyph of Rake
7421 case 54821:
7422 {
7423 if (procSpell->SpellVisual[0] == 750 && procSpell->Effects[1].ApplyAuraName == 3)
7424 {
7425 if (target && target->GetTypeId() == TYPEID_UNIT)
7426 {
7427 triggered_spell_id = 54820;
7428 break;
7429 }
7430 }
7431 return false;
7432 }
7433 // Leader of the Pack
7434 case 24932:
7435 {
7436 if (triggerAmount <= 0)
7437 return false;
7438 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
7439 target = this;
7440 triggered_spell_id = 34299;
7441 if (triggeredByAura->GetCasterGUID() != GetGUID())
7442 break;
7443 int32 basepoints1 = CalculatePct(GetMaxPower(Powers(POWER_MANA)), triggerAmount * 2);
7444 // Improved Leader of the Pack
7445 // Check cooldown of heal spell cooldown
7446 if (GetTypeId() == TYPEID_PLAYER && !ToPlayer()->HasSpellCooldown(34299))
7447 CastCustomSpell(this, 68285, &basepoints1, 0, 0, true, 0, triggeredByAura);
7448 break;
7449 }
7450 // Healing Touch (Dreamwalker Raiment set)
7451 case 28719:
7452 {
7453 // mana back
7454 basepoints0 = int32(CalculatePct(spellProc->GetPowerCost(), 30));
7455 target = this;
7456 triggered_spell_id = 28742;
7457 break;
7458 }
7459 // Glyph of Rejuvenation
7460 case 54754:
7461 {
7462 if (!victim || !victim->HealthBelowPct(uint32(triggerAmount)))
7463 return false;
7464 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7465 triggered_spell_id = 54755;
7466 break;
7467 }
7468 // Healing Touch Refund (Idol of Longevity trinket)
7469 case 28847:
7470 {
7471 target = this;
7472 triggered_spell_id = 28848;
7473 break;
7474 }
7475 // Mana Restore (Malorne Raiment set / Malorne Regalia set)
7476 case 37288:
7477 case 37295:
7478 {
7479 target = this;
7480 triggered_spell_id = 37238;
7481 break;
7482 }
7483 // Druid Tier 6 Trinket
7484 case 40442:
7485 {
7486 float chance;
7487
7488 // Starfire
7489 if (procSpell->SpellFamilyFlags[0] & 0x4)
7490 {
7491 triggered_spell_id = 40445;
7492 chance = 25.0f;
7493 }
7494 // Rejuvenation
7495 else if (procSpell->SpellFamilyFlags[0] & 0x10)
7496 {
7497 triggered_spell_id = 40446;
7498 chance = 25.0f;
7499 }
7500 // Mangle (Bear) and Mangle (Cat)
7501 else if (procSpell->SpellFamilyFlags[1] & 0x00000440)
7502 {
7503 triggered_spell_id = 40452;
7504 chance = 40.0f;
7505 }
7506 else
7507 return false;
7508
7509 if (!roll_chance_f(chance))
7510 return false;
7511
7512 target = this;
7513 break;
7514 }
7515 // Maim Interrupt
7516 case 44835:
7517 {
7518 // Deadly Interrupt Effect
7519 triggered_spell_id = 32747;
7520 break;
7521 }
7522 // Item - Druid T10 Restoration 4P Bonus (Rejuvenation)
7523 case 70664:
7524 {
7525 // xinef: proc only from normal Rejuvenation, and proc rejuvenation
7526 if (!victim || !procSpell || procSpell->SpellIconID != 64)
7527 return false;
7528
7529 Player* caster = ToPlayer();
7530 if (!caster)
7531 return false;
7532 if (!caster->GetGroup() && victim == this)
7533 return false;
7534
7535 CastCustomSpell(70691, SPELLVALUE_BASE_POINT0, damage, victim, true);
7536 return true;
7537 }
7538 }
7539 // Eclipse
7540 if (dummySpell->SpellIconID == 2856 && GetTypeId() == TYPEID_PLAYER)
7541 {
7542 if (!procSpell || effIndex != 0)
7543 return false;
7544
7545 bool isWrathSpell = (procSpell->SpellFamilyFlags[0] & 1);
7546
7547 if (!roll_chance_f(dummySpell->ProcChance * (isWrathSpell ? 0.6f : 1.0f)))
7548 return false;
7549
7550 target = this;
7551 if (target->HasAura(isWrathSpell ? 48517 : 48518))
7552 return false;
7553
7554 triggered_spell_id = isWrathSpell ? 48518 : 48517;
7555 break;
7556 }
7557 [[fallthrough]];
7558 }
7559 case SPELLFAMILY_ROGUE:
7560 {
7561 switch(dummySpell->Id)
7562 {
7563 // Glyph of Backstab
7564 case 56800:
7565 {
7566 if (victim)
7567 if (AuraEffect* aurEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x100000, 0, 0, GetGUID()))
7568 if (Aura* aur = aurEff->GetBase())
7569 if (!aur->IsRemoved() && aur->GetDuration() > 0)
7570 if ((aur->GetApplyTime() + aur->GetMaxDuration() / 1000 + 5) > (GameTime::GetGameTime().count() + aur->GetDuration() / 1000) )
7571 {
7572 aur->SetDuration(aur->GetDuration() + 2000);
7573 return true;
7574 }
7575 return false;
7576 }
7577 // Deadly Throw Interrupt
7578 case 32748:
7579 {
7580 // Prevent cast Deadly Throw Interrupt on self from last effect (apply dummy) of Deadly Throw
7581 if (this == victim)
7582 return false;
7583
7584 triggered_spell_id = 32747;
7585 break;
7586 }
7587 }
7588 // Master of subtlety
7589 if( dummySpell->SpellIconID == 2114 )
7590 {
7591 triggered_spell_id = 31665;
7592 basepoints0 = triggerAmount;
7593 break;
7594 }
7595 // Cut to the Chase
7596 if (dummySpell->SpellIconID == 2909)
7597 {
7598 // "refresh your Slice and Dice duration to its 5 combo point maximum"
7599 // lookup Slice and Dice
7600 if (AuraEffect const* aur = GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000, 0, 0))
7601 {
7602 aur->GetBase()->SetDuration(aur->GetSpellInfo()->GetMaxDuration(), true);
7603 return true;
7604 }
7605 return false;
7606 }
7607 // Deadly Brew
7608 else if (dummySpell->SpellIconID == 2963)
7609 {
7610 triggered_spell_id = 3409;
7611 break;
7612 }
7613 // Quick Recovery
7614 else if (dummySpell->SpellIconID == 2116)
7615 {
7616 if (!procSpell)
7617 return false;
7618
7619 // energy cost save
7620 basepoints0 = CalculatePct(int32(procSpell->ManaCost), triggerAmount);
7621 if (basepoints0 <= 0)
7622 return false;
7623
7624 target = this;
7625 triggered_spell_id = 31663;
7626 break;
7627 }
7628 break;
7629 }
7630 case SPELLFAMILY_HUNTER:
7631 {
7632 switch (dummySpell->SpellIconID)
7633 {
7634 case 2236: // Thrill of the Hunt
7635 {
7636 if (!procSpell)
7637 return false;
7638
7640
7641 // Disable charge drop because of Lock and Load
7642 if (spell)
7643 ToPlayer()->SetSpellModTakingSpell(spell, false);
7644
7645 // Explosive Shot
7646 if (procSpell->SpellFamilyFlags[2] & 0x200)
7647 {
7648 if (!victim)
7649 return false;
7650 if (AuraEffect const* pEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DUMMY, SPELLFAMILY_HUNTER, 0x0, 0x80000000, 0x0, GetGUID()))
7651 basepoints0 = pEff->GetSpellInfo()->CalcPowerCost(this, SpellSchoolMask(pEff->GetSpellInfo()->SchoolMask)) * 4 / 10 / 3;
7652 }
7653 else
7654 basepoints0 = procSpell->CalcPowerCost(this, SpellSchoolMask(procSpell->SchoolMask)) * 4 / 10;
7655
7656 if (spell)
7657 ToPlayer()->SetSpellModTakingSpell(spell, true);
7658
7659 if (basepoints0 <= 0)
7660 return false;
7661
7662 target = this;
7663 triggered_spell_id = 34720;
7664 break;
7665 }
7666 case 3406: // Hunting Party
7667 {
7668 triggered_spell_id = 57669;
7669 target = this;
7670 break;
7671 }
7672 case 3560: // Rapid Recuperation
7673 {
7674 // This effect only from Rapid Killing (mana regen)
7675 if (!(procSpell->SpellFamilyFlags[1] & 0x01000000))
7676 return false;
7677
7678 target = this;
7679
7680 switch (dummySpell->Id)
7681 {
7682 case 53228: // Rank 1
7683 triggered_spell_id = 56654;
7684 break;
7685 case 53232: // Rank 2
7686 triggered_spell_id = 58882;
7687 break;
7688 }
7689 break;
7690 }
7691 }
7692
7693 switch (dummySpell->Id)
7694 {
7695 case 57870: // Glyph of Mend Pet
7696 {
7697 if (!victim)
7698 return false;
7699
7700 victim->CastSpell(victim, 57894, true, nullptr, nullptr, GetGUID());
7701 return true;
7702 }
7703 }
7704 break;
7705 }
7707 {
7708 // Light's Beacon - Beacon of Light
7709 if (dummySpell->Id == 53651)
7710 {
7711 if (!victim)
7712 return false;
7713
7714 // Do not proc from Glyph of Holy Light and Judgement of Light
7715 if (procSpell->Id == 20267 || procSpell->Id == 54968)
7716 {
7717 return false;
7718 }
7719
7720 Unit* beaconTarget = triggeredByAura->GetBase()->GetCaster();
7721 if (!beaconTarget || beaconTarget == this || !beaconTarget->GetAura(53563, victim->GetGUID()))
7722 return false;
7723
7724 basepoints0 = int32(damage);
7725 triggered_spell_id = procSpell->IsRankOf(sSpellMgr->GetSpellInfo(635)) ? 53652 : 53654;
7726
7727 victim->CastCustomSpell(beaconTarget, triggered_spell_id, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura, victim->GetGUID());
7728 return true;
7729 }
7730 // Judgements of the Wise
7731 if (dummySpell->SpellIconID == 3017)
7732 {
7733 target = this;
7734 triggered_spell_id = 31930;
7735 // replenishment
7736 CastSpell(this, 57669, true, castItem, triggeredByAura);
7737 break;
7738 }
7739 // Righteous Vengeance
7740 if (dummySpell->SpellIconID == 3025)
7741 {
7742 if (!victim)
7743 return false;
7744
7745 // 4 damage tick
7746 basepoints0 = triggerAmount * damage / 400;
7747 triggered_spell_id = 61840;
7748 // Add remaining ticks to damage done
7749 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
7750 return true;
7751 }
7752 // Sheath of Light
7753 if (dummySpell->SpellIconID == 3030)
7754 {
7755 // 4 healing tick
7756 basepoints0 = triggerAmount * damage / 400;
7757 triggered_spell_id = 54203;
7758 break;
7759 }
7760 switch (dummySpell->Id)
7761 {
7762 // Judgement of Light
7763 case 20185:
7764 {
7765 if (!victim || !victim->IsAlive() || victim->HasSpellCooldown(20267))
7766 return false;
7767 // 2% of base mana
7768 basepoints0 = int32(victim->CountPctFromMaxHealth(2));
7769 victim->CastCustomSpell(victim, 20267, &basepoints0, 0, 0, true, 0, triggeredByAura);
7770 victim->AddSpellCooldown(20267, 0, 4 * IN_MILLISECONDS);
7771 return true;
7772 }
7773 // Judgement of Wisdom
7774 case 20186:
7775 {
7776 if (!victim || !victim->IsAlive() || victim->getPowerType() != POWER_MANA || victim->HasSpellCooldown(20268))
7777 return false;
7778
7779 // 2% of base mana
7780 basepoints0 = int32(CalculatePct(victim->GetCreateMana(), 2));
7781 victim->CastCustomSpell(victim, 20268, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura);
7782 victim->AddSpellCooldown(20268, 0, 4 * IN_MILLISECONDS);
7783 return true;
7784 }
7785 // Holy Power (Redemption Armor set)
7786 case 28789:
7787 {
7788 if (!victim)
7789 return false;
7790
7791 // Set class defined buff
7792 switch (victim->getClass())
7793 {
7794 case CLASS_PALADIN:
7795 case CLASS_PRIEST:
7796 case CLASS_SHAMAN:
7797 case CLASS_DRUID:
7798 triggered_spell_id = 28795; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
7799 break;
7800 case CLASS_MAGE:
7801 case CLASS_WARLOCK:
7802 triggered_spell_id = 28793; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
7803 break;
7804 case CLASS_HUNTER:
7805 case CLASS_ROGUE:
7806 triggered_spell_id = 28791; // Increases the friendly target's attack power by $s1 for $d.
7807 break;
7808 case CLASS_WARRIOR:
7809 triggered_spell_id = 28790; // Increases the friendly target's armor
7810 break;
7811 default:
7812 return false;
7813 }
7814 break;
7815 }
7816 // Seal of Vengeance (damage calc on apply aura)
7817 case 31801:
7818 {
7819 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
7820 return false;
7821
7822 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
7823 bool stacker = !procSpell || procSpell->Id == 53595;
7824 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
7825 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
7826
7827 if (!stacker && !damager)
7828 return false;
7829
7830 triggered_spell_id = 31803;
7831
7832 // On target with 5 stacks of Holy Vengeance direct damage is done
7833 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
7834 {
7835 if (aur->GetStackAmount() == 5)
7836 {
7837 if (stacker)
7838 aur->RefreshDuration();
7839
7840 CastSpell(victim, 42463, true, castItem, triggeredByAura);
7841 return true;
7842 }
7843 }
7844
7845 if (!stacker)
7846 return false;
7847 break;
7848 }
7849 // Seal of Corruption
7850 case 53736:
7851 {
7852 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
7853 return false;
7854
7855 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
7856 bool stacker = !procSpell || procSpell->Id == 53595;
7857 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
7858 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
7859
7860 if (!stacker && !damager)
7861 return false;
7862
7863 triggered_spell_id = 53742;
7864
7865 // On target with 5 stacks of Blood Corruption direct damage is done
7866 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
7867 {
7868 if (aur->GetStackAmount() == 5)
7869 {
7870 if (stacker)
7871 aur->RefreshDuration();
7872
7873 CastSpell(victim, 53739, true, castItem, triggeredByAura);
7874 return true;
7875 }
7876 }
7877
7878 if (!stacker)
7879 return false;
7880 break;
7881 }
7882 // Spiritual Attunement
7883 case 31785:
7884 case 33776:
7885 {
7886 // if healed by another unit (victim)
7887 if (this == victim)
7888 return false;
7889
7890 // dont allow non-positive dots to proc
7891 if (!procSpell || !procSpell->IsPositive())
7892 return false;
7893
7894 HealInfo const* healInfo = eventInfo.GetHealInfo();
7895 if (!healInfo)
7896 {
7897 return false;
7898 }
7899
7900 uint32 effectiveHeal = healInfo->GetEffectiveHeal();
7901 if (effectiveHeal)
7902 {
7903 // heal amount
7904 basepoints0 = int32(CalculatePct(effectiveHeal, triggerAmount));
7905 target = this;
7906
7907 if (basepoints0)
7908 triggered_spell_id = 31786;
7909 }
7910 break;
7911 }
7912 // Paladin Tier 6 Trinket (Ashtongue Talisman of Zeal)
7913 case 40470:
7914 {
7915 if (!procSpell)
7916 return false;
7917
7918 float chance = 0.0f;
7919
7920 // Flash of light/Holy light
7921 if (procSpell->SpellFamilyFlags[0] & 0xC0000000)
7922 {
7923 triggered_spell_id = 40471;
7924 chance = 15.0f;
7925 }
7926 // Judgement (any)
7927 else if (procSpell->SpellFamilyFlags[0] & 0x800000)
7928 {
7929 triggered_spell_id = 40472;
7930 chance = 50.0f;
7931 }
7932 else
7933 return false;
7934
7935 if (!roll_chance_f(chance))
7936 return false;
7937
7938 break;
7939 }
7940 // Glyph of Holy Light
7941 case 54937:
7942 {
7943 triggered_spell_id = 54968;
7944 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7945 break;
7946 }
7947 // Item - Paladin T8 Holy 2P Bonus
7948 case 64890:
7949 {
7950 triggered_spell_id = 64891;
7951 basepoints0 = triggerAmount * damage / 300;
7952 break;
7953 }
7954 case 71406: // Tiny Abomination in a Jar
7955 case 71545: // Tiny Abomination in a Jar (Heroic)
7956 {
7957 if (!victim || !victim->IsAlive())
7958 return false;
7959
7960 CastSpell(this, 71432, true, nullptr, triggeredByAura);
7961
7962 Aura const* dummy = GetAura(71432);
7963 if (!dummy || dummy->GetStackAmount() < (dummySpell->Id == 71406 ? 8 : 7))
7964 return false;
7965
7966 RemoveAurasDueToSpell(71432);
7967 triggered_spell_id = 71433; // default main hand attack
7968 // roll if offhand
7969 if (Player const* player = ToPlayer())
7970 if (player->GetWeaponForAttack(OFF_ATTACK, true) && urand(0, 1))
7971 triggered_spell_id = 71434;
7972 target = victim;
7973 break;
7974 }
7975 // Item - Icecrown 25 Normal Dagger Proc
7976 case 71880:
7977 {
7978 switch (getPowerType())
7979 {
7980 case POWER_MANA:
7981 triggered_spell_id = 71881;
7982 break;
7983 case POWER_RAGE:
7984 triggered_spell_id = 71883;
7985 break;
7986 case POWER_ENERGY:
7987 triggered_spell_id = 71882;
7988 break;
7989 case POWER_RUNIC_POWER:
7990 triggered_spell_id = 71884;
7991 break;
7992 default:
7993 return false;
7994 }
7995 break;
7996 }
7997 // Item - Icecrown 25 Heroic Dagger Proc
7998 case 71892:
7999 {
8000 switch (getPowerType())
8001 {
8002 case POWER_MANA:
8003 triggered_spell_id = 71888;
8004 break;
8005 case POWER_RAGE:
8006 triggered_spell_id = 71886;
8007 break;
8008 case POWER_ENERGY:
8009 triggered_spell_id = 71887;
8010 break;
8011 case POWER_RUNIC_POWER:
8012 triggered_spell_id = 71885;
8013 break;
8014 default:
8015 return false;
8016 }
8017 break;
8018 }
8019 }
8020 break;
8021 }
8022 case SPELLFAMILY_SHAMAN:
8023 {
8024 switch (dummySpell->Id)
8025 {
8026 // Tidal Force
8027 case 55198:
8028 {
8029 // Remove aura stack from caster
8030 RemoveAuraFromStack(55166);
8031 // drop charges
8032 return false;
8033 }
8034 // Totemic Power (The Earthshatterer set)
8035 case 28823:
8036 {
8037 if (!victim)
8038 return false;
8039
8040 // Set class defined buff
8041 switch (victim->getClass())
8042 {
8043 case CLASS_PALADIN:
8044 case CLASS_PRIEST:
8045 case CLASS_SHAMAN:
8046 case CLASS_DRUID:
8047 triggered_spell_id = 28824; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
8048 break;
8049 case CLASS_MAGE:
8050 case CLASS_WARLOCK:
8051 triggered_spell_id = 28825; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
8052 break;
8053 case CLASS_HUNTER:
8054 case CLASS_ROGUE:
8055 triggered_spell_id = 28826; // Increases the friendly target's attack power by $s1 for $d.
8056 break;
8057 case CLASS_WARRIOR:
8058 triggered_spell_id = 28827; // Increases the friendly target's armor
8059 break;
8060 default:
8061 return false;
8062 }
8063 break;
8064 }
8065 // Lesser Healing Wave (Totem of Flowing Water Relic)
8066 case 28849:
8067 {
8068 target = this;
8069 triggered_spell_id = 28850;
8070 break;
8071 }
8072 // Windfury Weapon (Passive) 1-8 Ranks
8073 case 33757:
8074 {
8075 Player* player = ToPlayer();
8076 if (!player || !castItem || !castItem->IsEquipped() || !victim || !victim->IsAlive())
8077 return false;
8078
8079 if (triggeredByAura->GetBase() && castItem->GetGUID() != triggeredByAura->GetBase()->GetCastItemGUID())
8080 return false;
8081
8082 WeaponAttackType attType = WeaponAttackType(player->GetAttackBySlot(castItem->GetSlot()));
8083 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8084 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8085 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8086 return false;
8087
8088 // Now amount of extra power stored in 1 effect of Enchant spell
8089 // Get it by item enchant id
8090 uint32 spellId;
8092 {
8093 case 283:
8094 spellId = 8232;
8095 break; // 1 Rank
8096 case 284:
8097 spellId = 8235;
8098 break; // 2 Rank
8099 case 525:
8100 spellId = 10486;
8101 break; // 3 Rank
8102 case 1669:
8103 spellId = 16362;
8104 break; // 4 Rank
8105 case 2636:
8106 spellId = 25505;
8107 break; // 5 Rank
8108 case 3785:
8109 spellId = 58801;
8110 break; // 6 Rank
8111 case 3786:
8112 spellId = 58803;
8113 break; // 7 Rank
8114 case 3787:
8115 spellId = 58804;
8116 break; // 8 Rank
8117 default:
8118 {
8119 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled item enchantment (rank?) {} for spell id: {} (Windfury)",
8120 castItem->GetEnchantmentId(EnchantmentSlot(TEMP_ENCHANTMENT_SLOT)), dummySpell->Id);
8121 return false;
8122 }
8123 }
8124
8125 SpellInfo const* windfurySpellInfo = sSpellMgr->GetSpellInfo(spellId);
8126 if (!windfurySpellInfo)
8127 {
8128 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non-existing spell id: {} (Windfury)", spellId);
8129 return false;
8130 }
8131
8132 int32 extra_attack_power = CalculateSpellDamage(victim, windfurySpellInfo, 1);
8133
8134 // Value gained from additional AP
8135 basepoints0 = int32(extra_attack_power / 14.0f * GetAttackTime(attType) / 1000);
8136
8137 if (procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8138 triggered_spell_id = 25504;
8139
8140 if (procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8141 triggered_spell_id = 33750;
8142
8143 // custom cooldown processing case
8144 if (player->HasSpellCooldown(dummySpell->Id))
8145 return false;
8146
8147 // apply cooldown before cast to prevent processing itself
8148 player->AddSpellCooldown(dummySpell->Id, 0, 3 * IN_MILLISECONDS);
8149
8150 // Attack Twice
8151 for (uint32 i = 0; i < 2; ++i)
8152 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8153
8154 return true;
8155 }
8156 // Shaman Tier 6 Trinket
8157 case 40463:
8158 {
8159 if (!procSpell)
8160 return false;
8161
8162 float chance;
8163 if (procSpell->SpellFamilyFlags[0] & 0x1)
8164 {
8165 triggered_spell_id = 40465; // Lightning Bolt
8166 chance = 15.0f;
8167 }
8168 else if (procSpell->SpellFamilyFlags[0] & 0x80)
8169 {
8170 triggered_spell_id = 40465; // Lesser Healing Wave
8171 chance = 10.0f;
8172 }
8173 else if (procSpell->SpellFamilyFlags[1] & 0x00000010)
8174 {
8175 triggered_spell_id = 40466; // Stormstrike
8176 chance = 50.0f;
8177 }
8178 else
8179 return false;
8180
8181 if (!roll_chance_f(chance))
8182 return false;
8183
8184 target = this;
8185 break;
8186 }
8187 // Glyph of Healing Wave
8188 case 55440:
8189 {
8190 // Not proc from self heals
8191 if (this == victim)
8192 return false;
8193 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8194 target = this;
8195 triggered_spell_id = 55533;
8196 break;
8197 }
8198 // Spirit Hunt
8199 case 58877:
8200 {
8201 // Cast on owner
8202 target = GetOwner();
8203 if (!target)
8204 return false;
8205 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8206 triggered_spell_id = 58879;
8207 // Heal wolf
8208 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8209 break;
8210 }
8211 // Shaman T9 Elemental 4P Bonus
8212 case 67228:
8213 {
8214 // Lava Burst
8215 if (procSpell->SpellFamilyFlags[1] & 0x1000)
8216 {
8217 triggered_spell_id = 71824;
8218 SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id);
8219 if (!triggeredSpell)
8220 return false;
8221 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (triggeredSpell->GetMaxDuration() / triggeredSpell->Effects[0].Amplitude);
8222 }
8223 break;
8224 }
8225 // Item - Shaman T10 Elemental 4P Bonus
8226 case 70817:
8227 {
8228 if (!target)
8229 return false;
8230 // try to find spell Flame Shock on the target
8231 if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0x0, 0x0, GetGUID()))
8232 {
8233 Aura* flameShock = aurEff->GetBase();
8234 int32 extraTime = 2 * aurEff->GetAmplitude();
8235 flameShock->SetMaxDuration(flameShock->GetMaxDuration() + extraTime);
8236 flameShock->SetDuration(flameShock->GetDuration() + extraTime);
8237
8238 return true;
8239 }
8240 // if not found Flame Shock
8241 return false;
8242 }
8243 break;
8244 }
8245 // Frozen Power
8246 if (dummySpell->SpellIconID == 3780)
8247 {
8248 if (!target)
8249 return false;
8250 if (GetDistance(target) < 15.0f)
8251 return false;
8252 float chance = (float)triggerAmount;
8253 if (!roll_chance_f(chance))
8254 return false;
8255
8256 triggered_spell_id = 63685;
8257 break;
8258 }
8259 // Ancestral Awakening
8260 if (dummySpell->SpellIconID == 3065)
8261 {
8262 triggered_spell_id = 52759;
8263 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8264 target = this;
8265 break;
8266 }
8267 // Flametongue Weapon (Passive)
8268 if (dummySpell->SpellFamilyFlags[0] & 0x200000)
8269 {
8270 if (GetTypeId() != TYPEID_PLAYER || !victim || !victim->IsAlive() || !castItem || !castItem->IsEquipped())
8271 return false;
8272
8274 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8275 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8276 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8277 return false;
8278
8279 float fire_onhit = float(CalculatePct(dummySpell->Effects[EFFECT_0]. CalcValue(), 1.0f));
8280
8281 float add_spellpower = (float)(SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE)
8283
8284 // 1.3speed = 5%, 2.6speed = 10%, 4.0 speed = 15%, so, 1.0speed = 3.84%
8285 ApplyPct(add_spellpower, 3.84f);
8286
8287 // Enchant on Off-Hand and ready?
8288 if (castItem->GetSlot() == EQUIPMENT_SLOT_OFFHAND && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8289 {
8290 float BaseWeaponSpeed = GetAttackTime(OFF_ATTACK) / 1000.0f;
8291
8292 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8293 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8294 triggered_spell_id = 10444;
8295 }
8296
8297 // Enchant on Main-Hand and ready?
8298 else if (castItem->GetSlot() == EQUIPMENT_SLOT_MAINHAND && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8299 {
8300 float BaseWeaponSpeed = GetAttackTime(BASE_ATTACK) / 1000.0f;
8301
8302 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8303 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8304 triggered_spell_id = 10444;
8305 }
8306
8307 // If not ready, we should return, shouldn't we?!
8308 else
8309 return false;
8310
8311 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8312 return true;
8313 }
8314 // Improved Water Shield
8315 if (dummySpell->SpellIconID == 2287)
8316 {
8317 if (!procSpell)
8318 return false;
8319
8320 // Default chance for Healing Wave and Riptide
8321 float chance = (float)triggeredByAura->GetAmount();
8322
8323 if (procSpell->SpellFamilyFlags[0] & 0x80)
8324 // Lesser Healing Wave - 0.6 of default
8325 chance *= 0.6f;
8326 else if (procSpell->SpellFamilyFlags[0] & 0x100)
8327 // Chain heal - 0.3 of default
8328 chance *= 0.3f;
8329
8330 if (!roll_chance_f(chance))
8331 return false;
8332
8333 // Water Shield
8334 if (AuraEffect const* aurEff = GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, 0, 0x00000020, 0))
8335 {
8336 uint32 spell = aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell;
8337 CastSpell(this, spell, true, castItem, triggeredByAura);
8338 return true;
8339 }
8340 return false;
8341 }
8342 // Lightning Overload
8343 if (dummySpell->SpellIconID == 2018) // only this spell have SpellFamily Shaman SpellIconID == 2018 and dummy aura
8344 {
8345 if(!procSpell || GetTypeId() != TYPEID_PLAYER || !victim)
8346 return false;
8347
8348 if (procEx & PROC_EX_CRITICAL_HIT)
8349 damage /= 2;
8350
8351 // do not proc off from itself
8352 if (procSpell->Id == 45297 || procSpell->Id == 45284)
8353 {
8354 return false;
8355 }
8356
8357 do
8358 {
8359 uint32 spell = 0;
8360
8361 if (procSpell->SpellFamilyFlags[0] & 0x2)
8362 {
8363 // 1/3 of 33% if 11%
8364 if (!roll_chance_i(33))
8365 return false;
8366
8367 spell = 45297;
8368 }
8369 else
8370 spell = 45284;
8371
8372 // do not reduce damage-spells have correct basepoints
8373 damage /= 2;
8374 int32 dmg = damage;
8375
8376 // Cast
8377 CastCustomSpell(victim, spell, &dmg, 0, 0, true, castItem, triggeredByAura);
8378 } while (roll_chance_i(33));
8379 return true;
8380 }
8381 // Static Shock
8382 if (dummySpell->SpellIconID == 3059)
8383 {
8384 // Lightning Shield
8386 {
8387 uint32 spell = sSpellMgr->GetSpellWithRank(26364, aurEff->GetSpellInfo()->GetRank());
8388 CastSpell(target, spell, true, castItem, triggeredByAura);
8389 aurEff->GetBase()->DropCharge();
8390 return true;
8391 }
8392 return false;
8393 }
8394 break;
8395 }
8397 {
8398 // Improved Blood Presence
8399 if (dummySpell->SpellIconID == 2636)
8400 {
8401 if (GetTypeId() != TYPEID_PLAYER)
8402 return false;
8403 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8404 break;
8405 }
8406 // Butchery
8407 if (dummySpell->SpellIconID == 2664)
8408 {
8409 basepoints0 = triggerAmount;
8410 triggered_spell_id = 50163;
8411 target = this;
8412 break;
8413 }
8414 // Mark of Blood
8415 if (dummySpell->Id == 49005)
8416 {
8418 triggered_spell_id = 61607;
8419 break;
8420 }
8421 // Unholy Blight
8422 if (dummySpell->Id == 49194)
8423 {
8424 triggered_spell_id = 50536;
8425 SpellInfo const* unholyBlight = sSpellMgr->GetSpellInfo(triggered_spell_id);
8426 if (!unholyBlight || !victim)
8427 return false;
8428
8429 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8430
8431 //Glyph of Unholy Blight
8432 if (AuraEffect* glyph = GetAuraEffect(63332, 0))
8433 AddPct(basepoints0, glyph->GetAmount());
8434
8435 basepoints0 = basepoints0 / (unholyBlight->GetMaxDuration() / unholyBlight->Effects[0].Amplitude);
8436 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
8437 return true;
8438 }
8439 // Vendetta
8440 if (dummySpell->SpellFamilyFlags[0] & 0x10000)
8441 {
8442 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
8443 triggered_spell_id = 50181;
8444 target = this;
8445 break;
8446 }
8447 // Necrosis
8448 if (dummySpell->SpellIconID == 2709)
8449 {
8450 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8451 triggered_spell_id = 51460;
8452 break;
8453 }
8454 // Threat of Thassarian
8455 if (dummySpell->SpellIconID == 2023)
8456 {
8457 // Must Dual Wield
8458 if (!procSpell || !haveOffhandWeapon())
8459 return false;
8460 // Chance as basepoints for dummy aura
8461 if (!roll_chance_i(triggerAmount))
8462 return false;
8463
8464 switch (procSpell->Id)
8465 {
8466 // Obliterate
8467 case 49020:
8468 triggered_spell_id = 66198;
8469 break; // Rank 1
8470 case 51423:
8471 triggered_spell_id = 66972;
8472 break; // Rank 2
8473 case 51424:
8474 triggered_spell_id = 66973;
8475 break; // Rank 3
8476 case 51425:
8477 triggered_spell_id = 66974;
8478 break; // Rank 4
8479
8480 // Frost Strike
8481 case 49143:
8482 triggered_spell_id = 66196;
8483 break; // Rank 1
8484 case 51416:
8485 triggered_spell_id = 66958;
8486 break; // Rank 2
8487 case 51417:
8488 triggered_spell_id = 66959;
8489 break; // Rank 3
8490 case 51418:
8491 triggered_spell_id = 66960;
8492 break; // Rank 4
8493 case 51419:
8494 triggered_spell_id = 66961;
8495 break; // Rank 5
8496 case 55268:
8497 triggered_spell_id = 66962;
8498 break; // Rank 6
8499
8500 // Plague Strike
8501 case 45462:
8502 triggered_spell_id = 66216;
8503 break; // Rank 1
8504 case 49917:
8505 triggered_spell_id = 66988;
8506 break; // Rank 2
8507 case 49918:
8508 triggered_spell_id = 66989;
8509 break; // Rank 3
8510 case 49919:
8511 triggered_spell_id = 66990;
8512 break; // Rank 4
8513 case 49920:
8514 triggered_spell_id = 66991;
8515 break; // Rank 5
8516 case 49921:
8517 triggered_spell_id = 66992;
8518 break; // Rank 6
8519
8520 // Death Strike
8521 case 49998:
8522 triggered_spell_id = 66188;
8523 break; // Rank 1
8524 case 49999:
8525 triggered_spell_id = 66950;
8526 break; // Rank 2
8527 case 45463:
8528 triggered_spell_id = 66951;
8529 break; // Rank 3
8530 case 49923:
8531 triggered_spell_id = 66952;
8532 break; // Rank 4
8533 case 49924:
8534 triggered_spell_id = 66953;
8535 break; // Rank 5
8536
8537 // Rune Strike
8538 case 56815:
8539 triggered_spell_id = 66217;
8540 break; // Rank 1
8541
8542 // Blood Strike
8543 case 45902:
8544 triggered_spell_id = 66215;
8545 break; // Rank 1
8546 case 49926:
8547 triggered_spell_id = 66975;
8548 break; // Rank 2
8549 case 49927:
8550 triggered_spell_id = 66976;
8551 break; // Rank 3
8552 case 49928:
8553 triggered_spell_id = 66977;
8554 break; // Rank 4
8555 case 49929:
8556 triggered_spell_id = 66978;
8557 break; // Rank 5
8558 case 49930:
8559 triggered_spell_id = 66979;
8560 break; // Rank 6
8561 default:
8562 return false;
8563 }
8564
8565 // This should do, restore spell mod so next attack can also use this!
8566 // crit chance for first strike is already computed
8567 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 51124, nullptr); // Killing Machine
8568 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 49796, nullptr); // Deathchill
8569
8570 // Xinef: Somehow basepoints are divided by 2 which is later divided by 2 (offhand multiplier)
8571 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8572 if (triggerEntry->SchoolMask & SPELL_SCHOOL_MASK_NORMAL)
8573 basepoints0 = triggerEntry->Effects[EFFECT_0].BasePoints * 2;
8574
8575 SetCantProc(true);
8576 if(basepoints0)
8577 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8578 else
8579 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8580 SetCantProc(false);
8581 return true;
8582 }
8583 // Runic Power Back on Snare/Root
8584 if (dummySpell->Id == 61257)
8585 {
8586 // only for spells and hit/crit (trigger start always) and not start from self casted spells
8587 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
8588 return false;
8589 // Need snare or root mechanic
8590 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_SNARE))))
8591 return false;
8592 triggered_spell_id = 61258;
8593 target = this;
8594 break;
8595 }
8596 // Sudden Doom
8597 if (dummySpell->SpellIconID == 1939 && GetTypeId() == TYPEID_PLAYER)
8598 {
8599 SpellChainNode const* chain = nullptr;
8600 // get highest rank of the Death Coil spell
8601 PlayerSpellMap const& sp_list = ToPlayer()->GetSpellMap();
8602 for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr)
8603 {
8604 // check if shown in spell book
8605 if (!itr->second->Active || !itr->second->IsInSpec(ToPlayer()->GetActiveSpec()) || itr->second->State == PLAYERSPELL_REMOVED)
8606 continue;
8607
8608 SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(itr->first);
8609 if (!spellProto)
8610 continue;
8611
8612 if (spellProto->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT
8613 && spellProto->SpellFamilyFlags[0] & 0x2000)
8614 {
8615 SpellChainNode const* newChain = sSpellMgr->GetSpellChainNode(itr->first);
8616
8617 // No chain entry or entry lower than found entry
8618 if (!chain || !newChain || (chain->rank < newChain->rank))
8619 {
8620 triggered_spell_id = itr->first;
8621 chain = newChain;
8622 }
8623 else
8624 continue;
8625 // Found spell is last in chain - do not need to look more
8626 // Optimisation for most common case
8627 if (chain && chain->last->Id == itr->first)
8628 break;
8629 }
8630 }
8631 }
8632 break;
8633 }
8634 case SPELLFAMILY_POTION:
8635 {
8636 // alchemist's stone
8637 if (dummySpell->Id == 17619)
8638 {
8639 if (procSpell->SpellFamilyName == SPELLFAMILY_POTION)
8640 {
8641 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; i++)
8642 {
8643 if (procSpell->Effects[i].Effect == SPELL_EFFECT_HEAL)
8644 {
8645 triggered_spell_id = 21399;
8646 }
8647 else if (procSpell->Effects[i].Effect == SPELL_EFFECT_ENERGIZE)
8648 {
8649 triggered_spell_id = 21400;
8650 }
8651 else
8652 continue;
8653
8654 basepoints0 = int32(CalculateSpellDamage(this, procSpell, i) * 0.4f);
8655 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, nullptr, triggeredByAura);
8656 }
8657 return true;
8658 }
8659 }
8660 break;
8661 }
8662 case SPELLFAMILY_PET:
8663 {
8664 switch (dummySpell->SpellIconID)
8665 {
8666 // Guard Dog
8667 case 201:
8668 {
8669 if (!victim)
8670 return false;
8671
8672 triggered_spell_id = 54445;
8673 target = this;
8674 float addThreat = float(CalculatePct(procSpell->Effects[0].CalcValue(this), triggerAmount));
8675 victim->AddThreat(this, addThreat);
8676 break;
8677 }
8678 // Silverback
8679 case 1582:
8680 triggered_spell_id = dummySpell->Id == 62765 ? 62801 : 62800;
8681 target = this;
8682 break;
8683 }
8684 break;
8685 }
8686 default:
8687 break;
8688 }
8689
8690 // if not handled by custom case, get triggered spell from dummySpell proto
8691 if (!triggered_spell_id)
8692 triggered_spell_id = dummySpell->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
8693
8694 // processed charge only counting case
8695 if (!triggered_spell_id)
8696 return true;
8697
8698 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8699 if (!triggerEntry)
8700 {
8701 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: Spell {} has non-existing triggered spell {}", dummySpell->Id, triggered_spell_id);
8702 return false;
8703 }
8704
8705 if (cooldown_spell_id == 0)
8706 cooldown_spell_id = triggered_spell_id;
8707
8708 if (cooldown)
8709 {
8710 if (HasSpellCooldown(cooldown_spell_id))
8711 return false;
8712
8713 AddSpellCooldown(cooldown_spell_id, 0, cooldown);
8714 }
8715
8716 if(basepoints0)
8717 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8718 else
8719 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8720
8721 return true;
8722}
constexpr auto IN_MILLISECONDS
Definition: Common.h:55
int32 irand(int32 min, int32 max)
Definition: Random.cpp:37
T ApplyPct(T &base, U pct)
Definition: Util.h:73
static First const & RAND(First const &first, Second const &second, Rest const &... rest)
Definition: CreatureAIImpl.h:30
EnchantmentSlot
Definition: Item.h:162
@ TEMP_ENCHANTMENT_SLOT
Definition: Item.h:164
std::map< uint32, SpellCooldown > SpellCooldowns
Definition: Player.h:209
std::unordered_map< uint32, PlayerSpell * > PlayerSpellMap
Definition: Player.h:194
@ EQUIPMENT_SLOT_MAINHAND
Definition: Player.h:691
@ PLAYERSPELL_REMOVED
Definition: Player.h:123
WeaponAttackType
Definition: Unit.h:395
@ SPELL_AURA_PROC_TRIGGER_SPELL
Definition: SpellAuraDefines.h:105
@ SPELL_AURA_HASTE_SPELLS
Definition: SpellAuraDefines.h:279
@ SPELL_AURA_MOD_MELEE_HASTE
Definition: SpellAuraDefines.h:201
@ SPELL_AURA_MOD_DECREASE_SPEED
Definition: SpellAuraDefines.h:96
@ SPELL_AURA_PERIODIC_DUMMY
Definition: SpellAuraDefines.h:289
@ PROC_EX_INTERNAL_HOT
Definition: SpellMgr.h:220
@ PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS
Definition: SpellMgr.h:128
@ PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS
Definition: SpellMgr.h:122
@ SPELL_EFFECT_ENERGIZE
Definition: SharedDefines.h:808
@ LANG_UNIVERSAL
Definition: SharedDefines.h:735
@ CLASS_DRUID
Definition: SharedDefines.h:151
@ CLASS_SHAMAN
Definition: SharedDefines.h:147
@ CLASS_PRIEST
Definition: SharedDefines.h:145
@ CLASS_WARLOCK
Definition: SharedDefines.h:149
@ CLASS_MAGE
Definition: SharedDefines.h:148
@ CLASS_PALADIN
Definition: SharedDefines.h:142
@ CLASS_ROGUE
Definition: SharedDefines.h:144
@ MECHANIC_STUN
Definition: SharedDefines.h:1337
@ MECHANIC_ROOT
Definition: SharedDefines.h:1332
@ MECHANIC_SNARE
Definition: SharedDefines.h:1336
@ SPELLFAMILY_WARLOCK
Definition: SharedDefines.h:3533
@ SPELLFAMILY_PALADIN
Definition: SharedDefines.h:3538
@ SPELLFAMILY_HUNTER
Definition: SharedDefines.h:3537
@ SPELLFAMILY_POTION
Definition: SharedDefines.h:3541
@ SPELLFAMILY_ROGUE
Definition: SharedDefines.h:3536
@ SPELLFAMILY_DRUID
Definition: SharedDefines.h:3535
@ SPELLFAMILY_PET
Definition: SharedDefines.h:3545
@ REP_EXALTED
Definition: SharedDefines.h:187
@ SPELL_SCHOOL_MASK_SHADOW
Definition: SharedDefines.h:302
@ SPELL_SCHOOL_MASK_FIRE
Definition: SharedDefines.h:299
@ SPELL_SCHOOL_MASK_FROST
Definition: SharedDefines.h:301
bool IsEqual(uint32 p1=0, uint32 p2=0, uint32 p3=0) const
Definition: Util.h:463
uint8 GetSlot() const
Definition: Item.h:272
uint32 GetEnchantmentId(EnchantmentSlot slot) const
Definition: Item.h:295
bool IsEquipped() const
Definition: Item.cpp:790
void SetSpellModTakingSpell(Spell *spell, bool apply)
Definition: Player.cpp:9996
void RestoreSpellMods(Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
Definition: Player.cpp:9854
bool HasSpellCooldown(uint32 spell_id) const override
Definition: Player.cpp:16251
PlayerSpellMap const & GetSpellMap() const
Definition: Player.h:1739
void AddSpellCooldown(uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
Definition: Player.cpp:11004
SpellCooldowns GetSpellCooldowns() const
Definition: Player.h:2132
static uint8 GetAttackBySlot(uint8 slot)
Definition: PlayerStorage.cpp:570
ReputationRank GetReputationRank(uint32 faction_id) const
Definition: Player.cpp:5777
Unit * GetSelectedUnit() const
Definition: Player.cpp:11454
void RemoveSpellCooldown(uint32 spell_id, bool update=false)
Definition: Player.cpp:3475
void Say(std::string_view text, Language language, WorldObject const *=nullptr) override
Handles said message in regular chat based on declared language and in config pre-defined Range.
Definition: Player.cpp:9251
Item * GetItemByGuid(ObjectGuid guid) const
Definition: PlayerStorage.cpp:435
Spell * m_spellModTakingSpell
Definition: Player.h:2515
Definition: Unit.h:804
uint32 GetEffectiveHeal() const
Definition: Unit.h:844
uint32 GetCreatePowers(Powers power) const
Definition: Unit.cpp:15646
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition: Unit.cpp:5519
void RemoveAurasWithMechanic(uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
Definition: Unit.cpp:5193
int32 CalculateSpellDamage(Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
Definition: Unit.cpp:14837
void SetCantProc(bool apply)
Definition: Unit.h:2335
bool HealthBelowPct(int32 pct) const
Definition: Unit.h:1458
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4855
int32 SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask, bool isDoT=false)
Definition: Unit.cpp:11969
bool IsFriendlyTo(Unit const *unit) const
Definition: Unit.cpp:10249
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition: Unit.cpp:11931
uint32 CountPctFromMaxHealth(int32 pct) const
Definition: Unit.h:1463
void CastDelayedSpellWithPeriodicAmount(Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
Definition: Unit.cpp:20562
void RemoveMovementImpairingAuras(bool withRoot)
Definition: Unit.cpp:5169
void SetMaxDuration(int32 duration)
Definition: SpellAuras.h:130
SpellInfo const * GetSpellInfo() const
Definition: Spell.h:574
int32 GetPowerCost() const
Definition: Spell.h:575
uint8 GetRank() const
Definition: SpellInfo.cpp:2480
int32 GetMaxDuration() const
Definition: SpellInfo.cpp:2331
uint32 ProcChance
Definition: SpellInfo.h:354
Definition: SpellMgr.h:554
SpellInfo const * last
Definition: SpellMgr.h:558
uint8 rank
Definition: SpellMgr.h:559

References AddPct(), Player::AddSpellCooldown(), AddSpellCooldown(), AddThreat(), ApplyPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, SpellInfo::CalcPowerCost(), CalculatePct(), CalculateSpellDamage(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, CountPctFromMaxHealth(), CURRENT_GENERIC_SPELL, EFFECT_0, EFFECT_1, SpellInfo::Effects, ObjectGuid::Empty, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, SpellInfo::EquippedItemClass, SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), Player::GetAttackBySlot(), GetAttackTime(), GetAura(), GetAuraEffect(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraEffect::GetCaster(), Aura::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetCharges(), getClass(), GetCreateMana(), GetCreatePowers(), WorldObject::GetDistance(), Aura::GetDuration(), Aura::GetEffect(), HealInfo::GetEffectiveHeal(), AuraEffect::GetEffIndex(), Item::GetEnchantmentId(), GameTime::GetGameTime(), Player::GetGroup(), GetGuardianPet(), Object::GetGUID(), ProcEventInfo::GetHealInfo(), GetHealth(), AuraEffect::GetId(), Player::GetItemByGuid(), Aura::GetMaxDuration(), SpellInfo::GetMaxDuration(), GetMaxPower(), GetOwner(), Spell::GetPowerCost(), getPowerType(), ProcEventInfo::GetProcSpell(), SpellInfo::GetRank(), Player::GetReputationRank(), SpellInfo::GetSchoolMask(), Player::GetSelectedUnit(), Item::GetSlot(), Player::GetSpellCooldowns(), AuraEffect::GetSpellInfo(), Player::GetSpellMap(), Aura::GetStackAmount(), Object::GetTypeId(), ObjectAccessor::GetUnit(), GetVictim(), HasAura(), Position::HasInArc(), Player::HasSpellCooldown(), HasSpellCooldown(), haveOffhandWeapon(), HealthBelowPct(), SpellInfo::Id, IN_MILLISECONDS, irand(), IsAlive(), flag96::IsEqual(), Item::IsEquipped(), IsFriendlyTo(), SpellInfo::IsPositive(), SpellInfo::IsRankOf(), LANG_UNIVERSAL, SpellChainNode::last, LOG_ERROR, m_currentSpells, Player::m_spellModTakingSpell, SpellInfo::ManaCost, MAX_SPELL_EFFECTS, MECHANIC_ROOT, MECHANIC_SNARE, MECHANIC_STUN, OFF_ATTACK, PLAYERSPELL_REMOVED, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, PROC_EX_CRITICAL_HIT, PROC_EX_INTERNAL_HOT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, SpellInfo::ProcChance, RAND(), SpellChainNode::rank, RemoveAura(), RemoveAuraFromStack(), RemoveAurasByType(), RemoveAurasDueToSpell(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), Player::RemoveSpellCooldown(), REP_EXALTED, Player::RestoreSpellMods(), roll_chance_f(), roll_chance_i(), Player::Say(), SpellInfo::SchoolMask, AuraEffect::SetAmount(), SetCantProc(), Aura::SetDuration(), Aura::SetMaxDuration(), Player::SetSpellModTakingSpell(), SPELL_AURA_DUMMY, SPELL_AURA_HASTE_SPELLS, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_DUMMY, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_EFFECT_ENERGIZE, SPELL_EFFECT_HEAL, SPELL_SCHOOL_MASK_FIRE, SPELL_SCHOOL_MASK_FROST, SPELL_SCHOOL_MASK_NORMAL, SPELL_SCHOOL_MASK_SHADOW, SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PET, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, SpellInfo::SpellVisual, sSpellMgr, TEMP_ENCHANTMENT_SLOT, Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, and urand().

Referenced by ProcDamageAndSpellFor().

◆ HandleEmoteCommand()

void Unit::HandleEmoteCommand ( uint32  emoteId)
1981{
1983 packet.EmoteID = emoteId;
1984 packet.Guid = GetGUID();
1985 SendMessageToSet(packet.Write(), true);
1986}
Definition: ChatPackets.h:29
WorldPacket const * Write() override
Definition: ChatPackets.cpp:20
uint32 EmoteID
Definition: ChatPackets.h:35
ObjectGuid Guid
Definition: ChatPackets.h:36

References WorldPackets::Chat::Emote::EmoteID, Object::GetGUID(), WorldPackets::Chat::Emote::Guid, WorldObject::SendMessageToSet(), and WorldPackets::Chat::Emote::Write().

Referenced by npc_mograine::npc_mograineAI::AshbringerEvent(), boss_kiljaeden::boss_kiljaedenAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), boss_viscidus::DamageTaken(), DealMeleeDamage(), boss_twinemperorsAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), StandUpEvent::Execute(), PartyTimeEmoteEvent::Execute(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), WorldSession::HandleEmoteOpcode(), npc_commandscript::HandleNpcSayCommand(), npc_commandscript::HandleNpcYellCommand(), WorldSession::HandleTextEmoteOpcode(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_sentinel_leader::MovementInform(), npc_sentinel_infiltrator::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::MovementInform(), boss_felmyst::boss_felmystAI::MovementInform(), npc_kalecgos::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), boss_nefarian::PathEndReached(), spell_gen_spectator_cheer_trigger::PrepareSpellScript(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), PetAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), CreatureTextMgr::SendEmote(), boss_grand_warlock_nethekurse::SetData(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), boss_gothik::boss_gothikAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_nightbane::TakeOff(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_nightbane::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::npc_forest_frogAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_shenthul::npc_shenthulAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_highlord_tirion_fordring_lh::npc_highlord_tirion_fordringAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_valiance_keep_cannoneer::npc_valiance_keep_cannoneerAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_dancing_flames::npc_dancing_flamesAI::UpdateAI(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::UpdateAI(), npc_rocknot::npc_rocknotAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_taretha::npc_tarethaAI::WaypointReached(), npc_general_andorov::WaypointReached(), npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached(), npc_engineer_helice::npc_engineer_heliceAI::WaypointReached(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::WaypointReached(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ HandleOverrideClassScriptAuraProc()

bool Unit::HandleOverrideClassScriptAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  cooldown 
)
private
9870{
9871 int32 scriptId = triggeredByAura->GetMiscValue();
9872
9873 if (!victim || !victim->IsAlive())
9874 return false;
9875
9876 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && GetTypeId() == TYPEID_PLAYER
9877 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
9878
9879 uint32 triggered_spell_id = 0;
9880
9881 switch (scriptId)
9882 {
9883 case 836: // Improved Blizzard (Rank 1)
9884 {
9885 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9886 return false;
9887 triggered_spell_id = 12484;
9888 break;
9889 }
9890 case 988: // Improved Blizzard (Rank 2)
9891 {
9892 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9893 return false;
9894 triggered_spell_id = 12485;
9895 break;
9896 }
9897 case 989: // Improved Blizzard (Rank 3)
9898 {
9899 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9900 return false;
9901 triggered_spell_id = 12486;
9902 break;
9903 }
9904 case 4533: // Dreamwalker Raiment 2 pieces bonus
9905 {
9906 // Chance 50%
9907 if (!roll_chance_i(50))
9908 return false;
9909
9910 switch (victim->getPowerType())
9911 {
9912 case POWER_MANA:
9913 triggered_spell_id = 28722;
9914 break;
9915 case POWER_RAGE:
9916 triggered_spell_id = 28723;
9917 break;
9918 case POWER_ENERGY:
9919 triggered_spell_id = 28724;
9920 break;
9921 default:
9922 return false;
9923 }
9924 break;
9925 }
9926 case 4537: // Dreamwalker Raiment 6 pieces bonus
9927 triggered_spell_id = 28750; // Blessing of the Claw
9928 break;
9929 case 5497: // Improved Mana Gems
9930 triggered_spell_id = 37445; // Mana Surge
9931 break;
9932 case 7010: // Revitalize - can proc on full hp target
9933 case 7011:
9934 case 7012:
9935 {
9936 if (!roll_chance_i(triggeredByAura->GetAmount()))
9937 return false;
9938 switch (victim->getPowerType())
9939 {
9940 case POWER_MANA:
9941 triggered_spell_id = 48542;
9942 break;
9943 case POWER_RAGE:
9944 triggered_spell_id = 48541;
9945 break;
9946 case POWER_ENERGY:
9947 triggered_spell_id = 48540;
9948 break;
9949 case POWER_RUNIC_POWER:
9950 triggered_spell_id = 48543;
9951 break;
9952 default:
9953 break;
9954 }
9955 break;
9956 }
9957 default:
9958 break;
9959 }
9960
9961 // not processed
9962 if (!triggered_spell_id)
9963 return false;
9964
9965 // standard non-dummy case
9966 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
9967
9968 if (!triggerEntry)
9969 {
9970 LOG_ERROR("entities.unit", "Unit::HandleOverrideClassScriptAuraProc: Spell {} triggering for class script id {}", triggered_spell_id, scriptId);
9971 return false;
9972 }
9973
9974 if (cooldown)
9975 {
9976 if (HasSpellCooldown(triggered_spell_id))
9977 return false;
9978
9979 AddSpellCooldown(triggered_spell_id, 0, cooldown);
9980 }
9981
9982 CastSpell(victim, triggered_spell_id, true, castItem, triggeredByAura);
9983
9984 return true;
9985}

References AddSpellCooldown(), CastSpell(), AuraEffect::GetAmount(), AuraEffect::GetBase(), Aura::GetCastItemGUID(), Player::GetItemByGuid(), AuraEffect::GetMiscValue(), getPowerType(), Object::GetTypeId(), HasSpellCooldown(), IsAlive(), LOG_ERROR, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, roll_chance_i(), SpellInfo::SpellVisual, sSpellMgr, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by ProcDamageAndSpellFor().

◆ HandleProcExtraAttackFor()

void Unit::HandleProcExtraAttackFor ( Unit victim,
uint32  count 
)
2729{
2730 while (count)
2731 {
2732 --count;
2733 AttackerStateUpdate(victim, BASE_ATTACK, true);
2734 }
2735}
void AttackerStateUpdate(Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
Definition: Unit.cpp:2537

References AttackerStateUpdate(), and BASE_ATTACK.

Referenced by Update().

◆ HandleProcTriggerSpell()

bool Unit::HandleProcTriggerSpell ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
uint32  procPhase,
ProcEventInfo eventInfo 
)
private
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
8922{
8923 // Get triggered aura spell info
8924 SpellInfo const* auraSpellInfo = triggeredByAura->GetSpellInfo();
8925
8926 // Basepoints of trigger aura
8927 int32 triggerAmount = triggeredByAura->GetAmount();
8928
8929 // Set trigger spell id, target, custom basepoints
8930 uint32 trigger_spell_id = auraSpellInfo->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
8931
8932 Unit* target = nullptr;
8933 int32 basepoints0 = 0;
8934
8935 if (triggeredByAura->GetAuraType() == SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE)
8936 basepoints0 = triggerAmount;
8937
8938 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && GetTypeId() == TYPEID_PLAYER
8939 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
8940
8941 // Try handle unknown trigger spells
8942 //if (sSpellMgr->GetSpellInfo(trigger_spell_id) == nullptr)
8943 {
8944 switch (auraSpellInfo->SpellFamilyName)
8945 {
8947 switch (auraSpellInfo->Id)
8948 {
8949 case 43820: // Charm of the Witch Doctor (Amani Charm of the Witch Doctor trinket)
8950 // Pct value stored in dummy
8951 if (!victim)
8952 return false;
8953 basepoints0 = victim->GetCreateHealth() * auraSpellInfo->Effects[1].CalcValue() / 100;
8954 target = victim;
8955 break;
8956 case 57345: // Darkmoon Card: Greatness
8957 {
8958 float stat = 0.0f;
8959 // strength
8960 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 60229; stat = GetStat(STAT_STRENGTH); }
8961 // agility
8962 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 60233; stat = GetStat(STAT_AGILITY); }
8963 // intellect
8964 if (GetStat(STAT_INTELLECT) > stat) { trigger_spell_id = 60234; stat = GetStat(STAT_INTELLECT);}
8965 // spirit
8966 if (GetStat(STAT_SPIRIT) > stat) { trigger_spell_id = 60235; }
8967 break;
8968 }
8969 case 67702: // Death's Choice, Item - Coliseum 25 Normal Melee Trinket
8970 {
8971 if (!damage)
8972 return false;
8973 float stat = 0.0f;
8974 // strength
8975 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67708; stat = GetStat(STAT_STRENGTH); }
8976 // agility
8977 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67703; }
8978 break;
8979 }
8980 case 67771: // Death's Choice (heroic), Item - Coliseum 25 Heroic Melee Trinket
8981 {
8982 if (!damage)
8983 return false;
8984 float stat = 0.0f;
8985 // strength
8986 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67773; stat = GetStat(STAT_STRENGTH); }
8987 // agility
8988 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67772; }
8989 break;
8990 }
8991 // Mana Drain Trigger
8992 case 27522:
8993 case 40336:
8994 {
8995 // On successful melee or ranged attack gain $29471s1 mana and if possible drain $27526s1 mana from the target.
8996 if (IsAlive())
8997 CastSpell(this, 29471, true, castItem, triggeredByAura);
8998 if (victim && victim->IsAlive())
8999 CastSpell(victim, 27526, true, castItem, triggeredByAura);
9000 return true;
9001 }
9002 // Forge of Souls, Devourer of Souls, Mirrored Soul
9003 case 69023:
9004 {
9005 int32 dmg = damage * 0.45f;
9006 if (dmg > 0)
9007 if (Aura* a = GetAura(69023))
9008 if (Unit* c = a->GetCaster())
9009 CastCustomSpell(c, 69034, &dmg, 0, 0, true);
9010 return true;
9011 }
9012 // Soul-Trader Beacon proc aura
9013 case 50051:
9014 {
9015 if (!victim)
9016 return false;
9017
9019 cr->CastSpell(victim, 50101, true);
9020
9021 return false;
9022 }
9023 }
9024 break;
9025 case SPELLFAMILY_MAGE:
9026 if (auraSpellInfo->SpellIconID == 2127) // Blazing Speed
9027 {
9028 switch (auraSpellInfo->Id)
9029 {
9030 case 31641: // Rank 1
9031 case 31642: // Rank 2
9032 trigger_spell_id = 31643;
9033 break;
9034 default:
9035 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Blazing Speed", auraSpellInfo->Id);
9036 return false;
9037 }
9038 }
9039 else if (auraSpellInfo->Id == 71761) // Deep Freeze Immunity State (only permanent)
9040 {
9041 Creature* creature = victim->ToCreature();
9042 if (!creature || !creature->HasMechanicTemplateImmunity(1 << (MECHANIC_STUN - 1)))
9043 return false;
9044 }
9045 break;
9047 {
9048 // Nether Protection
9049 if (auraSpellInfo->SpellIconID == 1985)
9050 {
9051 if (!procSpell)
9052 return false;
9053 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9054 {
9056 return false; // ignore
9057 case SPELL_SCHOOL_HOLY:
9058 trigger_spell_id = 54370;
9059 break;
9060 case SPELL_SCHOOL_FIRE:
9061 trigger_spell_id = 54371;
9062 break;
9064 trigger_spell_id = 54375;
9065 break;
9066 case SPELL_SCHOOL_FROST:
9067 trigger_spell_id = 54372;
9068 break;
9070 trigger_spell_id = 54374;
9071 break;
9073 trigger_spell_id = 54373;
9074 break;
9075 default:
9076 return false;
9077 }
9078 }
9079 break;
9080 }
9081 case SPELLFAMILY_PRIEST:
9082 {
9083 // Blessed Recovery
9084 if (auraSpellInfo->SpellIconID == 1875)
9085 {
9086 switch (auraSpellInfo->Id)
9087 {
9088 case 27811:
9089 trigger_spell_id = 27813;
9090 break;
9091 case 27815:
9092 trigger_spell_id = 27817;
9093 break;
9094 case 27816:
9095 trigger_spell_id = 27818;
9096 break;
9097 default:
9098 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in BR", auraSpellInfo->Id);
9099 return false;
9100 }
9101 basepoints0 = CalculatePct(int32(damage), triggerAmount) / 3;
9102 target = this;
9103 // Add remaining ticks to healing done
9104 CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
9105 return true;
9106 }
9107 break;
9108 }
9109 case SPELLFAMILY_DRUID:
9110 {
9111 switch (auraSpellInfo->Id)
9112 {
9113 // Druid Forms Trinket
9114 case 37336:
9115 {
9116 switch (GetShapeshiftForm())
9117 {
9118 case FORM_NONE:
9119 trigger_spell_id = 37344;
9120 break;
9121 case FORM_CAT:
9122 trigger_spell_id = 37341;
9123 break;
9124 case FORM_BEAR:
9125 case FORM_DIREBEAR:
9126 trigger_spell_id = 37340;
9127 break;
9128 case FORM_TREE:
9129 trigger_spell_id = 37342;
9130 break;
9131 case FORM_MOONKIN:
9132 trigger_spell_id = 37343;
9133 break;
9134 default:
9135 return false;
9136 }
9137 break;
9138 }
9139 // Druid T9 Feral Relic (Lacerate, Swipe, Mangle, and Shred)
9140 case 67353:
9141 {
9142 switch (GetShapeshiftForm())
9143 {
9144 case FORM_CAT:
9145 trigger_spell_id = 67355;
9146 break;
9147 case FORM_BEAR:
9148 case FORM_DIREBEAR:
9149 trigger_spell_id = 67354;
9150 break;
9151 default:
9152 return false;
9153 }
9154 break;
9155 }
9156 default:
9157 break;
9158 }
9159 break;
9160 }
9161 case SPELLFAMILY_HUNTER:
9162 {
9163 if (auraSpellInfo->SpellIconID == 3247) // Piercing Shots
9164 {
9165 if (!victim)
9166 return false;
9167
9168 switch (auraSpellInfo->Id)
9169 {
9170 case 53234: // Rank 1
9171 case 53237: // Rank 2
9172 case 53238: // Rank 3
9173 trigger_spell_id = 63468;
9174 break;
9175 default:
9176 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Piercing Shots", auraSpellInfo->Id);
9177 return false;
9178 }
9179 SpellInfo const* TriggerPS = sSpellMgr->GetSpellInfo(trigger_spell_id);
9180 if (!TriggerPS)
9181 return false;
9182
9183 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (TriggerPS->GetMaxDuration() / TriggerPS->Effects[0].Amplitude);
9184 victim->CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
9185 return true;
9186 }
9187 // Item - Hunter T9 4P Bonus (Steady Shot)
9188 else if (auraSpellInfo->Id == 67151)
9189 {
9190 if (GetTypeId() != TYPEID_PLAYER || !ToPlayer()->GetPet())
9191 return false;
9192
9193 target = ToPlayer()->GetPet();
9194 trigger_spell_id = 68130;
9195 break;
9196 }
9197 break;
9198 }
9200 {
9201 switch (auraSpellInfo->Id)
9202 {
9203 // Soul Preserver
9204 case 60510:
9205 {
9206 switch (getClass())
9207 {
9208 case CLASS_DRUID:
9209 trigger_spell_id = 60512;
9210 break;
9211 case CLASS_PALADIN:
9212 trigger_spell_id = 60513;
9213 break;
9214 case CLASS_PRIEST:
9215 trigger_spell_id = 60514;
9216 break;
9217 case CLASS_SHAMAN:
9218 trigger_spell_id = 60515;
9219 break;
9220 }
9221
9222 target = this;
9223 break;
9224 }
9225 case 37657: // Lightning Capacitor
9226 case 54841: // Thunder Capacitor
9227 case 67712: // Item - Coliseum 25 Normal Caster Trinket
9228 case 67758: // Item - Coliseum 25 Heroic Caster Trinket
9229 {
9230 if (!victim || !victim->IsAlive() || GetTypeId() != TYPEID_PLAYER)
9231 return false;
9232
9233 uint32 stack_spell_id = 0;
9234 switch (auraSpellInfo->Id)
9235 {
9236 case 37657:
9237 stack_spell_id = 37658;
9238 trigger_spell_id = 37661;
9239 break;
9240 case 54841:
9241 stack_spell_id = 54842;
9242 trigger_spell_id = 54843;
9243 break;
9244 case 67712:
9245 stack_spell_id = 67713;
9246 trigger_spell_id = 67714;
9247 break;
9248 case 67758:
9249 stack_spell_id = 67759;
9250 trigger_spell_id = 67760;
9251 break;
9252 }
9253
9254 if (cooldown && GetTypeId() == TYPEID_PLAYER)
9255 {
9256 if (ToPlayer()->HasSpellCooldown(stack_spell_id))
9257 return false;
9258
9259 ToPlayer()->AddSpellCooldown(stack_spell_id, 0, cooldown);
9260 }
9261
9262 CastSpell(this, stack_spell_id, true, nullptr, triggeredByAura);
9263
9264 Aura* dummy = GetAura(stack_spell_id);
9265 if (!dummy || dummy->GetStackAmount() < triggerAmount)
9266 return false;
9267
9268 RemoveAurasDueToSpell(stack_spell_id);
9269 CastSpell(victim, trigger_spell_id, true, nullptr, triggeredByAura);
9270 return true;
9271 }
9272 default:
9273 // Illumination
9274 if (auraSpellInfo->SpellIconID == 241)
9275 {
9276 if (!procSpell)
9277 return false;
9278 // procspell is triggered spell but we need mana cost of original casted spell
9279 uint32 originalSpellId = procSpell->Id;
9280 // Holy Shock heal
9281 if (procSpell->SpellFamilyFlags[1] & 0x00010000)
9282 {
9283 switch (procSpell->Id)
9284 {
9285 case 25914:
9286 originalSpellId = 20473;
9287 break;
9288 case 25913:
9289 originalSpellId = 20929;
9290 break;
9291 case 25903:
9292 originalSpellId = 20930;
9293 break;
9294 case 27175:
9295 originalSpellId = 27174;
9296 break;
9297 case 33074:
9298 originalSpellId = 33072;
9299 break;
9300 case 48820:
9301 originalSpellId = 48824;
9302 break;
9303 case 48821:
9304 originalSpellId = 48825;
9305 break;
9306 default:
9307 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in HShock", procSpell->Id);
9308 return false;
9309 }
9310 }
9311 SpellInfo const* originalSpell = sSpellMgr->GetSpellInfo(originalSpellId);
9312 if (!originalSpell)
9313 {
9314 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} unknown but selected as original in Illu", originalSpellId);
9315 return false;
9316 }
9317 // percent stored in effect 1 (class scripts) base points
9318 int32 cost = int32(originalSpell->ManaCost + CalculatePct(GetCreateMana(), originalSpell->ManaCostPercentage));
9319 basepoints0 = CalculatePct(cost, auraSpellInfo->Effects[1].CalcValue());
9320 trigger_spell_id = 20272;
9321 target = this;
9322 }
9323 break;
9324 }
9325 break;
9326 }
9327 case SPELLFAMILY_SHAMAN:
9328 {
9329 // Lightning Shield (overwrite non existing triggered spell call in spell.dbc
9330 if (auraSpellInfo->SpellFamilyFlags[0] & 0x400 && auraSpellInfo->HasAttribute(SPELL_ATTR1_NO_THREAT))
9331 {
9332 // Do not proc off from self-casted items
9333 if (Spell const* spell = eventInfo.GetProcSpell())
9334 {
9335 if (spell->m_castItemGUID && victim->GetGUID() == GetGUID())
9336 {
9337 return false;
9338 }
9339 }
9340
9341 trigger_spell_id = sSpellMgr->GetSpellWithRank(26364, auraSpellInfo->GetRank());
9342 }
9343 // Nature's Guardian
9344 else if (auraSpellInfo->SpellIconID == 2013)
9345 {
9346 // Check health condition - should drop to less 30% (damage deal after this!)
9347 if (!HealthBelowPctDamaged(30, damage))
9348 return false;
9349
9350 if (victim && victim->IsAlive())
9351 victim->GetThreatMgr().ModifyThreatByPercent(this, -10);
9352
9353 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
9354 trigger_spell_id = 31616;
9355 target = this;
9356 }
9357 break;
9358 }
9360 {
9361 // Acclimation
9362 if (auraSpellInfo->SpellIconID == 1930)
9363 {
9364 if (!procSpell)
9365 return false;
9366 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9367 {
9369 return false; // ignore
9370 case SPELL_SCHOOL_HOLY:
9371 trigger_spell_id = 50490;
9372 break;
9373 case SPELL_SCHOOL_FIRE:
9374 trigger_spell_id = 50362;
9375 break;
9377 trigger_spell_id = 50488;
9378 break;
9379 case SPELL_SCHOOL_FROST:
9380 trigger_spell_id = 50485;
9381 break;
9383 trigger_spell_id = 50489;
9384 break;
9386 trigger_spell_id = 50486;
9387 break;
9388 default:
9389 return false;
9390 }
9391 }
9392 // Blood Presence (Improved)
9393 else if (auraSpellInfo->Id == 63611)
9394 {
9395 if (GetTypeId() != TYPEID_PLAYER)
9396 return false;
9397
9398 trigger_spell_id = 50475;
9399 basepoints0 = CalculatePct(int32(damage), triggerAmount);
9400 }
9401 break;
9402 }
9403 }
9404 }
9405
9406 // All ok. Check current trigger spell
9407 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(trigger_spell_id);
9408 if (!triggerEntry)
9409 {
9410 // Don't cast unknown spell
9411 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} (effIndex: {}) has unknown TriggerSpell {}. Unhandled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex(), trigger_spell_id);
9412 return false;
9413 }
9414
9415 // not allow proc extra attack spell at extra attack
9416 if (triggerEntry->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS))
9417 {
9418 uint32 lastExtraAttackSpell = eventInfo.GetActor()->GetLastExtraAttackSpell();
9419
9420 // Patch 1.12.0(?) extra attack abilities can no longer chain proc themselves
9421 if (lastExtraAttackSpell == trigger_spell_id)
9422 {
9423 return false;
9424 }
9425
9426 // Patch 2.2.0 Sword Specialization (Warrior, Rogue) extra attack can no longer proc additional extra attacks
9427 // 3.3.5 Sword Specialization (Warrior), Hack and Slash (Rogue)
9428 if (lastExtraAttackSpell == SPELL_SWORD_SPECIALIZATION || lastExtraAttackSpell == SPELL_HACK_AND_SLASH)
9429 {
9430 return false;
9431 }
9432 }
9433
9434 // Custom requirements (not listed in procEx) Warning! damage dealing after this
9435 // Custom triggered spells
9436 switch (auraSpellInfo->Id)
9437 {
9438 // Deep Wounds
9439 case 12834:
9440 case 12849:
9441 case 12867:
9442 {
9443 if (GetTypeId() != TYPEID_PLAYER)
9444 return false;
9445
9446 if (procFlags & PROC_FLAG_DONE_OFFHAND_ATTACK)
9448 else
9450 break;
9451 }
9452 // Persistent Shield (Scarab Brooch trinket)
9453 // This spell originally trigger 13567 - Dummy Trigger (vs dummy efect)
9454 case 26467:
9455 {
9456 basepoints0 = int32(CalculatePct(damage, 15));
9457 target = victim;
9458 trigger_spell_id = 26470;
9459 break;
9460 }
9461 // Unyielding Knights (item exploit 29108\29109)
9462 case 38164:
9463 {
9464 if (!victim || victim->GetEntry() != 19457) // Proc only if your target is Grillok
9465 return false;
9466 break;
9467 }
9468 // Deflection
9469 case 52420:
9470 {
9471 if (!HealthBelowPct(35))
9472 return false;
9473 break;
9474 }
9475
9476 // Cheat Death
9477 case 28845:
9478 {
9479 // When your health drops below 20%
9480 if (HealthBelowPctDamaged(20, damage) || HealthBelowPct(20))
9481 return false;
9482 break;
9483 }
9484 // Deadly Swiftness (Rank 1)
9485 case 31255:
9486 {
9487 // whenever you deal damage to a target who is below 20% health.
9488 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(20))
9489 return false;
9490
9491 target = this;
9492 trigger_spell_id = 22588;
9493 [[fallthrough]];
9494 }
9495 // Bonus Healing (Crystal Spire of Karabor mace)
9496 case 40971:
9497 {
9498 // If your target is below $s1% health
9499 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(triggerAmount))
9500 return false;
9501 break;
9502 }
9503 // Rapid Recuperation
9504 case 53228:
9505 case 53232:
9506 {
9507 // This effect only from Rapid Fire (ability cast)
9508 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x20))
9509 return false;
9510 break;
9511 }
9512 // Decimation
9513 case 63156:
9514 case 63158:
9515 // Can proc only if target has hp below 35%
9516 if (!victim || !victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, procSpell, this))
9517 return false;
9518 break;
9519 // Ulduar, Hodir, Toasty Fire
9520 case 62821:
9521 if (this->GetTypeId() != TYPEID_PLAYER) // spell has Attribute, but persistent area auras ignore it
9522 return false;
9523 break;
9524 case 15337: // Improved Spirit Tap (Rank 1)
9525 case 15338: // Improved Spirit Tap (Rank 2)
9526 {
9527 if (!procSpell)
9528 return false;
9529
9530 if (procSpell->SpellFamilyFlags[0] & 0x800000)
9531 if ((procSpell->Id != 58381) || !roll_chance_i(50))
9532 return false;
9533
9534 target = victim;
9535 break;
9536 }
9537 // Professor Putricide - Ooze Spell Tank Protection
9538 case 71770:
9539 if (victim)
9540 victim->CastSpell(victim, trigger_spell_id, true); // EffectImplicitTarget is self
9541 return true;
9542 case 45057: // Evasive Maneuvers (Commendation of Kael`thas trinket)
9543 case 71634: // Item - Icecrown 25 Normal Tank Trinket 1
9544 case 71640: // Item - Icecrown 25 Heroic Tank Trinket 1
9545 case 75475: // Item - Chamber of Aspects 25 Normal Tank Trinket
9546 case 75481: // Item - Chamber of Aspects 25 Heroic Tank Trinket
9547 {
9548 // Procs only if damage takes health below $s1%
9549 if (!HealthBelowPctDamaged(triggerAmount, damage))
9550 return false;
9551 break;
9552 }
9553 default:
9554 break;
9555 }
9556
9557 if (auraSpellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
9558 {
9559 // Xinef: keep this order, Aura 70656 has SpellIconID 85!
9560 // Item - Death Knight T10 Melee 4P Bonus
9561 if (auraSpellInfo->Id == 70656)
9562 {
9564 return false;
9565
9566 for (uint8 i = 0; i < MAX_RUNES; ++i)
9567 if (ToPlayer()->GetRuneCooldown(i) == 0)
9568 return false;
9569 }
9570 // Blade Barrier
9571 else if (auraSpellInfo->SpellIconID == 85)
9572 {
9573 Player* plr = ToPlayer();
9574 if (!plr || plr->getClass() != CLASS_DEATH_KNIGHT || !procSpell)
9575 return false;
9576
9578 return false;
9579 }
9580 // Rime
9581 else if (auraSpellInfo->SpellIconID == 56)
9582 {
9583 if (GetTypeId() != TYPEID_PLAYER)
9584 return false;
9585
9586 // Howling Blast
9588 }
9589 }
9590
9591 // Custom basepoints/target for exist spell
9592 // dummy basepoints or other customs
9593 switch (trigger_spell_id)
9594 {
9595 // Auras which should proc on area aura source (caster in this case):
9596 // Turn the Tables
9597 case 52914:
9598 case 52915:
9599 case 52910:
9600 // Honor Among Thieves
9601 case 51699:
9602 {
9603 target = triggeredByAura->GetBase()->GetCaster();
9604 if (!target)
9605 return false;
9606
9607 if (Player* pTarget = target->ToPlayer())
9608 {
9609 if (cooldown)
9610 {
9611 if (pTarget->HasSpellCooldown(trigger_spell_id) )
9612 return false;
9613 pTarget->AddSpellCooldown(trigger_spell_id, 0, cooldown);
9614 }
9615
9616 Unit* cptarget = nullptr;
9617 if (trigger_spell_id == 51699)
9618 {
9619 cptarget = pTarget->GetComboTarget();
9620 if (!cptarget)
9621 {
9622 cptarget = pTarget->GetSelectedUnit();
9623 }
9624 }
9625 else
9626 cptarget = target;
9627
9628 if (cptarget)
9629 {
9630 target->CastSpell(cptarget, trigger_spell_id, true);
9631 return true;
9632 }
9633 }
9634 return false;
9635 }
9636 // Cast positive spell on enemy target
9637 case 7099: // Curse of Mending
9638 case 39703: // Curse of Mending
9639 case 20233: // Improved Lay on Hands (cast on target)
9640 {
9641 target = victim;
9642 break;
9643 }
9644 // Ruby Drake, Evasive Aura
9645 case 50241:
9646 {
9647 if( GetAura(50240) )
9648 return false;
9649
9650 break;
9651 }
9652 // Combo points add triggers (need add combopoint only for main target, and after possible combopoints reset)
9653 case 15250: // Rogue Setup
9654 {
9655 // applied only for main target
9656 if (!victim || (GetTypeId() == TYPEID_PLAYER && victim != ToPlayer()->GetSelectedUnit()))
9657 return false;
9658 break; // continue normal case
9659 }
9660 // Finish movies that add combo
9661 case 14189: // Seal Fate (Netherblade set)
9662 case 14157: // Ruthlessness
9663 {
9664 victim = nullptr;
9665 // Need add combopoint AFTER finish movie (or they dropped in finish phase)
9666 break;
9667 }
9668 // Item - Druid T10 Balance 2P Bonus
9669 case 16870:
9670 {
9671 if (HasAura(70718))
9672 CastSpell(this, 70721, true);
9673 RemoveAurasDueToSpell(trigger_spell_id);
9674 break;
9675 }
9676 // Shamanistic Rage triggered spell
9677 case 30824:
9678 {
9679 basepoints0 = int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), triggerAmount));
9680 break;
9681 }
9682 // Enlightenment (trigger only from mana cost spells)
9683 case 35095:
9684 {
9685 if (!procSpell || procSpell->PowerType != POWER_MANA || (procSpell->ManaCost == 0 && procSpell->ManaCostPercentage == 0 && procSpell->ManaCostPerlevel == 0))
9686 return false;
9687 break;
9688 }
9689 // Demonic Pact
9690 case 48090:
9691 {
9692 // Get talent aura from owner
9693 if (IsPet())
9694 if (Unit* owner = GetOwner())
9695 {
9696 if (HasSpellCooldown(trigger_spell_id))
9697 return false;
9698 AddSpellCooldown(trigger_spell_id, 0, cooldown);
9699
9700 if (AuraEffect* aurEff = owner->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, 3220, 0))
9701 {
9702 int32 spellPower = owner->SpellBaseDamageBonusDone(SpellSchoolMask(SPELL_SCHOOL_MASK_MAGIC));
9703 if (AuraEffect const* demonicAuraEffect = GetAuraEffect(trigger_spell_id, EFFECT_0))
9704 spellPower -= demonicAuraEffect->GetAmount();
9705
9706 basepoints0 = int32((aurEff->GetAmount() * spellPower + 100.0f) / 100.0f);
9707 CastCustomSpell(this, trigger_spell_id, &basepoints0, &basepoints0, nullptr, true, castItem, triggeredByAura);
9708 return true;
9709 }
9710 }
9711 break;
9712 }
9713 case 46916: // Slam! (Bloodsurge proc)
9714 case 52437: // Sudden Death
9715 {
9716 // Item - Warrior T10 Melee 4P Bonus
9717 if (AuraEffect const* aurEff = GetAuraEffect(70847, 0))
9718 {
9719 if (!roll_chance_i(aurEff->GetAmount()))
9720 {
9721 // Xinef: dont allow normal proc to override set one
9722 if (GetAura((trigger_spell_id == 46916) ? 71072 : 71069))
9723 return false;
9724 // Xinef: just to be sure
9725 RemoveAurasDueToSpell(70849);
9726 break;
9727 }
9728
9729 // Xinef: fully remove all auras and reapply once more
9730 RemoveAurasDueToSpell(70849);
9731 RemoveAurasDueToSpell(71072);
9732 RemoveAurasDueToSpell(71069);
9733
9734 CastSpell(this, 70849, true, castItem, triggeredByAura); // Extra Charge!
9735 if (trigger_spell_id == 46916)
9736 CastSpell(this, 71072, true, castItem, triggeredByAura); // Slam GCD Reduced
9737 else
9738 CastSpell(this, 71069, true, castItem, triggeredByAura); // Execute GCD Reduced
9739 }
9740 break;
9741 }
9742 // Sword and Board
9743 case 50227:
9744 {
9745 // Remove cooldown on Shield Slam
9746 if (GetTypeId() == TYPEID_PLAYER)
9748 break;
9749 }
9750 // Maelstrom Weapon
9751 case 53817:
9752 {
9753 // have rank dependent proc chance, ignore too often cases
9754 // PPM = 2.5 * (rank of talent),
9755 uint32 rank = auraSpellInfo->GetRank();
9756 // 5 rank -> 100% 4 rank -> 80% and etc from full rate
9757 if (!roll_chance_i(20 * rank))
9758 return false;
9759
9760 // Item - Shaman T10 Enhancement 4P Bonus
9761 if (AuraEffect const* aurEff = GetAuraEffect(70832, 0))
9762 if (Aura const* maelstrom = GetAura(53817))
9763 // xinef: we have 4 charges and all proc conditions are met - aura reaches 5 charges
9764 if ((maelstrom->GetStackAmount() == 4) && roll_chance_i(aurEff->GetAmount()))
9765 CastSpell(this, 70831, true, castItem, triggeredByAura);
9766
9767 break;
9768 }
9769 // Astral Shift
9770 case 52179:
9771 {
9772 if (!procSpell || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
9773 return false;
9774
9775 // Need stun, fear or silence mechanic
9776 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_SILENCE) | (1 << MECHANIC_STUN) | (1 << MECHANIC_FEAR))))
9777 return false;
9778 break;
9779 }
9780 // Glyph of Death's Embrace
9781 case 58679:
9782 {
9783 // Proc only from healing part of Death Coil. Check is essential as all Death Coil spells have 0x2000 mask in SpellFamilyFlags
9784 if (!procSpell || !(procSpell->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && procSpell->SpellFamilyFlags[0] == 0x80002000))
9785 return false;
9786 break;
9787 }
9788 // Glyph of Death Grip
9789 case 58628:
9790 {
9791 // remove cooldown of Death Grip
9792 if (GetTypeId() == TYPEID_PLAYER)
9793 ToPlayer()->RemoveSpellCooldown(49576, true);
9794 return true;
9795 }
9796 // Savage Defense
9797 case 62606:
9798 {
9799 basepoints0 = CalculatePct(triggerAmount, GetTotalAttackPowerValue(BASE_ATTACK));
9800 break;
9801 }
9802 // Body and Soul
9803 case 64128:
9804 case 65081:
9805 {
9806 // Proc only from PW:S cast
9807 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x00000001))
9808 return false;
9809 break;
9810 }
9811 // Culling the Herd
9812 case 70893:
9813 {
9814 if (!procSpell)
9815 {
9816 return false;
9817 }
9818 // check if we're doing a critical hit
9819 if (!(procSpell->SpellFamilyFlags[1] & 0x10000000) && (procEx != PROC_EX_CRITICAL_HIT))
9820 return false;
9821 // check if we're procced by Claw, Bite or Smack (need to use the spell icon ID to detect it)
9822 if (!(procSpell->SpellIconID == 262 || procSpell->SpellIconID == 1680 || procSpell->SpellIconID == 473))
9823 return false;
9824 break;
9825 }
9826 // Fingers of Frost, synchronise with Frostbite
9827 case 44544:
9828 {
9829 if (procPhase == PROC_SPELL_PHASE_HIT)
9830 {
9831 // Find Frostbite
9833 {
9834 if (!victim)
9835 return false;
9836
9837 uint8 fofRank = sSpellMgr->GetSpellRank(triggeredByAura->GetId());
9838 uint8 fbRank = sSpellMgr->GetSpellRank(aurEff->GetId());
9839 uint8 chance = uint8(std::ceil(fofRank * fbRank * 16.6f));
9840
9841 if (roll_chance_i(chance))
9842 CastSpell(victim, aurEff->GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true);
9843 }
9844 }
9845 break;
9846 }
9847 }
9848
9849 // try detect target manually if not set
9850 if (!target)
9851 target = !(procFlags & (PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS)) && triggerEntry->IsPositive() ? this : victim;
9852
9853 if (cooldown)
9854 {
9855 if (HasSpellCooldown(triggerEntry->Id))
9856 return false;
9857
9858 AddSpellCooldown(triggerEntry->Id, 0, cooldown);
9859 }
9860
9861 if(basepoints0)
9862 CastCustomSpell(target, triggerEntry->Id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
9863 else
9864 CastSpell(target, triggerEntry->Id, true, castItem, triggeredByAura);
9865
9866 return true;
9867}
#define SUMMON_SLOT_MINIPET
Definition: Unit.h:1225
@ FORM_MOONKIN
Definition: Unit.h:119
@ FORM_NONE
Definition: Unit.h:90
@ FORM_TREE
Definition: Unit.h:92
@ SPELL_HACK_AND_SLASH
Definition: Unit.h:723
@ SPELL_SWORD_SPECIALIZATION
Definition: Unit.h:722
@ SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE
Definition: SpellAuraDefines.h:294
@ SPELL_AURA_ADD_TARGET_TRIGGER
Definition: SpellAuraDefines.h:172
@ PROC_SPELL_PHASE_HIT
Definition: SpellMgr.h:244
@ SPELL_EFFECT_ADD_EXTRA_ATTACKS
Definition: SharedDefines.h:797
@ SPELL_ATTR1_NO_THREAT
Definition: SharedDefines.h:429
@ MECHANIC_FEAR
Definition: SharedDefines.h:1330
@ MECHANIC_SILENCE
Definition: SharedDefines.h:1334
@ AURA_STATE_HEALTHLESS_35_PERCENT
Definition: SharedDefines.h:1305
@ SPELL_SCHOOL_MASK_MAGIC
Definition: SharedDefines.h:312
Creature * GetCreature(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:213
void ModifyThreatByPercent(Unit *victim, int32 percent)
Definition: ThreatMgr.cpp:508
bool HasMechanicTemplateImmunity(uint32 mask) const
Definition: Creature.cpp:2155
bool IsBaseRuneSlotsOnCooldown(RuneType runeType) const
Definition: Player.cpp:13396
void RemoveCategoryCooldown(uint32 cat)
Definition: Player.cpp:3483
Spell const * GetProcSpell() const
Definition: Unit.h:879
Unit * GetActor()
Definition: Unit.h:870
bool HealthAbovePct(int32 pct) const
Definition: Unit.h:1460
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition: Unit.cpp:15414
uint32 GetLastExtraAttackSpell() const
Definition: Unit.h:1584
uint32 GetCreateHealth() const
Definition: Unit.h:2053
Unit * GetComboTarget() const
Definition: Unit.h:2306
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition: Unit.h:1459
uint32 ManaCostPercentage
Definition: SpellInfo.h:365
bool HasEffect(SpellEffects effect) const
Definition: SpellInfo.cpp:872
uint32 ManaCost
Definition: SpellInfo.h:361

References Player::AddSpellCooldown(), AddSpellCooldown(), AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, CalculatePct(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_PALADIN, CLASS_PRIEST, CLASS_SHAMAN, CountPctFromMaxHealth(), EFFECT_0, SpellInfo::Effects, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_MOONKIN, FORM_NONE, FORM_TREE, ProcEventInfo::GetActor(), SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), GetAura(), GetAuraEffect(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), Aura::GetCaster(), Aura::GetCastItemGUID(), getClass(), GetComboTarget(), GetCreateHealth(), GetCreateMana(), ObjectAccessor::GetCreature(), AuraEffect::GetEffIndex(), Object::GetEntry(), GetFirstSchoolInMask(), Object::GetFloatValue(), Object::GetGUID(), AuraEffect::GetId(), Player::GetItemByGuid(), GetLastExtraAttackSpell(), SpellInfo::GetMaxDuration(), GetOwner(), Player::GetPet(), ProcEventInfo::GetProcSpell(), SpellInfo::GetRank(), SpellInfo::GetSchoolMask(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), Aura::GetStackAmount(), GetStat(), GetThreatMgr(), GetTotalAttackPowerValue(), Object::GetTypeId(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), SpellInfo::HasEffect(), Creature::HasMechanicTemplateImmunity(), HasSpellCooldown(), HealthAbovePct(), HealthBelowPct(), HealthBelowPctDamaged(), SpellInfo::Id, IsAlive(), Player::IsBaseRuneSlotsOnCooldown(), IsPet(), SpellInfo::IsPositive(), LOG_ERROR, m_SummonSlot, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, SpellInfo::ManaCostPerlevel, MAX_RUNES, MECHANIC_FEAR, MECHANIC_SILENCE, MECHANIC_STUN, ThreatMgr::ModifyThreatByPercent(), POWER_MANA, SpellInfo::PowerType, PROC_EX_CRITICAL_HIT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, PROC_SPELL_PHASE_HIT, RemoveAurasDueToSpell(), Player::RemoveCategoryCooldown(), Player::RemoveSpellCooldown(), roll_chance_i(), RUNE_BLOOD, SPELL_ATTR1_NO_THREAT, SPELL_AURA_ADD_TARGET_TRIGGER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_EFFECT_ADD_EXTRA_ATTACKS, SPELL_HACK_AND_SLASH, SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_MASK_MAGIC, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, SPELL_SWORD_SPECIALIZATION, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, sSpellMgr, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STRENGTH, SUMMON_SLOT_MINIPET, Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MINDAMAGE, and UNIT_FIELD_MINOFFHANDDAMAGE.

Referenced by ProcDamageAndSpellFor().

◆ HandleSafeUnitPointersOnDelete()

void Unit::HandleSafeUnitPointersOnDelete ( Unit thisUnit)
static
4282{
4283 if (thisUnit->SafeUnitPointerSet.empty())
4284 return;
4285 for (std::set<SafeUnitPointer*>::iterator itr = thisUnit->SafeUnitPointerSet.begin(); itr != thisUnit->SafeUnitPointerSet.end(); ++itr)
4286 (*itr)->UnitDeleted();
4287
4288 thisUnit->SafeUnitPointerSet.clear();
4289}

References SafeUnitPointerSet.

Referenced by ~Unit().

◆ HandleSpellClick()

bool Unit::HandleSpellClick ( Unit clicker,
int8  seatId = -1 
)

First check simple relations from clicker to clickee

Check database conditions

19810{
19811 Creature* creature = ToCreature();
19812 if (creature && creature->IsAIEnabled)
19813 {
19814 if (!creature->AI()->BeforeSpellClick(clicker))
19815 {
19816 return false;
19817 }
19818 }
19819
19820 bool result = false;
19821 uint32 spellClickEntry = GetVehicleKit() ? GetVehicleKit()->GetCreatureEntry() : GetEntry();
19822 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(spellClickEntry);
19823 for (SpellClickInfoContainer::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr)
19824 {
19826 if (!itr->second.IsFitToRequirements(clicker, this))
19827 continue;
19828
19830 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(spellClickEntry, itr->second.spellId);
19831 ConditionSourceInfo info = ConditionSourceInfo(clicker, this);
19832 if (!sConditionMgr->IsObjectMeetToConditions(info, conds))
19833 continue;
19834
19835 Unit* caster = (itr->second.castFlags & NPC_CLICK_CAST_CASTER_CLICKER) ? clicker : this;
19836 Unit* target = (itr->second.castFlags & NPC_CLICK_CAST_TARGET_CLICKER) ? clicker : this;
19837 ObjectGuid origCasterGUID = (itr->second.castFlags & NPC_CLICK_CAST_ORIG_CASTER_OWNER) ? GetOwnerGUID() : clicker->GetGUID();
19838
19839 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->second.spellId);
19840
19841 // xinef: dont allow players to enter vehicles on arena
19842 if (spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) && caster->GetTypeId() == TYPEID_PLAYER && caster->FindMap() && caster->FindMap()->IsBattleArena())
19843 continue;
19844
19845 if (seatId > -1)
19846 {
19847 uint8 i = 0;
19848 bool valid = false;
19849 while (i < MAX_SPELL_EFFECTS)
19850 {
19851 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_CONTROL_VEHICLE)
19852 {
19853 valid = true;
19854 break;
19855 }
19856 ++i;
19857 }
19858
19859 if (!valid)
19860 {
19861 LOG_ERROR("sql.sql", "Spell {} specified in npc_spellclick_spells is not a valid vehicle enter aura!", itr->second.spellId);
19862 continue;
19863 }
19864
19865 if (IsInMap(caster))
19866 caster->CastCustomSpell(itr->second.spellId, SpellValueMod(SPELLVALUE_BASE_POINT0 + i), seatId + 1, target, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19867 else // This can happen during Player::_LoadAuras
19868 {
19870 for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j)
19871 bp0[j] = spellInfo->Effects[j].BasePoints;
19872
19873 bp0[i] = seatId;
19874 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, bp0, nullptr, origCasterGUID);
19875 }
19876 }
19877 else
19878 {
19879 if (IsInMap(caster))
19880 caster->CastSpell(target, spellInfo, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19881 else
19882 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, nullptr, nullptr, origCasterGUID);
19883 }
19884
19885 result = true;
19886 }
19887
19888 if (creature && creature->IsAIEnabled)
19889 creature->AI()->OnSpellClick(clicker, result);
19890
19891 return result;
19892}
#define sConditionMgr
Definition: ConditionMgr.h:289
std::list< Condition * > ConditionList
Definition: ConditionMgr.h:236
std::pair< SpellClickInfoContainer::const_iterator, SpellClickInfoContainer::const_iterator > SpellClickInfoMapBounds
Definition: ObjectMgr.h:409
SpellValueMod
Definition: SpellDefines.h:113
@ NPC_CLICK_CAST_TARGET_CLICKER
Definition: SharedDefines.h:691
@ NPC_CLICK_CAST_ORIG_CASTER_OWNER
Definition: SharedDefines.h:692
@ NPC_CLICK_CAST_CASTER_CLICKER
Definition: SharedDefines.h:690
virtual void OnSpellClick(Unit *, bool &)
Definition: CreatureAI.h:200
virtual bool BeforeSpellClick(Unit *)
Definition: CreatureAI.h:198
Definition: ConditionMgr.h:181
uint32 GetCreatureEntry() const
Definition: Vehicle.h:41
bool HasAura(AuraType aura) const
Definition: SpellInfo.cpp:880

References Creature::AI(), CreatureAI::BeforeSpellClick(), CastCustomSpell(), CastSpell(), SpellInfo::Effects, WorldObject::FindMap(), Vehicle::GetCreatureEntry(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), Object::GetTypeId(), GetVehicleKit(), SpellInfo::HasAura(), IsAIEnabled, Map::IsBattleArena(), WorldObject::IsInMap(), LOG_ERROR, MAX_EFFECT_MASK, MAX_SPELL_EFFECTS, NPC_CLICK_CAST_CASTER_CLICKER, NPC_CLICK_CAST_ORIG_CASTER_OWNER, NPC_CLICK_CAST_TARGET_CLICKER, CreatureAI::OnSpellClick(), sConditionMgr, sObjectMgr, SPELL_AURA_CONTROL_VEHICLE, SPELLVALUE_BASE_POINT0, sSpellMgr, Object::ToCreature(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, TRIGGERED_NONE, Aura::TryRefreshStackOrCreate(), and TYPEID_PLAYER.

Referenced by boss_xt002::boss_xt002AI::AttachHeart(), boss_kologarn::boss_kologarnAI::AttachLeftArm(), boss_kologarn::boss_kologarnAI::AttachRightArm(), WorldSession::HandleSpellClick(), Vehicle::InstallAccessory(), and npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI().

◆ HandleStatModifier()

bool Unit::HandleStatModifier ( UnitMods  unitMod,
UnitModifierType  modifierType,
float  amount,
bool  apply 
)
15190{
15191 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
15192 {
15193 LOG_ERROR("entities.unit", "ERROR in HandleStatModifier(): non-existing UnitMods or wrong UnitModifierType!");
15194 return false;
15195 }
15196
15197 switch (modifierType)
15198 {
15199 case BASE_VALUE:
15200 case TOTAL_VALUE:
15201 m_auraModifiersGroup[unitMod][modifierType] += apply ? amount : -amount;
15202 break;
15203 case BASE_PCT:
15204 case TOTAL_PCT:
15205 ApplyPercentModFloatVar(m_auraModifiersGroup[unitMod][modifierType], amount, apply);
15206 break;
15207 default:
15208 break;
15209 }
15210
15211 if (!CanModifyStats())
15212 return false;
15213
15214 switch (unitMod)
15215 {
15222 break;
15223
15224 case UNIT_MOD_ARMOR:
15225 UpdateArmor();
15226 break;
15227 case UNIT_MOD_HEALTH:
15229 break;
15230
15231 case UNIT_MOD_MANA:
15232 case UNIT_MOD_RAGE:
15233 case UNIT_MOD_FOCUS:
15234 case UNIT_MOD_ENERGY:
15235 case UNIT_MOD_HAPPINESS:
15236 case UNIT_MOD_RUNE:
15239 break;
15240
15248 break;
15249
15252 break;
15255 break;
15256
15259 break;
15262 break;
15265 break;
15266
15267 default:
15268 break;
15269 }
15270
15271 return true;
15272}
@ UNIT_MOD_ARMOR
Definition: Unit.h:275
@ UNIT_MOD_ATTACK_POWER
Definition: Unit.h:282
@ UNIT_MOD_HEALTH
Definition: Unit.h:267
@ UNIT_MOD_DAMAGE_RANGED
Definition: Unit.h:286
@ UNIT_MOD_DAMAGE_MAINHAND
Definition: Unit.h:284
@ UNIT_MOD_ATTACK_POWER_RANGED
Definition: Unit.h:283
void apply(T *val)
Definition: ByteConverter.h:40
SpellSchools GetSpellSchoolByAuraGroup(UnitMods unitMod) const
Definition: Unit.cpp:15331
Stats GetStatByAuraGroup(UnitMods unitMod) const
Definition: Unit.cpp:15363
virtual void UpdateAttackPowerAndDamage(bool ranged=false)=0
virtual void UpdateResistances(uint32 school)=0
Powers GetPowerTypeByAuraGroup(UnitMods unitMod) const
Definition: Unit.cpp:15392
virtual void UpdateDamagePhysical(WeaponAttackType attType)
Definition: StatSystem.cpp:60
virtual void UpdateArmor()=0
virtual void UpdateMaxPower(Powers power)=0
virtual bool UpdateStats(Stats stat)=0
bool CanModifyStats() const
Definition: Unit.h:2119
virtual void UpdateMaxHealth()=0

References ApplyPercentModFloatVar(), BASE_ATTACK, BASE_PCT, BASE_VALUE, CanModifyStats(), GetPowerTypeByAuraGroup(), GetSpellSchoolByAuraGroup(), GetStatByAuraGroup(), LOG_ERROR, m_auraModifiersGroup, MODIFIER_TYPE_END, OFF_ATTACK, RANGED_ATTACK, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_ARMOR, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, UNIT_MOD_END, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, UNIT_MOD_RESISTANCE_SHADOW, UNIT_MOD_RUNE, UNIT_MOD_RUNIC_POWER, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, UNIT_MOD_STAT_STRENGTH, UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDamagePhysical(), UpdateMaxHealth(), UpdateMaxPower(), UpdateResistances(), and UpdateStats().

Referenced by Player::_ApplyItemBonuses(), Player::_ApplyWeaponDependentAuraDamageMod(), boss_marli::_schedulePhaseSpider(), boss_marli::_schedulePhaseTroll(), Player::ApplyEnchantment(), AuraEffect::HandleAuraIncreaseBaseHealthPercent(), AuraEffect::HandleAuraModAttackPower(), AuraEffect::HandleAuraModAttackPowerPercent(), AuraEffect::HandleAuraModBaseResistancePCT(), AuraEffect::HandleAuraModIncreaseEnergy(), AuraEffect::HandleAuraModIncreaseEnergyPercent(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), AuraEffect::HandleAuraModRangedAttackPower(), AuraEffect::HandleAuraModRangedAttackPowerPercent(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModResistanceExclusive(), AuraEffect::HandleAuraModStat(), AuraEffect::HandleModBaseResistance(), AuraEffect::HandleModDamageDone(), AuraEffect::HandleModDamagePercentDone(), AuraEffect::HandleModOffhandDamagePercent(), AuraEffect::HandleModPercentStat(), AuraEffect::HandleModResistancePercent(), AuraEffect::HandleModTotalPercentStat(), Guardian::InitStatsForLevel(), spell_astromancer_solarian_transform::spell_astromancer_solarian_transform_AuraScript::OnApply(), spell_astromancer_solarian_transform::spell_astromancer_solarian_transform_AuraScript::OnRemove(), boss_arlokk::boss_arlokkAI::Reset(), boss_marli::Reset(), and boss_arlokk::boss_arlokkAI::UpdateAI().

◆ HasAura()

bool Unit::HasAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5637{
5638 if (GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask))
5639 return true;
5640 return false;
5641}

References GetAuraApplication().

Referenced by boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), spell_warl_health_funnel::ApplyEffect(), boss_archavon::boss_archavonAI::AttackStart(), boss_emalon::boss_emalonAI::AttackStart(), boss_koralon::boss_koralonAI::AttackStart(), boss_toravon::boss_toravonAI::AttackStart(), boss_hodir::boss_hodirAI::CanAIAttack(), boss_razorgore::boss_razorgoreAI::CanAIAttack(), boss_hazzarah::CanAIAttack(), boss_jindo::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_nethermancer_sepethrea::CanAIAttack(), boss_chromaggus::boss_chromaggusAI::CanAIAttack(), npc_wg_siege_machine::npc_wg_siege_machineAI::CanControlVehicle(), Player::CanJoinToBattleground(), Player::CanResummonPet(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), Player::CastItemCombatSpell(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), Spell::CheckCast(), Spell::CheckCasterAuras(), Spell::CheckItems(), spell_pal_hand_of_sacrifice::CheckTarget(), SpellInfo::CheckTarget(), spell_hun_lock_and_load::CheckTrapProc(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_thekal::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), boss_kalecgos::boss_kalecgosAI::DoAction(), npc_midsummer_ribbon_pole_target::DoCleanupChecks(), Spell::DoCreateItem(), Spell::EffectDummy(), Spell::EffectHeal(), Spell::EffectInstaKill(), Spell::EffectSanctuary(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonPlayer(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), NPCStaveQuestAI::EvadeOnFeignDeath(), IceTombSummonEvent::Execute(), PartyTimeEmoteEvent::Execute(), spell_class_call_polymorph::FilterTargets(), spell_dru_wild_growth::FilterTargets(), spell_pri_circle_of_healing::FilterTargets(), lfg::LFGMgr::FinishDungeon(), GetDispellableAuraList(), instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::GetPlayerInMap(), Player::GetResurrectionSpellId(), Player::GiveXP(), go_wind_stone::go_wind_stoneAI::GossipHello(), go_soulwell::go_soulwellAI::GossipHello(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraMounted(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), spell_thaddius_pos_neg_charge::spell_thaddius_pos_neg_charge_SpellScript::HandleDamage(), spell_capacitus_polarity_charge::HandleDamage(), spell_mage_summon_water_elemental::HandleDummy(), spell_rog_preparation::HandleDummy(), spell_warr_charge::HandleDummy(), HandleDummyAuraProc(), spell_q12851_going_bearback::HandleEffectApply(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_oculus_soar::spell_oculus_soarAuraScript::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), Player::HandleFall(), gm_commandscript::HandleGMVisibleCommand(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::spell_sindragosa_frost_breath_SpellScript::HandleInfusion(), BattlefieldWG::HandleKill(), lookup_commandscript::HandleLookupSpellCommand(), lookup_commandscript::HandleLookupSpellIdCommand(), WorldSession::HandleMessagechatOpcode(), spell_oculus_soar::spell_oculus_soarAuraScript::HandleOnEffectApply(), spell_mark_of_frost_freeze::HandleOnHit(), OPvPCapturePointZM_GraveYard::HandleOpenGo(), spell_hadronox_summon_periodic::spell_hadronox_summon_periodic_AuraScript::HandlePeriodic(), spell_garr_separation_nexiety::spell_garr_separation_nexiety_AuraScript::HandlePeriodic(), spell_majordomo_separation_nexiety::spell_majordomo_separation_nexiety_AuraScript::HandlePeriodic(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), spell_warr_vigilance::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_pal_lay_on_hands::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_q12611_deathbolt::HandleScriptEffect(), spell_dru_glyph_of_starfire::HandleScriptEffect(), misc_commandscript::HandleUnFreezeCommand(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::InformCloud(), boss_taldaram::InitializeAI(), Player::IsDeserter(), SpellArea::IsFitToRequirements(), npc_anzu_spirit::IsSummonedBy(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), IsVampire(), lfg::LFGMgr::JoinLfg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), boss_sindragosa::boss_sindragosaAI::JustDied(), boss_hydross_the_unstable::JustDied(), boss_alar::boss_alarAI::JustDied(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), boss_bjarngrim::boss_bjarngrimAI::JustEngagedWith(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::JustEngagedWith(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::JustEngagedWith(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::JustEngagedWith(), npc_hivezara_stinger::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_hydross_the_unstable::JustEngagedWith(), boss_hydross_the_unstable::JustReachedHome(), Kill(), boss_hydross_the_unstable::KilledUnit(), boss_hadronox::boss_hadronoxAI::KilledUnit(), Creature::LoadCreaturesAddon(), MeleeDamageBonusDone(), ModSpellCastTime(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), npc_custodian_of_time::npc_custodian_of_timeAI::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), boss_doomwalker::boss_doomwalkerAI::MoveInLineOfSight(), npc_daranelle::npc_daranelleAI::MoveInLineOfSight(), boss_lady_vashj::MovementInform(), boss_kagani_nightstrike::MovementInform(), achievement_staying_buffed_all_winter_10::OnCheck(), achievement_staying_buffed_all_winter_25::OnCheck(), achievement_flirt_with_disaster_perf_check::OnCheck(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_aged_dying_ancient_kodo::OnGossipHello(), npc_alchemist_adrianna::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_innkeeper::OnGossipHello(), go_manticron_cube::OnGossipHello(), go_orb_of_domination::OnGossipHello(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), instance_scarlet_monastery::instance_scarlet_monastery_InstanceMapScript::OnPlayerAreaUpdate(), instance_scarlet_monastery::instance_scarlet_monastery_InstanceMapScript::OnPlayerEnter(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerEnter(), spell_azjol_nerub_web_wrap::spell_azjol_nerub_web_wrap_AuraScript::OnRemove(), spell_icc_web_wrap::spell_icc_web_wrap_AuraScript::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), at_karazhan_atiesh_aran::OnTrigger(), at_hor_battered_hilt_start::OnTrigger(), at_hor_battered_hilt_throw::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), at_commander_dawnforge::OnTrigger(), item_gor_dreks_ointment::OnUse(), Acore::FriendlyMissingBuffInRange::operator()(), NotInStomachSelector::operator()(), SindragosaIceTombCheck::operator()(), NecroticPlagueTargetCheck::operator()(), DefaultTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), DefileTargetSelector::operator()(), ShadowOfDeathSelector::operator()(), Acore::UnitAuraCheck::operator()(), SpectralBlastCheck::operator()(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Player::ReportedAfkBy(), npc_corrupted_totem::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), boss_magus_telestra::boss_magus_telestraAI::Reset(), boss_fathomlord_karathress::Reset(), npc_pet_pri_shadowfiend::Reset(), Player::RewardHonor(), RewardRage(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_jormungarAI::ScheduleEvents(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), boss_anomalus::boss_anomalusAI::SetData(), npc_thassarian2::npc_thassarian2AI::sGossipHello(), npc_chesspiece::sGossipHello(), npc_omen::npc_omenAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::SpellHit(), npc_greengill_slave::npc_greengill_slaveAI::SpellHit(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::SpellHit(), SpellPctDamageModsDone(), SpellTakenCritChance(), Player::StoreItem(), boss_moam::SummonedCreatureDies(), boss_apothecary_hummel::boss_apothecary_hummelAI::SummonedCreatureDies(), boss_archimonde::boss_archimondeAI::UnleashSoulCharge(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), npc_cyclone::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), boss_nalorakk::boss_nalorakkAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), npc_abomination::npc_abominationAI::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_moam::UpdateAI(), boss_ossirian::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_beryl_sorcerer::npc_beryl_sorcererAI::UpdateAI(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), boss_gurtogg_bloodboil::boss_gurtogg_bloodboilAI::UpdateAI(), boss_supremus::UpdateAI(), npc_phase_hunter::npc_phase_hunterAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), Player::UpdateAreaDependentAuras(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI(), boss_netherspite::UpdatePortals(), Player::UpdateZoneDependentAuras(), and Spell::WriteAmmoToPacket().

◆ HasAuraEffect()

bool Unit::HasAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  caster = ObjectGuid::Empty 
) const
5607{
5608 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5609 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5610 {
5611 if (itr->second->HasEffect(effIndex)
5612 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5613 {
5614 return true;
5615 }
5616 }
5617 return false;
5618}

References m_appliedAuras.

Referenced by Spell::CanAutoCast(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), spell_q12683_take_sputum_sample::HandleDummy(), AchievementCriteriaData::Meets(), and boss_headless_horseman::UpdateAI().

◆ HasAuraState()

bool Unit::HasAuraState ( AuraStateType  flag,
SpellInfo const *  spellProto = nullptr,
Unit const *  Caster = nullptr 
) const
10547{
10548 if (Caster)
10549 {
10550 if (spellProto)
10551 {
10552 AuraEffectList const& stateAuras = Caster->GetAuraEffectsByType(SPELL_AURA_ABILITY_IGNORE_AURASTATE);
10553 for (AuraEffectList::const_iterator j = stateAuras.begin(); j != stateAuras.end(); ++j)
10554 if ((*j)->IsAffectedOnSpell(spellProto))
10555 return true;
10556 }
10557 // Check per caster aura state
10558 // If aura with aurastate by caster not found return false
10559 if ((1 << (flag - 1)) & PER_CASTER_AURA_STATE_MASK)
10560 {
10561 AuraStateAurasMapBounds range = m_auraStateAuras.equal_range(flag);
10562 for (AuraStateAurasMap::const_iterator itr = range.first; itr != range.second; ++itr)
10563 if (itr->second->GetBase()->GetCasterGUID() == Caster->GetGUID())
10564 return true;
10565 return false;
10566 }
10567 }
10568
10569 return HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10570}
@ SPELL_AURA_ABILITY_IGNORE_AURASTATE
Definition: SpellAuraDefines.h:325
std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
Definition: Unit.h:1316

References GetAuraEffectsByType(), Object::GetGUID(), Object::HasFlag(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, SPELL_AURA_ABILITY_IGNORE_AURASTATE, and UNIT_FIELD_AURASTATE.

Referenced by Player::_addSpell(), Pet::addSpell(), Spell::CheckCast(), spell_sha_earthliving_weapon::CheckProc(), SpellInfo::CheckTarget(), ClearAllReactives(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), isFrozen(), Player::LoadFromDB(), MeleeDamageBonusDone(), SpellPctDamageModsDone(), SpellTakenCritChance(), and UpdateReactives().

◆ HasAuraType()

bool Unit::HasAuraType ( AuraType  auraType) const
5644{
5645 return (!m_modAuras[auraType].empty());
5646}

References m_modAuras.

Referenced by ApplyTotalThreatModifier(), Attack(), Creature::CanCreatureAttack(), Player::CanTameExoticPets(), spell_q11010_q11102_q11023_q11008_check_fly_mount::CheckRequirement(), SpellInfo::CheckTarget(), Creature::DoFleeToGetAssistance(), Spell::DoSpellHitOnUnit(), Player::DurabilityPointsLoss(), Spell::EffectStuck(), Spell::EffectWeaponDmg(), npc_wild_wyrm::npc_wild_wyrmAI::EnterEvadeMode(), spell_suppression_aura::FilterTargets(), Player::GetAurasForTarget(), Player::getMaxTimer(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraAllowOnlyAbility(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraEmpathy(), AuraEffect::HandleAuraFeatherFall(), AuraEffect::HandleAuraGhost(), AuraEffect::HandleAuraHover(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModFakeInebriation(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModPacifyAndSilence(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraModSilence(), AuraEffect::HandleAuraModStalked(), AuraEffect::HandleAuraTrackStealthed(), AuraEffect::HandleAuraUntrackable(), AuraEffect::HandleAuraWaterWalk(), AuraEffect::HandleComprehendLanguage(), AuraEffect::HandleDetectAmore(), spell_item_reindeer_transformation::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), Player::HandleFall(), AuraEffect::HandleForceMoveForward(), WorldSession::HandleMirrorImageDataRequest(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModInvisibilityDetect(), AuraEffect::HandleModStealth(), AuraEffect::HandleModStealthDetect(), AuraEffect::HandleModUnattackable(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePlayerLoginFromDB(), AuraEffect::HandlePreventFleeing(), WorldSession::HandleRepopRequestOpcode(), reset_commandscript::HandleResetStatsOrLevelHelper(), WorldSession::HandleSelfResOpcode(), HasAuraTypeWithFamilyFlags(), HasInvisibilityAura(), HasStealthAura(), isFeared(), SpellArea::IsFitToRequirements(), IsImmunedToDamage(), IsImmunedToSchool(), IsImmunedToSpell(), IsImmunedToSpellEffect(), isInRoots(), isSpellBlocked(), Kill(), Player::KillPlayer(), KnockbackFrom(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), MagicSpellHitResult(), MeleeDamageBonusTaken(), MeleeSpellHitResult(), Acore::AnyDeadUnitObjectInRangeCheck::operator()(), LastPhaseIceTombTargetSelector::operator()(), WorldSession::ReadMovementInfo(), Player::Regenerate(), Player::RegenerateAll(), Player::RegenerateHealth(), Player::RewardHonor(), RollMeleeOutcomeAgainst(), PetAI::SelectNextTarget(), Player::SendInitialPacketsAfterAddToMap(), SetControlled(), Player::SetDrunkValue(), SpellDamageBonusTaken(), SpellTakenCritChance(), Player::Update(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_phase_hunter::npc_phase_hunterAI::UpdateAI(), Creature::UpdateMovementFlags(), and Player::UpdateTriggerVisibility().

◆ HasAuraTypeWithAffectMask()

bool Unit::HasAuraTypeWithAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
5677{
5678 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5679 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5680 if ((*i)->IsAffectedOnSpell(affectedSpell))
5681 return true;
5682 return false;
5683}

References GetAuraEffectsByType().

Referenced by AuraEffect::CalculatePeriodic(), Spell::DoSpellHitOnUnit(), Spell::handle_immediate(), Aura::RefreshDuration(), and Aura::RefreshTimersWithMods().

◆ HasAuraTypeWithCaster()

bool Unit::HasAuraTypeWithCaster ( AuraType  auratype,
ObjectGuid  caster 
) const
5649{
5650 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5651 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5652 if (caster == (*i)->GetCasterGUID())
5653 return true;
5654 return false;
5655}

References GetAuraEffectsByType().

Referenced by BuildValuesUpdate(), IsAlwaysDetectableFor(), and ThreatContainer::SelectNextVictim().

◆ HasAuraTypeWithFamilyFlags()

bool Unit::HasAuraTypeWithFamilyFlags ( AuraType  auraType,
uint32  familyName,
uint32  familyFlags 
) const
771{
772 if (!HasAuraType(auraType))
773 return false;
774 AuraEffectList const& auras = GetAuraEffectsByType(auraType);
775 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
776 if (SpellInfo const* iterSpellProto = (*itr)->GetSpellInfo())
777 if (iterSpellProto->SpellFamilyName == familyName && iterSpellProto->SpellFamilyFlags[0] & familyFlags)
778 return true;
779 return false;
780}

References GetAuraEffectsByType(), and HasAuraType().

◆ HasAuraTypeWithMiscvalue()

bool Unit::HasAuraTypeWithMiscvalue ( AuraType  auratype,
int32  miscvalue 
) const
5668{
5669 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5670 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5671 if (miscvalue == (*i)->GetMiscValue())
5672 return true;
5673 return false;
5674}

References GetAuraEffectsByType().

Referenced by Player::Regenerate(), Player::UpdateManaRegen(), and Player::UpdateStats().

◆ HasAuraTypeWithTriggerSpell()

bool Unit::HasAuraTypeWithTriggerSpell ( AuraType  auratype,
uint32  triggerSpell 
) const
5695{
5696 for (AuraEffect const* aura : GetAuraEffectsByType(auratype))
5697 {
5698 if (aura->GetSpellInfo()->Effects[aura->GetEffIndex()].TriggerSpell == triggerSpell)
5699 {
5700 return true;
5701 }
5702 }
5703
5704 return false;
5705}

References GetAuraEffectsByType().

Referenced by WorldSession::HandlePetActionHelper().

◆ HasAuraTypeWithValue()

bool Unit::HasAuraTypeWithValue ( AuraType  auratype,
int32  value 
) const
5686{
5687 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5688 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5689 if (value == (*i)->GetAmount())
5690 return true;
5691 return false;
5692}

References GetAuraEffectsByType().

◆ HasAuraWithMechanic()

bool Unit::HasAuraWithMechanic ( uint32  mechanicMask) const
5731{
5732 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5733 {
5734 SpellInfo const* spellInfo = iter->second->GetBase()->GetSpellInfo();
5735 if (spellInfo->Mechanic && (mechanicMask & (1 << spellInfo->Mechanic)))
5736 return true;
5737
5738 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5739 if (iter->second->HasEffect(i) && spellInfo->Effects[i].Effect && spellInfo->Effects[i].Mechanic)
5740 if (mechanicMask & (1 << spellInfo->Effects[i].Mechanic))
5741 return true;
5742 }
5743
5744 return false;
5745}

References SpellInfo::Effects, m_appliedAuras, MAX_SPELL_EFFECTS, and SpellInfo::Mechanic.

Referenced by EarthenPowerTargetSelector::operator()(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ HasBreakableByDamageAuraType()

bool Unit::HasBreakableByDamageAuraType ( AuraType  type,
uint32  excludeAura = 0 
) const
783{
784 AuraEffectList const& auras = GetAuraEffectsByType(type);
785 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
786 if ((!excludeAura || excludeAura != (*itr)->GetSpellInfo()->Id) && //Avoid self interrupt of channeled Crowd Control spells like Seduction
787 ((*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE))
788 return true;
789 return false;
790}

References AURA_INTERRUPT_FLAG_TAKE_DAMAGE, and GetAuraEffectsByType().

Referenced by HasBreakableByDamageCrowdControlAura().

◆ HasBreakableByDamageCrowdControlAura()

bool Unit::HasBreakableByDamageCrowdControlAura ( Unit excludeCasterChannel = nullptr) const
793{
794 uint32 excludeAura = 0;
795 if (Spell* currentChanneledSpell = excludeCasterChannel ? excludeCasterChannel->GetCurrentSpell(CURRENT_CHANNELED_SPELL) : nullptr)
796 excludeAura = currentChanneledSpell->GetSpellInfo()->Id; //Avoid self interrupt of channeled Crowd Control spells like Seduction
797
803}
@ SPELL_AURA_MOD_FEAR
Definition: SpellAuraDefines.h:70
@ SPELL_AURA_MOD_ROOT
Definition: SpellAuraDefines.h:89
@ SPELL_AURA_MOD_CONFUSE
Definition: SpellAuraDefines.h:68
@ SPELL_AURA_MOD_STUN
Definition: SpellAuraDefines.h:75
bool HasBreakableByDamageAuraType(AuraType type, uint32 excludeAura=0) const
Definition: Unit.cpp:782
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition: Unit.h:2075

References CURRENT_CHANNELED_SPELL, GetCurrentSpell(), HasBreakableByDamageAuraType(), SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, and SPELL_AURA_TRANSFORM.

Referenced by PetAI::CanAttack(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), CasterAI::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), and PetAI::UpdateAI().

◆ HasExtraUnitMovementFlag()

uint16 Unit::HasExtraUnitMovementFlag ( uint16  f) const
inline

◆ HasInvisibilityAura()

bool Unit::HasInvisibilityAura ( ) const
inline

◆ HasNegativeAuraWithAttribute()

bool Unit::HasNegativeAuraWithAttribute ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5720{
5721 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5722 {
5723 Aura const* aura = iter->second->GetBase();
5724 if (!iter->second->IsPositive() && aura->GetSpellInfo()->Attributes & flag && (!guid || aura->GetCasterGUID() == guid))
5725 return true;
5726 }
5727 return false;
5728}
uint32 Attributes
Definition: SpellInfo.h:322

References SpellInfo::Attributes, Aura::GetCasterGUID(), Aura::GetSpellInfo(), and m_appliedAuras.

◆ HasNegativeAuraWithInterruptFlag()

bool Unit::HasNegativeAuraWithInterruptFlag ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5708{
5709 if (!(m_interruptMask & flag))
5710 return false;
5711 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end(); ++iter)
5712 {
5713 if (!(*iter)->IsPositive() && (*iter)->GetBase()->GetSpellInfo()->AuraInterruptFlags & flag && (!guid || (*iter)->GetBase()->GetCasterGUID() == guid))
5714 return true;
5715 }
5716 return false;
5717}

References m_interruptableAuras, and m_interruptMask.

Referenced by ThreatContainer::SelectNextVictim().

◆ HasNpcFlag()

◆ HasSharedVision()

◆ HasSpell()

◆ HasSpellCooldown()

◆ HasSpellItemCooldown()

virtual bool Unit::HasSpellItemCooldown ( uint32  ,
uint32   
) const
inlinevirtual

Reimplemented in Player.

2433{ return false; }

Referenced by Spell::CheckCast(), and ProcDamageAndSpellFor().

◆ HasStealthAura()

◆ HasUnitFlag()

bool Unit::HasUnitFlag ( UnitFlags  flags) const
inline
1494{ return HasFlag(UNIT_FIELD_FLAGS, flags); }

References Object::HasFlag(), and UNIT_FIELD_FLAGS.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), Vehicle::AddPassenger(), AttackerStateUpdate(), boss_malygos::boss_malygosAI::AttackStart(), SmartAI::AttackStart(), npc_halazzi_lynx::npc_halazzi_lynxAI::AttackStart(), npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), violet_hold_trashAI::AttackStart(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::AttackStart(), npc_ravenous_worg::npc_ravenous_worgAI::AttackStart(), npc_swarm_scarab::npc_swarm_scarabAI::CanAIAttack(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanNoReagentCast(), CanSwim(), CanUseAttackType(), Spell::CheckEffectTarget(), boss_muru::boss_muruAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_illidan_stormrage::boss_illidan_stormrageAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_jormungarAI::DoAction(), Spell::DoSpellHitOnUnit(), RandomMovementGenerator< T >::DoUpdate(), boss_dorothee::EnterEvadeMode(), boss_roar::EnterEvadeMode(), boss_strawman::EnterEvadeMode(), boss_tinhead::EnterEvadeMode(), boss_julianne::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GetReactionTo(), GetVelocity(), spell_gen_model_visible::HandleEffectApply(), WorldSession::HandleMovementOpcodes(), spell_gen_mounted_charge::HandleScriptEffect(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsMounted(), IsPetInCombat(), isTargetableForAttack(), violet_hold_trashAI::JustEngagedWith(), boss_novos::boss_novosAI::JustSummoned(), Condition::Meets(), MotionMaster::MoveCharge(), MotionMaster::MoveChase(), MotionMaster::MoveConfused(), MotionMaster::MoveDistract(), MotionMaster::MoveFall(), MotionMaster::MoveFleeing(), MotionMaster::MoveFollow(), boss_professor_putricide::boss_professor_putricideAI::MoveInLineOfSight(), boss_palehoof::boss_palehoofAI::MoveInLineOfSight(), npc_massive_jormungar::npc_massive_jormungarAI::MoveInLineOfSight(), npc_ferocious_rhino::npc_ferocious_rhinoAI::MoveInLineOfSight(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::MoveInLineOfSight(), npc_frenzied_worgen::npc_frenzied_worgenAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), npc_nether_drake::npc_nether_drakeAI::MoveInLineOfSight(), MotionMaster::MoveLand(), MotionMaster::MovePath(), MotionMaster::MovePoint(), MotionMaster::MoveRandom(), MotionMaster::MoveSeekAssistance(), MotionMaster::MoveSeekAssistanceDistract(), MotionMaster::MoveSplinePath(), MotionMaster::MoveTakeoff(), MotionMaster::MoveTargetedHome(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::myCanCast(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::RefreshSwimmingFlag(), ScriptedAI::SelectSpell(), Player::SetClientControl(), SetSpeed(), Player::Update(), npc_onyxian_lair_guard::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_xt002_heart::npc_xt002_heartAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), npc_ravenous_worg::npc_ravenous_worgAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), boss_ahune::UpdateAI(), and Player::UpdateTriggerVisibility().

◆ HasUnitFlag2()

◆ HasUnitMovementFlag()

◆ HasUnitState()

bool Unit::HasUnitState ( const uint32  f) const
inline
1410{ return (m_state & f); }

References m_state.

Referenced by Spell::_cast(), Creature::_IsTargetAcceptable(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), AddThreat(), Attack(), AttackerStateUpdate(), FollowerAI::AttackStart(), npc_raging_spirit::npc_raging_spiritAI::AttackStart(), boss_anzu::boss_anzu(), boss_apothecary_hummel::boss_apothecary_hummelAI::boss_apothecary_hummelAI(), boss_azuregos::boss_azuregosAI::boss_azuregosAI(), boss_balinda::boss_balinda(), boss_bigbadwolf::boss_bigbadwolf(), boss_blackheart_the_inciter::boss_blackheart_the_inciter(), boss_blindeye_the_seer::boss_blindeye_the_seer(), boss_captain_skarloc::boss_captain_skarloc(), boss_curator::boss_curator(), boss_darkweaver_syth::boss_darkweaver_syth(), boss_dorothee::boss_dorothee(), boss_exarch_maladaar::boss_exarch_maladaar(), boss_fathomguard_caribdis::boss_fathomguard_caribdis(), boss_fathomguard_sharkkis::boss_fathomguard_sharkkis(), boss_fathomguard_tidalvess::boss_fathomguard_tidalvess(), boss_ghazan::boss_ghazan(), boss_grand_warlock_nethekurse::boss_grand_warlock_nethekurse(), boss_high_astromancer_solarian::boss_high_astromancer_solarian(), boss_high_king_maulgar::boss_high_king_maulgar(), boss_jarien::boss_jarien(), boss_kelidan_the_breaker::boss_kelidan_the_breaker(), boss_kiggler_the_crazed::boss_kiggler_the_crazed(), boss_krosh_firehand::boss_krosh_firehand(), boss_lady_vashj::boss_lady_vashj(), boss_magtheridon::boss_magtheridon(), boss_maiden_of_virtue::boss_maiden_of_virtue(), boss_mekgineer_steamrigger::boss_mekgineer_steamrigger(), boss_mennu_the_betrayer::boss_mennu_the_betrayer(), boss_mor_grayhoof::boss_mor_grayhoof(), boss_moroes::boss_moroes(), boss_morogrim_tidewalker::boss_morogrim_tidewalker(), boss_murmur::boss_murmur(), boss_nazan::boss_nazan(), boss_nexusprince_shaffar::boss_nexusprince_shaffar(), boss_olm_the_summoner::boss_olm_the_summoner(), boss_omor_the_unscarred::boss_omor_the_unscarred(), boss_pandemonius::boss_pandemonius(), boss_quagmirran::boss_quagmirran(), boss_roar::boss_roar(), boss_rokmar_the_crackler::boss_rokmar_the_crackler(), boss_shirrak_the_dead_watcher::boss_shirrak_the_dead_watcher(), boss_sothos::boss_sothos(), boss_strawman::boss_strawman(), boss_swamplord_muselek::boss_swamplord_muselek(), boss_talon_king_ikiss::boss_talon_king_ikiss(), boss_tavarok::boss_tavarok(), boss_terestian_illhoof::boss_terestian_illhoof(), boss_the_black_stalker::boss_the_black_stalker(), boss_the_maker::boss_the_maker(), boss_tinhead::boss_tinhead(), boss_vazruden::boss_vazruden(), boss_void_reaver::boss_void_reaver(), boss_warbringer_omrogg::boss_warbringer_omrogg(), boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefist(), boss_watchkeeper_gargolmar::boss_watchkeeper_gargolmar(), BossAI::BossAI(), PathGenerator::CalculatePath(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), PetAI::CanAttack(), Player::CanEquipItem(), CanFreeMove(), Creature::CanPeriodicallyCallForAssistance(), Creature::CanStartAttack(), spell_dk_death_grip::CheckCast(), Spell::CheckCast(), Spell::CheckPetCast(), spell_warr_retaliation::CheckProc(), CreatureUnitRelocationWorker(), boss_garfrost::boss_garfrostAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), DealDamage(), DealMeleeDamage(), DisableRotate(), UnitAI::DoCast(), UnitAI::DoCastAOE(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), Spell::DoSpellHitOnUnit(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), Spell::EffectDistract(), Spell::EffectKnockBack(), CritterAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), Spell::finish(), Player::GetInitialVisiblePackets(), WorldSession::HandleAuctionListItems(), spell_dru_starfall_dummy::HandleDummy(), WorldSession::HandleEmoteOpcode(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleMoveTeleportAck(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), AuraEffect::HandleProcTriggerDamageAuraProc(), ArenaSpectator::HandleSpectatorSpectateCommand(), boss_venoxis::InitializeAI(), isAttackingPlayer(), boss_faction_championsAI::IsCCed(), Creature::IsInEvadeMode(), IsInFlight(), IsMovementPreventedByCasting(), Creature::IsMovementPreventedByCasting(), isPossessed(), isPossessedByPlayer(), isSpellBlocked(), IsStopped(), isTargetableForAttack(), IsValidCombatTarget(), CritterAI::JustEngagedWith(), npc_coren_direbrew_sisters::JustEngagedWith(), PetAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), LoadHelper(), MagicSpellHitResult(), MeleeSpellHitResult(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_hunter::npc_toc_hunterAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_warrior::npc_toc_warriorAI::myCanCast(), npc_toc_dk::npc_toc_dkAI::myCanCast(), npc_toc_rogue::npc_toc_rogueAI::myCanCast(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::myCanCast(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::myCanCast(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_apothecary_baxter::npc_apothecary_baxter(), npc_batrider::npc_batrider(), npc_icc_spire_frostwyrm::npc_icc_spire_frostwyrm(), npc_inner_demon::npc_inner_demon(), Acore::FriendlyCCedInRange::operator()(), SmartScript::ProcessAction(), RemoveCharmedBy(), boss_kormok::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), npc_ohgan::npc_ohganAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), boss_isalien::Reset(), npc_anubisath_guardian::Reset(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::Reset(), RollMeleeOutcomeAgainst(), boss_faction_championsAI::SelectEnemyCaster(), Player::SetClientControl(), SetContestedPvP(), SetControlled(), Creature::SetDisableGravity(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), Creature::SetHover(), SetInCombatState(), SetInFront(), SetRooted(), SetStunned(), WaypointMovementGenerator< Creature >::StartMove(), lfg::LFGMgr::TeleportPlayer(), CreatureAI::TriggerAlert(), Player::Update(), Update(), TimedFleeingMovementGenerator::Update(), boss_sartharion_dragonAI::UpdateAI(), CombatAI::UpdateAI(), CasterAI::UpdateAI(), BossAI::UpdateAI(), WorldBossAI::UpdateAI(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::UpdateAI(), ironhand_guardian::ironhand_guardianAI::UpdateAI(), boss_anubshiah::boss_anubshiahAI::UpdateAI(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::UpdateAI(), boss_eviscerator::boss_evisceratorAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_moira_bronzebeardAI::UpdateAI(), boss_high_priestess_thaurissanAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_halycon::boss_halyconAI::UpdateAI(), boss_highlord_omokk::boss_highlordomokkAI::UpdateAI(), boss_lord_valthalak::boss_lord_valthalakAI::UpdateAI(), boss_overlord_wyrmthalak::boss_overlordwyrmthalakAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_solakar_flamewreath::boss_solakar_flamewreathAI::UpdateAI(), boss_the_beast::boss_thebeastAI::UpdateAI(), boss_urok_doomhowl::boss_urok_doomhowlAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_chromaggus::boss_chromaggusAI::UpdateAI(), boss_ebonroc::boss_ebonrocAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_nefarian::UpdateAI(), boss_razorgore::boss_razorgoreAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_garr::boss_garrAI::UpdateAI(), boss_golemagg::boss_golemaggAI::UpdateAI(), npc_core_rager::npc_core_ragerAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_flamewaker_priest::npc_flamewaker_priestAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), boss_netherspite::UpdateAI(), boss_servant_quarters::UpdateAI(), npc_kilrek::UpdateAI(), boss_felblood_kaelthas::UpdateAI(), boss_priestess_delrissa::UpdateAI(), boss_priestess_lackey_commonAI::UpdateAI(), boss_kagani_nightstrike::UpdateAI(), boss_selin_fireheart::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_brutallus::boss_brutallusAI::UpdateAI(), boss_sacrolash::boss_sacrolashAI::UpdateAI(), boss_alythess::boss_alythessAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kalec::boss_kalecAI::UpdateAI(), boss_sathrovarr::boss_sathrovarrAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), boss_muru::boss_muruAI::UpdateAI(), boss_entropius::boss_entropiusAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), boss_blight_worm::boss_blight_wormAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_gahzranka::boss_gahzrankaAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_hazzarah::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_coren_direbrew::UpdateAI(), npc_hallows_end_soh::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_archimonde::boss_archimondeAI::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), boss_onyxia::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), npc_belnistrasz::npc_belnistraszAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_volazj::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), boss_taldaram::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), npc_rotting_frost_giant::npc_rotting_frost_giantAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_captain_arnath::npc_captain_arnathAI::UpdateAI(), npc_captain_brandon::npc_captain_brandonAI::UpdateAI(), npc_captain_grondel::npc_captain_grondelAI::UpdateAI(), npc_captain_rupert::npc_captain_rupertAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_anubrekhan::boss_anubrekhanAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razuvious::boss_razuviousAI::UpdateAI(), boss_razuvious_minion::boss_razuvious_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), npc_scion_of_eternity::npc_scion_of_eternityAI::UpdateAI(), boss_anomalus::boss_anomalusAI::UpdateAI(), boss_commander_stoutbeard::boss_commander_stoutbeardAI::UpdateAI(), boss_keristrasza::boss_keristraszaAI::UpdateAI(), boss_magus_telestra::boss_magus_telestraAI::UpdateAI(), boss_ormorok::boss_ormorokAI::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir::boss_sjonnirAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_yoggsaron_constrictor_tentacle::boss_yoggsaron_constrictor_tentacleAI::UpdateAI(), boss_yoggsaron_keeper::boss_yoggsaron_keeperAI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), boss_keleseth::boss_kelesethAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::UpdateAI(), boss_dalronn_the_controller::boss_dalronn_the_controllerAI::UpdateAI(), npc_enslaved_proto_drake::npc_enslaved_proto_drakeAI::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_exarch_maladaar::UpdateAI(), boss_nexusprince_shaffar::UpdateAI(), npc_yor::UpdateAI(), boss_anzu::UpdateAI(), boss_gurtogg_bloodboil::boss_gurtogg_bloodboilAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), boss_mother_shahraz::boss_shahrazAI::UpdateAI(), boss_essence_of_suffering::boss_essence_of_sufferingAI::UpdateAI(), boss_essence_of_desire::boss_essence_of_desireAI::UpdateAI(), boss_essence_of_anger::boss_essence_of_angerAI::UpdateAI(), boss_shade_of_akama::UpdateAI(), npc_akama_shade::UpdateAI(), boss_supremus::UpdateAI(), boss_teron_gorefiend::UpdateAI(), boss_gathios_the_shatterer::boss_gathios_the_shattererAI::UpdateAI(), boss_high_nethermancer_zerevor::boss_high_nethermancer_zerevorAI::UpdateAI(), boss_lady_malande::boss_lady_malandeAI::UpdateAI(), boss_veras_darkshadow::boss_veras_darkshadowAI::UpdateAI(), boss_doomlord_kazzak::boss_doomlordkazzakAI::UpdateAI(), boss_doomwalker::boss_doomwalkerAI::UpdateAI(), boss_leotheras_the_blind::UpdateAI(), boss_ahune::UpdateAI(), boss_gruul::UpdateAI(), boss_the_maker::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), boss_watchkeeper_gargolmar::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), boss_alar::boss_alarAI::UpdateAI(), boss_kaelthas::boss_kaelthasAI::UpdateAI(), npc_maghar_captive::npc_maghar_captiveAI::UpdateAI(), npc_phase_hunter::npc_phase_hunterAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), emerald_dragonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), PetAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::UpdateAI(), npc_wg_spirit_guide::npc_wg_spirit_guideAI::UpdateAI(), Player::UpdateCharmedAI(), npc_general_andorov::UpdateEscortAI(), npc_onyx_flamecaller::npc_onyx_flamecallerAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), npc_kurenai_captive::npc_kurenai_captiveAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), SmartAI::UpdatePath(), and SmartScript::UpdateTimer().

◆ HasUnitTypeMask()

◆ HasVisibleAuraType()

bool Unit::HasVisibleAuraType ( AuraType  auraType) const
5658{
5659 AuraEffectList const& mAuraList = GetAuraEffectsByType(auraType);
5660 for (AuraEffectList::const_iterator i = mAuraList.begin(); i != mAuraList.end(); ++i)
5661 if( (*i)->GetBase()->CanBeSentToClient() )
5662 return true;
5663
5664 return false;
5665}

References GetAuraEffectsByType().

◆ haveOffhandWeapon()

◆ HealBySpell()

int32 Unit::HealBySpell ( HealInfo healInfo,
bool  critical = false 
)
11239{
11240 uint32 heal = healInfo.GetHeal();
11241 sScriptMgr->ModifyHealReceived(this, healInfo.GetTarget(), heal, healInfo.GetSpellInfo());
11242 healInfo.SetHeal(heal);
11243
11244 // calculate heal absorb and reduce healing
11245 CalcHealAbsorb(healInfo);
11246
11247 int32 gain = Unit::DealHeal(healInfo.GetHealer(), healInfo.GetTarget(), healInfo.GetHeal());
11248 healInfo.SetEffectiveHeal(gain);
11249
11250 SendHealSpellLog(healInfo, critical);
11251 return gain;
11252}
Unit * GetHealer() const
Definition: Unit.h:841
void SetHeal(uint32 amount)
Definition: Unit.h:831
void SetEffectiveHeal(uint32 amount)
Definition: Unit.h:836
static void CalcHealAbsorb(HealInfo &healInfo)
Definition: Unit.cpp:2474
static int32 DealHeal(Unit *healer, Unit *victim, uint32 addhealth)
Definition: Unit.cpp:10945
void SendHealSpellLog(HealInfo const &healInfo, bool critical=false)
Definition: Unit.cpp:11221

References CalcHealAbsorb(), DealHeal(), HealInfo::GetHeal(), HealInfo::GetHealer(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SendHealSpellLog(), HealInfo::SetEffectiveHeal(), HealInfo::SetHeal(), and sScriptMgr.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ HealthAbovePct()

◆ HealthAbovePctHealed()

bool Unit::HealthAbovePctHealed ( int32  pct,
uint32  heal 
) const
inline

◆ HealthBelowPct()

bool Unit::HealthBelowPct ( int32  pct) const
inline
1458{ return GetHealth() < CountPctFromMaxHealth(pct); }

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_moira_bronzebeardAI::CastOnEmperorIfPossible(), boss_mor_grayhoof::DamageTaken(), boss_isalien::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::DamageTaken(), boss_hadronox::boss_hadronoxAI::DamageTaken(), HandleDummyAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), HandleProcTriggerSpell(), ScriptedAI::HealthBelowPct(), boss_olm_the_summoner::JustEngagedWith(), boss_grand_warlock_nethekurse::JustEngagedWith(), Player::LoadFromDB(), npc_death_knight_initiate::OnGossipHello(), SetHealth(), SpellPctHealingModsDone(), Update(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_priestess_lackey_commonAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kalec::boss_kalecAI::UpdateAI(), boss_sathrovarr::boss_sathrovarrAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), boss_archimonde::boss_archimondeAI::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_anomalus::boss_anomalusAI::UpdateAI(), boss_keristrasza::boss_keristraszaAI::UpdateAI(), boss_magus_telestra::boss_magus_telestraAI::UpdateAI(), boss_ormorok::boss_ormorokAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), boss_kaelthas::boss_kaelthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), and npc_akama_illidan::npc_akama_illidanAI::UpdateEscortAI().

◆ HealthBelowPctDamaged()

bool Unit::HealthBelowPctDamaged ( int32  pct,
uint32  damage 
) const
inline
1459{ return int64(GetHealth()) - int64(damage) < int64(CountPctFromMaxHealth(pct)); }
std::int64_t int64
Definition: Define.h:103

References CountPctFromMaxHealth(), and GetHealth().

Referenced by BossAI::_ProccessHealthCheckEvent(), boss_mandokir::boss_mandokirAI::DamageDealt(), boss_gyth::boss_gythAI::DamageTaken(), boss_lord_valthalak::boss_lord_valthalakAI::DamageTaken(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::DamageTaken(), boss_quartermaster_zigris::DamageTaken(), boss_warmaster_voone::boss_warmastervooneAI::DamageTaken(), boss_nefarian::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_golemagg::boss_golemaggAI::DamageTaken(), npc_core_rager::npc_core_ragerAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_kormok::DamageTaken(), npc_batrider::DamageTaken(), npc_coren_direbrew::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_onyxia::DamageTaken(), npc_anubisath_guardian::DamageTaken(), boss_ouro::DamageTaken(), npc_anubisath_sentinel::aqsentinelAI::DamageTaken(), npc_anubisath_defender::DamageTaken(), boss_elder_nadox::DamageTaken(), boss_volazj::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), npc_xt002_boombot::npc_xt002_boombotAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), boss_vazruden::DamageTaken(), npc_millhouse_manastorm::npc_millhouse_manastormAI::DamageTaken(), npc_magister_aledis::DamageTaken(), boss_ysondre::boss_ysondreAI::DamageTaken(), boss_lethon::boss_lethonAI::DamageTaken(), boss_emeriss::boss_emerissAI::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), boss_buru::DamageTaken(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), npc_calvin_montague::npc_calvin_montagueAI::DamageTaken(), boss_bug_trio::DamageTaken(), boss_hadronox::boss_hadronoxAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), and HandleProcTriggerSpell().

◆ IncrDiminishing()

void Unit::IncrDiminishing ( DiminishingGroup  group)
15020{
15021 // Checking for existing in the table
15022 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15023 {
15024 if (i->DRGroup != group)
15025 continue;
15026 if (int32(i->hitCount) < GetDiminishingReturnsMaxLevel(group))
15027 i->hitCount += 1;
15028 return;
15029 }
15031}
DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group)
Definition: SpellMgr.cpp:265
Definition: Unit.h:703

References DIMINISHING_LEVEL_2, GetDiminishingReturnsMaxLevel(), GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ InitCharmInfo()

CharmInfo * Unit::InitCharmInfo ( )
15799{
15800 if (!m_charmInfo)
15801 m_charmInfo = new CharmInfo(this);
15802
15803 return m_charmInfo;
15804}
Definition: Unit.h:1106

References m_charmInfo.

Referenced by Guardian::Guardian(), Pet::Pet(), and SetCharmedBy().

◆ InitStatBuffMods()

void Unit::InitStatBuffMods ( )
inline
2044 {
2045 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + i, 0);
2046 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + i, 0);
2047 }

References STAT_STRENGTH, UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by Player::InitStatsForLevel().

◆ InitTamedPet()

bool Unit::InitTamedPet ( Pet pet,
uint8  level,
uint32  spell_id 
)
17650{
17651 Player* player = ToPlayer();
17652 PetStable& petStable = player->GetOrInitPetStable();
17653 if (petStable.CurrentPet || petStable.GetUnslottedHunterPet())
17654 return false;
17655
17656 pet->SetCreatorGUID(GetGUID());
17657 pet->SetFaction(GetFaction());
17658 pet->SetUInt32Value(UNIT_CREATED_BY_SPELL, spell_id);
17659
17660 if (GetTypeId() == TYPEID_PLAYER)
17662
17663 if (!pet->InitStatsForLevel(level))
17664 {
17665 LOG_ERROR("entities.unit", "Pet::InitStatsForLevel() failed for creature (Entry: {})!", pet->GetEntry());
17666 return false;
17667 }
17668
17669 pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
17670 // this enables pet details window (Shift+P)
17671 pet->InitPetCreateSpells();
17672 pet->SetFullHealth();
17673 pet->FillPetInfo(&petStable.CurrentPet.emplace());
17674 return true;
17675}
@ UNIT_CREATED_BY_SPELL
Definition: UpdateFields.h:138
bool InitStatsForLevel(uint8 level)
Definition: Pet.cpp:1012
void FillPetInfo(PetStable::PetInfo *petInfo) const
Definition: Pet.cpp:2468
void InitPetCreateSpells()
Definition: Pet.cpp:2040
Definition: PetDefines.h:202
PetInfo const * GetUnslottedHunterPet() const
Definition: PetDefines.h:230
Optional< PetInfo > CurrentPet
Definition: PetDefines.h:225
PetStable & GetOrInitPetStable()
Definition: Player.cpp:15501
void SetPetNumber(uint32 petnumber, bool statwindow)
Definition: Unit.cpp:16034
void SetFullHealth()
Definition: Unit.h:1469
void SetFaction(uint32 faction)
Definition: Unit.cpp:10064
void ReplaceAllUnitFlags(UnitFlags flags)
Definition: Unit.h:1497
CharmInfo * GetCharmInfo()
Definition: Unit.h:1897
void SetCreatorGUID(ObjectGuid creator)
Definition: Unit.h:1831

References PetStable::CurrentPet, Pet::FillPetInfo(), GetCharmInfo(), Object::GetEntry(), GetFaction(), Object::GetGUID(), Player::GetOrInitPetStable(), Object::GetTypeId(), PetStable::GetUnslottedHunterPet(), Pet::InitPetCreateSpells(), Guardian::InitStatsForLevel(), LOG_ERROR, ReplaceAllUnitFlags(), SetCreatorGUID(), SetFaction(), SetFullHealth(), CharmInfo::SetPetNumber(), Object::SetUInt32Value(), sObjectMgr, Object::ToPlayer(), TYPEID_PLAYER, UNIT_CREATED_BY_SPELL, and UNIT_FLAG_PLAYER_CONTROLLED.

Referenced by CreateTamedPetFrom().

◆ InterruptNonMeleeSpells()

void Unit::InterruptNonMeleeSpells ( bool  withDelayed,
uint32  spellid = 0,
bool  withInstant = true,
bool  bySelf = false 
)
4082{
4083 // generic spells are interrupted if they are not finished or delayed
4084 if (m_currentSpells[CURRENT_GENERIC_SPELL] && (!spell_id || m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->Id == spell_id))
4085 InterruptSpell(CURRENT_GENERIC_SPELL, withDelayed, withInstant, bySelf);
4086
4087 // autorepeat spells are interrupted if they are not finished or delayed
4088 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL] && (!spell_id || m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id == spell_id))
4089 InterruptSpell(CURRENT_AUTOREPEAT_SPELL, withDelayed, withInstant, bySelf);
4090
4091 // channeled spells are interrupted if they are not finished, even if they are delayed
4092 if (m_currentSpells[CURRENT_CHANNELED_SPELL] && (!spell_id || m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->Id == spell_id))
4093 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4094}

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, InterruptSpell(), and m_currentSpells.

Referenced by _EnterVehicle(), PetAI::_stopAttack(), Player::ActivateSpec(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), CleanupBeforeRemoveFromMap(), CombatStop(), boss_julianne::DamageTaken(), npc_mograine::npc_mograineAI::DamageTaken(), boss_onyxia::DamageTaken(), boss_volazj::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), boss_alar::boss_alarAI::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DamageTaken(), DealDamage(), boss_leotheras_the_blind::DemonTime(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_medivh_bm::DoAction(), boss_thorim_sif::boss_thorim_sifAI::DoAction(), boss_nazan::DoAction(), npc_ranshalla::npc_ranshallaAI::DoContinueEscort(), Spell::EffectKnockBack(), boss_leotheras_the_blind::ElfTime(), spell_dk_death_grip::HandleBaseDummy(), WorldSession::HandleCancelCastOpcode(), spell_magtheridon_shadow_grasp::HandleDummyRemove(), spell_hydross_cleansing_field_command::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLootOpcode(), WorldSession::HandlePetActionHelper(), spell_the_lich_king_jump::spell_the_lich_king_jump_SpellScript::HandleScript(), boss_akilzon::boss_akilzonAI::HandleStormSequence(), npc_kilrek::JustEngagedWith(), boss_infinite_corruptor::boss_infinite_corruptorAI::JustEngagedWith(), boss_taldaram::JustEngagedWith(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_curator::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustEngagedWith(), boss_gal_darah::boss_gal_darahAI::JustEngagedWith(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustEngagedWith(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustEngagedWith(), violet_hold_trashAI::JustEngagedWith(), PetAI::KilledUnit(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_shade_of_aran::OnPowerUpdate(), boss_jeklik::PathEndReached(), PretendToDie(), SmartScript::ProcessAction(), RemoveAurasWithInterruptFlags(), boss_curator::Reset(), boss_malchezaar::Reset(), boss_varos::boss_varosAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), boss_talon_king_ikiss::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), boss_the_lurker_below::SchedulerPhaseOne(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), boss_anomalus::boss_anomalusAI::SetData(), setDeathState(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), StopAttackFaction(), Player::TeleportTo(), boss_archimonde::boss_archimondeAI::UnleashSoulCharge(), CasterAI::UpdateAI(), TotemAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_felblood_kaelthas::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_azgalor::boss_azgalorAI::UpdateAI(), hyjalAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), boss_shade_of_akama::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), generic_creature::generic_creatureAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and PetAI::UpdateAI().

◆ InterruptSpell()

void Unit::InterruptSpell ( CurrentSpellTypes  spellType,
bool  withDelayed = true,
bool  withInstant = true,
bool  bySelf = false 
)
4015{
4016 //LOG_DEBUG("entities.unit", "Interrupt spell for unit {}.", GetEntry());
4017 Spell* spell = m_currentSpells[spellType];
4018 if (spell
4019 && (withDelayed || spell->getState() != SPELL_STATE_DELAYED)
4020 && (withInstant || spell->GetCastTime() > 0 || spell->getState() == SPELL_STATE_CASTING)) // xinef: or spell is in casting state (channeled spells only)
4021 {
4022 // for example, do not let self-stun aura interrupt itself
4023 if (!spell->IsInterruptable())
4024 return;
4025
4026 // send autorepeat cancel message for autorepeat spells
4027 if (spellType == CURRENT_AUTOREPEAT_SPELL)
4028 if (GetTypeId() == TYPEID_PLAYER)
4030
4031 if (spell->getState() != SPELL_STATE_FINISHED)
4032 spell->cancel(bySelf);
4033
4034 m_currentSpells[spellType] = nullptr;
4035 spell->SetReferencedFromCurrent(false);
4036 }
4037}
@ SPELL_STATE_DELAYED
Definition: Spell.h:228
void SendAutoRepeatCancel(Unit *target)
Definition: PlayerMisc.cpp:152
bool IsInterruptable() const
Definition: Spell.h:559
int32 GetCastTime() const
Definition: Spell.h:547
uint32 getState() const
Definition: Spell.h:482
void cancel(bool bySelf=false)
Definition: Spell.cpp:3707

References Spell::cancel(), CURRENT_AUTOREPEAT_SPELL, Spell::GetCastTime(), Spell::getState(), Object::GetTypeId(), Spell::IsInterruptable(), m_currentSpells, Player::SendAutoRepeatCancel(), Spell::SetReferencedFromCurrent(), SPELL_STATE_CASTING, SPELL_STATE_DELAYED, SPELL_STATE_FINISHED, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by _UpdateAutoRepeatSpell(), Player::ActivateTaxiPathTo(), Attack(), AttackStop(), CastStop(), Spell::EffectInterruptCast(), Spell::EffectSanctuary(), AuraEffect::HandleAuraModSilence(), WorldSession::HandleCancelAuraOpcode(), WorldSession::HandleCancelAutoRepeatSpellOpcode(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleCancelChanneling(), spell_hun_scatter_shot::HandleDummy(), AuraEffect::HandleFeignDeath(), InterruptNonMeleeSpells(), boss_archimonde::boss_archimondeAI::JustEngagedWith(), SmartAI::JustEngagedWith(), Player::RemoveItemDependentAurasAndCasts(), SetCurrentCastedSpell(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_nightbane::TakeOff(), and npc_belnistrasz::npc_belnistraszAI::UpdateAI().

◆ IsAlive()

bool Unit::IsAlive ( ) const
inline
1822{ return (m_deathState == DeathState::Alive); };

References m_deathState.

Referenced by _CreateAuraApplication(), CreatureAI::_EnterEvadeMode(), _EnterVehicle(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::_LoadItem(), BossAI::_Reset(), WorldBossAI::_Reset(), KillRewarder::_RewardHonor(), KillRewarder::_RewardKillCredit(), KillRewarder::_RewardXP(), PetAI::_stopAttack(), AddAura(), Map::AddPlayerToMap(), HostileReference::AddThreat(), Spell::AddUnitTarget(), Attack(), PetAI::AttackedBy(), AttackerStateUpdate(), boss_freya::boss_freyaAI::boss_freyaAI(), boss_hodir::boss_hodirAI::boss_hodirAI(), boss_mimiron::boss_mimironAI::boss_mimironAI(), boss_thorim::boss_thorimAI::boss_thorimAI(), WorldSession::BuildPartyMemberStatsChangedPacket(), Player::BuyItemFromVendorSlot(), CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), instance_ruins_of_ahnqiraj::instance_ruins_of_ahnqiraj_InstanceMapScript::CallNextRajaxxLeader(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanCaptureTowerPoint(), CanHaveThreatList(), Player::CanInteractWithQuestGiver(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), boss_archimonde::boss_archimondeAI::CanUseFingerOfDeath(), Player::CanUseItem(), Player::CastItemCombatSpell(), Player::CheckAreaExploreAndOutdoor(), spell_dk_raise_ally::CheckCast(), spell_hun_check_pet_los::CheckCast(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), spell_hun_bestial_wrath::CheckCast(), Spell::CheckCast(), boss_gothik::boss_gothikAI::CheckGroupSplitted(), BattlegroundRV::CheckPositionForUnit(), spell_mage_focus_magic::CheckProc(), spell_dk_blood_caked_blade::CheckProc(), spell_dk_dancing_rune_weapon::CheckProc(), spell_item_necrotic_touch::CheckProc(), spell_pal_seal_of_righteousness::CheckProc(), spell_warl_siphon_life::CheckProc(), spell_putricide_mutation_init::spell_putricide_mutation_init_SpellScript::CheckRequirementInternal(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CreatureUnitRelocationWorker(), DealDamage(), DealDamageMods(), DealMeleeDamage(), DealSpellDamage(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), Creature::DisappearAndDie(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_xerestrasza::npc_xerestraszaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), boss_high_king_maulgar::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_infinite_corruptor::boss_infinite_corruptorAI::DoAction(), boss_tharon_ja::boss_tharon_jaAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), boss_illidari_council::boss_illidari_councilAI::DoAction(), Spell::DoAllEffectOnTarget(), spell_hun_masters_call::DoCheckCast(), RandomMovementGenerator< T >::DoInitialize(), WorldSession::DoLootRelease(), WaypointMovementGenerator< Creature >::DoUpdate(), instance_blackrock_spire::instance_blackrock_spireMapScript::Dragonspireroomcheck(), Spell::EffectAddExtraAttacks(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectEnvironmentalDMG(), Spell::EffectFeedPet(), Spell::EffectHeal(), Spell::EffectHealMaxHealth(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), Spell::EffectHealthLeech(), Spell::EffectInstaKill(), Spell::EffectInterruptCast(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectResurrect(), Spell::EffectResurrectNew(), Spell::EffectResurrectPet(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSelfResurrect(), Spell::EffectSkinPlayerCorpse(), Spell::EffectStuck(), Spell::EffectThreat(), Spell::EffectWeaponDmg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), hyjalAI::EnterEvadeMode(), Player::EnvironmentalDamage(), Player::EquipItem(), BattleExperienceEvent::Execute(), DelayedMovementEvent::Execute(), IceTombSummonEvent::Execute(), SACActivateEvent::Execute(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::ExecuteEvent(), AssistanceMovementGenerator::Finalize(), Creature::ForcedDespawn(), CreatureGroup::FormationReset(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::GetData(), GetDebugInfo(), Player::GetInitialVisiblePackets(), FollowerAI::GetLeaderForFollower(), Player::getMaxTimer(), CreatureGroup::GetNewTargetForMember(), Player::GetNPCIfCanInteractWith(), GetPartyMembers(), npc_air_force_bots::npc_air_force_botsAI::GetSummonedGuard(), npc_wild_wyrm::npc_wild_wyrmAI::GetValidPlayer(), Pet::GivePetXP(), Player::GiveXP(), go_wind_stone::go_wind_stoneAI::GossipSelect(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), BattlegroundEY::HandleAreaTrigger(), BattlegroundWS::HandleAreaTrigger(), WorldSession::HandleAreaTriggerOpcode(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModTotalThreat(), WorldSession::HandleAutostoreLootItemOpcode(), WorldSession::HandleBattleFieldPortOpcode(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), HandleDummyAuraProc(), WorldSession::HandleEmoteOpcode(), Player::HandleFall(), misc_commandscript::HandleFreezeCommand(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleMessagechatOpcode(), AuraEffect::HandleModTaunt(), AuraEffect::HandleModTotalPercentStat(), WorldSession::HandleMovementOpcodes(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), AuraEffect::HandleObsModPowerAuraTick(), spell_yogg_saron_brain_link::spell_yogg_saron_brain_link_AuraScript::HandleOnEffectApply(), WorldSession::HandleOpenItemOpcode(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetAction(), WorldSession::HandlePetCancelAuraOpcode(), WorldSession::HandlePetStopAttack(), misc_commandscript::HandlePInfoCommand(), spell_pal_seal_of_command_aura::HandleProc(), HandleProcTriggerSpell(), WorldSession::HandleReclaimCorpseOpcode(), WorldSession::HandleRepopRequestOpcode(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), WorldSession::HandleSetAmmoOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleSummonResponseOpcode(), WorldSession::HandleUnstablePet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), boss_moroes::InitializeGuests(), Player::IsAtGroupRewardDistance(), Player::IsAtRecruitAFriendDistance(), Creature::IsInvisibleDueToDespawn(), Player::IsOutdoorPvPActive(), Player::IsPetNeedBeTemporaryUnsummoned(), isTargetableForAttack(), IsValidCombatTarget(), Spell::IsValidDeadOrAliveTarget(), ThreatCalcHelper::isValidProcess(), npc_kilrek::JustDied(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::JustDied(), boss_rajaxx::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), npc_underbat::JustEngagedWith(), boss_sartharion::boss_sartharionAI::JustEngagedWith(), boss_rotface::boss_rotfaceAI::JustSummoned(), Kill(), boss_hadronox::boss_hadronoxAI::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), Player::LoadCorpse(), Player::LoadFromDB(), LoadHelper(), MagicSpellHitResult(), AchievementCriteriaData::Meets(), CreatureGroup::MemberEngagingTarget(), CreatureGroup::MemberEvaded(), npc_twiggy_flathead::npc_twiggy_flatheadAI::MoveInLineOfSight(), boss_lord_marrowgar::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_uldaman::instance_uldaman_InstanceMapScript::OnCreatureCreate(), instance_temple_of_ahnqiraj::instance_temple_of_ahnqiraj_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), instance_shadow_labyrinth::instance_shadow_labyrinth_InstanceMapScript::OnCreatureCreate(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), go_palehoof_sphere::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), spell_yogg_saron_brain_link::spell_yogg_saron_brain_link_AuraScript::OnPeriodic(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnPlayerEnter(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::OnPlayerEnter(), at_orb_of_command::OnTrigger(), at_ancient_leaf::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), AreaTrigger_at_voltarus_middle::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), AreaTrigger_at_sentry_point::OnTrigger(), SmartTrigger::OnTrigger(), AreaTrigger_at_area_52_entrance::OnTrigger(), at_dragonspire_hall::OnTrigger(), at_blackrock_stadium::OnTrigger(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), at_commander_dawnforge::OnTrigger(), RisenArchmageCheck::operator()(), WretchedGhoulCleaner::operator()(), ValithriaDespawner::operator()(), Acore::NearestCreatureEntryWithLiveStateInObjectRangeCheck::operator()(), Acore::PlayerAtMinimumRangeAway::operator()(), Acore::AnyDeadUnitObjectInRangeCheck::operator()(), Acore::AnyPlayerInObjectRangeCheck::operator()(), Acore::NearestPlayerInObjectRangeCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), Acore::AnyUnitInObjectRangeCheck::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), Acore::AnyDeadUnitCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::MostHPMissingGroupInRange::operator()(), FrostwingVrykulSearcher::operator()(), Acore::AllDeadCreaturesInRange::operator()(), ShadowTrapLKTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), DefileTargetSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), MapMgr::PlayerCannotEnter(), ProcDamageAndSpell(), RemoveCharmedBy(), Group::RemoveMember(), Player::RemovePet(), Battleground::RemovePlayerAtLeave(), Player::RepopAtGraveyard(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::Reset(), boss_fathomlord_karathress::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), Creature::Respawn(), Player::RewardPlayerAndGroupAtEvent(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), Player::SendLoot(), npc_corrupted_totem::SetAura(), instance_naxxramas::instance_naxxramas_InstanceMapScript::SetBossState(), SetConfused(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::SetData(), npc_enslaved_proto_drake::npc_enslaved_proto_drakeAI::SetData(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::SetData(), boss_teron_gorefiend::SetData(), Player::setDeathState(), Creature::SetDisableGravity(), SetFeared(), Creature::SetHover(), SetInCombatState(), SetStunned(), Battlefield::ShowNpc(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::SpawnAdds(), npc_dark_iron_guzzler::SpellHit(), npc_crusade_persuaded::npc_crusade_persuadedAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), WaypointMovementGenerator< Creature >::StartMove(), PassengerController::SummonCreatures(), boss_rend_blackhand::boss_rend_blackhandAI::SummonedCreatureDespawn(), boss_priestess_delrissa::SummonedCreatureDies(), boss_kaelthas::boss_kaelthasAI::SummonedCreatureDies(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), Player::SwapItem(), lfg::LFGMgr::TeleportPlayer(), BattlegroundRV::TeleportUnitToNewZ(), Pet::Update(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Puppet::Update(), Player::Update(), Totem::Update(), Update(), TimedFleeingMovementGenerator::Update(), TotemAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_giant_infernal::npc_giant_infernalAI::UpdateAI(), hyjalAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_taldaram::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), generic_creature::generic_creatureAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::UpdateAI(), PetAI::UpdateAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_ringo::npc_ringoAI::UpdateFollowerAI(), InstanceScript::UpdateMinionState(), Creature::UpdateMovementFlags(), boss_netherspite::UpdatePortals(), boss_twin_valkyrAI::UpdateSharedHealth(), UpdateSplineMovement(), Player::UpdateZone(), boss_anetheron::boss_anetheronAI::WaypointReached(), boss_azgalor::boss_azgalorAI::WaypointReached(), boss_kazrogal::boss_kazrogalAI::WaypointReached(), boss_rage_winterchill::boss_rage_winterchillAI::WaypointReached(), npc_giant_infernal::npc_giant_infernalAI::WaypointReached(), npc_abomination::npc_abominationAI::WaypointReached(), npc_ghoul::npc_ghoulAI::WaypointReached(), npc_necromancer::npc_necromancerAI::WaypointReached(), npc_banshee::npc_bansheeAI::WaypointReached(), npc_crypt_fiend::npc_crypt_fiendAI::WaypointReached(), npc_fel_stalker::npc_fel_stalkerAI::WaypointReached(), npc_frost_wyrm::npc_frost_wyrmAI::WaypointReached(), npc_gargoyle::npc_gargoyleAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsAlwaysDetectableFor()

bool Unit::IsAlwaysDetectableFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

14203{
14205 return true;
14206
14207 if (HasAuraTypeWithCaster(SPELL_AURA_MOD_STALKED, seer->GetGUID()))
14208 return true;
14209
14210 if (Player* ownerPlayer = GetSpellModOwner())
14211 if (Player const* seerPlayer = seer->ToPlayer())
14212 {
14213 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14214 return true;
14215 }
14216
14217 return false;
14218}
virtual bool IsAlwaysDetectableFor(WorldObject const *) const
Definition: Object.h:652

References Object::GetGUID(), GetSpellModOwner(), HasAuraTypeWithCaster(), WorldObject::IsAlwaysDetectableFor(), SPELL_AURA_MOD_STALKED, and Object::ToPlayer().

Referenced by Creature::IsAlwaysDetectableFor(), and Player::IsAlwaysDetectableFor().

◆ IsAlwaysVisibleFor()

bool Unit::IsAlwaysVisibleFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

14184{
14186 return true;
14187
14188 // Always seen by owner
14189 if (ObjectGuid guid = GetCharmerOrOwnerGUID())
14190 if (seer->GetGUID() == guid)
14191 return true;
14192
14193 if (Player const* seerPlayer = seer->ToPlayer())
14194 if (Unit* owner = GetOwner())
14195 if (Player* ownerPlayer = owner->ToPlayer())
14196 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14197 return true;
14198
14199 return false;
14200}
virtual bool IsAlwaysVisibleFor(WorldObject const *) const
Definition: Object.h:649

References GetCharmerOrOwnerGUID(), Object::GetGUID(), GetOwner(), WorldObject::IsAlwaysVisibleFor(), and Object::ToPlayer().

◆ IsArmorer()

bool Unit::IsArmorer ( ) const
inline
@ UNIT_NPC_FLAG_REPAIR
Definition: Unit.h:528
bool HasNpcFlag(NPCFlags flags) const
Definition: Unit.h:1660

References HasNpcFlag(), and UNIT_NPC_FLAG_REPAIR.

◆ isAttackingPlayer()

bool Unit::isAttackingPlayer ( ) const
10465{
10467 return true;
10468
10469 if (!m_Controlled.empty())
10470 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10471 if ((*itr)->isAttackingPlayer())
10472 return true;
10473
10474 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
10475 if (m_SummonSlot[i])
10476 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
10477 if (summon->isAttackingPlayer())
10478 return true;
10479
10480 return false;
10481}

References WorldObject::GetMap(), HasUnitState(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, and UNIT_STATE_ATTACK_PLAYER.

◆ isAttackReady()

◆ IsAuctioner()

bool Unit::IsAuctioner ( ) const
inline
@ UNIT_NPC_FLAG_AUCTIONEER
Definition: Unit.h:537

References HasNpcFlag(), and UNIT_NPC_FLAG_AUCTIONEER.

◆ IsBanker()

bool Unit::IsBanker ( ) const
inline
@ UNIT_NPC_FLAG_BANKER
Definition: Unit.h:533

References HasNpcFlag(), and UNIT_NPC_FLAG_BANKER.

◆ IsBattleMaster()

bool Unit::IsBattleMaster ( ) const
inline

◆ isBeingLoaded()

virtual bool Unit::isBeingLoaded ( ) const
inlinevirtual

Reimplemented in Pet, and Player.

2409{ return false;}

Referenced by Player::SetMover().

◆ isBlockCritical()

bool Unit::isBlockCritical ( )
3091{
3093 return true;
3094 return false;
3095}
@ SPELL_AURA_MOD_BLOCK_CRIT_CHANCE
Definition: SpellAuraDefines.h:316

References GetTotalAuraModifier(), roll_chance_i(), and SPELL_AURA_MOD_BLOCK_CRIT_CHANCE.

Referenced by CalculateMeleeDamage(), and CalculateSpellDamageTaken().

◆ IsCharmed()

◆ IsCharmedOwnedByPlayerOrPlayer()

bool Unit::IsCharmedOwnedByPlayerOrPlayer ( ) const
inline
ObjectGuid GetCharmerOrOwnerOrOwnGUID() const
Definition: Unit.h:1845

References GetCharmerOrOwnerOrOwnGUID(), and ObjectGuid::IsPlayer().

Referenced by Spell::DoSpellHitOnUnit(), and ProcDamageAndSpellFor().

◆ IsContestedGuard()

bool Unit::IsContestedGuard ( ) const
inline
1524 {
1525 if (FactionTemplateEntry const* entry = GetFactionTemplateEntry())
1526 return entry->IsContestedGuardFaction();
1527
1528 return false;
1529 }

References GetFactionTemplateEntry().

Referenced by Acore::NearestVisibleDetectableContestedGuardUnitCheck::operator()().

◆ IsControllableGuardian()

bool Unit::IsControllableGuardian ( ) const
inline

◆ IsControlledByPlayer()

◆ IsCreatedByPlayer()

bool Unit::IsCreatedByPlayer ( ) const
inline
1843{ return m_CreatedByPlayer; }

References m_CreatedByPlayer.

Referenced by DealDamage().

◆ IsCritter()

◆ IsDamageReducedByArmor()

bool Unit::IsDamageReducedByArmor ( SpellSchoolMask  damageSchoolMask,
SpellInfo const *  spellInfo = nullptr,
uint8  effIndex = MAX_SPELL_EFFECTS 
)
static
1989{
1990 // only physical spells damage gets reduced by armor
1991 if ((schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0)
1992 return false;
1993 if (spellInfo)
1994 {
1995 // there are spells with no specific attribute but they have "ignores armor" in tooltip
1996 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_IGNORE_ARMOR))
1997 return false;
1998
1999 // bleeding effects are not reduced by armor
2000 if (effIndex != MAX_SPELL_EFFECTS)
2001 {
2002 if (spellInfo->Effects[effIndex].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE ||
2003 spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
2004 if (spellInfo->GetEffectMechanicMask(effIndex) & (1 << MECHANIC_BLEED))
2005 return false;
2006 }
2007 }
2008 return true;
2009}
@ SPELL_ATTR0_CU_IGNORE_ARMOR
Definition: SpellInfo.h:191
@ MECHANIC_BLEED
Definition: SharedDefines.h:1340

References SpellInfo::Effects, SpellInfo::GetEffectMechanicMask(), SpellInfo::HasAttribute(), MAX_SPELL_EFFECTS, MECHANIC_BLEED, SPELL_ATTR0_CU_IGNORE_ARMOR, SPELL_AURA_PERIODIC_DAMAGE, SPELL_EFFECT_SCHOOL_DAMAGE, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ isDead()

bool Unit::isDead ( ) const
inline
1824{ return (m_deathState == DeathState::Dead || m_deathState == DeathState::Corpse); };

References m_deathState.

Referenced by npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::CheckEventFail(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), Spell::EffectSummonPet(), AuraEffect::HandleAuraDummy(), Player::HandleFall(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), misc_commandscript::HandleRespawnCommand(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), Creature::HasSpellFocus(), UnitAI::InitializeAI(), SmartAI::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_spinestalker::npc_spinestalkerAI::InitializeAI(), npc_rimefang::npc_rimefangAI::InitializeAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::InitializeAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), Player::isAllowedToLoot(), npc_anubisath_sentinel::aqsentinelAI::JustDied(), Player::OnGossipSelect(), AreaTrigger_at_stormwright_shelf::OnTrigger(), AreaTrigger_at_scent_larkorwi::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), AreaTrigger_at_sholazar_waygate::OnTrigger(), Player::PrepareGossipMenu(), SmartScript::ProcessAction(), Player::RepopAtGraveyard(), npc_anubisath_sentinel::aqsentinelAI::Reset(), instance_molten_core::instance_molten_core_InstanceMapScript::SetBossState(), npc_towering_infernal::npc_towering_infernalAI::UpdateAI(), npc_lesser_doomguard::npc_lesser_doomguardAI::UpdateAI(), and npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI().

◆ IsDuringRemoveFromWorld()

◆ isDying()

bool Unit::isDying ( ) const
inline
1823{ return (m_deathState == DeathState::JustDied); };

References m_deathState.

Referenced by CanHaveThreatList(), and SetHover().

◆ IsEngaged()

◆ IsEngagedBy()

bool Unit::IsEngagedBy ( Unit const *  who) const
inline
1700{ return IsInCombatWith(who); }

References IsInCombatWith().

Referenced by Creature::_IsTargetAcceptable(), and Creature::Update().

◆ IsFalling()

bool Unit::IsFalling ( ) const

◆ isFeared()

◆ IsFFAPvP()

bool Unit::IsFFAPvP ( ) const
inline

◆ IsFlying()

◆ IsFriendlyTo()

bool Unit::IsFriendlyTo ( Unit const *  unit) const
10250{
10251 return GetReactionTo(unit) >= REP_FRIENDLY;
10252}

References GetReactionTo(), and REP_FRIENDLY.

Referenced by Spell::_cast(), AuraApplication::_InitFlags(), Creature::_IsTargetAcceptable(), FollowerAI::AssistPlayerInCombatAgainst(), npc_calvin_montague::npc_calvin_montagueAI::AttackedBy(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), Creature::CanAssistTo(), spell_dk_death_coil::CheckCast(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), Spell::CheckCast(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), Spell::EffectDispel(), Spell::EffectDispelMechanic(), Spell::EffectStealBeneficialBuff(), Spell::EffectThreat(), Aura::HandleAuraSpecificMods(), spell_dk_death_coil::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pri_penance::HandleDummy(), HandleDummyAuraProc(), BattlefieldWG::HandleKill(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), WorldSession::HandleSetSelectionOpcode(), Spell::HandleThreatSpells(), GameObject::IsAlwaysVisibleFor(), SpellClickInfo::IsFitToRequirements(), npc_draenei_survivor::npc_draenei_survivorAI::MoveInLineOfSight(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), PetSpellFail(), SmartScript::ProcessEvent(), RemoveCharmedBy(), Spell::SelectExplicitTargets(), Player::SendLoot(), Acore::MessageDistDelivererToHostile::SendPacket(), and TotemAI::UpdateAI().

◆ isFrozen()

◆ IsFullHealth()

◆ IsGossip()

bool Unit::IsGossip ( ) const
inline

◆ IsGuardian()

◆ IsGuildMaster()

bool Unit::IsGuildMaster ( ) const
inline
@ UNIT_NPC_FLAG_PETITIONER
Definition: Unit.h:534

References HasNpcFlag(), and UNIT_NPC_FLAG_PETITIONER.

◆ IsHostileTo()

◆ IsHostileToPlayers()

bool Unit::IsHostileToPlayers ( ) const
10255{
10256 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10257 if (!my_faction || !my_faction->faction)
10258 return false;
10259
10260 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10261 if (raw_faction && raw_faction->reputationListID >= 0)
10262 return false;
10263
10264 return my_faction->IsHostileToPlayers();
10265}
int32 reputationListID
Definition: DBCStructure.h:900
uint32 faction
Definition: DBCStructure.h:932
bool IsHostileToPlayers() const
Definition: DBCStructure.h:972

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsHostileToPlayers(), FactionEntry::reputationListID, and sFactionStore.

◆ IsHovering()

◆ IsHunterPet()

◆ IsImmunedToDamage() [1/3]

bool Unit::IsImmunedToDamage ( Spell const *  spell) const
12790{
12791 SpellInfo const* spellInfo = spell->GetSpellInfo();
12792 if (!spellInfo)
12793 {
12794 return false;
12795 }
12796
12798 {
12799 return false;
12800 }
12801
12803 {
12804 return false;
12805 }
12806
12807 uint32 schoolMask = spell->GetSpellSchoolMask();
12808 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12809 {
12810 return false;
12811 }
12812
12813 // If m_immuneToDamage type contain magic, IMMUNE damage.
12814 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12815 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12816 {
12817 if ((itr->type & schoolMask) == schoolMask)
12818 {
12819 return true;
12820 }
12821 }
12822
12823 return false;
12824}
std::vector< SpellImmune > SpellImmuneList
Definition: SpellDefines.h:179
@ SPELL_ATTR2_NO_SCHOOL_IMMUNITIES
Definition: SharedDefines.h:482
@ SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS
Definition: SharedDefines.h:435
@ IMMUNITY_DAMAGE
Definition: SharedDefines.h:1397
@ SPELL_SCHOOL_MASK_NONE
Definition: SharedDefines.h:296

References Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasAuraType(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, SPELL_AURA_SPIRIT_OF_REDEMPTION, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [2/3]

bool Unit::IsImmunedToDamage ( SpellInfo const *  spellInfo) const
12758{
12759 if (!spellInfo)
12760 {
12761 return false;
12762 }
12763
12765 {
12766 return false;
12767 }
12768
12769 if (spellInfo->HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) || spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
12770 {
12771 return false;
12772 }
12773
12774 uint32 schoolMask = spellInfo->GetSchoolMask();
12775 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12776 {
12777 return false;
12778 }
12779
12780 // If m_immuneToDamage type contain magic, IMMUNE damage.
12781 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12782 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12783 if((itr->type & schoolMask) == schoolMask)
12784 return true;
12785
12786 return false;
12787}

References SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasAuraType(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, SPELL_AURA_SPIRIT_OF_REDEMPTION, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [3/3]

bool Unit::IsImmunedToDamage ( SpellSchoolMask  meleeSchoolMask) const
12742{
12743 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12744 {
12745 return false;
12746 }
12747
12748 // If m_immuneToDamage type contain magic, IMMUNE damage.
12749 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12750 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12751 if((itr->type & meleeSchoolMask) == meleeSchoolMask)
12752 return true;
12753
12754 return false;
12755}

References IMMUNITY_DAMAGE, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by Spell::DoSpellHitOnUnit(), and IsImmunedToDamageOrSchool().

◆ IsImmunedToDamageOrSchool() [1/2]

bool Unit::IsImmunedToDamageOrSchool ( SpellInfo const *  spellInfo) const
12906{
12907 return IsImmunedToDamage(spellInfo) || IsImmunedToSchool(spellInfo);
12908}
bool IsImmunedToSchool(SpellSchoolMask meleeSchoolMask) const
Definition: Unit.cpp:12826
bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask) const
Definition: Unit.cpp:12741

References IsImmunedToDamage(), and IsImmunedToSchool().

◆ IsImmunedToDamageOrSchool() [2/2]

◆ IsImmunedToSchool() [1/3]

bool Unit::IsImmunedToSchool ( Spell const *  spell) const
12866{
12867 SpellInfo const* spellInfo = spell->GetSpellInfo();
12869 {
12870 return false;
12871 }
12872
12873 uint32 schoolMask = spell->GetSpellSchoolMask();
12874 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12875 {
12876 return false;
12877 }
12878
12879 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12880 {
12881 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12882 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12883 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12884 {
12885 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
12886 {
12887 return true;
12888 }
12889 }
12890 }
12891
12892 return false;
12893}
@ IMMUNITY_SCHOOL
Definition: SharedDefines.h:1396
bool CanPierceImmuneAura(SpellInfo const *aura) const
Definition: SpellInfo.cpp:1310

References SpellInfo::CanPierceImmuneAura(), Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasAuraType(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_SPIRIT_OF_REDEMPTION, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [2/3]

bool Unit::IsImmunedToSchool ( SpellInfo const *  spellInfo) const
12843{
12845 return false;
12846
12847 uint32 schoolMask = spellInfo->GetSchoolMask();
12848 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12849 {
12850 return false;
12851 }
12852
12853 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12854 {
12855 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12856 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12857 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12858 if((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
12859 return true;
12860 }
12861
12862 return false;
12863}

References SpellInfo::CanPierceImmuneAura(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasAuraType(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_SPIRIT_OF_REDEMPTION, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [3/3]

bool Unit::IsImmunedToSchool ( SpellSchoolMask  meleeSchoolMask) const
12827{
12828 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12829 {
12830 return false;
12831 }
12832
12833 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12834 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12835 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12836 if((itr->type & meleeSchoolMask) == meleeSchoolMask)
12837 return true;
12838
12839 return false;
12840}

References IMMUNITY_SCHOOL, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by Spell::DoSpellHitOnUnit(), IsImmunedToDamageOrSchool(), and SpellHitResult().

◆ IsImmunedToSpell()

bool Unit::IsImmunedToSpell ( SpellInfo const *  spellInfo,
Spell const *  spell = nullptr 
)
virtual

Reimplemented in Creature.

12911{
12912 if (!spellInfo)
12913 return false;
12914
12915 // Single spell immunity.
12916 SpellImmuneList const& idList = m_spellImmune[IMMUNITY_ID];
12917 for (SpellImmuneList::const_iterator itr = idList.begin(); itr != idList.end(); ++itr)
12918 if (itr->type == spellInfo->Id)
12919 return true;
12920
12921 // xinef: my special immunity, if spellid is not on this list it means npc is immune
12922 SpellImmuneList const& allowIdList = m_spellImmune[IMMUNITY_ALLOW_ID];
12923 if (!allowIdList.empty())
12924 {
12925 for (SpellImmuneList::const_iterator itr = allowIdList.begin(); itr != allowIdList.end(); ++itr)
12926 if (itr->type == spellInfo->Id)
12927 return false;
12928 return true;
12929 }
12930
12932 return false;
12933
12934 if (spellInfo->Dispel)
12935 {
12936 SpellImmuneList const& dispelList = m_spellImmune[IMMUNITY_DISPEL];
12937 for (SpellImmuneList::const_iterator itr = dispelList.begin(); itr != dispelList.end(); ++itr)
12938 if (itr->type == spellInfo->Dispel)
12939 return true;
12940 }
12941
12942 // Spells that don't have effectMechanics.
12943 if (spellInfo->Mechanic)
12944 {
12945 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
12946 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
12947 if (itr->type == spellInfo->Mechanic)
12948 return true;
12949 }
12950
12951 bool immuneToAllEffects = true;
12952 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12953 {
12954 // State/effect immunities applied by aura expect full spell immunity
12955 // Ignore effects with mechanic, they are supposed to be checked separately
12956 if (!spellInfo->Effects[i].IsEffect())
12957 continue;
12958
12959 // Xinef: if target is immune to one effect, and the spell has transform aura - it is immune to whole spell
12960 if (IsImmunedToSpellEffect(spellInfo, i))
12961 {
12962 if (spellInfo->HasAura(SPELL_AURA_TRANSFORM))
12963 return true;
12964 continue;
12965 }
12966
12967 immuneToAllEffects = false;
12968 break;
12969 }
12970 if (immuneToAllEffects) //Return immune only if the target is immune to all spell effects.
12971 return true;
12972
12973 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12974 {
12975 SpellSchoolMask spellSchoolMask = spellInfo->GetSchoolMask();
12976 if (spell)
12977 {
12978 spellSchoolMask = spell->GetSpellSchoolMask();
12979 }
12980
12981 if (spellSchoolMask != SPELL_SCHOOL_MASK_NONE)
12982 {
12983 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12984 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12985 {
12986 SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(itr->spellId);
12987 if (((itr->type & spellSchoolMask) == spellSchoolMask)
12988 && (!immuneSpellInfo || immuneSpellInfo->IsPositive()) && !spellInfo->IsPositive()
12989 && !spellInfo->CanPierceImmuneAura(immuneSpellInfo))
12990 {
12991 return true;
12992 }
12993 }
12994 }
12995 }
12996
12997 return false;
12998}
@ IMMUNITY_ALLOW_ID
Definition: SharedDefines.h:1401
@ IMMUNITY_ID
Definition: SharedDefines.h:1400
@ IMMUNITY_MECHANIC
Definition: SharedDefines.h:1399

References SpellInfo::CanPierceImmuneAura(), SpellInfo::Dispel, SpellInfo::Effects, SpellInfo::GetSchoolMask(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasAuraType(), SpellInfo::Id, IMMUNITY_ALLOW_ID, IMMUNITY_DISPEL, IMMUNITY_ID, IMMUNITY_MECHANIC, IMMUNITY_SCHOOL, IsImmunedToSpellEffect(), SpellInfo::IsPositive(), m_spellImmune, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_SPIRIT_OF_REDEMPTION, SPELL_AURA_TRANSFORM, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

Referenced by AddAura(), Spell::DoSpellHitOnUnit(), Creature::IsImmunedToSpell(), spell_hun_lock_and_load::IsTargetValid(), boss_talon_king_ikiss::JustEngagedWith(), boss_kiggler_the_crazed::JustEngagedWith(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), and SpellHitResult().

◆ IsImmunedToSpellEffect()

bool Unit::IsImmunedToSpellEffect ( SpellInfo const *  spellInfo,
uint32  index 
) const
virtual

Reimplemented in Creature, and Totem.

13001{
13002 if (!spellInfo || !spellInfo->Effects[index].IsEffect())
13003 return false;
13004
13005 // xinef: pet scaling auras
13006 if (spellInfo->HasAttribute(SPELL_ATTR4_OWNER_POWER_SCALING))
13007 return false;
13008
13010 return false;
13011
13012 //If m_immuneToEffect type contain this effect type, IMMUNE effect.
13013 uint32 effect = spellInfo->Effects[index].Effect;
13014 SpellImmuneList const& effectList = m_spellImmune[IMMUNITY_EFFECT];
13015 for (SpellImmuneList::const_iterator itr = effectList.begin(); itr != effectList.end(); ++itr)
13016 {
13017 if (itr->type == effect && (itr->spellId != 62692 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13018 {
13019 return true;
13020 }
13021 }
13022
13023 if (uint32 mechanic = spellInfo->Effects[index].Mechanic)
13024 {
13025 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
13026 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
13027 if (itr->type == mechanic)
13028 return true;
13029 }
13030
13031 if (uint32 aura = spellInfo->Effects[index].ApplyAuraName)
13032 {
13034 for (SpellImmuneList::const_iterator itr = list.begin(); itr != list.end(); ++itr)
13035 {
13036 if (itr->type == aura && (itr->spellId != 64848 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13037 {
13038 if (!spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
13039 {
13040 if (itr->blockType == SPELL_BLOCK_TYPE_ALL || spellInfo->IsPositive()) // xinef: added for pet scaling
13041 {
13042 return true;
13043 }
13044 }
13045 }
13046 }
13047
13048 if (!spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
13049 {
13050 // Check for immune to application of harmful magical effects
13052 for (AuraEffectList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter)
13053 {
13054 if (/*(spellInfo->Dispel == DISPEL_MAGIC || spellInfo->Dispel == DISPEL_CURSE || spellInfo->Dispel == DISPEL_DISEASE) &&*/ // Magic debuff, xinef: all kinds?
13055 ((*iter)->GetMiscValue() & spellInfo->GetSchoolMask()) && // Check school
13056 !spellInfo->IsPositiveEffect(index) && // Harmful
13057 spellInfo->Effects[index].Effect != SPELL_EFFECT_PERSISTENT_AREA_AURA) // Not Persistent area auras
13058 {
13059 return true;
13060 }
13061 }
13062 }
13063 }
13064
13065 return false;
13066}
@ SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL
Definition: SpellAuraDefines.h:330
@ SPELL_BLOCK_TYPE_ALL
Definition: SpellDefines.h:156
@ SPELL_EFFECT_PERSISTENT_AREA_AURA
Definition: SharedDefines.h:805
@ SPELL_ATTR3_ALWAYS_HIT
Definition: SharedDefines.h:511
@ IMMUNITY_STATE
Definition: SharedDefines.h:1395
@ IMMUNITY_EFFECT
Definition: SharedDefines.h:1394
@ SPELL_ATTR4_OWNER_POWER_SCALING
Definition: SharedDefines.h:555
bool CanRestoreMana(SpellInfo const *spellInfo) const
Definition: Unit.cpp:21497

References CanRestoreMana(), SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasAuraType(), IMMUNITY_EFFECT, IMMUNITY_MECHANIC, IMMUNITY_STATE, SpellInfo::IsPositive(), SpellInfo::IsPositiveEffect(), m_spellImmune, POWER_MANA, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_OWNER_POWER_SCALING, SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL, SPELL_AURA_SPIRIT_OF_REDEMPTION, SPELL_BLOCK_TYPE_ALL, and SPELL_EFFECT_PERSISTENT_AREA_AURA.

Referenced by AddAura(), Spell::AddUnitTarget(), Spell::DoSpellHitOnUnit(), spell_dk_death_grip::HandleBaseDummy(), IsImmunedToSpell(), and Creature::IsImmunedToSpellEffect().

◆ IsImmuneToAll()

bool Unit::IsImmuneToAll ( ) const
inline
1693{ return IsImmuneToPC() && IsImmuneToNPC(); }

References IsImmuneToNPC(), and IsImmuneToPC().

◆ IsImmuneToNPC()

◆ IsImmuneToPC()

◆ isInAccessiblePlaceFor()

bool Unit::isInAccessiblePlaceFor ( Creature const *  c) const
4146{
4147 if (c->GetMapId() == 618) // Ring of Valor
4148 {
4149 // skip transport check, check for being below floor level
4150 if (this->GetPositionZ() < 28.0f)
4151 return false;
4152 if (BattlegroundMap* bgMap = c->GetMap()->ToBattlegroundMap())
4153 if (Battleground* bg = bgMap->GetBG())
4154 if (bg->GetStartTime() < 80133) // 60000ms preparation time + 20133ms elevator rise time
4155 return false;
4156 }
4157 else if (c->GetMapId() == 631) // Icecrown Citadel
4158 {
4159 // if static transport doesn't match - return false
4160 if (c->GetTransport() != this->GetTransport() && ((c->GetTransport() && c->GetTransport()->IsStaticTransport()) || (this->GetTransport() && this->GetTransport()->IsStaticTransport())))
4161 return false;
4162
4163 // special handling for ICC (map 631), for non-flying pets in Gunship Battle, for trash npcs this is done via CanAIAttack
4164 if (c->GetOwnerGUID().IsPlayer() && !c->CanFly())
4165 {
4166 if (c->GetTransport() != this->GetTransport())
4167 return false;
4168 if (this->GetTransport())
4169 {
4170 if (c->GetPositionY() < 2033.0f)
4171 {
4172 if (this->GetPositionY() > 2033.0f)
4173 return false;
4174 }
4175 else if (c->GetPositionY() < 2438.0f)
4176 {
4177 if (this->GetPositionY() < 2033.0f || this->GetPositionY() > 2438.0f)
4178 return false;
4179 }
4180 else if (this->GetPositionY() < 2438.0f)
4181 return false;
4182 }
4183 }
4184 }
4185 else
4186 {
4187 // pussywizard: prevent any bugs by passengers exiting transports or normal creatures flying away
4188 if (c->GetTransport() != this->GetTransport())
4189 return false;
4190 }
4191
4192 LiquidStatus liquidStatus = GetLiquidData().Status;
4193 bool isInWater = (liquidStatus & MAP_LIQUID_STATUS_IN_CONTACT) != 0;
4194
4195 // In water or jumping in water
4196 if (isInWater || (liquidStatus == LIQUID_MAP_ABOVE_WATER && (IsFalling() || (ToPlayer() && ToPlayer()->IsFalling()))))
4197 {
4198 return c->CanEnterWater();
4199 }
4200 else
4201 {
4202 return c->CanWalk() || c->CanFly();
4203 }
4204}
LiquidStatus
Definition: Map.h:143
@ LIQUID_MAP_ABOVE_WATER
Definition: Map.h:145
#define MAP_LIQUID_STATUS_IN_CONTACT
Definition: Map.h:152
LiquidData const & GetLiquidData() const
Definition: Object.cpp:3133
bool IsFalling() const
Definition: Unit.cpp:20223
LiquidStatus Status
Definition: Map.h:178
BattlegroundMap * ToBattlegroundMap()
Definition: Map.h:548
Definition: Map.h:852

References Creature::CanEnterWater(), Creature::CanFly(), Creature::CanWalk(), WorldObject::GetLiquidData(), WorldObject::GetMap(), WorldLocation::GetMapId(), GetOwnerGUID(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransport(), IsFalling(), ObjectGuid::IsPlayer(), GameObject::IsStaticTransport(), LIQUID_MAP_ABOVE_WATER, MAP_LIQUID_STATUS_IN_CONTACT, LiquidData::Status, Map::ToBattlegroundMap(), and Object::ToPlayer().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), ChaseMovementGenerator< T >::DoUpdate(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), and HostileReference::updateOnlineStatus().

◆ isInBackInMap()

bool Unit::isInBackInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const

◆ IsInCombat()

bool Unit::IsInCombat ( ) const
inline

References HasUnitFlag(), and UNIT_FLAG_IN_COMBAT.

Referenced by _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), npc_anubisath_sentinel::aqsentinelAI::CallBuddiesToAttack(), npc_argent_captainAI::CanAIAttack(), Player::CanEquipItem(), Creature::CanPeriodicallyCallForAssistance(), Player::CanUnequipItem(), spell_hun_disengage::CheckCast(), Spell::CheckCast(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CombatStart(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::DoAction(), npc_risen_archmage::npc_risen_archmageAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoAllEffectOnTarget(), UnitAI::DoCastToAllHostilePlayers(), Spell::DoSpellHitOnUnit(), Spell::EffectActivateRune(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), Player::EquipItem(), CastRunesEvent::Execute(), GetVelocity(), spell_apothecary_lingering_fumes::HandleAfterCast(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::HandleBattleFieldPortOpcode(), spell_mc_play_dead::spell_mc_play_dead_AuraScript::HandleEffectRemove(), WorldSession::HandleEquipmentSetUse(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), spell_putricide_mutated_transformation::spell_putricide_mutated_transformation_SpellScript::HandleSummon(), WorldSession::HandleSummonResponseOpcode(), tele_commandscript::HandleTeleCommand(), misc_commandscript::HandleUnstuckCommand(), WorldSession::HandleUseItemOpcode(), npc_pet_mage_mirror_image::InitializeAI(), IsEngaged(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_anubrekhan::boss_anubrekhanAI::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_rotface::boss_rotfaceAI::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), Pet::LoseHappiness(), CreatureGroup::MemberEvaded(), CreatureAI::MoveInLineOfSight(), npc_towering_infernal::npc_towering_infernalAI::MoveInLineOfSight(), npc_lesser_doomguard::npc_lesser_doomguardAI::MoveInLineOfSight(), boss_eye_of_cthun::MoveInLineOfSight(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_alar::boss_alarAI::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_death_knight_initiate::OnGossipHello(), npc_ulduar_expedition_commander::OnGossipHello(), go_ulduar_working_harpoon::OnGossipHello(), npc_death_knight_initiate::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), at_frozen_throne_teleport::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_voltarus_middle::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), RisenArchmageCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::OwnerAttackedBy(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), SmartScript::ProcessEvent(), Creature::Regenerate(), Player::Regenerate(), Player::RegenerateAll(), Player::RegenerateHealth(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), instance_naxxramas::instance_naxxramas_InstanceMapScript::SetBossState(), boss_grand_warlock_nethekurse::SetData(), SetInCombatState(), SetSpeed(), boss_prince_keleseth_icc::boss_prince_kelesethAI::SpellHit(), boss_prince_taldaram_icc::boss_prince_taldaramAI::SpellHit(), boss_prince_valanar_icc::boss_prince_valanarAI::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SpellHit(), Spell::SummonGuardian(), lfg::LFGMgr::TeleportPlayer(), Map::Update(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Update(), DistractMovementGenerator::Update(), TotemAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_thekal::UpdateAI(), npc_zealot_lorkhan::UpdateAI(), npc_zealot_zath::UpdateAI(), boss_archimonde::boss_archimondeAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), boss_faction_championsAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_anubrekhan::boss_anubrekhanAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), boss_ahune::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), generic_creature::generic_creatureAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), PassiveAI::UpdateAI(), PetAI::UpdateAI(), Player::UpdateContestedPvP(), Creature::UpdateEntry(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), InstanceScript::UpdateMinionState(), SmartAI::UpdatePath(), Player::UpdatePotionCooldown(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsInCombatWith()

bool Unit::IsInCombatWith ( Unit const *  who) const
21320{
21321 // Check target exists
21322 if (!who)
21323 return false;
21324 // Search in threat list
21325 ObjectGuid guid = who->GetGUID();
21326 for (ThreatContainer::StorageType::const_iterator i = m_ThreatMgr.GetThreatList().begin(); i != m_ThreatMgr.GetThreatList().end(); ++i)
21327 {
21328 HostileReference* ref = (*i);
21329 // Return true if the unit matches
21330 if (ref && ref->getUnitGuid() == guid)
21331 return true;
21332 }
21333 // Nothing found, false.
21334 return false;
21335}
Definition: ThreatMgr.h:49
ObjectGuid getUnitGuid() const
Definition: ThreatMgr.h:107
ThreatContainer::StorageType const & GetThreatList() const
Definition: ThreatMgr.h:274

References Object::GetGUID(), ThreatMgr::GetThreatList(), HostileReference::getUnitGuid(), and m_ThreatMgr.

Referenced by _IsValidAttackTarget(), DealDamage(), Spell::DoAllEffectOnTarget(), TemporaryThreatModifierEvent::Execute(), spell_herald_volzaj_insanity::HandleDummyEffect(), IsEngagedBy(), and Acore::NearestAttackableUnitInObjectRangeCheck::operator()().

◆ IsInDisallowedMountForm()

bool Unit::IsInDisallowedMountForm ( ) const
21527{
21528 if (SpellInfo const* transformSpellInfo = sSpellMgr->GetSpellInfo(getTransForm()))
21529 {
21530 if (transformSpellInfo->HasAttribute(SPELL_ATTR0_ALLOW_WHILE_MOUNTED))
21531 {
21532 return false;
21533 }
21534 }
21535
21536 if (ShapeshiftForm form = GetShapeshiftForm())
21537 {
21538 SpellShapeshiftEntry const* shapeshift = sSpellShapeshiftStore.LookupEntry(form);
21539 if (!shapeshift)
21540 {
21541 return true;
21542 }
21543
21544 if (!(shapeshift->flags1 & 0x1))
21545 {
21546 return true;
21547 }
21548 }
21549
21551 {
21552 return false;
21553 }
21554
21555 CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(GetDisplayId());
21556 if (!display)
21557 {
21558 return true;
21559 }
21560
21562 if (!displayExtra)
21563 {
21564 return true;
21565 }
21566
21567 CreatureModelDataEntry const* model = sCreatureModelDataStore.LookupEntry(display->ModelId);
21568 ChrRacesEntry const* race = sChrRacesStore.LookupEntry(displayExtra->DisplayRaceID);
21569
21570 if (model && !(model->HasFlag(CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT)))
21571 {
21572 if (race && !(race->HasFlag(CHRRACES_FLAGS_CAN_MOUNT)))
21573 {
21574 return true;
21575 }
21576 }
21577
21578 return false;
21579}
@ CHRRACES_FLAGS_CAN_MOUNT
Definition: DBCStructure.h:675
@ CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT
Definition: DBCStructure.h:771
@ SPELL_ATTR0_ALLOW_WHILE_MOUNTED
Definition: SharedDefines.h:406
bool HasFlag(ChrRacesFlags flag) const
Definition: DBCStructure.h:700
uint32 ExtendedDisplayInfoID
Definition: DBCStructure.h:725
uint32 DisplayRaceID
Definition: DBCStructure.h:741
bool HasFlag(CreatureModelDataFlags flag) const
Definition: DBCStructure.h:795
uint32 flags1
Definition: DBCStructure.h:1822

References CHRRACES_FLAGS_CAN_MOUNT, CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT, CreatureDisplayInfoExtraEntry::DisplayRaceID, CreatureDisplayInfoEntry::ExtendedDisplayInfoID, SpellShapeshiftEntry::flags1, GetDisplayId(), GetNativeDisplayId(), GetShapeshiftForm(), getTransForm(), ChrRacesEntry::HasFlag(), CreatureModelDataEntry::HasFlag(), CreatureDisplayInfoEntry::ModelId, sChrRacesStore, sCreatureDisplayInfoExtraStore, sCreatureDisplayInfoStore, sCreatureModelDataStore, SPELL_ATTR0_ALLOW_WHILE_MOUNTED, sSpellMgr, and sSpellShapeshiftStore.

Referenced by Player::ActivateTaxiPathTo(), Spell::CheckCast(), Player::ContinueTaxiFlight(), and Player::ProcessDelayedOperations().

◆ IsInFeralForm()

bool Unit::IsInFeralForm ( ) const
inline

◆ IsInFlight()

bool Unit::IsInFlight ( ) const
inline

◆ isInFrontInMap()

bool Unit::isInFrontInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const
4136{
4137 return IsWithinDistInMap(target, distance) && HasInArc(arc, target);
4138}

References Position::HasInArc(), and WorldObject::IsWithinDistInMap().

◆ IsInnkeeper()

bool Unit::IsInnkeeper ( ) const
inline
@ UNIT_NPC_FLAG_INNKEEPER
Definition: Unit.h:532

References HasNpcFlag(), and UNIT_NPC_FLAG_INNKEEPER.

Referenced by npc_innkeeper::OnGossipHello().

◆ IsInPartyWith()

bool Unit::IsInPartyWith ( Unit const *  unit) const
19039{
19040 if (this == unit)
19041 return true;
19042
19043 Unit const* u1 = GetCharmerOrOwnerOrSelf();
19044 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
19045 if (u1 == u2)
19046 return true;
19047
19048 if (u1->GetTypeId() == TYPEID_PLAYER && u2->GetTypeId() == TYPEID_PLAYER)
19049 return u1->ToPlayer()->IsInSameGroupWith(u2->ToPlayer());
19050 // Xinef: we assume that npcs with the same faction are in party
19051 else if (u1->GetTypeId() == TYPEID_UNIT && u2->GetTypeId() == TYPEID_UNIT && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
19052 return u1->GetFaction() == u2->GetFaction();
19053 // Xinef: creature type_flag should work for party check only if player group is not a raid
19056 return true;
19057 else
19058 return false;
19059}
bool IsInSameGroupWith(Player const *p) const
Definition: Player.cpp:2293
bool isRaidGroup() const
Definition: Group.cpp:2210

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), Player::GetGroup(), Object::GetTypeId(), IsControlledByPlayer(), Player::IsInSameGroupWith(), Group::isRaidGroup(), Object::ToCreature(), Object::ToPlayer(), CreatureTemplate::type_flags, TYPEID_PLAYER, and TYPEID_UNIT.

Referenced by SpellInfo::CheckExplicitTarget(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ IsInRaidWith()

bool Unit::IsInRaidWith ( Unit const *  unit) const
19062{
19063 if (this == unit)
19064 return true;
19065
19066 Unit const* u1 = GetCharmerOrOwnerOrSelf();
19067 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
19068 if (u1 == u2)
19069 return true;
19070
19071 if (u1->GetTypeId() == TYPEID_PLAYER && u2->GetTypeId() == TYPEID_PLAYER)
19072 return u1->ToPlayer()->IsInSameRaidWith(u2->ToPlayer());
19073 // Xinef: we assume that npcs with the same faction are in party
19074 else if (u1->GetTypeId() == TYPEID_UNIT && u2->GetTypeId() == TYPEID_UNIT && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
19075 return u1->GetFaction() == u2->GetFaction();
19078 return true;
19079 else
19080 return false;
19081}

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), Object::GetTypeId(), IsControlledByPlayer(), Player::IsInSameRaidWith(), Object::ToCreature(), Object::ToPlayer(), CreatureTemplate::type_flags, TYPEID_PLAYER, and TYPEID_UNIT.

Referenced by Corpse::BuildValuesUpdate(), BuildValuesUpdate(), SpellInfo::CheckExplicitTarget(), GetReactionTo(), WorldSession::HandleLootMasterGiveOpcode(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ isInRoots()

bool Unit::isInRoots ( ) const
inline

◆ IsInSanctuary()

◆ IsInWater()

bool Unit::IsInWater ( ) const
virtual

Reimplemented in Player.

4292{
4293 return (GetLiquidData().Status & MAP_LIQUID_STATUS_SWIMMING) != 0;
4294}
#define MAP_LIQUID_STATUS_SWIMMING
Definition: Map.h:151

References WorldObject::GetLiquidData(), and MAP_LIQUID_STATUS_SWIMMING.

Referenced by Spell::CheckCast(), WorldObject::GetNearPoint(), Totem::InitSummon(), and Spell::SelectImplicitCasterDestTargets().

◆ IsLevitating()

◆ IsMounted()

◆ IsMovementPreventedByCasting()

bool Unit::IsMovementPreventedByCasting ( ) const
virtual

Reimplemented in Creature.

4112{
4113 // can always move when not casting
4115 {
4116 return false;
4117 }
4118
4119 // channeled spells during channel stage (after the initial cast timer) allow movement with a specific spell attribute
4121 {
4122 if (spell->getState() != SPELL_STATE_FINISHED && spell->IsChannelActive())
4123 {
4124 if (spell->GetSpellInfo()->IsActionAllowedChannel())
4125 {
4126 return false;
4127 }
4128 }
4129 }
4130
4131 // prohibit movement for all other spell casts
4132 return true;
4133}
@ UNIT_STATE_CASTING
Definition: Unit.h:340

References CURRENT_CHANNELED_SPELL, HasUnitState(), m_currentSpells, SPELL_STATE_FINISHED, and UNIT_STATE_CASTING.

Referenced by TimedFleeingMovementGenerator::Update().

◆ isMoving()

◆ IsNeutralToAll()

bool Unit::IsNeutralToAll ( ) const
10268{
10269 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10270 if (!my_faction || !my_faction->faction)
10271 return true;
10272
10273 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10274 if (raw_faction && raw_faction->reputationListID >= 0)
10275 return false;
10276
10277 return my_faction->IsNeutralToAll();
10278}
bool IsNeutralToAll() const
Definition: DBCStructure.h:973

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsNeutralToAll(), FactionEntry::reputationListID, and sFactionStore.

Referenced by Creature::_IsTargetAcceptable(), Creature::CanStartAttack(), AggressorAI::Permissible(), and ReactorAI::Permissible().

◆ IsNonMeleeSpellCast()

bool Unit::IsNonMeleeSpellCast ( bool  withDelayed,
bool  skipChanneled = false,
bool  skipAutorepeat = false,
bool  isAutoshoot = false,
bool  skipInstant = true 
) const
4052{
4053 // We don't do loop here to explicitly show that melee spell is excluded.
4054 // Maybe later some special spells will be excluded too.
4055
4056 // generic spells are cast when they are not finished and not delayed
4059 (withDelayed || m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_DELAYED))
4060 {
4061 if (!skipInstant || m_currentSpells[CURRENT_GENERIC_SPELL]->GetCastTime())
4062 {
4063 if (!isAutoshoot || !m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4064 return true;
4065 }
4066 }
4067 // channeled spells may be delayed, but they are still considered cast
4068 if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] &&
4070 {
4071 if (!isAutoshoot || !m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4072 return true;
4073 }
4074 // autorepeat spells may be finished or delayed, but they are still considered cast
4075 if (!skipAutorepeat && m_currentSpells[CURRENT_AUTOREPEAT_SPELL])
4076 return true;
4077
4078 return false;
4079}
@ SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS
Definition: SharedDefines.h:473

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, m_currentSpells, SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_DELAYED, and SPELL_STATE_FINISHED.

Referenced by Spell::_cast(), _UpdateAutoRepeatSpell(), Player::ActivateSpec(), Player::ActivateTaxiPathTo(), Player::CanEquipItem(), CombatStop(), npc_mograine::npc_mograineAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), ScriptedAI::DoCastSpell(), boss_zuljin::boss_zuljinAI::DoMeleeAttackIfReady(), Spell::EffectKnockBack(), Spell::finish(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), isSpellBlocked(), boss_shade_of_aran::JustEngagedWith(), boss_pandemonius::JustEngagedWith(), MeleeSpellHitResult(), Spell::prepare(), SmartScript::ProcessEvent(), RollMeleeOutcomeAgainst(), spell_item_fetch_ball::SelectTarget(), setDeathState(), StopAttackFaction(), boss_netherspite::SwitchToPortalPhase(), Player::TeleportTo(), TotemAI::UpdateAI(), npc_chesspiece::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), boss_janalai::boss_janalaiAI::UpdateAI(), hyjalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), generic_creature::generic_creatureAI::UpdateAI(), npc_warmage_violetstand::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ IsOnVehicle()

◆ IsPet()

bool Unit::IsPet ( ) const
inline
1425{ return m_unitTypeMask & UNIT_MASK_PET; }
@ UNIT_MASK_PET
Definition: Unit.h:679

References m_unitTypeMask, and UNIT_MASK_PET.

Referenced by Spell::_cast(), Spell::AddUnitTarget(), Creature::AllLootRemovedFromCorpse(), BeforeVisibilityDestroy< Creature >(), Creature::CallAssistance(), Creature::CallForHelp(), boss_renataki::boss_renatakiAI::CanAlwaysBeDetectable(), boss_renataki::boss_renatakiAI::CanSeeAlways(), Creature::CanSwim(), ClearInCombat(), CombatStart(), Creature::CreateFromProto(), Player::CreatePet(), hyjal_trashAI::DamageTaken(), npc_calvin_montague::npc_calvin_montagueAI::DamageTaken(), DealDamage(), MotionTransport::DelayedTeleportTransport(), PetAI::DoAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectDismissPet(), Spell::EffectForceDeselect(), Spell::EffectRenamePet(), Spell::EffectSanctuary(), Spell::EffectSchoolDMG(), Spell::EffectTameCreature(), Acore::XP::Gain(), Creature::GetAggroRange(), GetCastingTimeForBonus(), GetCombatRatingReduction(), GetCreatePowers(), GetNextRandomRaidMemberOrPet(), GetRandomContactPoint(), GetVelocity(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModStat(), debug_commandscript::HandleDebugThreatListCommand(), AuraEffect::HandleFeignDeath(), modify_commandscript::HandleModifyTalentCommand(), AuraEffect::HandleModPossessPet(), AuraEffect::HandleModResistancePercent(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcDeleteCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_commandscript::HandleNpcSetModelCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), npc_commandscript::HandleNpcTameCommand(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), pet_commandscript::HandlePetCreateCommand(), WorldSession::HandlePetRename(), WorldSession::HandlePetSetAction(), HandleProcTriggerSpell(), misc_commandscript::HandleRespawnCommand(), Creature::InitEntry(), TempSummon::InitStats(), Guardian::InitStatsForLevel(), DisableMgr::IsDisabledFor(), Creature::isElite(), Minion::IsGuardianPet(), Player::isHonorOrXPTarget(), Creature::isWorldBoss(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_underbat::JustEngagedWith(), npc_hivezara_stinger::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_murmur::JustEngagedWith(), Kill(), spell_hun_target_self_and_pet::Load(), ModSpellCastTime(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::MoveInLineOfSight(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::MoveInLineOfSight(), Acore::MostHPMissingGroupInRange::operator()(), PetAI::ReceiveEmote(), RollMeleeOutcomeAgainst(), FactorySelector::SelectAI(), Creature::SelectLevel(), WorldSession::SendPetNameQuery(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetCharm(), Creature::SetDisplayId(), SetHealth(), SetInCombatState(), SetMinion(), Creature::SetObjectScale(), setPowerType(), SpellDamageBonusDone(), SpellPctDamageModsDone(), ToPet(), TempSummon::UnSummon(), Update(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_hazzarah::UpdateAI(), PetAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdateAuraForGroup(), Creature::UpdateEntry(), Creature::UpdateMoveInLineOfSightState(), and UpdateSpeed().

◆ IsPetAura()

bool Unit::IsPetAura ( Aura const *  aura)
17591{
17592 Unit* owner = GetOwner();
17593
17594 if (!owner || owner->GetTypeId() != TYPEID_PLAYER)
17595 return false;
17596
17597 // if the owner has that pet aura, return true
17598 for (PetAura const* petAura : owner->m_petAuras)
17599 if (petAura->GetAura(GetEntry()) == aura->GetId())
17600 return true;
17601
17602 return false;
17603}
Definition: SpellMgr.h:470
uint32 GetAura(uint32 petEntry) const
Definition: SpellMgr.h:486

References PetAura::GetAura(), Object::GetEntry(), Aura::GetId(), GetOwner(), Object::GetTypeId(), m_petAuras, and TYPEID_PLAYER.

Referenced by Pet::_SaveAuras(), and Spell::EffectSummonPet().

◆ IsPetInCombat()

bool Unit::IsPetInCombat ( ) const
inline

◆ IsPolymorphed()

bool Unit::IsPolymorphed ( ) const
17010{
17011 uint32 transformId = getTransForm();
17012 if (!transformId)
17013 return false;
17014
17015 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(transformId);
17016 if (!spellInfo)
17017 return false;
17018
17019 return spellInfo->GetSpellSpecific() == SPELL_SPECIFIC_MAGE_POLYMORPH;
17020}
@ SPELL_SPECIFIC_MAGE_POLYMORPH
Definition: SpellInfo.h:160
SpellSpecificType GetSpellSpecific() const
Definition: SpellInfo.cpp:2123

References SpellInfo::GetSpellSpecific(), getTransForm(), SPELL_SPECIFIC_MAGE_POLYMORPH, and sSpellMgr.

Referenced by Attack(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), Player::RegenerateAll(), Creature::RegenerateHealth(), Player::RegenerateHealth(), and Creature::Update().

◆ isPossessed()

◆ isPossessedByPlayer()

bool Unit::isPossessedByPlayer ( ) const
inline

◆ isPossessing() [1/2]

bool Unit::isPossessing ( ) const
inline
1889 {
1890 if (Unit* u = GetCharm())
1891 return u->isPossessed();
1892 else
1893 return false;
1894 }

References GetCharm().

Referenced by WorldSession::HandleCastSpellOpcode(), and misc_commandscript::HandleUnbindSightCommand().

◆ isPossessing() [2/2]

bool Unit::isPossessing ( Unit u) const
inline
1895{ return u->isPossessed() && GetCharmGUID() == u->GetGUID(); }
bool isPossessed() const
Definition: Unit.h:1886

References GetCharmGUID(), Object::GetGUID(), and isPossessed().

◆ IsPvP()

◆ IsQuestGiver()

bool Unit::IsQuestGiver ( ) const
inline
@ UNIT_NPC_FLAG_QUESTGIVER
Definition: Unit.h:517

References HasNpcFlag(), and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_lokhtos_darkbargainer::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_cos_chromie_middle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_fos_leader::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_queue::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_taxi::OnGossipHello(), npc_riggle_bassbait::OnGossipHello(), and npc_sayge::OnGossipHello().

◆ IsScriptOverriden()

AuraEffect * Unit::IsScriptOverriden ( SpellInfo const *  spell,
int32  script 
) const
5748{
5750 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5751 {
5752 if ((*i)->GetMiscValue() == script)
5753 if ((*i)->IsAffectedOnSpell(spell))
5754 return (*i);
5755 }
5756 return nullptr;
5757}
@ SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
Definition: SpellAuraDefines.h:175

References GetAuraEffectsByType(), and SPELL_AURA_OVERRIDE_CLASS_SCRIPTS.

Referenced by Spell::CheckCast(), Spell::EffectWeaponDmg(), and AuraEffect::HandleAuraModShapeshift().

◆ IsServiceProvider()

◆ IsSitState()

bool Unit::IsSitState ( ) const
16980{
16981 uint8 s = getStandState();
16982 return
16986}
@ UNIT_STAND_STATE_SIT_HIGH_CHAIR
Definition: Unit.h:59
@ UNIT_STAND_STATE_SIT_MEDIUM_CHAIR
Definition: Unit.h:58
@ UNIT_STAND_STATE_SIT_LOW_CHAIR
Definition: Unit.h:57
@ UNIT_STAND_STATE_SIT_CHAIR
Definition: Unit.h:55

References getStandState(), UNIT_STAND_STATE_SIT, UNIT_STAND_STATE_SIT_CHAIR, UNIT_STAND_STATE_SIT_HIGH_CHAIR, UNIT_STAND_STATE_SIT_LOW_CHAIR, and UNIT_STAND_STATE_SIT_MEDIUM_CHAIR.

Referenced by _ApplyAura(), AttackerStateUpdate(), WorldSession::HandleMovementOpcodes(), IsStandState(), Spell::prepare(), and SpellTakenCritChance().

◆ isSpellBlocked()

bool Unit::isSpellBlocked ( Unit victim,
SpellInfo const *  spellProto,
WeaponAttackType  attackType = BASE_ATTACK 
)
3065{
3066 // These spells can't be blocked
3067 if (spellProto && spellProto->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3068 return false;
3069
3070 if (victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION) || victim->HasInArc(M_PI, this))
3071 {
3072 // Check creatures flags_extra for disable block
3073 if (victim->GetTypeId() == TYPEID_UNIT &&
3075 return false;
3076
3077 float blockChance = victim->GetUnitBlockChance();
3078 blockChance += (int32(GetWeaponSkillValue(attackType)) - int32(victim->GetMaxSkillValueForLevel())) * 0.04f;
3079
3080 // xinef: cant block while casting or while stunned
3081 if (blockChance < 0.0f || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3082 blockChance = 0.0f;
3083
3084 if (roll_chance_f(blockChance))
3085 return true;
3086 }
3087 return false;
3088}
@ CREATURE_FLAG_EXTRA_NO_BLOCK
Definition: CreatureData.h:53
@ UNIT_STATE_CONTROLLED
Definition: Unit.h:365
@ SPELL_AURA_IGNORE_HIT_DIRECTION
Definition: SpellAuraDefines.h:351
@ SPELL_ATTR0_NO_ACTIVE_DEFENSE
Definition: SharedDefines.h:403
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const *target=nullptr) const
Definition: Unit.cpp:3753
float GetUnitBlockChance() const
Definition: Unit.cpp:3665

References CREATURE_FLAG_EXTRA_NO_BLOCK, CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), GetMaxSkillValueForLevel(), Object::GetTypeId(), GetUnitBlockChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), HasAuraType(), Position::HasInArc(), HasUnitState(), IsNonMeleeSpellCast(), roll_chance_f(), SPELL_ATTR0_NO_ACTIVE_DEFENSE, SPELL_AURA_IGNORE_HIT_DIRECTION, Object::ToCreature(), TYPEID_UNIT, and UNIT_STATE_CONTROLLED.

Referenced by CalculateSpellDamageTaken().

◆ IsSpiritGuide()

bool Unit::IsSpiritGuide ( ) const
inline

◆ IsSpiritHealer()

bool Unit::IsSpiritHealer ( ) const
inline

◆ IsSpiritService()

◆ IsStandState()

◆ IsStopped()

bool Unit::IsStopped ( ) const
inline

◆ IsSummon()

bool Unit::IsSummon ( ) const
inline
1422{ return m_unitTypeMask & UNIT_MASK_SUMMON; }
@ UNIT_MASK_SUMMON
Definition: Unit.h:675

References m_unitTypeMask, and UNIT_MASK_SUMMON.

Referenced by Creature::CanPeriodicallyCallForAssistance(), spell_item_unsated_craving::CheckProc(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Spell::EffectScriptEffect(), boss_skeram::EnterEvadeMode(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), Spell::finish(), GetAllMinionsByEntry(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), WorldSession::HandlePetActionHelper(), spell_pri_lightwell::HandleScriptEffect(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), boss_skeram::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), boss_freya_iron_root::boss_freya_iron_rootAI::JustDied(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::JustDied(), npc_counselor_talbot::npc_counselor_talbotAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::npc_pet_dk_ghoulAI::JustDied(), npc_pet_pri_shadowfiend::JustDied(), boss_skeram::JustEngagedWith(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_leryssa::npc_leryssaAI::MovementInform(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), BattlefieldWG::OnCreatureCreate(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnUnitDeath(), RemoveAllControlled(), RemoveAllMinionsByEntry(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), Creature::SaveRespawnTime(), Creature::SearchFormation(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), ToTempSummon(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_skeram::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_flash_freeze::npc_ulduar_flash_freezeAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), and Player::VehicleSpellInitialize().

◆ isSwimming()

◆ IsTabardDesigner()

bool Unit::IsTabardDesigner ( ) const
inline

◆ isTargetableForAttack()

bool Unit::isTargetableForAttack ( bool  checkFakeDeath = true,
Unit const *  byWho = nullptr 
) const
13843{
13844 if (!IsAlive())
13845 return false;
13846
13848 return false;
13849
13850 if (IsImmuneToPC() && byWho && byWho->GetCharmerOrOwnerPlayerOrPlayerItself())
13851 return false;
13852
13853 if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->IsGameMaster())
13854 return false;
13855
13856 return !HasUnitState(UNIT_STATE_UNATTACKABLE) && (!checkFakeDeath || !HasUnitState(UNIT_STATE_DIED));
13857}
@ UNIT_STATE_DIED
Definition: Unit.h:325

References GetCharmerOrOwnerPlayerOrPlayerItself(), Object::GetTypeId(), HasUnitFlag(), HasUnitState(), IsAlive(), IsImmuneToPC(), Object::ToPlayer(), TYPEID_PLAYER, UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NOT_SELECTABLE, UNIT_STATE_DIED, and UNIT_STATE_UNATTACKABLE.

Referenced by Creature::_IsTargetAcceptable(), boss_shade_of_aran::AttackStart(), boss_alyson_antille::boss_alyson_antilleAI::AttackStart(), boss_gazakrothAI::AttackStart(), boss_slither::boss_slitherAI::AttackStart(), boss_veklor::AttackStart(), Player::IsImmuneToEnvironmentalDamage(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableUnitInObjectRangeCheck::operator()(), NecroticPlagueTargetCheck::operator()(), TotemAI::UpdateAI(), and boss_zuljin::boss_zuljinAI::UpdateAI().

◆ IsTaxi()

bool Unit::IsTaxi ( ) const
inline

◆ IsTotem()

◆ IsTrainer()

◆ IsTriggeredAtSpellProcEvent()

bool Unit::IsTriggeredAtSpellProcEvent ( Unit victim,
Aura aura,
WeaponAttackType  attType,
bool  isVictim,
bool  active,
SpellProcEventEntry const *&  spellProcEvent,
ProcEventInfo const &  eventInfo 
)
private
17678{
17679 SpellInfo const* spellProto = aura->GetSpellInfo();
17680 SpellInfo const* procSpell = eventInfo.GetSpellInfo();
17681
17682 // let the aura be handled by new proc system if it has new entry
17683 if (sSpellMgr->GetSpellProcEntry(spellProto->Id))
17684 return false;
17685
17686 // Get proc Event Entry
17687 spellProcEvent = sSpellMgr->GetSpellProcEvent(spellProto->Id);
17688
17689 // Get EventProcFlag
17690 uint32 EventProcFlag;
17691 if (spellProcEvent && spellProcEvent->procFlags) // if exist get custom spellProcEvent->procFlags
17692 EventProcFlag = spellProcEvent->procFlags;
17693 else
17694 EventProcFlag = spellProto->ProcFlags; // else get from spell proto
17695 // Continue if no trigger exist
17696 if (!EventProcFlag)
17697 return false;
17698
17699 // Additional checks for triggered spells (ignore trap casts)
17700 //if (procExtra & PROC_EX_INTERNAL_TRIGGERED && !(procFlag & PROC_FLAG_DONE_TRAP_ACTIVATION))
17701 //{
17702 // if (!spellProto->HasAttribute(SPELL_ATTR3_CAN_PROC_TRIGGERED))
17703 // return false;
17704 //}
17705
17706 // Xinef: additional check for player auras - only player spells can trigger player proc auras
17707 // Xinef: skip victim auras
17708 // Excluded player shoot spells
17709 // Excluded player item spells
17710 if (!isVictim && IsPlayer() && !(EventProcFlag & (PROC_FLAG_KILL | PROC_FLAG_DEATH)))
17711 {
17712 if (procSpell && procSpell->SpellFamilyName == SPELLFAMILY_GENERIC && procSpell->GetCategory() != 76 &&
17713 (!eventInfo.GetProcSpell() || !eventInfo.GetProcSpell()->m_CastItem) &&
17714 (!eventInfo.GetTriggerAuraSpell() || eventInfo.GetTriggerAuraSpell()->SpellFamilyName == SPELLFAMILY_GENERIC))
17715 {
17716 return false;
17717 }
17718 }
17719
17720 // Check spellProcEvent data requirements
17721 if (!sSpellMgr->IsSpellProcEventCanTriggeredBy(spellProto, spellProcEvent, EventProcFlag, eventInfo, active))
17722 return false;
17723 // In most cases req get honor or XP from kill
17724 if (EventProcFlag & PROC_FLAG_KILL && GetTypeId() == TYPEID_PLAYER)
17725 {
17726 bool allow = false;
17727
17728 if (victim)
17729 allow = ToPlayer()->isHonorOrXPTarget(victim);
17730
17731 // Shadow Word: Death - can trigger from every kill
17732 if (aura->GetId() == 32409 || aura->GetId() == 18372 || aura->GetId() == 18213)
17733 allow = true;
17734 if (!allow)
17735 return false;
17736 }
17737 // Aura added by spell can`t trigger from self (prevent drop charges/do triggers)
17738 // But except periodic and kill triggers (can triggered from self)
17739 if (procSpell && procSpell->Id == spellProto->Id
17740 && !(spellProto->ProcFlags & (PROC_FLAG_TAKEN_PERIODIC | PROC_FLAG_KILL)))
17741 return false;
17742
17743 // Check if current equipment allows aura to proc
17744 if (!isVictim && GetTypeId() == TYPEID_PLAYER && !spellProto->HasAttribute(SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT))
17745 {
17746 Player* player = ToPlayer();
17747 if (spellProto->EquippedItemClass == ITEM_CLASS_WEAPON)
17748 {
17749 Item* item = nullptr;
17750 if (attType == BASE_ATTACK)
17752 else if (attType == OFF_ATTACK)
17754 else
17756
17757 if (player->IsInFeralForm())
17758 return false;
17759
17760 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_WEAPON || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17761 return false;
17762 }
17763 else if (spellProto->EquippedItemClass == ITEM_CLASS_ARMOR)
17764 {
17765 // Check if player is wearing shield
17767 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_ARMOR || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17768 return false;
17769 }
17770 }
17771 // Get chance from spell
17772 float chance = float(spellProto->ProcChance);
17773 // If in spellProcEvent exist custom chance, chance = spellProcEvent->customChance;
17774 if (spellProcEvent && spellProcEvent->customChance)
17775 chance = spellProcEvent->customChance;
17776 // If PPM exist calculate chance from PPM
17777 if (spellProcEvent && spellProcEvent->ppmRate != 0)
17778 {
17779 if (!isVictim)
17780 {
17781 uint32 WeaponSpeed = GetAttackTime(attType);
17782 chance = GetPPMProcChance(WeaponSpeed, spellProcEvent->ppmRate, spellProto);
17783 }
17784 else if (victim)
17785 {
17786 uint32 WeaponSpeed = victim->GetAttackTime(attType);
17787 chance = victim->GetPPMProcChance(WeaponSpeed, spellProcEvent->ppmRate, spellProto);
17788 }
17789 }
17790
17791 // Custom chances
17792 switch (spellProto->SpellFamilyName)
17793 {
17795 {
17796 // Recklessness, allow to proc only once for whirlwind
17797 if (spellProto->Id == 1719 && procSpell && procSpell->Id == 44949)
17798 return false;
17799 }
17800 }
17801
17802 if (eventInfo.GetProcChance())
17803 {
17804 chance = *eventInfo.GetProcChance();
17805 }
17806
17807 // Apply chance modifer aura
17808 if (Player* modOwner = GetSpellModOwner())
17809 {
17810 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CHANCE_OF_SUCCESS, chance);
17811 }
17812
17813 return roll_chance_f(chance);
17814}
@ ITEM_CLASS_ARMOR
Definition: ItemTemplate.h:304
@ ITEM_CLASS_WEAPON
Definition: ItemTemplate.h:302
@ EQUIPMENT_SLOT_RANGED
Definition: Player.h:693
@ SPELLMOD_CHANCE_OF_SUCCESS
Definition: SpellDefines.h:95
@ PROC_FLAG_DEATH
Definition: SpellMgr.h:143
@ PROC_FLAG_TAKEN_PERIODIC
Definition: SpellMgr.h:135
@ PROC_FLAG_KILL
Definition: SpellMgr.h:108
@ SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT
Definition: SharedDefines.h:494
uint32 Class
Definition: ItemTemplate.h:630
uint32 SubClass
Definition: ItemTemplate.h:631
Item * GetUseableItemByPos(uint8 bag, uint8 slot) const
Definition: Player.h:1232
bool isHonorOrXPTarget(Unit *victim) const
Definition: Player.cpp:12582
float GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
Definition: Unit.cpp:13445
uint32 GetCategory() const
Definition: SpellInfo.cpp:867
int32 EquippedItemClass
Definition: SpellInfo.h:373
uint32 ProcFlags
Definition: SpellInfo.h:353
int32 EquippedItemSubClassMask
Definition: SpellInfo.h:374

References BASE_ATTACK, ItemTemplate::Class, SpellProcEventEntry::customChance, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, SpellInfo::EquippedItemClass, SpellInfo::EquippedItemSubClassMask, GetAttackTime(), SpellInfo::GetCategory(), Aura::GetId(), GetPPMProcChance(), ProcEventInfo::GetProcChance(), ProcEventInfo::GetProcSpell(), ProcEventInfo::GetSpellInfo(), Aura::GetSpellInfo(), GetSpellModOwner(), Item::GetTemplate(), ProcEventInfo::GetTriggerAuraSpell(), Object::GetTypeId(), Player::GetUseableItemByPos(), SpellInfo::HasAttribute(), SpellInfo::Id, INVENTORY_SLOT_BAG_0, Item::IsBroken(), Player::isHonorOrXPTarget(), IsInFeralForm(), Object::IsPlayer(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, Spell::m_CastItem, OFF_ATTACK, SpellProcEventEntry::ppmRate, PROC_FLAG_DEATH, PROC_FLAG_KILL, PROC_FLAG_TAKEN_PERIODIC, SpellInfo::ProcChance, SpellInfo::ProcFlags, SpellProcEventEntry::procFlags, roll_chance_f(), SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT, SPELLFAMILY_GENERIC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyName, SPELLMOD_CHANCE_OF_SUCCESS, sSpellMgr, ItemTemplate::SubClass, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by ProcDamageAndSpellFor().

◆ isTurning()

bool Unit::isTurning ( ) const
inline

◆ IsUnderLastManaUseEffect()

bool Unit::IsUnderLastManaUseEffect ( ) const

◆ IsUnderWater()

bool Unit::IsUnderWater ( ) const
virtual
4297{
4299}
@ LIQUID_MAP_UNDER_WATER
Definition: Map.h:148

References WorldObject::GetLiquidData(), LIQUID_MAP_UNDER_WATER, and LiquidData::Status.

Referenced by HasInLineCheck::operator()(), and Creature::setDeathState().

◆ IsValidAssistTarget()

bool Unit::IsValidAssistTarget ( Unit const *  target) const
13983{
13984 return _IsValidAssistTarget(target, nullptr);
13985}
bool _IsValidAssistTarget(Unit const *target, SpellInfo const *bySpell) const
Definition: Unit.cpp:13988

References _IsValidAssistTarget().

Referenced by SmartAI::AssistPlayerInCombatAgainst().

◆ IsValidAttackTarget()

bool Unit::IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell = nullptr 
) const
13860{
13861 return _IsValidAttackTarget(target, bySpell);
13862}

References _IsValidAttackTarget().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), CreatureGroup::GetNewTargetForMember(), WorldSession::HandleAttackSwingOpcode(), npc_beryl_sorcerer::npc_beryl_sorcererAI::JustEngagedWith(), CreatureGroup::MemberEngagingTarget(), npc_towering_infernal::npc_towering_infernalAI::MoveInLineOfSight(), npc_lesser_doomguard::npc_lesser_doomguardAI::MoveInLineOfSight(), alliance_rifleman::alliance_riflemanAI::MoveInLineOfSight(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_doomwalker::boss_doomwalkerAI::MoveInLineOfSight(), boss_kaelthas::boss_kaelthasAI::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestHostileUnitCheck::operator()(), MalleableGooSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), CreatureAI::SetGazeOn(), StopAttackingInvalidTarget(), SimpleCharmedAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateCharmedAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ IsVehicle()

bool Unit::IsVehicle ( ) const
inline

References m_unitTypeMask, and UNIT_MASK_VEHICLE.

Referenced by Battleground::AddCreature(), Creature::AddToWorld(), ApplyResilience(), CanHaveThreatList(), spell_wintergrasp_water::spell_wintergrasp_water_SpellScript::CheckCast(), Spell::CheckEffectTarget(), SpellInfo::CheckTarget(), Map::CreatureRelocation(), DealDamage(), DealMeleeDamage(), Spell::EffectDummy(), Spell::EffectKnockBack(), Spell::EffectSummonType(), CreatureAI::EnterEvadeMode(), SmartScript::GetTargets(), GetVelocity(), AuraEffect::HandleAuraControlVehicle(), debug_commandscript::HandleDebugEnterVehicleCommand(), debug_commandscript::HandleDebugSetVehicleIdCommand(), spell_q13280_13283_plant_battle_standard::HandleDummy(), BattlefieldWG::HandleKill(), BattlegroundIC::HandleKillUnit(), WorldSession::HandlePetActionHelper(), spell_q12919_gymers_throw::HandleScript(), spell_putricide_mutated_transformation::spell_putricide_mutated_transformation_SpellScript::HandleSummon(), TempSummon::InitStats(), KillRewarder::KillRewarder(), spell_igb_overheat::spell_igb_overheat_AuraScript::Load(), MagicSpellHitResult(), npc_brann_radio::npc_brann_radioAI::MoveInLineOfSight(), BattlefieldWG::OnUnitDeath(), OutDebugInfo(), VehicleAI::Permissible(), Map::PlayerRelocation(), RemoveCharmedBy(), RemoveFromWorld(), Spell::SelectImplicitCasterObjectTargets(), SetCharmedBy(), SetOwnerGUID(), SetSpeed(), Player::StopCastingCharm(), UpdateCharmAI(), Creature::UpdateEntry(), UpdateHeight(), UpdateOrientation(), and UpdateSpeed().

◆ IsVendor()

◆ IsVisible()

bool Unit::IsVisible ( ) const
inline
@ SEC_PLAYER
Definition: Common.h:59
@ SERVERSIDE_VISIBILITY_GM
Definition: SharedDefines.h:1273
T_VALUES GetValue(FLAG_TYPE flag) const
Definition: Object.h:359

References FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::GetValue(), WorldObject::m_serverSideVisibility, SEC_PLAYER, and SERVERSIDE_VISIBILITY_GM.

Referenced by npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::CanAIAttack(), boss_professor_putricide::boss_professor_putricideAI::CanAIAttack(), boss_sindragosa::boss_sindragosaAI::CanAIAttack(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), SpellInfo::CheckTarget(), AuraEffect::HandlePhase(), Player::IsVisibleGloballyFor(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), Acore::AllFriendlyCreaturesInGrid::operator()(), boss_sapphiron::boss_sapphironAI::Reset(), npc_pos_leader::npc_pos_leaderAI::SetData(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), boss_archimonde::boss_archimondeAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), boss_taldaram::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), and boss_vazruden_the_herald::UpdateAI().

◆ IsWalking()

◆ IsWithinCombatRange()

bool Unit::IsWithinCombatRange ( Unit const *  obj,
float  dist2compare 
) const
668{
669 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
670 return false;
671
672 float dx = GetPositionX() - obj->GetPositionX();
673 float dy = GetPositionY() - obj->GetPositionY();
674 float dz = GetPositionZ() - obj->GetPositionZ();
675 float distsq = dx * dx + dy * dy + dz * dz;
676
677 float sizefactor = GetCombatReach() + obj->GetCombatReach();
678 float maxdist = dist2compare + sizefactor;
679
680 return distsq < maxdist * maxdist;
681}

References GetCombatReach(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::InSamePhase(), and WorldObject::IsInMap().

Referenced by ArcherAI::AttackStart(), TurretAI::CanAIAttack(), Spell::CheckRange(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), SmartScript::GetTargets(), npc_underbat::JustEngagedWith(), DefaultTargetSelector::operator()(), SpellTargetSelector::operator()(), PowerUsersSelector::operator()(), FarthestTargetSelector::operator()(), MalleableGooSelector::operator()(), ArcherAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), and HostileReference::updateOnlineStatus().

◆ IsWithinMeleeRange()

bool Unit::IsWithinMeleeRange ( Unit const *  obj,
float  dist = 0.f 
) const
684{
685 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
686 return false;
687
688 float dx = GetPositionX() - obj->GetPositionX();
689 float dy = GetPositionY() - obj->GetPositionY();
690 float dz = GetPositionZ() - obj->GetPositionZ();
691 float distsq = dx * dx + dy * dy + dz * dz;
692
693 float maxdist = dist + GetMeleeRange(obj);
694
695 return distsq < maxdist * maxdist;
696}

References GetMeleeRange(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::InSamePhase(), and WorldObject::IsInMap().

Referenced by boss_marli::_chargePlayer(), boss_swamplord_muselek::AttackStart(), SmartAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::CanAIAttack(), boss_ouro::CanAIAttack(), boss_murmur::CanAIAttack(), PetAI::CanAttack(), boss_archimonde::boss_archimondeAI::CanUseFingerOfDeath(), Spell::CheckRange(), UnitAI::DoMeleeAttackIfReady(), boss_zuljin::boss_zuljinAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), spell_shazzrah_gate_dummy::spell_shazzrah_gate_dummy_SpellScript::FilterTargets(), boss_supremus::FindHatefulStrikeTarget(), boss_ouro::IsPlayerWithinMeleeRange(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), boss_swamplord_muselek::JustEngagedWith(), boss_vem::JustEngagedWith(), generic_creature::generic_creatureAI::JustEngagedWith(), CreatureAI::MoveCircleChecks(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), SpellTargetSelector::operator()(), ThreatContainer::SelectNextVictim(), boss_murmur::ShouldCastResonance(), boss_quartermaster_zigris::SpellHitTarget(), Player::Update(), boss_quartermaster_zigris::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), boss_zuljin::boss_zuljinAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_skeram::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_shade_of_akama::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), boss_alar::boss_alarAI::UpdateAI(), generic_creature::generic_creatureAI::UpdateAI(), PetAI::UpdateAI(), npc_zuljin_vortex::npc_zuljin_vortexAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), and boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI().

◆ IsWithinRange()

bool Unit::IsWithinRange ( Unit const *  obj,
float  dist 
) const
705{
706 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
707 {
708 return false;
709 }
710
711 auto dx = GetPositionX() - obj->GetPositionX();
712 auto dy = GetPositionY() - obj->GetPositionY();
713 auto dz = GetPositionZ() - obj->GetPositionZ();
714 auto distsq = dx * dx + dy * dy + dz * dz;
715
716 return distsq <= dist * dist;
717}

References Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::InSamePhase(), and WorldObject::IsInMap().

Referenced by boss_swamplord_muselek::CanShootVictim().

◆ JumpTo() [1/2]

void Unit::JumpTo ( float  speedXY,
float  speedZ,
bool  forward = true 
)
19780{
19781 float angle = forward ? 0 : M_PI;
19782 if (GetTypeId() == TYPEID_UNIT)
19783 GetMotionMaster()->MoveJumpTo(angle, speedXY, speedZ);
19784 else
19785 {
19786 float vcos = cos(angle + GetOrientation());
19787 float vsin = std::sin(angle + GetOrientation());
19788
19789 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19790 data << GetPackGUID();
19791 data << uint32(0); // Sequence
19792 data << float(vcos); // x direction
19793 data << float(vsin); // y direction
19794 data << float(speedXY); // Horizontal speed
19795 data << float(-speedZ); // Z Movement speed (vertical)
19796
19797 ToPlayer()->GetSession()->SendPacket(&data);
19798 }
19799}
@ SMSG_MOVE_KNOCK_BACK
Definition: Opcodes.h:269
void MoveJumpTo(float angle, float speedXY, float speedZ)
Definition: MotionMaster.cpp:553
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition: WorldSession.cpp:212

References GetMotionMaster(), Position::GetOrientation(), Object::GetPackGUID(), Player::GetSession(), Object::GetTypeId(), MotionMaster::MoveJumpTo(), WorldSession::SendPacket(), SMSG_MOVE_KNOCK_BACK, Object::ToPlayer(), and TYPEID_UNIT.

Referenced by Spell::EffectLeapBack().

◆ JumpTo() [2/2]

void Unit::JumpTo ( WorldObject obj,
float  speedZ 
)
19802{
19803 float x, y, z;
19804 obj->GetContactPoint(this, x, y, z);
19805 float speedXY = GetExactDist2d(x, y) * 10.0f / speedZ;
19806 GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ);
19807}
void GetContactPoint(WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
Definition: Object.cpp:2730
void MoveJump(Position const &pos, float speedXY, float speedZ, uint32 id=0)
Definition: MotionMaster.h:227

References WorldObject::GetContactPoint(), Position::GetExactDist2d(), GetMotionMaster(), and MotionMaster::MoveJump().

◆ Kill()

void Unit::Kill ( Unit killer,
Unit victim,
bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
static
Todo:
: do instance binding anyway if the charmer/owner is offline
17957{
17958 // Prevent killing unit twice (and giving reward from kill twice)
17959 if (!victim->GetHealth())
17960 return;
17961
17962 if (killer && !killer->IsInMap(victim))
17963 killer = nullptr;
17964
17965 // find player: owner of controlled `this` or `this` itself maybe
17966 Player* player = killer ? killer->GetCharmerOrOwnerPlayerOrPlayerItself() : nullptr;
17967 Creature* creature = victim->ToCreature();
17968
17969 bool isRewardAllowed = true;
17970 if (creature)
17971 {
17972 isRewardAllowed = creature->IsDamageEnoughForLootingAndReward();
17973 if (!isRewardAllowed)
17974 creature->SetLootRecipient(nullptr);
17975 }
17976
17977 // pussywizard: remade this if section (player is on the same map
17978 if (isRewardAllowed && creature)
17979 {
17980 Player* lr = creature->GetLootRecipient();
17981 if (lr && lr->IsInMap(creature))
17982 player = creature->GetLootRecipient();
17983 else if (Group* lrg = creature->GetLootRecipientGroup())
17984 for (GroupReference* itr = lrg->GetFirstMember(); itr != nullptr; itr = itr->next())
17985 if (Player* member = itr->GetSource())
17986 if (member->IsAtLootRewardDistance(creature))
17987 {
17988 player = member;
17989 break;
17990 }
17991 }
17992
17993 // Exploit fix
17994 if (creature && creature->IsPet() && creature->GetOwnerGUID().IsPlayer())
17995 isRewardAllowed = false;
17996
17997 // Reward player, his pets, and group/raid members
17998 // call kill spell proc event (before real die and combat stop to triggering auras removed at death/combat stop)
17999 if (isRewardAllowed && player && player != victim)
18000 {
18001 WorldPacket data(SMSG_PARTYKILLLOG, (8 + 8)); // send event PARTY_KILL
18002 data << player->GetGUID(); // player with killing blow
18003 data << victim->GetGUID(); // victim
18004
18005 Player* looter = player;
18006 Group* group = player->GetGroup();
18007 bool hasLooterGuid = false;
18008
18009 if (group)
18010 {
18011 group->BroadcastPacket(&data, group->GetMemberGroup(player->GetGUID()));
18012
18013 if (creature)
18014 {
18015 group->UpdateLooterGuid(creature, true);
18016 if (group->GetLooterGuid() && group->GetLootMethod() != FREE_FOR_ALL)
18017 {
18018 looter = ObjectAccessor::FindPlayer(group->GetLooterGuid());
18019 if (looter)
18020 {
18021 hasLooterGuid = true;
18022 creature->SetLootRecipient(looter); // update creature loot recipient to the allowed looter.
18023 }
18024 }
18025 }
18026 }
18027 else
18028 {
18029 player->SendDirectMessage(&data);
18030
18031 if (creature)
18032 {
18033 WorldPacket data2(SMSG_LOOT_LIST, 8 + 1 + 1);
18034 data2 << creature->GetGUID();
18035 data2 << uint8(0); // unk1
18036 data2 << uint8(0); // no group looter
18037 player->SendMessageToSet(&data2, true);
18038 }
18039 }
18040
18041 // Generate loot before updating looter
18042 if (creature)
18043 {
18044 Loot* loot = &creature->loot;
18045 loot->clear();
18046
18047 if (uint32 lootid = creature->GetCreatureTemplate()->lootid)
18048 loot->FillLoot(lootid, LootTemplates_Creature, looter, false, false, creature->GetLootMode(), creature);
18049
18050 if (creature->GetLootMode())
18052
18053 if (group)
18054 {
18055 if (hasLooterGuid)
18056 group->SendLooter(creature, looter);
18057 else
18058 group->SendLooter(creature, nullptr);
18059
18060 // Update round robin looter only if the creature had loot
18061 if (!creature->loot.empty())
18062 group->UpdateLooterGuid(creature);
18063 }
18064 }
18065
18066 player->RewardPlayerAndGroupAtKill(victim, false);
18067 }
18068
18069 // Do KILL and KILLED procs. KILL proc is called only for the unit who landed the killing blow (and its owner - for pets and totems) regardless of who tapped the victim
18070 if (killer && (killer->IsPet() || killer->IsTotem()))
18071 if (Unit* owner = killer->GetOwner())
18072 {
18073 Unit::ProcDamageAndSpell(owner, victim, PROC_FLAG_KILL, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
18074 sScriptMgr->OnCreatureKilledByPet( killer->GetCharmerOrOwnerPlayerOrPlayerItself(), victim->ToCreature());
18075 }
18076
18077 if (killer != victim)
18078 {
18079 Unit::ProcDamageAndSpell(killer, victim, killer ? PROC_FLAG_KILL : 0, PROC_FLAG_KILLED, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
18080 }
18081
18082 // Proc auras on death - must be before aura/combat remove
18083 Unit::ProcDamageAndSpell(victim, nullptr, PROC_FLAG_DEATH, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
18084
18085 // update get killing blow achievements, must be done before setDeathState to be able to require auras on target
18086 // and before Spirit of Redemption as it also removes auras
18087 if (killer)
18088 if (Player* killerPlayer = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
18089 killerPlayer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, victim);
18090
18091 // Spirit of Redemption
18092 // if talent known but not triggered (check priest class for speedup check)
18093 bool spiritOfRedemption = false;
18094 if (victim->GetTypeId() == TYPEID_PLAYER && victim->getClass() == CLASS_PRIEST && !victim->ToPlayer()->HasPlayerFlag(PLAYER_FLAGS_IS_OUT_OF_BOUNDS))
18095 {
18096 if (AuraEffect* aurEff = victim->GetAuraEffectDummy(20711))
18097 {
18098 // Xinef: aura_spirit_of_redemption is triggered by 27827 shapeshift
18099 if (victim->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION) || victim->HasAura(27827))
18100 {
18101 /*LOG_INFO("misc", "Player ({}) died with spirit of redemption. Killer (Entry: {}, Name: {}), Map: {}, x: {}, y: {}, z: {}",
18102 victim->GetGUID().ToString(), killer ? killer->GetEntry() : 1, killer ? killer->GetName() : "", victim->GetMapId(), victim->GetPositionX(),
18103 victim->GetPositionY(), victim->GetPositionZ());
18104
18105 ACE_Stack_Trace trace(0, 50);
18106 LOG_INFO("misc", "TRACE: {}\n\n", trace);*/
18107 }
18108 else
18109 {
18110 // save value before aura remove
18111 uint32 ressSpellId = victim->GetUInt32Value(PLAYER_SELF_RES_SPELL);
18112 if (!ressSpellId)
18113 ressSpellId = victim->ToPlayer()->GetResurrectionSpellId();
18114
18115 //Remove all expected to remove at death auras (most important negative case like DoT or periodic triggers)
18116 victim->RemoveAllAurasOnDeath();
18117
18118 // Stop attacks
18119 victim->CombatStop();
18121
18122 // restore for use at real death
18123 victim->SetUInt32Value(PLAYER_SELF_RES_SPELL, ressSpellId);
18124
18125 // FORM_SPIRITOFREDEMPTION and related auras
18126 victim->CastSpell(victim, 27827, true, nullptr, aurEff);
18127 spiritOfRedemption = true;
18128 }
18129 }
18130 }
18131
18132 if (!spiritOfRedemption)
18133 {
18134 LOG_DEBUG("entities.unit", "SET DeathState::JustDied");
18135 victim->setDeathState(DeathState::JustDied);
18136 }
18137
18138 // Inform pets (if any) when player kills target)
18139 // MUST come after victim->setDeathState(DeathState::JustDied); or pet next target
18140 // selection will get stuck on same target and break pet react state
18141 if (player)
18142 {
18143 Pet* pet = player->GetPet();
18144 if (pet && pet->IsAlive() && pet->isControlled())
18145 pet->AI()->KilledUnit(victim);
18146 }
18147
18148 // 10% durability loss on death
18149 // clean InHateListOf
18150 if (Player* plrVictim = victim->ToPlayer())
18151 {
18152 // remember victim PvP death for corpse type and corpse reclaim delay
18153 // at original death (not at SpiritOfRedemtionTalent timeout)
18154 plrVictim->SetPvPDeath(player != nullptr);
18155
18156 // only if not player and not controlled by player pet. And not at BG
18157 if ((durabilityLoss && !player && !plrVictim->InBattleground()) || (player && sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP)))
18158 {
18159 LOG_DEBUG("entities.unit", "We are dead, losing {} percent durability", sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH));
18160 plrVictim->DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH), false);
18161 // durability lost message
18162 plrVictim->SendDurabilityLoss();
18163 }
18164 // Call KilledUnit for creatures
18165 if (killer && killer->GetTypeId() == TYPEID_UNIT && killer->IsAIEnabled)
18166 killer->ToCreature()->AI()->KilledUnit(victim);
18167
18168 // last damage from non duel opponent or opponent controlled creature
18169 if (plrVictim->duel)
18170 {
18171 plrVictim->duel->Opponent->CombatStopWithPets(true);
18172 plrVictim->CombatStopWithPets(true);
18173 plrVictim->DuelComplete(DUEL_INTERRUPTED);
18174 }
18175 }
18176 else // creature died
18177 {
18178 LOG_DEBUG("entities.unit", "DealDamageNotPlayer");
18179
18180 if (!creature->IsPet() && creature->GetLootMode() > 0)
18181 {
18182 creature->GetThreatMgr().ClearAllThreat();
18183
18184 // must be after setDeathState which resets dynamic flags
18185 if (!creature->loot.isLooted())
18186 {
18188 }
18189 else
18190 {
18191 creature->AllLootRemovedFromCorpse();
18192 }
18193 }
18194
18195 // Call KilledUnit for creatures, this needs to be called after the lootable flag is set
18196 if (killer && killer->GetTypeId() == TYPEID_UNIT && killer->IsAIEnabled)
18197 killer->ToCreature()->AI()->KilledUnit(victim);
18198
18199 // Call creature just died function
18200 if (CreatureAI* ai = creature->AI())
18201 {
18202 ai->JustDied(killer);
18203 }
18204
18205 if (TempSummon* summon = creature->ToTempSummon())
18206 {
18207 if (WorldObject* summoner = summon->GetSummoner())
18208 {
18209 if (summoner->ToCreature() && summoner->ToCreature()->IsAIEnabled)
18210 {
18211 summoner->ToCreature()->AI()->SummonedCreatureDies(creature, killer);
18212 }
18213 else if (summoner->ToGameObject() && summoner->ToGameObject()->AI())
18214 {
18215 summoner->ToGameObject()->AI()->SummonedCreatureDies(creature, killer);
18216 }
18217 }
18218 }
18219
18220 // Dungeon specific stuff, only applies to players killing creatures
18221 if (creature->GetInstanceId())
18222 {
18223 Map* instanceMap = creature->GetMap();
18224 //Player* creditedPlayer = GetCharmerOrOwnerPlayerOrPlayerItself();
18226
18227 if (instanceMap->IsDungeon() && player)
18228 if (instanceMap->IsRaidOrHeroicDungeon())
18230 instanceMap->ToInstanceMap()->PermBindAllPlayers();
18231 }
18232 }
18233
18234 // outdoor pvp things, do these after setting the death state, else the player activity notify won't work... doh...
18235 // handle player kill only if not suicide (spirit of redemption for example)
18236 if (player && killer != victim)
18237 {
18238 if (OutdoorPvP* pvp = player->GetOutdoorPvP())
18239 pvp->HandleKill(player, victim);
18240
18241 if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetZoneId()))
18242 bf->HandleKill(player, victim);
18243 }
18244
18245 //if (victim->GetTypeId() == TYPEID_PLAYER)
18246 // if (OutdoorPvP* pvp = victim->ToPlayer()->GetOutdoorPvP())
18247 // pvp->HandlePlayerActivityChangedpVictim->ToPlayer();
18248
18249 // battleground things (do this at the end, so the death state flag will be properly set to handle in the bg->handlekill)
18250 if (player)
18251 if (Battleground* bg = player->GetBattleground())
18252 {
18253 if (victim->GetTypeId() == TYPEID_PLAYER)
18254 bg->HandleKillPlayer(victim->ToPlayer(), player);
18255 else
18256 bg->HandleKillUnit(victim->ToCreature(), player);
18257 }
18258
18259 // achievement stuff
18260 if (killer && victim->GetTypeId() == TYPEID_PLAYER)
18261 {
18262 if (killer->GetTypeId() == TYPEID_UNIT)
18264 else if (victim != killer && killer->GetTypeId() == TYPEID_PLAYER)
18266 }
18267
18268 // Hook for OnPVPKill Event
18269 if (killer)
18270 {
18271 if (Player* killerPlr = killer->ToPlayer())
18272 {
18273 if (Player* killedPlr = victim->ToPlayer())
18274 sScriptMgr->OnPVPKill(killerPlr, killedPlr);
18275 else if (Creature* killedCre = victim->ToCreature())
18276 sScriptMgr->OnCreatureKill(killerPlr, killedCre);
18277 }
18278 else if (Creature* killerCre = killer->ToCreature())
18279 {
18280 if (Player* killed = victim->ToPlayer())
18281 sScriptMgr->OnPlayerKilledByCreature(killerCre, killed);
18282 }
18283 }
18284
18285 sScriptMgr->OnUnitDeath(victim, killer);
18286}
#define sBattlefieldMgr
Definition: BattlefieldMgr.h:77
@ CREATURE_FLAG_EXTRA_INSTANCE_BIND
Definition: CreatureData.h:49
@ PLAYER_SELF_RES_SPELL
Definition: UpdateFields.h:370
@ PLAYER_FLAGS_IS_OUT_OF_BOUNDS
Definition: Player.h:489
LootStore LootTemplates_Creature("creature_loot_template", "creature entry", true)
@ FREE_FOR_ALL
Definition: LootMgr.h:59
@ PROC_FLAG_KILLED
Definition: SpellMgr.h:107
@ CONFIG_DURABILITY_LOSS_IN_PVP
Definition: IWorld.h:71
@ RATE_DURABILITY_LOSS_ON_DEATH
Definition: IWorld.h:510
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER
Definition: DBCEnums.h:146
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE
Definition: DBCEnums.h:145
@ ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS
Definition: DBCEnums.h:178
@ DUEL_INTERRUPTED
Definition: SharedDefines.h:3612
@ SMSG_PARTYKILLLOG
Definition: Opcodes.h:531
@ SMSG_LOOT_LIST
Definition: Opcodes.h:1047
Player * FindPlayer(ObjectGuid const guid)
Definition: ObjectAccessor.cpp:248
Definition: CreatureAI.h:71
virtual void KilledUnit(Unit *)
Definition: CreatureAI.h:130
Definition: Battlefield.h:206
Loot loot
Definition: Creature.h:220
uint16 GetLootMode() const
Definition: Creature.h:234
void AllLootRemovedFromCorpse()
Definition: Creature.cpp:2909
Player * GetLootRecipient() const
Definition: Creature.cpp:1244
bool IsDamageEnoughForLootingAndReward() const
Definition: Creature.cpp:3701
Group * GetLootRecipientGroup() const
Definition: Creature.cpp:1251
uint32 mingold
Definition: CreatureData.h:224
uint32 maxgold
Definition: CreatureData.h:225
uint32 lootid
Definition: CreatureData.h:217
virtual void SetDynamicFlag(uint32 flag)
Definition: Object.h:117
uint32 GetInstanceId() const
Definition: Object.h:431
uint32 GetZoneId() const
Definition: Object.cpp:3100
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:5607
TeamId GetTeamId(bool original=false) const
Definition: Player.h:2072
Battleground * GetBattleground(bool create=false) const
Definition: Player.cpp:12117
uint32 GetResurrectionSpellId()
Definition: Player.cpp:12525
OutdoorPvP * GetOutdoorPvP() const
Definition: Player.cpp:12426
void RewardPlayerAndGroupAtKill(Unit *victim, bool isBattleGround)
Definition: Player.cpp:12645
void RemoveAllAurasOnDeath()
Definition: Unit.cpp:5289
AuraEffect * GetAuraEffectDummy(uint32 spellid) const
Definition: Unit.cpp:5488
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
Definition: Group.cpp:1725
uint8 GetMemberGroup(ObjectGuid guid) const
Definition: Group.cpp:2323
ObjectGuid GetLooterGuid() const
Definition: Group.cpp:2260
LootMethod GetLootMethod() const
Definition: Group.cpp:2255
void UpdateLooterGuid(WorldObject *pLootedObject, bool ifneed=false)
Definition: Group.cpp:1836
void SendLooter(Creature *creature, Player *pLooter)
Definition: Group.cpp:967
Definition: LootMgr.h:313
bool empty() const
Definition: LootMgr.h:367
bool isLooted() const
Definition: LootMgr.h:368
void clear()
Definition: LootMgr.h:343
void generateMoneyLoot(uint32 minAmount, uint32 maxAmount)
Definition: LootMgr.cpp:818
bool FillLoot(uint32 lootId, LootStore const &store, Player *lootOwner, bool personal, bool noEmptyError=false, uint16 lootMode=LOOT_MODE_DEFAULT, WorldObject *lootSource=nullptr)
Definition: LootMgr.cpp:553
Definition: Map.h:313
bool IsRaidOrHeroicDungeon() const
Definition: Map.h:451
InstanceMap * ToInstanceMap()
Definition: Map.h:545
void PermBindAllPlayers()
Definition: Map.cpp:3145
Definition: OutdoorPvP.h:186

References ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, Creature::AI(), Creature::AllLootRemovedFromCorpse(), Group::BroadcastPacket(), CastSpell(), CLASS_PRIEST, Loot::clear(), ThreatMgr::ClearAllThreat(), CombatStop(), CONFIG_DURABILITY_LOSS_IN_PVP, CREATURE_FLAG_EXTRA_INSTANCE_BIND, HostileRefMgr::deleteReferences(), DUEL_INTERRUPTED, Loot::empty(), Loot::FillLoot(), ObjectAccessor::FindPlayer(), CreatureTemplate::flags_extra, FREE_FOR_ALL, Loot::generateMoneyLoot(), GetAuraEffectDummy(), Player::GetBattleground(), GetCharmerOrOwnerPlayerOrPlayerItself(), getClass(), Creature::GetCreatureTemplate(), Object::GetEntry(), Player::GetGroup(), Object::GetGUID(), GetHealth(), getHostileRefMgr(), WorldObject::GetInstanceId(), Group::GetLooterGuid(), Group::GetLootMethod(), Creature::GetLootMode(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), WorldObject::GetMap(), Group::GetMemberGroup(), Player::GetOutdoorPvP(), GetOwner(), GetOwnerGUID(), Player::GetPet(), Player::GetResurrectionSpellId(), Player::GetTeamId(), GetThreatMgr(), Object::GetTypeId(), Object::GetUInt32Value(), WorldObject::GetZoneId(), HasAura(), HasAuraType(), Player::HasPlayerFlag(), Player::InBattleground(), IsAIEnabled, IsAlive(), Pet::isControlled(), Creature::IsDamageEnoughForLootingAndReward(), Map::IsDungeon(), WorldObject::IsInMap(), Loot::isLooted(), IsPet(), ObjectGuid::IsPlayer(), Map::IsRaidOrHeroicDungeon(), IsTotem(), CreatureAI::KilledUnit(), LOG_DEBUG, Creature::loot, CreatureTemplate::lootid, LootTemplates_Creature, CreatureTemplate::maxgold, CreatureTemplate::mingold, GroupReference::next(), InstanceMap::PermBindAllPlayers(), PLAYER_FLAGS_IS_OUT_OF_BOUNDS, PLAYER_SELF_RES_SPELL, PROC_EX_NONE, PROC_FLAG_DEATH, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_FLAG_NONE, ProcDamageAndSpell(), RATE_DURABILITY_LOSS_ON_DEATH, RemoveAllAurasOnDeath(), Player::RewardPlayerAndGroupAtKill(), sBattlefieldMgr, Player::SendDirectMessage(), Group::SendLooter(), Player::SendMessageToSet(), setDeathState(), Object::SetDynamicFlag(), Creature::SetLootRecipient(), Object::SetUInt32Value(), SMSG_LOOT_LIST, SMSG_PARTYKILLLOG, SPELL_AURA_SPIRIT_OF_REDEMPTION, sScriptMgr, sWorld, Object::ToCreature(), Map::ToInstanceMap(), Object::ToPlayer(), ToTempSummon(), TYPEID_PLAYER, TYPEID_UNIT, UNIT_DYNFLAG_LOOTABLE, Player::UpdateAchievementCriteria(), and Group::UpdateLooterGuid().

Referenced by npc_mograine::npc_mograineAI::AshbringerEvent(), boss_shade_of_akama::ChannelersAction(), boss_headless_horseman_head::DamageTaken(), boss_viscidus::DamageTaken(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_brutallus::boss_brutallusAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), DealDamage(), boss_jedoga_shadowseeker::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_illidari_council::boss_illidari_councilAI::DoAction(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), LichKingDeathEvent::Execute(), DeathEvent::Execute(), AuraEffect::HandleAuraControlVehicle(), BattlegroundIC::HandleCapturedNodes(), misc_commandscript::HandleDieCommand(), spell_ooze_zap_channel_end::spell_ooze_zap_channel_end_SpellScript::HandleDummy(), spell_pos_rimefang_frost_nova::spell_pos_rimefang_frost_novaSpellScript::HandleDummy(), spell_q12589_shoot_rjr::spell_q12589_shoot_rjr_SpellScript::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_yogg_saron_titanic_storm::spell_yogg_saron_titanic_storm_SpellScript::HandleDummyEffect(), spell_item_rocket_chicken::HandleDummyTick(), spell_mc_play_dead::spell_mc_play_dead_AuraScript::HandleEffectRemove(), spell_teron_gorefiend_spiritual_vengeance::HandleEffectRemove(), spell_voa_overcharge::spell_voa_overcharge_AuraScript::HandlePeriodicDummy(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_felmyst_fog_of_corruption_charm::spell_felmyst_fog_of_corruption_charm_AuraScript::HandleRemove(), spell_leotheras_clear_consuming_madness::HandleScriptEffect(), boss_kiljaeden::boss_kiljaedenAI::JustDied(), boss_entropius::boss_entropiusAI::JustDied(), npc_eye_tentacle::JustDied(), npc_claw_tentacle::JustDied(), npc_giant_claw_tentacle::JustDied(), npc_giant_eye_tentacle::JustDied(), boss_twin_valkyrAI::JustDied(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_sister_svalna::boss_sister_svalnaAI::JustDied(), boss_ignis::boss_ignisAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), boss_twinemperorsAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), KillSelf(), boss_buru::ManipulateEggs(), npc_burning_spirit::npc_burning_spiritAI::MovementInform(), spell_yogg_saron_insane::spell_yogg_saron_insane_AuraScript::OnRemove(), WretchedGhoulCleaner::operator()(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::PassengerBoarded(), spell_ulduar_arachnopod_damaged::spell_ulduar_arachnopod_damaged_AuraScript::PrepareAuraScript(), SmartScript::ProcessAction(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::RandomizeCompositionsAndShow(), boss_faerlina::boss_faerlinaAI::SpellHit(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), boss_ahune::SummonedCreatureDespawn(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::Update(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::Update(), instance_shattered_halls::instance_shattered_halls_InstanceMapScript::Update(), SimpleCharmedAI::UpdateAI(), boss_selin_fireheart::UpdateAI(), npc_crusade_persuaded::npc_crusade_persuadedAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_sinkhole_kill_credit::npc_sinkhole_kill_creditAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), and npc_emily::npc_emilyAI::WaypointReached().

◆ KillSelf()

void Unit::KillSelf ( bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
inline
1565{ Kill(this, this, durabilityLoss, attackType, spellProto, spell); };

References Kill().

Referenced by npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_illidari_council::boss_illidari_councilAI::DoAction(), npc_raging_flames::EnterEvadeMode(), npc_xt002_boombot::npc_xt002_boombotAI::Explode(), boss_warlord_kalithresh::JustDied(), npc_pet_gen_plump_turkey::MovementInform(), npc_wild_wyrm::npc_wild_wyrmAI::MovementInform(), npc_announcer_toc5::npc_announcer_toc5AI::MovementInform(), boss_glob_of_viscidus::MovementInform(), SmartScript::ProcessAction(), npc_dark_iron_guzzler::SpellHit(), boss_victor_nefarius::boss_victor_nefariusAI::SummonedCreatureDies(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDies(), npc_icc_gauntlet_controller::npc_icc_gauntlet_controllerAI::SummonedCreatureDies(), boss_vazruden_the_herald::SummonedCreatureDies(), npc_warden_mellichar::npc_warden_mellicharAI::SummonedCreatureDies(), boss_felblood_kaelthas::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), npc_singularity::npc_singularityAI::UpdateAI(), npc_brewfest_super_brew_trigger::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and npc_frost_tomb::npc_frost_tombAI::UpdateAI().

◆ KnockbackFrom()

void Unit::KnockbackFrom ( float  x,
float  y,
float  speedXY,
float  speedZ 
)
19408{
19409 Player* player = ToPlayer();
19410 if (!player)
19411 {
19412 if (Unit* charmer = GetCharmer())
19413 {
19414 player = charmer->ToPlayer();
19415 if (player && player->m_mover != this)
19416 player = nullptr;
19417 }
19418 }
19419
19420 if (!player)
19421 {
19422 GetMotionMaster()->MoveKnockbackFrom(x, y, speedXY, speedZ);
19423 }
19424 else
19425 {
19426 float vcos, vsin;
19427 GetSinCos(x, y, vsin, vcos);
19428
19429 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19430 data << GetPackGUID();
19431 data << uint32(0); // counter
19432 data << float(vcos); // x direction
19433 data << float(vsin); // y direction
19434 data << float(speedXY); // Horizontal speed
19435 data << float(-speedZ); // Z Movement speed (vertical)
19436
19437 player->GetSession()->SendPacket(&data);
19438
19440 player->SetCanFly(true, true);
19441
19442 sScriptMgr->AnticheatSetSkipOnePacketForASH(player, true);
19443 player->SetCanKnockback(true);
19444 }
19445}
@ SPELL_AURA_FLY
Definition: SpellAuraDefines.h:264
@ SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED
Definition: SpellAuraDefines.h:270
void GetSinCos(float x, float y, float &vsin, float &vcos) const
Definition: Position.cpp:91
SafeUnitPointer m_mover
Definition: Player.h:2295
void SetCanKnockback(bool value)
Definition: Player.h:2463
bool SetCanFly(bool apply, bool packetOnly=false) override
Definition: Player.cpp:15838
void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ)
Definition: MotionMaster.cpp:527

References GetCharmer(), GetMotionMaster(), Object::GetPackGUID(), Player::GetSession(), Position::GetSinCos(), HasAuraType(), Player::m_mover, MotionMaster::MoveKnockbackFrom(), WorldSession::SendPacket(), Player::SetCanFly(), Player::SetCanKnockback(), SMSG_MOVE_KNOCK_BACK, SPELL_AURA_FLY, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, sScriptMgr, and Object::ToPlayer().

Referenced by _ExitVehicle(), Spell::EffectKnockBack(), spell_warhead_detonate::spell_warhead_detonate_SpellScript::HandleDummy(), npc_vekjik::OnGossipSelect(), and npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI().

◆ MagicSpellHitResult()

SpellMissInfo Unit::MagicSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3292{
3293 // Can`t miss on dead target (on skinning for example)
3294 if (!victim->IsAlive() && victim->GetTypeId() != TYPEID_PLAYER)
3295 return SPELL_MISS_NONE;
3296
3297 // vehicles cant miss
3298 if (IsVehicle())
3299 return SPELL_MISS_NONE;
3300
3301 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3302 // resist and deflect chances
3303 // xinef: skip all calculations, proof: Toxic Tolerance quest
3304 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3305 return SPELL_MISS_NONE;
3306
3307 if (spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
3308 {
3309 return SPELL_MISS_NONE;
3310 }
3311
3312 SpellSchoolMask schoolMask = spellInfo->GetSchoolMask();
3313 int32 thisLevel = getLevelForTarget(victim);
3314 if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsTrigger())
3315 thisLevel = std::max<int32>(thisLevel, spellInfo->SpellLevel);
3316 int32 levelDiff = int32(victim->getLevelForTarget(this)) - thisLevel;
3317
3318 int32 MISS_CHANCE_MULTIPLIER;
3319 if (sWorld->getBoolConfig(CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS) && GetTypeId() != TYPEID_PLAYER) // keep it as it was originally (7 and 11)
3320 {
3321 MISS_CHANCE_MULTIPLIER = victim->GetTypeId() == TYPEID_PLAYER ? 7 : 11;
3322 }
3323 else
3324 {
3325 MISS_CHANCE_MULTIPLIER = sWorld->getRate(
3326 victim->GetTypeId() == TYPEID_PLAYER
3329 }
3330
3331 // Base hit chance from attacker and victim levels
3332 int32 modHitChance = levelDiff < 3
3333 ? 96 - levelDiff
3334 : 94 - (levelDiff - 2) * MISS_CHANCE_MULTIPLIER;
3335
3336 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
3337 if (Player* modOwner = GetSpellModOwner())
3338 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_RESIST_MISS_CHANCE, modHitChance);
3339
3340 // Increase from attacker SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT auras
3342
3343 // Spells with SPELL_ATTR3_ALWAYS_HIT will ignore target's avoidance effects
3344 // xinef: imo it should completly ignore all calculations, eg: 14792. Hits 80 level players on blizz without any problems
3345 //if (!spell->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3346 {
3347 // Chance hit from victim SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE auras
3349 // Reduce spell hit chance for Area of effect spells from victim SPELL_AURA_MOD_AOE_AVOIDANCE aura
3350 if (spellInfo->IsAffectingArea())
3351 modHitChance -= victim->GetTotalAuraModifier(SPELL_AURA_MOD_AOE_AVOIDANCE);
3352
3353 // Decrease hit chance from victim rating bonus
3354 if (victim->GetTypeId() == TYPEID_PLAYER)
3355 modHitChance -= int32(victim->ToPlayer()->GetRatingBonusValue(CR_HIT_TAKEN_SPELL));
3356 }
3357
3358 int32 HitChance = modHitChance * 100;
3359 // Increase hit chance from attacker SPELL_AURA_MOD_SPELL_HIT_CHANCE and attacker ratings
3360 // Xinef: Totems should inherit casters ratings?
3361 if (IsTotem())
3362 {
3363 if (Unit* owner = GetOwner())
3364 HitChance += int32(owner->m_modSpellHitChance * 100.0f);
3365 }
3366 else
3367 HitChance += int32(m_modSpellHitChance * 100.0f);
3368
3369 if (HitChance < 100)
3370 HitChance = 100;
3371 else if (HitChance > 10000)
3372 HitChance = 10000;
3373
3374 int32 tmp = 10000 - HitChance;
3375
3376 int32 rand = irand(1, 10000); // Needs to be 1 to 10000 to avoid the 1/10000 chance to miss on 100% hit rating
3377
3378 if (rand < tmp)
3379 return SPELL_MISS_MISS;
3380
3381 // Chance resist mechanic (select max value from every mechanic spell effect)
3382 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3383 tmp += resist_chance;
3384
3385 // Chance resist debuff
3386 if (!spellInfo->IsPositive() && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))
3387 {
3388 bool bNegativeAura = true;
3389 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3390 {
3391 // Xinef: Check if effect exists!
3392 if (spellInfo->Effects[i].IsEffect() && spellInfo->Effects[i].ApplyAuraName == 0)
3393 {
3394 bNegativeAura = false;
3395 break;
3396 }
3397 }
3398
3399 if (bNegativeAura)
3400 {
3401 tmp += victim->GetMaxPositiveAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3402 tmp += victim->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3403 }
3404
3405 // Players resistance for binary spells
3406 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && (spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_NORMAL | SPELL_SCHOOL_MASK_HOLY)) == 0)
3407 tmp += int32(Unit::GetEffectiveResistChance(this, spellInfo->GetSchoolMask(), victim) * 10000.0f); // 100 for spell calculations, and 100 for return value percentage
3408 }
3409
3410 // Roll chance
3411 if (rand < tmp)
3412 return SPELL_MISS_RESIST;
3413
3414 // cast by caster in front of victim
3415 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION)))
3416 {
3417 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3418 tmp += deflect_chance;
3419 if (rand < tmp)
3420 return SPELL_MISS_DEFLECT;
3421 }
3422
3423 return SPELL_MISS_NONE;
3424}
@ CR_HIT_TAKEN_SPELL
Definition: Unit.h:417
@ SPELL_AURA_MOD_DEBUFF_RESISTANCE
Definition: SpellAuraDefines.h:241
@ SPELL_AURA_DEFLECT_SPELLS
Definition: SpellAuraDefines.h:350
@ SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT
Definition: SpellAuraDefines.h:262
@ SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE
Definition: SpellAuraDefines.h:249
@ SPELL_AURA_MOD_AOE_AVOIDANCE
Definition: SpellAuraDefines.h:223
@ SPELLMOD_RESIST_MISS_CHANCE
Definition: SpellDefines.h:93
@ CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS
Definition: IWorld.h:177
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER
Definition: IWorld.h:517
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE
Definition: IWorld.h:516
@ SPELL_ATTR7_NO_ATTACK_MISS
Definition: SharedDefines.h:666
@ SPELL_MISS_NONE
Definition: SharedDefines.h:1519
@ SPELL_MISS_RESIST
Definition: SharedDefines.h:1521
@ SPELL_MISS_MISS
Definition: SharedDefines.h:1520
@ SPELL_MISS_DEFLECT
Definition: SharedDefines.h:1528
float GetRatingBonusValue(CombatRating cr) const
Definition: Player.cpp:5113
int32 GetMaxNegativeAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:5990
int32 GetMaxPositiveAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:5976
int32 GetMechanicResistChance(SpellInfo const *spell)
Definition: Unit.cpp:3097

References CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS, CR_HIT_TAKEN_SPELL, SpellInfo::Dispel, SpellInfo::Effects, GetEffectiveResistChance(), getLevelForTarget(), GetMaxNegativeAuraModifierByMiscValue(), GetMaxPositiveAuraModifierByMiscValue(), GetMechanicResistChance(), GetOwner(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), Object::GetTypeId(), SpellInfo::HasAttribute(), HasAuraType(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, irand(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsPositive(), IsTotem(), IsVehicle(), m_modSpellHitChance, MAX_SPELL_EFFECTS, RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE, RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER, SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_NO_CAST_LOG, SPELL_ATTR7_NO_ATTACK_MISS, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_IGNORE_HIT_DIRECTION, SPELL_AURA_MOD_AOE_AVOIDANCE, SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE, SPELL_AURA_MOD_DEBUFF_RESISTANCE, SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT, SPELL_MISS_DEFLECT, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_RESIST, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NORMAL, SpellInfo::SpellLevel, SPELLMOD_RESIST_MISS_CHANCE, sWorld, Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, and UNIT_STATE_STUNNED.

Referenced by SpellHitResult().

◆ MeleeDamageBonusDone()

uint32 Unit::MeleeDamageBonusDone ( Unit pVictim,
uint32  damage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13069{
13070 if (!victim || pdamage == 0)
13071 return 0;
13072
13073 if (GetTypeId() == TYPEID_UNIT)
13074 {
13075 // Dancing Rune Weapon...
13076 if (GetEntry() == 27893)
13077 {
13078 if (Unit* owner = GetOwner())
13079 return owner->MeleeDamageBonusDone(victim, pdamage, attType, spellProto, damageSchoolMask) / 2;
13080 }
13081 }
13082
13083 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
13084
13085 // Done fixed damage bonus auras
13086 int32 DoneFlatBenefit = 0;
13087
13088 // ..done
13090 for (AuraEffectList::const_iterator i = mDamageDoneCreature.begin(); i != mDamageDoneCreature.end(); ++i)
13091 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13092 DoneFlatBenefit += (*i)->GetAmount();
13093
13094 // ..done
13095 // SPELL_AURA_MOD_DAMAGE_DONE included in weapon damage
13096
13097 // ..done (base at attack power for marked target and base at attack power for creature type)
13098 int32 APbonus = 0;
13099
13100 if (attType == RANGED_ATTACK)
13101 {
13102 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
13103
13104 // ..done (base at attack power and creature type)
13106 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
13107 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13108 APbonus += (*i)->GetAmount();
13109 }
13110 else
13111 {
13112 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
13113
13114 // ..done (base at attack power and creature type)
13116 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
13117 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13118 APbonus += (*i)->GetAmount();
13119 }
13120
13121 if (APbonus != 0) // Can be negative
13122 {
13123 bool normalized = false;
13124 if (spellProto)
13125 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
13126 if (spellProto->Effects[i].Effect == SPELL_EFFECT_NORMALIZED_WEAPON_DMG)
13127 {
13128 normalized = true;
13129 break;
13130 }
13131 DoneFlatBenefit += int32(APbonus / 14.0f * GetAPMultiplier(attType, normalized));
13132 }
13133
13134 // Done total percent damage auras
13135 float DoneTotalMod = 1.0f;
13136
13137 // mods for SPELL_SCHOOL_MASK_NORMAL are already factored in base melee damage calculation
13138 if (!(damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL))
13139 {
13140 // Some spells don't benefit from pct done mods
13142 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
13143 {
13144 if (!spellProto || (spellProto->ValidateAttribute6SpellDamageMods(this, *i, false) &&
13145 sScriptMgr->IsNeedModMeleeDamagePercent(this, *i, DoneTotalMod, spellProto)))
13146 {
13147 if (((*i)->GetMiscValue() & damageSchoolMask))
13148 {
13149 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
13150 AddPct(DoneTotalMod, (*i)->GetAmount());
13151 else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
13152 AddPct(DoneTotalMod, (*i)->GetAmount());
13153 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
13154 AddPct(DoneTotalMod, (*i)->GetAmount());
13155 }
13156 }
13157 }
13158 }
13159
13161 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
13162 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13163 if (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13164 AddPct(DoneTotalMod, (*i)->GetAmount());
13165
13166 // bonus against aurastate
13168 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
13169 if (victim->HasAuraState(AuraStateType((*i)->GetMiscValue())))
13170 if (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13171 AddPct(DoneTotalMod, (*i)->GetAmount());
13172
13173 // done scripted mod (take it from owner)
13174 Unit* owner = GetOwner() ? GetOwner() : this;
13175 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13176 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
13177 {
13178 if (spellProto && !spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13179 continue;
13180
13181 if (!(*i)->IsAffectedOnSpell(spellProto))
13182 continue;
13183
13184 switch ((*i)->GetMiscValue())
13185 {
13186 // Tundra Stalker
13187 // Merciless Combat
13188 case 7277:
13189 {
13190 // Merciless Combat
13191 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
13192 {
13193 if (!victim->HealthAbovePct(35))
13194 AddPct(DoneTotalMod, (*i)->GetAmount());
13195 }
13196 // Tundra Stalker
13197 else
13198 {
13199 // Frost Fever (target debuff)
13200 if (victim->HasAura(55095))
13201 AddPct(DoneTotalMod, (*i)->GetAmount());
13202 }
13203 break;
13204 }
13205 // Rage of Rivendare
13206 case 7293:
13207 {
13208 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0x02000000, 0))
13209 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
13210 break;
13211 }
13212 // Marked for Death
13213 case 7598:
13214 case 7599:
13215 case 7600:
13216 case 7601:
13217 case 7602:
13218 {
13219 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
13220 AddPct(DoneTotalMod, (*i)->GetAmount());
13221 break;
13222 }
13223 // Dirty Deeds
13224 case 6427:
13225 case 6428:
13226 {
13227 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
13228 {
13229 // effect 0 has expected value but in negative state
13230 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
13231 AddPct(DoneTotalMod, bonus);
13232 }
13233 break;
13234 }
13235 }
13236 }
13237
13238 // Custom scripted damage
13239 if (spellProto)
13240 switch (spellProto->SpellFamilyName)
13241 {
13243 // Glacier Rot
13244 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
13246 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
13247 AddPct(DoneTotalMod, aurEff->GetAmount());
13248 break;
13249 }
13250
13251 // Some spells don't benefit from done mods
13252 if (spellProto)
13253 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
13254 {
13255 DoneFlatBenefit = 0;
13256 DoneTotalMod = 1.0f;
13257 }
13258
13259 float tmpDamage = float(int32(pdamage) + DoneFlatBenefit) * DoneTotalMod;
13260
13261 // apply spellmod to Done damage
13262 if (spellProto)
13263 if (Player* modOwner = GetSpellModOwner())
13264 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_DAMAGE, tmpDamage);
13265
13266 // bonus result can be negative
13267 return uint32(std::max(tmpDamage, 0.0f));
13268}
@ SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS
Definition: SpellAuraDefines.h:165
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS
Definition: SpellAuraDefines.h:231
@ SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS
Definition: SpellAuraDefines.h:194
@ SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
Definition: SpellAuraDefines.h:142
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE
Definition: SpellAuraDefines.h:366
@ SPELL_AURA_MOD_DAMAGE_DONE_CREATURE
Definition: SpellAuraDefines.h:122
@ SPELLMOD_DAMAGE
Definition: SpellDefines.h:77
@ SPELL_EFFECT_NORMALIZED_WEAPON_DMG
Definition: SharedDefines.h:899
@ SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM
Definition: SharedDefines.h:583
@ SPELL_ATTR3_IGNORE_CASTER_MODIFIERS
Definition: SharedDefines.h:522
float GetAPMultiplier(WeaponAttackType attType, bool normalized)
Definition: Unit.cpp:17483
AuraEffect * GetDummyAuraEffect(SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
Definition: Unit.h:1990

References AddPct(), AURA_STATE_HEALTHLESS_35_PERCENT, SpellInfo::Effects, GetAPMultiplier(), GetAuraEffect(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDiseasesByCaster(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetOwner(), GetSpellModOwner(), GetTotalAuraModifier(), Object::GetTypeId(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HealthAbovePct(), SpellInfo::Id, MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_DAMAGE_DONE_CREATURE, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS, SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS, SPELL_AURA_MOD_STALKED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_EFFECT_NORMALIZED_WEAPON_DMG, SPELL_SCHOOL_MASK_NORMAL, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_HUNTER, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_DAMAGE, sScriptMgr, Object::ToPlayer(), TYPEID_UNIT, and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeDamageBonusTaken()

uint32 Unit::MeleeDamageBonusTaken ( Unit attacker,
uint32  pdamage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13271{
13272 if (pdamage == 0)
13273 return 0;
13274
13275 int32 TakenFlatBenefit = 0;
13276
13277 // ..taken
13279 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
13280 if ((*i)->GetMiscValue() & damageSchoolMask)
13281 TakenFlatBenefit += (*i)->GetAmount();
13282
13283 if (attType != RANGED_ATTACK)
13285 else
13287
13288 // Taken total percent damage auras
13289 float TakenTotalMod = 1.0f;
13290
13292
13293 // .. taken pct (special attacks)
13294 if (spellProto)
13295 {
13296 // From caster spells
13298 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
13299 if ((*i)->GetCasterGUID() == attacker->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
13300 AddPct(TakenTotalMod, (*i)->GetAmount());
13301
13302 // Mod damage from spell mechanic
13303 uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask();
13304
13305 // Shred, Maul - "Effects which increase Bleed damage also increase Shred damage"
13306 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[0] & 0x00008800)
13307 mechanicMask |= (1 << MECHANIC_BLEED);
13308
13309 if (mechanicMask)
13310 {
13312 for (AuraEffectList::const_iterator i = mDamageDoneMechanic.begin(); i != mDamageDoneMechanic.end(); ++i)
13313 if (mechanicMask & uint32(1 << ((*i)->GetMiscValue())))
13314 AddPct(TakenTotalMod, (*i)->GetAmount());
13315 }
13316 }
13317
13318 TakenTotalMod = processDummyAuras(TakenTotalMod);
13319
13320 // .. taken pct: class scripts
13321 /*AuraEffectList const& mclassScritAuras = GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13322 for (AuraEffectList::const_iterator i = mclassScritAuras.begin(); i != mclassScritAuras.end(); ++i)
13323 {
13324 switch ((*i)->GetMiscValue())
13325 {
13326 }
13327 }*/
13328
13329 if (attType != RANGED_ATTACK)
13330 {
13332 for (AuraEffectList::const_iterator i = mModMeleeDamageTakenPercent.begin(); i != mModMeleeDamageTakenPercent.end(); ++i)
13333 AddPct(TakenTotalMod, (*i)->GetAmount());
13334 }
13335 else
13336 {
13337 AuraEffectList const& mModRangedDamageTakenPercent = GetAuraEffectsByType(SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT);
13338 for (AuraEffectList::const_iterator i = mModRangedDamageTakenPercent.begin(); i != mModRangedDamageTakenPercent.end(); ++i)
13339 AddPct(TakenTotalMod, (*i)->GetAmount());
13340 }
13341
13342 // No positive taken bonus, custom attr
13343 if (spellProto)
13344 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
13345 {
13346 TakenFlatBenefit = 0;
13347 TakenTotalMod = 1.0f;
13348 }
13349
13350 // xinef: sanctified wrath talent
13351 if (TakenTotalMod < 1.0f && attacker->HasAuraType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST))
13352 {
13353 float ignoreModifier = 1.0f - TakenTotalMod;
13354 bool addModifier = false;
13356 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
13357 if ((*j)->GetMiscValue() & damageSchoolMask)
13358 {
13359 ApplyPct(ignoreModifier, (*j)->GetAmount());
13360 addModifier = true;
13361 }
13362
13363 if (addModifier)
13364 TakenTotalMod += ignoreModifier;
13365 }
13366
13367 float tmpDamage = (float(pdamage) + TakenFlatBenefit) * TakenTotalMod;
13368
13369 // bonus result can be negative
13370 return uint32(std::max(tmpDamage, 0.0f));
13371}
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN
Definition: SpellAuraDefines.h:176
@ SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
Definition: SpellAuraDefines.h:150
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN
Definition: SpellAuraDefines.h:188
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT
Definition: SpellAuraDefines.h:189
@ SPELL_AURA_MOD_DAMAGE_TAKEN
Definition: SpellAuraDefines.h:77
@ SPELL_AURA_MOD_DAMAGE_FROM_CASTER
Definition: SpellAuraDefines.h:334
@ SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT
Definition: SpellAuraDefines.h:318
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT
Definition: SpellAuraDefines.h:177
@ SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS
Definition: SpellInfo.h:197
float processDummyAuras(float TakenTotalMod) const
Definition: Unit.cpp:11896

References AddPct(), ApplyPct(), SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), Object::GetGUID(), GetTotalAuraModifier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::HasAttribute(), HasAuraType(), MECHANIC_BLEED, processDummyAuras(), RANGED_ATTACK, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_DAMAGE_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeSpellHitResult()

SpellMissInfo Unit::MeleeSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3119{
3120 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3121 // resist and deflect chances
3122 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3123 return SPELL_MISS_NONE;
3124
3125 WeaponAttackType attType = BASE_ATTACK;
3126
3127 // Check damage class instead of attack type to correctly handle judgements
3128 // - they are meele, but can't be dodged/parried/deflected because of ranged dmg class
3129 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED)
3130 attType = RANGED_ATTACK;
3131
3132 int32 attackerWeaponSkill;
3133 // skill value for these spells (for example judgements) is 5* level
3134 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED && !spellInfo->IsRangedWeaponSpell())
3135 attackerWeaponSkill = GetLevel() * 5;
3136 // bonus from skills is 0.04% per skill Diff
3137 else
3138 attackerWeaponSkill = int32(GetWeaponSkillValue(attType, victim));
3139
3140 int32 skillDiff = attackerWeaponSkill - int32(victim->GetMaxSkillValueForLevel(this));
3141
3142 uint32 roll = urand (0, 10000);
3143
3144 uint32 missChance = uint32(MeleeSpellMissChance(victim, attType, skillDiff, spellInfo->Id) * 100.0f);
3145 // Roll miss
3146 uint32 tmp = missChance;
3147 if (roll < tmp)
3148 return SPELL_MISS_MISS;
3149
3150 bool canDodge = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_DODGE);
3151 bool canParry = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_PARRY);
3152 bool canBlock = spellInfo->HasAttribute(SPELL_ATTR3_COMPLETELY_BLOCKED) && !spellInfo->HasAttribute(SPELL_ATTR0_CU_DIRECT_DAMAGE);
3153
3154 // Same spells cannot be parry/dodge
3155 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3156 return SPELL_MISS_NONE;
3157
3158 // Chance resist mechanic
3159 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3160 tmp += resist_chance;
3161 if (roll < tmp)
3162 return SPELL_MISS_RESIST;
3163
3164 // Ranged attacks can only miss, resist and deflect
3165 if (attType == RANGED_ATTACK)
3166 {
3167 // only if in front
3168 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION)))
3169 {
3170 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3171 tmp += deflect_chance;
3172 if (roll < tmp)
3173 return SPELL_MISS_DEFLECT;
3174 }
3175
3176 canDodge = false;
3177 canParry = false;
3178 }
3179
3180 // Check for attack from behind
3181 // xinef: if from behind or spell requires cast from behind
3182 if (!victim->HasInArc(M_PI, this))
3183 {
3185 {
3186 // Can`t dodge from behind in PvP (but its possible in PvE)
3187 if (victim->GetTypeId() == TYPEID_PLAYER)
3188 {
3189 canDodge = false;
3190 }
3191
3192 // Can`t parry or block
3193 canParry = false;
3194 canBlock = false;
3195 }
3196 }
3197
3198 // Check creatures flags_extra for disable parry
3199 if (victim->GetTypeId() == TYPEID_UNIT)
3200 {
3201 uint32 flagEx = victim->ToCreature()->GetCreatureTemplate()->flags_extra;
3202 // Xinef: no dodge flag
3203 if (flagEx & CREATURE_FLAG_EXTRA_NO_DODGE)
3204 canDodge = false;
3205 if (flagEx & CREATURE_FLAG_EXTRA_NO_PARRY)
3206 canParry = false;
3207 // Check creatures flags_extra for disable block
3208 if (flagEx & CREATURE_FLAG_EXTRA_NO_BLOCK)
3209 canBlock = false;
3210 }
3211 // Ignore combat result aura
3213 for (AuraEffectList::const_iterator i = ignore.begin(); i != ignore.end(); ++i)
3214 {
3215 if (!(*i)->IsAffectedOnSpell(spellInfo))
3216 continue;
3217 switch ((*i)->GetMiscValue())
3218 {
3219 case MELEE_HIT_DODGE:
3220 canDodge = false;
3221 break;
3222 case MELEE_HIT_BLOCK:
3223 canBlock = false;
3224 break;
3225 case MELEE_HIT_PARRY:
3226 canParry = false;
3227 break;
3228 default:
3229 LOG_DEBUG("entities.unit", "Spell {} SPELL_AURA_IGNORE_COMBAT_RESULT has unhandled state {}", (*i)->GetId(), (*i)->GetMiscValue());
3230 break;
3231 }
3232 }
3233
3234 if (canDodge)
3235 {
3236 // Roll dodge
3237 int32 dodgeChance = int32(victim->GetUnitDodgeChance() * 100.0f) - skillDiff * 4;
3238 // Reduce enemy dodge chance by SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
3240 dodgeChance = int32(float(dodgeChance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
3241 // Reduce dodge chance by attacker expertise rating
3242 if (GetTypeId() == TYPEID_PLAYER)
3243 dodgeChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3244 else
3246
3247 // xinef: cant dodge while casting or while stunned
3248 if (dodgeChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3249 dodgeChance = 0;
3250
3251 tmp += dodgeChance;
3252 if (roll < tmp)
3253 return SPELL_MISS_DODGE;
3254 }
3255
3256 if (canParry)
3257 {
3258 // Roll parry
3259 int32 parryChance = int32(victim->GetUnitParryChance() * 100.0f) - skillDiff * 4;
3260 // Reduce parry chance by attacker expertise rating
3261 if (GetTypeId() == TYPEID_PLAYER)
3262 parryChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3263 else
3265
3266 // xinef: cant parry while casting or while stunned
3267 if (parryChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3268 parryChance = 0;
3269
3270 tmp += parryChance;
3271 if (roll < tmp)
3272 return SPELL_MISS_PARRY;
3273 }
3274
3275 if (canBlock)
3276 {
3277 int32 blockChance = int32(victim->GetUnitBlockChance() * 100.0f) - skillDiff * 4;
3278
3279 // xinef: cant block while casting or while stunned
3280 if (blockChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3281 blockChance = 0;
3282
3283 tmp += blockChance;
3284 if (roll < tmp)
3285 return SPELL_MISS_BLOCK;
3286 }
3287
3288 return SPELL_MISS_NONE;
3289}
@ CREATURE_FLAG_EXTRA_NO_PARRY
Definition: CreatureData.h:51
@ CREATURE_FLAG_EXTRA_NO_DODGE
Definition: CreatureData.h:72
@ SPELL_AURA_MOD_EXPERTISE
Definition: SpellAuraDefines.h:303
@ SPELL_AURA_IGNORE_COMBAT_RESULT
Definition: SpellAuraDefines.h:265
@ SPELL_AURA_MOD_ENEMY_DODGE
Definition: SpellAuraDefines.h:314
@ SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
Definition: SpellAuraDefines.h:311
@ SPELL_ATTR0_CU_DIRECT_DAMAGE
Definition: SpellInfo.h:184
@ SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET
Definition: SpellInfo.h:193
@ SPELL_ATTR7_NO_ATTACK_PARRY
Definition: SharedDefines.h:665
@ SPELL_ATTR7_NO_ATTACK_DODGE
Definition: SharedDefines.h:664
@ SPELL_ATTR3_COMPLETELY_BLOCKED
Definition: SharedDefines.h:496
@ SPELL_MISS_PARRY
Definition: SharedDefines.h:1523
@ SPELL_MISS_DODGE
Definition: SharedDefines.h:1522
@ SPELL_MISS_BLOCK
Definition: SharedDefines.h:1524
float GetUnitDodgeChance() const
Definition: Unit.cpp:3603
float GetTotalAuraMultiplier(AuraType auratype) const
Definition: Unit.cpp:5862
float GetUnitParryChance() const
Definition: Unit.cpp:3620
float MeleeSpellMissChance(Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
Definition: Unit.cpp:19252

References BASE_ATTACK, CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, SpellInfo::DmgClass, CreatureTemplate::flags_extra, GetAuraEffectsByType(), Creature::GetCreatureTemplate(), GetLevel(), GetMaxSkillValueForLevel(), GetMechanicResistChance(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), Object::GetTypeId(), GetUnitBlockChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), HasAuraType(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, IsNonMeleeSpellCast(), SpellInfo::IsRangedWeaponSpell(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_DODGE, MELEE_HIT_PARRY, MeleeSpellMissChance(), RANGED_ATTACK, SPELL_ATTR0_CU_DIRECT_DAMAGE, SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET, SPELL_ATTR0_NO_ACTIVE_DEFENSE, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR3_COMPLETELY_BLOCKED, SPELL_ATTR7_NO_ATTACK_DODGE, SPELL_ATTR7_NO_ATTACK_PARRY, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_IGNORE_COMBAT_RESULT, SPELL_AURA_IGNORE_HIT_DIRECTION, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, SPELL_DAMAGE_CLASS_RANGED, SPELL_MISS_BLOCK, SPELL_MISS_DEFLECT, SPELL_MISS_DODGE, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_PARRY, SPELL_MISS_RESIST, Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, UNIT_STATE_CONTROLLED, UNIT_STATE_STUNNED, urand(), and VICTIMSTATE_DODGE.

Referenced by SpellHitResult().

◆ MeleeSpellMissChance()

float Unit::MeleeSpellMissChance ( Unit const *  victim,
WeaponAttackType  attType,
int32  skillDiff,
uint32  spellId 
) const
19253{
19254 SpellInfo const* spellInfo = spellId ? sSpellMgr->GetSpellInfo(spellId) : nullptr;
19255 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
19256 {
19257 return 0.0f;
19258 }
19259
19260 //calculate miss chance
19261 float missChance = victim->GetUnitMissChance(attType);
19262
19263 // Check if dual wielding, add additional miss penalty - when mainhand has on next swing spell, offhand doesnt suffer penalty
19264 if (!spellId && (attType != RANGED_ATTACK) && haveOffhandWeapon() && (!m_currentSpells[CURRENT_MELEE_SPELL] || !m_currentSpells[CURRENT_MELEE_SPELL]->IsNextMeleeSwingSpell()))
19265 {
19266 missChance += 19;
19267 }
19268
19269 // bonus from skills is 0.04%
19270 //miss_chance -= skillDiff * 0.04f;
19271 int32 diff = -skillDiff;
19272 if (victim->GetTypeId() == TYPEID_PLAYER)
19273 missChance += diff > 0 ? diff * 0.04f : diff * 0.02f;
19274 else
19275 missChance += diff > 10 ? 1 + (diff - 10) * 0.4f : diff * 0.1f;
19276
19277 // Calculate hit chance
19278 float hitChance = 100.0f;
19279
19280 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
19281 if (spellId)
19282 {
19283 if (Player* modOwner = GetSpellModOwner())
19284 modOwner->ApplySpellMod(spellId, SPELLMOD_RESIST_MISS_CHANCE, hitChance);
19285 }
19286
19287 missChance += hitChance - 100.0f;
19288
19289 if (attType == RANGED_ATTACK)
19290 missChance -= m_modRangedHitChance;
19291 else
19292 missChance -= m_modMeleeHitChance;
19293
19294 // Limit miss chance from 0 to 60%
19295 if (missChance < 0.0f)
19296 return 0.0f;
19297 if (missChance > 60.0f)
19298 return 60.0f;
19299 return missChance;
19300}

References CURRENT_MELEE_SPELL, GetSpellModOwner(), Object::GetTypeId(), GetUnitMissChance(), SpellInfo::HasAttribute(), haveOffhandWeapon(), m_currentSpells, m_modMeleeHitChance, m_modRangedHitChance, RANGED_ATTACK, SPELL_ATTR7_NO_ATTACK_MISS, SPELLMOD_RESIST_MISS_CHANCE, sSpellMgr, and TYPEID_PLAYER.

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ ModifyAuraState()

void Unit::ModifyAuraState ( AuraStateType  flag,
bool  apply 
)
10497{
10498 if (apply)
10499 {
10500 if (!HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10501 {
10502 SetFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10503 Unit::AuraMap& tAuras = GetOwnedAuras();
10504 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10505 {
10506 if( (*itr).second->IsRemoved() )
10507 continue;
10508
10509 if( (*itr).second->GetSpellInfo()->CasterAuraState == flag )
10510 if( AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()) )
10511 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, true);
10512 }
10513 }
10514 }
10515 else
10516 {
10517 if (HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10518 {
10519 RemoveFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10520
10521 if (flag != AURA_STATE_ENRAGE) // enrage aura state triggering continues auras
10522 {
10523 Unit::AuraMap& tAuras = GetOwnedAuras();
10524 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10525 {
10526 if( (*itr).second->GetSpellInfo()->CasterAuraState == flag )
10527 if( AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()) )
10528 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, false);
10529 }
10530 }
10531 }
10532 }
10533}
@ AURA_EFFECT_HANDLE_REAL
Definition: SpellAuraDefines.h:42
@ AURA_STATE_ENRAGE
Definition: SharedDefines.h:1309
void SetFlag(uint16 index, uint32 newFlag)
Definition: Object.cpp:845
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition: Object.cpp:860
std::multimap< uint32, Aura * > AuraMap
Definition: Unit.h:1307
AuraMap & GetOwnedAuras()
Definition: Unit.h:1928

References AURA_EFFECT_HANDLE_REAL, AURA_STATE_ENRAGE, Object::GetGUID(), GetOwnedAuras(), Object::HasFlag(), Object::RemoveFlag(), Object::SetFlag(), and UNIT_FIELD_AURASTATE.

Referenced by _ApplyAura(), _UnapplyAura(), ClearAllReactives(), ConflagrateAuraStateDelayEvent::Execute(), Spell::finish(), debug_commandscript::HandleDebugSetAuraStateCommand(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), ProcDamageAndSpellFor(), Update(), and UpdateReactives().

◆ ModifyHealth()

int32 Unit::ModifyHealth ( int32  val)
14080{
14081 int32 gain = 0;
14082
14083 if (dVal == 0)
14084 return 0;
14085
14086 int32 curHealth = (int32)GetHealth();
14087
14088 int32 val = dVal + curHealth;
14089 if (val <= 0)
14090 {
14091 SetHealth(0);
14092 return -curHealth;
14093 }
14094
14095 int32 maxHealth = (int32)GetMaxHealth();
14096
14097 if (val < maxHealth)
14098 {
14099 SetHealth(val);
14100 gain = val - curHealth;
14101 }
14102 else if (curHealth != maxHealth)
14103 {
14104 SetHealth(maxHealth);
14105 gain = maxHealth - curHealth;
14106 }
14107
14108 return gain;
14109}

References GetHealth(), GetMaxHealth(), and SetHealth().

Referenced by DealDamage(), DealHeal(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), boss_hadronox::boss_hadronoxAI::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::RegenerateHealth(), Player::RegenerateHealth(), npc_injured_patient::npc_injured_patientAI::Reset(), Spell::TakePower(), Aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ ModifyPower()

int32 Unit::ModifyPower ( Powers  power,
int32  val,
bool  withPowerUpdate = true 
)
14138{
14139 if (dVal == 0)
14140 return 0;
14141
14142 int32 gain = 0;
14143
14144 int32 curPower = (int32)GetPower(power);
14145
14146 int32 val = dVal + curPower;
14147 if (val <= 0)
14148 {
14149 SetPower(power, 0, withPowerUpdate);
14150 return -curPower;
14151 }
14152
14153 int32 maxPower = (int32)GetMaxPower(power);
14154
14155 if (val < maxPower)
14156 {
14157 SetPower(power, val, withPowerUpdate);
14158 gain = val - curPower;
14159 }
14160 else if (curPower != maxPower)
14161 {
14162 SetPower(power, maxPower, withPowerUpdate);
14163 gain = maxPower - curPower;
14164 }
14165
14166 if (GetAI())
14167 {
14168 GetAI()->OnPowerUpdate(power, gain, dVal, curPower);
14169 }
14170
14171 return gain;
14172}
virtual void OnPowerUpdate(Powers, int32, int32, uint32)
Definition: UnitAI.h:362
void SetPower(Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
Definition: Unit.cpp:15552

References GetAI(), GetMaxPower(), GetPower(), UnitAI::OnPowerUpdate(), and SetPower().

Referenced by CalcAbsorbResist(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), EnergizeBySpell(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_kelthuzad_detonate_mana::spell_kelthuzad_detonate_mana_AuraScript::HandleScript(), boss_pathaleon_the_calculator::JustEngagedWith(), boss_curator::JustEngagedWith(), Pet::LoseHappiness(), ModifyPowerPct(), Creature::Regenerate(), RewardRage(), Pet::setDeathState(), Spell::TakePower(), Spell::TakeRunePower(), Aura::Update(), and boss_faction_championsAI::UpdateAI().

◆ ModifyPowerPct()

int32 Unit::ModifyPowerPct ( Powers  power,
float  pct,
bool  apply = true 
)
14176{
14177 float amount = (float)GetMaxPower(power);
14178 ApplyPercentModFloatVar(amount, pct, apply);
14179
14180 return ModifyPower(power, (int32)amount - (int32)GetMaxPower(power));
14181}

References ApplyPercentModFloatVar(), GetMaxPower(), and ModifyPower().

Referenced by AuraEffect::HandleAuraModIncreaseEnergyPercent().

◆ ModifyRedirectThreat()

void Unit::ModifyRedirectThreat ( int32  amount)
inline
void ModifyThreatPct(int32 amount)
Definition: Unit.h:974

References _redirectThreatInfo, and RedirectThreatInfo::ModifyThreatPct().

Referenced by spell_warr_vigilance::HandleAfterApply().

◆ ModSpellCastTime()

void Unit::ModSpellCastTime ( SpellInfo const *  spellProto,
int32 castTime,
Spell spell = nullptr 
)
Todo:
:(MadAgos) Eventually check and delete the bool argument
14960{
14961 if (!spellInfo || castTime < 0)
14962 return;
14963
14964 if (spellInfo->IsChanneled() && spellInfo->HasAura(SPELL_AURA_MOUNTED))
14965 return;
14966
14967 // called from caster
14968 if (Player* modOwner = GetSpellModOwner())
14970 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, castTime, spell, bool(modOwner != this && !IsPet()));
14971
14972 switch (spellInfo->DmgClass)
14973 {
14975 if (spellInfo->AttributesEx5 & SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC) // required double check
14976 castTime = int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
14977 else if (spellInfo->SpellVisual[0] == 3881 && HasAura(67556)) // cooking with Chef Hat.
14978 castTime = 500;
14979 break;
14981 break; // no known cases
14983 castTime = CanInstantCast() ? 0 : int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
14984 break;
14986 castTime = int32(float(castTime) * m_modAttackSpeedPct[RANGED_ATTACK]);
14987 break;
14988 default:
14989 break;
14990 }
14991}
@ SPELLMOD_CASTING_TIME
Definition: SpellDefines.h:87
@ SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC
Definition: SharedDefines.h:580
bool CanInstantCast() const
Definition: Unit.h:2451

References SpellInfo::AttributesEx5, CanInstantCast(), SpellInfo::DmgClass, Object::GetFloatValue(), GetSpellModOwner(), SpellInfo::HasAura(), HasAura(), SpellInfo::Id, SpellInfo::IsChanneled(), IsPet(), m_modAttackSpeedPct, RANGED_ATTACK, SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC, SPELL_AURA_MOUNTED, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLMOD_CASTING_TIME, SpellInfo::SpellVisual, and UNIT_MOD_CAST_SPEED.

Referenced by SpellInfo::CalcCastTime().

◆ ModSpellDuration()

int32 Unit::ModSpellDuration ( SpellInfo const *  spellProto,
Unit const *  target,
int32  duration,
bool  positive,
uint32  effectMask 
)
14860{
14861 // don't mod permanent auras duration
14862 if (duration < 0)
14863 return duration;
14864
14865 // some auras are not affected by duration modifiers
14866 if (spellProto->HasAttribute(SPELL_ATTR7_NO_TARGET_DURATION_MOD))
14867 return duration;
14868
14869 // cut duration only of negative effects
14870 // xinef: also calculate self casts, spell can be reflected for example
14871 if (!positive)
14872 {
14873 int32 mechanic = spellProto->GetSpellMechanicMaskByEffectMask(effectMask);
14874
14875 int32 durationMod;
14876 int32 durationMod_always = 0;
14877 int32 durationMod_not_stack = 0;
14878
14879 for (uint8 i = 1; i <= MECHANIC_ENRAGED; ++i)
14880 {
14881 if (!(mechanic & 1 << i))
14882 continue;
14883
14884 // Xinef: spells affecting movement imparing effects should not reduce duration if disoriented mechanic is present
14885 if (i == MECHANIC_SNARE && (mechanic & (1 << MECHANIC_DISORIENTED)))
14886 continue;
14887
14888 // Find total mod value (negative bonus)
14889 int32 new_durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD, i);
14890 // Find max mod (negative bonus)
14891 int32 new_durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, i);
14892 // Check if mods applied before were weaker
14893 if (new_durationMod_always < durationMod_always)
14894 durationMod_always = new_durationMod_always;
14895 if (new_durationMod_not_stack < durationMod_not_stack)
14896 durationMod_not_stack = new_durationMod_not_stack;
14897 }
14898
14899 // Select strongest negative mod
14900 if (durationMod_always > durationMod_not_stack)
14901 durationMod = durationMod_not_stack;
14902 else
14903 durationMod = durationMod_always;
14904
14905 if (durationMod != 0)
14906 AddPct(duration, durationMod);
14907
14908 // there are only negative mods currently
14909 durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, spellProto->Dispel);
14910 durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, spellProto->Dispel);
14911
14912 durationMod = 0;
14913 if (durationMod_always > durationMod_not_stack)
14914 durationMod += durationMod_not_stack;
14915 else
14916 durationMod += durationMod_always;
14917
14918 if (durationMod != 0)
14919 AddPct(duration, durationMod);
14920 }
14921 else
14922 {
14923 // else positive mods here, there are no currently
14924 // when there will be, change GetTotalAuraModifierByMiscValue to GetTotalPositiveAuraModifierByMiscValue
14925 }
14926
14927 // Glyphs which increase duration of selfcasted buffs
14928 if (target == this)
14929 {
14930 switch (spellProto->SpellFamilyName)
14931 {
14932 case SPELLFAMILY_DRUID:
14933 if (spellProto->SpellFamilyFlags[0] & 0x100)
14934 {
14935 // Glyph of Thorns
14936 if (AuraEffect* aurEff = GetAuraEffect(57862, 0))
14937 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
14938 }
14939 break;
14941 if ((spellProto->SpellFamilyFlags[0] & 0x00000002) && spellProto->SpellIconID == 298)
14942 {
14943 // Glyph of Blessing of Might
14944 if (AuraEffect* aurEff = GetAuraEffect(57958, 0))
14945 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
14946 }
14947 else if ((spellProto->SpellFamilyFlags[0] & 0x00010000) && spellProto->SpellIconID == 306)
14948 {
14949 // Glyph of Blessing of Wisdom
14950 if (AuraEffect* aurEff = GetAuraEffect(57979, 0))
14951 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
14952 }
14953 break;
14954 }
14955 }
14956 return std::max(duration, 0);
14957}
constexpr auto MINUTE
Definition: Common.h:49
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK
Definition: SpellAuraDefines.h:309
@ SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK
Definition: SpellAuraDefines.h:297
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL
Definition: SpellAuraDefines.h:308
@ SPELL_AURA_MECHANIC_DURATION_MOD
Definition: SpellAuraDefines.h:295
@ SPELL_ATTR7_NO_TARGET_DURATION_MOD
Definition: SharedDefines.h:642
@ MECHANIC_ENRAGED
Definition: SharedDefines.h:1356
@ MECHANIC_DISORIENTED
Definition: SharedDefines.h:1327

References AddPct(), SpellInfo::Dispel, GetAuraEffect(), GetMaxNegativeAuraModifierByMiscValue(), SpellInfo::GetSpellMechanicMaskByEffectMask(), GetTotalAuraModifierByMiscValue(), SpellInfo::HasAttribute(), IN_MILLISECONDS, MECHANIC_DISORIENTED, MECHANIC_ENRAGED, MECHANIC_SNARE, MINUTE, SPELL_ATTR7_NO_TARGET_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, SPELLFAMILY_DRUID, SPELLFAMILY_PALADIN, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

Referenced by Spell::DoSpellHitOnUnit(), and Spell::EffectInterruptCast().

◆ MonsterMoveWithSpeed()

◆ Mount()

void Unit::Mount ( uint32  mount,
uint32  vehicleId = 0,
uint32  creatureEntry = 0 
)
13460{
13461 if (mount)
13463
13465
13466 if (Player* player = ToPlayer())
13467 {
13468 sScriptMgr->AnticheatSetUnderACKmount(player);
13469
13470 // mount as a vehicle
13471 if (VehicleId)
13472 {
13473 if (CreateVehicleKit(VehicleId, creatureEntry))
13474 {
13475 GetVehicleKit()->Reset();
13476
13477 // Send others that we now have a vehicle
13479 data << GetPackGUID();
13480 data << uint32(VehicleId);
13481 SendMessageToSet(&data, true);
13482
13484 player->GetSession()->SendPacket(&data);
13485
13486 // mounts can also have accessories
13488 }
13489 }
13490
13491 // unsummon pet
13492 Pet* pet = player->GetPet();
13493 if (pet)
13494 {
13496 // don't unsummon pet in arena but SetFlag UNIT_FLAG_STUNNED to disable pet's interface
13497 if (bg && bg->isArena())
13499 else
13500 player->UnsummonPetTemporaryIfAny();
13501 }
13502
13503 // xinef: if we have charmed npc, stun him also
13504 if (Unit* charm = player->GetCharm())
13505 if (charm->GetTypeId() == TYPEID_UNIT)
13506 charm->SetUnitFlag(UNIT_FLAG_STUNNED);
13507
13508 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13509 data << GetPackGUID();
13510 data << uint32(GameTime::GetGameTime().count()); // Packet counter
13511 data << player->GetCollisionHeight();
13512 player->GetSession()->SendPacket(&data);
13513 }
13514
13516}
@ AURA_INTERRUPT_FLAG_MOUNT
Definition: SpellDefines.h:61
bool isArena() const
Definition: Battleground.h:396
bool CreateVehicleKit(uint32 id, uint32 creatureEntry)
Definition: Unit.cpp:18979
void Reset(bool evading=false)
Definition: Vehicle.cpp:118
void InstallAllAccessories(bool evading)
Definition: Vehicle.cpp:85

References AURA_INTERRUPT_FLAG_MOUNT, CreateVehicleKit(), Player::GetBattleground(), GetCharm(), GameTime::GetGameTime(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), Vehicle::InstallAllAccessories(), Battleground::isArena(), RemoveAurasWithInterruptFlags(), Vehicle::Reset(), WorldObject::SendMessageToSet(), Object::SetUInt32Value(), SetUnitFlag(), SMSG_MOVE_SET_COLLISION_HGT, SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), TYPEID_UNIT, UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, and UNIT_FLAG_STUNNED.

Referenced by AuraEffect::HandleAuraMounted(), spell_mount_check::spell_mount_check_AuraScript::HandleEffectPeriodic(), modify_commandscript::HandleModifyMountCommand(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::InitializeAI(), boss_captain_skarloc::InitializeAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::JustRespawned(), Creature::LoadCreaturesAddon(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), npc_scarlet_courier::npc_scarlet_courierAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_mandokir::boss_mandokirAI::Reset(), WorldSession::SendDoFlight(), and npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached().

◆ NearTeleportTo() [1/2]

void Unit::NearTeleportTo ( float  x,
float  y,
float  z,
float  orientation,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
20256{
20257 DisableSpline();
20258 if (GetTypeId() == TYPEID_PLAYER)
20259 ToPlayer()->TeleportTo(GetMapId(), x, y, z, orientation, TELE_TO_NOT_LEAVE_COMBAT | (removeTransport ? 0 : TELE_TO_NOT_LEAVE_TRANSPORT) | TELE_TO_NOT_UNSUMMON_PET | (casting ? TELE_TO_SPELL : 0) | (vehicleTeleport ? TELE_TO_NOT_LEAVE_VEHICLE : 0) | (withPet ? TELE_TO_WITH_PET : 0));
20260 else
20261 {
20262 Position pos = {x, y, z, orientation};
20263 SendTeleportPacket(pos);
20264 UpdatePosition(x, y, z, orientation, true);
20267 }
20268}
@ TELE_TO_WITH_PET
Definition: Player.h:820
@ TELE_TO_NOT_LEAVE_VEHICLE
Definition: Player.h:819
@ TELE_TO_SPELL
Definition: Player.h:818
@ TELE_TO_NOT_LEAVE_COMBAT
Definition: Player.h:816
@ TELE_TO_NOT_UNSUMMON_PET
Definition: Player.h:817
@ TELE_TO_NOT_LEAVE_TRANSPORT
Definition: Player.h:815
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition: Player.cpp:1314
void SendTeleportPacket(Position &pos)
Definition: Unit.cpp:20277
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition: Unit.cpp:19394
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition: Unit.cpp:20296
void ReinitializeMovement()
Definition: MotionMaster.cpp:850

References DisableSpline(), WorldLocation::GetMapId(), GetMotionMaster(), Object::GetTypeId(), MotionMaster::ReinitializeMovement(), SendTeleportPacket(), TELE_TO_NOT_LEAVE_COMBAT, TELE_TO_NOT_LEAVE_TRANSPORT, TELE_TO_NOT_LEAVE_VEHICLE, TELE_TO_NOT_UNSUMMON_PET, TELE_TO_SPELL, TELE_TO_WITH_PET, Player::TeleportTo(), Object::ToPlayer(), TYPEID_PLAYER, UpdateObjectVisibility(), and UpdatePosition().

◆ NearTeleportTo() [2/2]

void Unit::NearTeleportTo ( Position pos,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
20251{
20252 NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), casting, vehicleTeleport, withPet, removeTransport);
20253}
void NearTeleportTo(Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
Definition: Unit.cpp:20250

References Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and NearTeleportTo().

Referenced by boss_viscidus::DamageTaken(), npc_madrigosa::npc_madrigosaAI::DoAction(), Spell::EffectLeap(), Spell::EffectResurrectPet(), Spell::EffectStuck(), Spell::EffectSummonPet(), Spell::EffectTeleportUnits(), Spell::EffectTeleUnitsFaceCaster(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnterEvadeMode(), boss_zuljin::boss_zuljinAI::EnterPhase(), UtherBatteredHiltEvent::Execute(), BattlegroundBE::HandleAreaTrigger(), BattlegroundDS::HandleAreaTrigger(), BattlegroundNA::HandleAreaTrigger(), BattlegroundRL::HandleAreaTrigger(), BattlegroundRV::HandleAreaTrigger(), spell_moroes_vanish::HandleDummy(), spell_class_call_handler::HandleOnHitRogue(), npc_echo_of_medivh::HandlePieceJustDied(), BattlegroundBE::HandlePlayerUnderMap(), BattlegroundDS::HandlePlayerUnderMap(), BattlegroundNA::HandlePlayerUnderMap(), BattlegroundRL::HandlePlayerUnderMap(), BattlegroundRV::HandlePlayerUnderMap(), npc_pet_mage_mirror_image::InitializeAI(), boss_urom::boss_uromAI::JustDied(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_grandmaster_vorpil::JustEngagedWith(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), NearTeleportTo(), npc_akama_illidan::npc_akama_illidanAI::npc_akama_illidanAI(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_chesspiece::OnCharmed(), npc_vh_sinclari::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), boss_gothik::boss_gothikAI::Reset(), Map::ScriptsProcess(), npc_midsummer_torch_target::SelectPosition(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), boss_urom::boss_uromAI::SpellHit(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), npc_pos_leader_second::npc_pos_leader_secondAI::SpellHitTarget(), boss_cyanigosa::boss_cyanigosaAI::SpellHitTarget(), BattlegroundRV::TeleportUnitToNewZ(), Vehicle::TeleportVehicle(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_janalai::boss_janalaiAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_magus_telestra::boss_magus_telestraAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), and npc_minigob_manabonk::npc_minigob_manabonkAI::UpdateAI().

◆ OutDebugInfo()

void Unit::OutDebugInfo ( ) const
20504{
20505 LOG_ERROR("entities.unit", "Unit::OutDebugInfo");
20506 LOG_INFO("entities.unit", "GUID {}, name {}", GetGUID().ToString(), GetName());
20507 LOG_INFO("entities.unit", "OwnerGUID {}, MinionGUID {}, CharmerGUID {}, CharmedGUID {}",
20509 LOG_INFO("entities.unit", "In world {}, unit type mask {}", (uint32)(IsInWorld() ? 1 : 0), m_unitTypeMask);
20510 if (IsInWorld())
20511 LOG_INFO("entities.unit", "Mapid {}", GetMapId());
20512
20513 LOG_INFO("entities.unit", "Summon Slot: ");
20514 for (uint32 i = 0; i < MAX_SUMMON_SLOT; ++i)
20515 LOG_INFO("entities.unit", "{}, ", m_SummonSlot[i].ToString());
20516 LOG_INFO("server.loading", " ");
20517
20518 LOG_INFO("entities.unit", "Controlled List: ");
20519 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20520 LOG_INFO("entities.unit", "{}, ", (*itr)->GetGUID().ToString());
20521 LOG_INFO("server.loading", " ");
20522
20523 LOG_INFO("entities.unit", "Aura List: ");
20524 for (AuraApplicationMap::const_iterator itr = m_appliedAuras.begin(); itr != m_appliedAuras.end(); ++itr)
20525 LOG_INFO("entities.unit", "{}, ", itr->first);
20526 LOG_INFO("server.loading", " ");
20527
20528 if (IsVehicle())
20529 {
20530 LOG_INFO("entities.unit", "Passenger List: ");
20531 for (SeatMap::iterator itr = GetVehicleKit()->Seats.begin(); itr != GetVehicleKit()->Seats.end(); ++itr)
20532 if (Unit* passenger = ObjectAccessor::GetUnit(*GetVehicleBase(), itr->second.Passenger.Guid))
20533 LOG_INFO("entities.unit", "{}, ", passenger->GetGUID().ToString());
20534 LOG_INFO("server.loading", " ");
20535 }
20536
20537 if (GetVehicle())
20538 LOG_INFO("entities.unit", "On vehicle {}.", GetVehicleBase()->GetEntry());
20539}
Seats
Definition: boss_flame_leviathan.cpp:161

References GetCharmerGUID(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), WorldLocation::GetMapId(), GetMinionGUID(), WorldObject::GetName(), GetOwnerGUID(), ObjectAccessor::GetUnit(), GetVehicle(), GetVehicleBase(), GetVehicleKit(), Object::IsInWorld(), IsVehicle(), LOG_ERROR, LOG_INFO, m_appliedAuras, m_Controlled, m_SummonSlot, m_unitTypeMask, MAX_SUMMON_SLOT, and Position::ToString().

Referenced by SetMinion().

◆ PauseMovement()

void Unit::PauseMovement ( uint32  timer = 0,
uint8  slot = 0 
)
virtual
16938{
16939 if (slot >= MAX_MOTION_SLOT)
16940 return;
16941
16942 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16943 movementGenerator->Pause(timer);
16944
16945 StopMoving();
16946}
@ MAX_MOTION_SLOT
Definition: MotionMaster.h:64
void StopMoving()
Definition: Unit.cpp:16918
Definition: MovementGenerator.h:30

References GetMotionMaster(), MAX_MOTION_SLOT, and StopMoving().

Referenced by WorldSession::HandleBattlemasterHelloOpcode(), WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::SendListInventory(), and boss_shade_of_aran::SetGUID().

◆ PetSpellFail()

void Unit::PetSpellFail ( SpellInfo const *  spellInfo,
Unit target,
uint32  result 
)
20692{
20693 CharmInfo* charmInfo = GetCharmInfo();
20694 if (!charmInfo || GetTypeId() != TYPEID_UNIT)
20695 return;
20696
20698 {
20699 if ((result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE) || !ToCreature()->HasReactState(REACT_PASSIVE))
20700 if (Unit* owner = GetOwner())
20701 {
20702 if (spellInfo->IsPositive() && IsFriendlyTo(target))
20703 {
20704 AttackStop();
20705 charmInfo->SetIsAtStay(false);
20706 charmInfo->SetIsCommandAttack(true);
20707 charmInfo->SetIsReturning(false);
20708 charmInfo->SetIsFollowing(false);
20709
20710 GetMotionMaster()->MoveFollow(target, PET_FOLLOW_DIST, rand_norm() * 2 * M_PI);
20711 }
20712 else if (owner->IsValidAttackTarget(target))
20713 {
20714 AttackStop();
20715 charmInfo->SetIsAtStay(false);
20716 charmInfo->SetIsCommandAttack(true);
20717 charmInfo->SetIsReturning(false);
20718 charmInfo->SetIsFollowing(false);
20719
20720 if (!ToCreature()->HasReactState(REACT_PASSIVE))
20721 ToCreature()->AI()->AttackStart(target);
20722 else
20723 GetMotionMaster()->MoveChase(target);
20724 }
20725 }
20726
20727 // can be extended in future
20728 if (result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE)
20729 {
20730 charmInfo->SetForcedSpell(spellInfo->IsPositive() ? -int32(spellInfo->Id) : spellInfo->Id);
20731 charmInfo->SetForcedTargetGUID(target->GetGUID());
20732 }
20733 else
20734 {
20735 charmInfo->SetForcedSpell(0);
20737 }
20738 }
20739}
#define PET_FOLLOW_DIST
Definition: PetDefines.h:198
@ SPELL_FAILED_OUT_OF_RANGE
Definition: SharedDefines.h:1046
@ SPELL_FAILED_LINE_OF_SIGHT
Definition: SharedDefines.h:996
bool IsPathfindingEnabled(const Map *map)
Definition: DisableMgr.cpp:411
virtual void AttackStart(Unit *)
Definition: UnitAI.cpp:27
void SetIsAtStay(bool val)
Definition: Unit.cpp:20661
void SetIsFollowing(bool val)
Definition: Unit.cpp:20671
void SetIsReturning(bool val)
Definition: Unit.cpp:20681
void SetForcedSpell(uint32 id)
Definition: Unit.h:1156
void SetForcedTargetGUID(ObjectGuid guid=ObjectGuid::Empty)
Definition: Unit.h:1158
void SetIsCommandAttack(bool val)
Definition: Unit.cpp:20599
void MoveChase(Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
Definition: MotionMaster.cpp:300
void MoveFollow(Unit *target, float dist, float angle, MovementSlot slot=MOTION_SLOT_ACTIVE)
Definition: MotionMaster.cpp:394

References Creature::AI(), UnitAI::AttackStart(), AttackStop(), ObjectGuid::Empty, GetCharmInfo(), Object::GetGUID(), WorldObject::GetMap(), GetMotionMaster(), GetOwner(), Object::GetTypeId(), SpellInfo::Id, IsFriendlyTo(), DisableMgr::IsPathfindingEnabled(), SpellInfo::IsPositive(), MotionMaster::MoveChase(), MotionMaster::MoveFollow(), PET_FOLLOW_DIST, rand_norm(), REACT_PASSIVE, CharmInfo::SetForcedSpell(), CharmInfo::SetForcedTargetGUID(), CharmInfo::SetIsAtStay(), CharmInfo::SetIsCommandAttack(), CharmInfo::SetIsFollowing(), CharmInfo::SetIsReturning(), SPELL_FAILED_LINE_OF_SIGHT, SPELL_FAILED_OUT_OF_RANGE, Object::ToCreature(), and TYPEID_UNIT.

Referenced by WorldSession::HandlePetActionHelper(), and WorldSession::HandlePetCastSpellOpcode().

◆ ProcDamageAndSpell()

void Unit::ProcDamageAndSpell ( Unit actor,
Unit victim,
uint32  procAttacker,
uint32  procVictim,
uint32  procEx,
uint32  amount,
WeaponAttackType  attType = BASE_ATTACK,
SpellInfo const *  procSpellInfo = nullptr,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
static
6317{
6318 // Not much to do if no flags are set.
6319 if (procAttacker && actor)
6320 actor->ProcDamageAndSpellFor(false, victim, procAttacker, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6321 // Now go on with a victim's events'n'auras
6322 // Not much to do if no flags are set or there is no victim
6323 if (victim && victim->IsAlive() && procVictim)
6324 victim->ProcDamageAndSpellFor(true, actor, procVictim, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6325}

References IsAlive(), and ProcDamageAndSpellFor().

Referenced by Spell::_cast(), Spell::_handle_finish_phase(), AttackerStateUpdate(), Spell::DoAllEffectOnTarget(), ReflectEvent::Execute(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and Kill().

◆ ProcDamageAndSpellFor()

void Unit::ProcDamageAndSpellFor ( bool  isVictim,
Unit target,
uint32  procFlag,
uint32  procExtra,
WeaponAttackType  attType,
SpellInfo const *  procSpellInfo,
uint32  damage,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
16323{
16324 // Player is loaded now - do not allow passive spell casts to proc
16325 if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->GetSession()->PlayerLoading())
16326 return;
16327 // For melee/ranged based attack need update skills and set some Aura states if victim present
16328 if (procFlag & MELEE_BASED_TRIGGER_MASK && target && procPhase == PROC_SPELL_PHASE_HIT)
16329 {
16330 // Xinef: Shaman in ghost wolf form cant proc anything melee based
16331 if (!isVictim && GetShapeshiftForm() == FORM_GHOSTWOLF)
16332 return;
16333
16334 // Update skills here for players
16335 // only when you are not fighting other players or their pets/totems (pvp)
16336 if (IsPlayer() && !target->IsCharmedOwnedByPlayerOrPlayer())
16337 {
16338 // On melee based hit/miss/resist/parry/dodge need to update skill (for victim and attacker)
16340 {
16341 ToPlayer()->UpdateCombatSkills(target, attType, isVictim, procSpell ? procSpell->m_weaponItem : nullptr);
16342 }
16343 // Update defence if player is victim and we block - TODO: confirm that blocked attacks only have a chance to increase defence skill
16344 else if (isVictim && procExtra & (PROC_EX_BLOCK))
16345 {
16346 ToPlayer()->UpdateCombatSkills(target, attType, true);
16347 }
16348 }
16349 // If exist crit/parry/dodge/block need update aura state (for victim and attacker)
16351 {
16352 // for victim
16353 if (isVictim)
16354 {
16355 // if victim and dodge attack
16356 if (procExtra & PROC_EX_DODGE)
16357 {
16358 // Update AURA_STATE on dodge
16359 if (getClass() != CLASS_ROGUE) // skip Rogue Riposte
16360 {
16363 }
16364 }
16365 // if victim and parry attack
16366 if (procExtra & PROC_EX_PARRY)
16367 {
16368 // For Hunters only Counterattack (skip Mongoose bite)
16369 if (getClass() == CLASS_HUNTER)
16370 {
16373 }
16374 else
16375 {
16378 }
16379 }
16380 // if and victim block attack
16381 if (procExtra & PROC_EX_BLOCK)
16382 {
16385 }
16386 }
16387 else // For attacker
16388 {
16389 // Overpower on victim dodge
16390 if (procExtra & PROC_EX_DODGE)
16391 {
16392 if (getClass() == CLASS_WARRIOR)
16393 {
16394 AddComboPoints(target, 1);
16396 }
16397 }
16398
16399 // Wolverine Bite
16400 if ((procExtra & PROC_HIT_CRITICAL) && IsHunterPet())
16401 {
16402 AddComboPoints(target, 1);
16404 }
16405 }
16406 }
16407 }
16408
16409 Unit* actor = isVictim ? target : this;
16410 Unit* actionTarget = !isVictim ? target : this;
16411
16412 ProcEventInfo eventInfo = ProcEventInfo(actor, actionTarget, target, procFlag, 0, procPhase, procExtra, procSpell, damageInfo, healInfo, procAura, procAuraEffectIndex);
16413
16414 ProcTriggeredList procTriggered;
16415 // Fill procTriggered list
16416 for (AuraApplicationMap::const_iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16417 {
16418 // Do not allow auras to proc from effect triggered by itself
16419 if (procAura && procAura->Id == itr->first)
16420 continue;
16421
16422 // Xinef: Generic Item Equipment cooldown, -1 is a special marker
16423 if (itr->second->GetBase()->GetCastItemGUID() && HasSpellItemCooldown(itr->first, uint32(-1)))
16424 continue;
16425
16426 ProcTriggeredData triggerData(itr->second->GetBase());
16427 // Defensive procs are active on absorbs (so absorption effects are not a hindrance)
16428 bool active = damage || (procExtra & PROC_EX_BLOCK && isVictim);
16429 if (isVictim)
16430 procExtra &= ~PROC_EX_INTERNAL_REQ_FAMILY;
16431
16432 SpellInfo const* spellProto = itr->second->GetBase()->GetSpellInfo();
16433
16434 // only auras that have trigger spell should proc from fully absorbed damage
16435 if (procExtra & PROC_EX_ABSORB && isVictim)
16436 if (damage || spellProto->Effects[EFFECT_0].TriggerSpell || spellProto->Effects[EFFECT_1].TriggerSpell || spellProto->Effects[EFFECT_2].TriggerSpell)
16437 active = true;
16438
16439 // xinef: fix spell procing from damaging / healing casts if spell has DoT / HoT effect only
16440 // only player spells are taken into account
16441 if (!active && !isVictim && !(procFlag & PROC_FLAG_DONE_PERIODIC) && procSpellInfo && procSpellInfo->SpellFamilyName && (procSpellInfo->HasAura(SPELL_AURA_PERIODIC_DAMAGE) || procSpellInfo->HasAura(SPELL_AURA_PERIODIC_HEAL)))
16442 active = true;
16443
16444 // AuraScript Hook
16445 if (!triggerData.aura->CallScriptCheckProcHandlers(itr->second, eventInfo))
16446 {
16447 continue;
16448 }
16449
16450 bool isTriggeredAtSpellProcEvent = IsTriggeredAtSpellProcEvent(target, triggerData.aura, attType, isVictim, active, triggerData.spellProcEvent, eventInfo);
16451
16452 // AuraScript Hook
16453 if (!triggerData.aura->CallScriptAfterCheckProcHandlers(itr->second, eventInfo, isTriggeredAtSpellProcEvent))
16454 {
16455 continue;
16456 }
16457
16458 // do checks using conditions table
16459 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_SPELL_PROC, spellProto->Id);
16460 ConditionSourceInfo condInfo = ConditionSourceInfo(eventInfo.GetActor(), eventInfo.GetActionTarget());
16461 if (!sConditionMgr->IsObjectMeetToConditions(condInfo, conditions))
16462 {
16463 continue;
16464 }
16465
16466 // Triggered spells not triggering additional spells
16467 //bool triggered = !spellProto->HasAttribute(SPELL_ATTR3_CAN_PROC_FROM_PROCS) ?
16468 // (procExtra & PROC_EX_INTERNAL_TRIGGERED && !(procFlag & PROC_FLAG_DONE_TRAP_ACTIVATION)) : false;
16469
16470 bool hasTriggeredProc = false;
16471 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
16472 {
16473 if (itr->second->HasEffect(i))
16474 {
16475 AuraEffect* aurEff = itr->second->GetBase()->GetEffect(i);
16476
16477 // Skip this auras
16478 if (isNonTriggerAura[aurEff->GetAuraType()])
16479 continue;
16480
16481 // If not trigger by default and spellProcEvent == nullptr - skip
16482 if (!isTriggerAura[aurEff->GetAuraType()] && !triggerData.spellProcEvent)
16483 continue;
16484
16485 switch (aurEff->GetAuraType())
16486 {
16489 case SPELL_AURA_DUMMY:
16491 if (uint32 triggerSpellId = aurEff->GetSpellInfo()->Effects[i].TriggerSpell)
16492 {
16493 triggerData.triggerSpelId[i] = triggerSpellId;
16494 hasTriggeredProc = true;
16495 }
16496 break;
16497 default:
16498 break;
16499 }
16500
16501 // Some spells must always trigger
16502 //if (isAlwaysTriggeredAura[aurEff->GetAuraType()])
16503 triggerData.effMask |= 1 << i;
16504 }
16505 }
16506
16507 if (triggerData.effMask)
16508 {
16509 // If there is aura that triggers another proc aura, make sure that the triggered one is going to be proccessed on top of it
16510 if (hasTriggeredProc)
16511 {
16512 bool proccessed = false;
16513 for (uint8 i = 0; i < EFFECT_ALL; ++i)
16514 {
16515 if (uint32 triggeredSpellId = triggerData.triggerSpelId[i])
16516 {
16517 auto iter = std::find(procTriggered.begin(), procTriggered.end(), triggeredSpellId);
16518 if (iter != procTriggered.end())
16519 {
16520 std::advance(iter, 1);
16521 procTriggered.insert(iter, triggerData);
16522 proccessed = true;
16523 break;
16524 }
16525 }
16526 }
16527
16528 if (!proccessed)
16529 {
16530 procTriggered.push_front(triggerData);
16531 }
16532 }
16533 else
16534 {
16535 procTriggered.push_front(triggerData);
16536 }
16537 }
16538 }
16539
16540 // Nothing found
16541 if (procTriggered.empty())
16542 return;
16543
16544 // Note: must SetCantProc(false) before return
16546 SetCantProc(true);
16547
16548 // Handle effects proceed this time
16549 for (ProcTriggeredList::const_iterator i = procTriggered.begin(); i != procTriggered.end(); ++i)
16550 {
16551 // look for aura in auras list, it may be removed while proc event processing
16552 if (i->aura->IsRemoved())
16553 continue;
16554
16555 bool useCharges = i->aura->IsUsingCharges();
16556 // no more charges to use, prevent proc
16557 if (useCharges && !i->aura->GetCharges())
16558 continue;
16559
16560 bool takeCharges = false;
16561 SpellInfo const* spellInfo = i->aura->GetSpellInfo();
16562
16563 AuraApplication* aurApp = i->aura->GetApplicationOfTarget(GetGUID());
16564
16565 bool prepare = i->aura->CallScriptPrepareProcHandlers(aurApp, eventInfo);
16566
16567 // For players set spell cooldown if need
16568 uint32 cooldown = 0;
16569 if (prepare && i->spellProcEvent && i->spellProcEvent->cooldown)
16570 cooldown = i->spellProcEvent->cooldown;
16571
16572 // Xinef: set cooldown for actual proc
16573 eventInfo.SetProcCooldown(cooldown);
16574
16575 // Note: must SetCantProc(false) before return
16577 SetCantProc(true);
16578
16579 bool handled = i->aura->CallScriptProcHandlers(aurApp, eventInfo);
16580
16581 // "handled" is needed as long as proc can be handled in multiple places
16582 if (!handled && HandleAuraProc(target, damage, i->aura, procSpellInfo, procFlag, procExtra, cooldown, &handled))
16583 {
16584 uint32 Id = i->aura->GetId();
16585 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), Id);
16586 takeCharges = true;
16587 }
16588
16589 if (!handled)
16590 for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex)
16591 {
16592 if (!(i->effMask & (1 << effIndex)))
16593 continue;
16594
16595 AuraEffect* triggeredByAura = i->aura->GetEffect(effIndex);
16596 ASSERT(triggeredByAura);
16597
16598 bool prevented = i->aura->CallScriptEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16599 if (prevented)
16600 {
16601 takeCharges = true;
16602 continue;
16603 }
16604
16605 switch (triggeredByAura->GetAuraType())
16606 {
16608 {
16609 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16610 // Don`t drop charge or add cooldown for not started trigger
16611 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16612 takeCharges = true;
16613 break;
16614 }
16616 {
16617 // target has to be valid
16618 if (!eventInfo.GetProcTarget())
16619 break;
16620
16621 triggeredByAura->HandleProcTriggerDamageAuraProc(aurApp, eventInfo); // this function is part of the new proc system
16622 takeCharges = true;
16623 break;
16624 }
16626 case SPELL_AURA_DUMMY:
16627 {
16628 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} dummy aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16629 if (HandleDummyAuraProc(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, eventInfo))
16630 takeCharges = true;
16631 break;
16632 }
16637 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, isVictim ? "a victim's" : "an attacker's", triggeredByAura->GetId());
16638 takeCharges = true;
16639 break;
16641 {
16642 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16643 if (HandleOverrideClassScriptAuraProc(target, damage, triggeredByAura, procSpellInfo, cooldown))
16644 takeCharges = true;
16645 break;
16646 }
16648 {
16649 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16650 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16651 if (damage > 0)
16652 {
16654 takeCharges = true;
16655 }
16656 break;
16657 }
16659 {
16660 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16661 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16662 HandleAuraRaidProcFromCharge(triggeredByAura);
16663 takeCharges = true;
16664 break;
16665 }
16667 {
16668 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16669
16670 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16671 takeCharges = true;
16672 break;
16673 }
16675 // Skip melee hits or instant cast spells
16676 // xinef: check channeled spells which are affected by haste also
16677 if (procSpellInfo && (procSpellInfo->SpellFamilyName || GetTypeId() != TYPEID_PLAYER) &&
16678 (procSpellInfo->CalcCastTime() > 0 /*||
16679 (procSpell->IsChanneled() && procSpell->GetDuration() > 0 && (HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, procSpell) || procSpell->HasAttribute(SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC)))*/))
16680 takeCharges = true;
16681 break;
16683 // Skip Melee hits and spells ws wrong school
16684 if (procSpellInfo && (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16685 takeCharges = true;
16686 break;
16688 // Skip Melee hits and targets with magnet aura
16689 if (procSpellInfo && (triggeredByAura->GetBase()->GetUnitOwner()->ToUnit() == ToUnit())) // Magnet
16690 takeCharges = true;
16691 break;
16694 // Skip melee hits and spells ws wrong school or zero cost
16695 if (procSpellInfo &&
16696 (procSpellInfo->ManaCost != 0 || procSpellInfo->ManaCostPercentage != 0 || (procSpellInfo->SpellFamilyFlags[1] & 0x2)) && // Cost check, mutilate include
16697 (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16698 takeCharges = true;
16699 break;
16702 // Compare mechanic
16703 if (procSpellInfo && procSpellInfo->Mechanic == uint32(triggeredByAura->GetMiscValue()))
16704 takeCharges = true;
16705 break;
16707 // Compare casters
16708 if (target && triggeredByAura->GetCasterGUID() == target->GetGUID())
16709 takeCharges = true;
16710 break;
16711 // CC Auras which use their amount amount to drop
16712 // Are there any more auras which need this?
16718 {
16719 // Spell own direct damage at apply wont break the CC
16720 // Xinef: Or when the aura is at full duration (assume that such auras should be added at the end, skipping all damage procs etc.)
16721 if (procSpellInfo)
16722 if ((!i->aura->IsPermanent() && i->aura->GetDuration() == i->aura->GetMaxDuration()) || procSpellInfo->Id == triggeredByAura->GetId() ||
16723 procSpellInfo->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
16724 break;
16725
16726 // chargeable mods are breaking on hit
16727 if (useCharges)
16728 takeCharges = true;
16729 else if (triggeredByAura->GetAmount()) // aura must have amount
16730 {
16731 int32 damageLeft = triggeredByAura->GetAmount();
16732 // No damage left
16733 if (damageLeft < int32(damage))
16734 i->aura->Remove();
16735 else
16736 triggeredByAura->SetAmount(damageLeft - damage);
16737 }
16738 break;
16739 }
16741 if (procSpellInfo && procSpellInfo->Id == 20647) // hack for warriors execute, both dummy and damage spell are affected by ignore aurastate aura
16742 break;
16743 takeCharges = true;
16744 break;
16747 {
16748 if (triggeredByAura->GetSpellModifier())
16749 {
16750 // Do proc if mod is consumed by spell
16751 if (!procSpell || procSpell->m_appliedMods.find(i->aura) != procSpell->m_appliedMods.end())
16752 {
16753 takeCharges = true;
16754 }
16755 }
16756 break;
16757 }
16758 default:
16759 takeCharges = true;
16760 break;
16761 }
16762 i->aura->CallScriptAfterEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16763 }
16764 // Remove charge (aura can be removed by triggers)
16765 // xinef: take into account attribute6 of proc spell
16766 if (prepare && useCharges && takeCharges)
16767 if (!procSpellInfo || isVictim || !procSpellInfo->HasAttribute(SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES))
16768 i->aura->DropCharge();
16769
16770 i->aura->CallScriptAfterProcHandlers(aurApp, eventInfo);
16771
16773 SetCantProc(false);
16774 }
16775
16776 // Cleanup proc requirements
16778 SetCantProc(false);
16779}
@ CONDITION_SOURCE_TYPE_SPELL_PROC
Definition: ConditionMgr.h:146
static bool isNonTriggerAura[TOTAL_AURAS]
Definition: Unit.cpp:107
static bool isTriggerAura[TOTAL_AURAS]
Definition: Unit.cpp:105
std::list< ProcTriggeredData > ProcTriggeredList
Definition: Unit.cpp:16122
@ REACTIVE_OVERPOWER
Definition: Unit.h:1216
@ REACTIVE_DEFENSE
Definition: Unit.h:1214
@ REACTIVE_HUNTER_PARRY
Definition: Unit.h:1215
@ REACTIVE_WOLVERINE_BITE
Definition: Unit.h:1217
@ SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE
Definition: SpellAuraDefines.h:288
@ SPELL_AURA_ADD_PCT_MODIFIER
Definition: SpellAuraDefines.h:171
@ SPELL_AURA_OBS_MOD_POWER
Definition: SpellAuraDefines.h:84
@ SPELL_AURA_ADD_FLAT_MODIFIER
Definition: SpellAuraDefines.h:170
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
Definition: SpellAuraDefines.h:120
@ SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT
Definition: SpellAuraDefines.h:135
@ SPELL_AURA_MOD_POWER_COST_SCHOOL
Definition: SpellAuraDefines.h:136
@ SPELL_AURA_MECHANIC_IMMUNITY
Definition: SpellAuraDefines.h:140
@ SPELL_AURA_RAID_PROC_FROM_CHARGE
Definition: SpellAuraDefines.h:286
@ SPELL_AURA_PROC_TRIGGER_DAMAGE
Definition: SpellAuraDefines.h:106
@ SPELL_AURA_REFLECT_SPELLS_SCHOOL
Definition: SpellAuraDefines.h:137
@ SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK
Definition: SpellAuraDefines.h:128
@ PROC_HIT_CRITICAL
Definition: SpellMgr.h:253
#define MELEE_BASED_TRIGGER_MASK
Definition: SpellMgr.h:182
@ PROC_EX_INTERNAL_CANT_PROC
Definition: SpellMgr.h:218
@ PROC_EX_INTERNAL_TRIGGERED
Definition: SpellMgr.h:221
@ PROC_FLAG_DONE_PERIODIC
Definition: SpellMgr.h:134
@ EFFECT_2
Definition: SharedDefines.h:33
@ SPELL_ATTR3_INSTANT_TARGET_PROCS
Definition: SharedDefines.h:512
#define EFFECT_ALL
Definition: SharedDefines.h:38
@ SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES
Definition: SharedDefines.h:609
void UpdateCombatSkills(Unit *victim, WeaponAttackType attType, bool defence, Item *item=nullptr)
Definition: PlayerUpdates.cpp:984
Definition: Unit.cpp:16103
Definition: Unit.h:851
void SetProcCooldown(uint32 cooldown)
Definition: Unit.h:885
Unit * GetActionTarget() const
Definition: Unit.h:871
Unit * GetProcTarget() const
Definition: Unit.h:872
bool HandleProcTriggerSpell(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
Definition: Unit.cpp:8921
bool HandleAuraRaidProcFromChargeWithValue(AuraEffect *triggeredByAura)
Definition: Unit.cpp:17816
bool IsHunterPet() const
Definition: Unit.h:1426
bool IsTriggeredAtSpellProcEvent(Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
Definition: Unit.cpp:17677
bool HandleAuraProc(Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
Definition: Unit.cpp:8726
virtual bool HasSpellItemCooldown(uint32, uint32) const
Definition: Unit.h:2433
bool HandleDummyAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
Definition: Unit.cpp:6527
void StartReactiveTimer(ReactiveType reactive)
Definition: Unit.h:2327
bool HandleOverrideClassScriptAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
Definition: Unit.cpp:9869
bool HandleAuraRaidProcFromCharge(AuraEffect *triggeredByAura)
Definition: Unit.cpp:17905
bool IsCharmedOwnedByPlayerOrPlayer() const
Definition: Unit.h:1852
void HandleProcTriggerDamageAuraProc(AuraApplication *aurApp, ProcEventInfo &eventInfo)
Definition: SpellAuraEffects.cpp:7307
SpellModifier * GetSpellModifier() const
Definition: SpellAuraEffects.h:52
Unit * GetUnitOwner() const
Definition: SpellAuras.h:108

References AddComboPoints(), ASSERT, ProcTriggeredData::aura, AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, SpellInfo::CalcCastTime(), Aura::CallScriptAfterCheckProcHandlers(), Aura::CallScriptCheckProcHandlers(), CLASS_HUNTER, CLASS_ROGUE, CLASS_WARRIOR, CONDITION_SOURCE_TYPE_SPELL_PROC, EFFECT_0, EFFECT_1, EFFECT_2, EFFECT_ALL, SpellInfo::Effects, ProcTriggeredData::effMask, FORM_GHOSTWOLF, ProcEventInfo::GetActionTarget(), ProcEventInfo::GetActor(), AuraEffect::GetAmount(), GetAppliedAuras(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), AuraEffect::GetCasterGUID(), getClass(), Aura::GetEffect(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), ProcEventInfo::GetProcTarget(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), AuraEffect::GetSpellModifier(), Object::GetTypeId(), Aura::GetUnitOwner(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandleProcTriggerDamageAuraProc(), HandleProcTriggerSpell(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasSpellItemCooldown(), SpellInfo::Id, IsCharmedOwnedByPlayerOrPlayer(), IsHunterPet(), isNonTriggerAura, Object::IsPlayer(), isTriggerAura, IsTriggeredAtSpellProcEvent(), LOG_DEBUG, Spell::m_appliedMods, Spell::m_weaponItem, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, MELEE_BASED_TRIGGER_MASK, ModifyAuraState(), PROC_EX_ABSORB, PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_INTERNAL_CANT_PROC, PROC_EX_INTERNAL_TRIGGERED, PROC_EX_MISS, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_EX_RESIST, PROC_FLAG_DONE_PERIODIC, PROC_HIT_CRITICAL, PROC_SPELL_PHASE_HIT, REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, REACTIVE_WOLVERINE_BITE, SpellInfo::SchoolMask, sConditionMgr, AuraEffect::SetAmount(), SetCantProc(), ProcEventInfo::SetProcCooldown(), SPELL_ATTR3_INSTANT_TARGET_PROCS, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES, SPELL_AURA_ABILITY_IGNORE_AURASTATE, SPELL_AURA_ADD_FLAT_MODIFIER, SPELL_AURA_ADD_PCT_MODIFIER, SPELL_AURA_DUMMY, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MECHANIC_IMMUNITY, SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_MECHANIC_RESISTANCE, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_MOD_POWER_COST_SCHOOL, SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_STUN, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_DAMAGE, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_AURA_RAID_PROC_FROM_CHARGE, SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_AURA_SPELL_MAGNET, SPELL_AURA_TRANSFORM, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, ProcTriggeredData::spellProcEvent, StartReactiveTimer(), Object::ToPlayer(), Object::ToUnit(), ProcTriggeredData::triggerSpelId, TYPEID_PLAYER, and Player::UpdateCombatSkills().

Referenced by CalcAbsorbResist(), and ProcDamageAndSpell().

◆ processDummyAuras()

float Unit::processDummyAuras ( float  TakenTotalMod) const
private
11897{
11898 // note: old code coming from TC, just extracted here to remove the code duplication + solve potential crash
11899 // see: https://github.com/TrinityCore/TrinityCore/commit/c85710e148d75450baedf6632b9ca6fd40b4148e
11900
11901 // .. taken pct: dummy auras
11902 auto const& mDummyAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
11903 for (auto i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i)
11904 {
11905 if (!(*i) || !(*i)->GetSpellInfo())
11906 {
11907 continue;
11908 }
11909
11910 if (auto spellIconId = (*i)->GetSpellInfo()->SpellIconID)
11911 {
11912 switch (spellIconId)
11913 {
11914 // Cheat Death
11915 case 2109:
11916 if ((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
11917 {
11918 // Patch 2.4.3: The resilience required to reach the 90% damage reduction cap
11919 // is 22.5% critical strike damage reduction, or 444 resilience.
11920 // To calculate for 90%, we multiply the 100% by 4 (22.5% * 4 = 90%)
11921 float mod = -1.0f * GetMeleeCritDamageReduction(400);
11922 AddPct(TakenTotalMod, std::max(mod, float((*i)->GetAmount())));
11923 }
11924 break;
11925 }
11926 }
11927 }
11928 return TakenTotalMod;
11929}

References AddPct(), GetAuraEffectsByType(), GetMeleeCritDamageReduction(), SPELL_AURA_DUMMY, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by MeleeDamageBonusTaken(), and SpellDamageBonusTaken().

◆ ProcessPositionDataChanged()

void Unit::ProcessPositionDataChanged ( PositionFullTerrainStatus const &  data)
overridevirtual

Reimplemented from WorldObject.

4207{
4210}
virtual void ProcessPositionDataChanged(PositionFullTerrainStatus const &data)
Definition: Object.cpp:1163
virtual void ProcessTerrainStatusUpdate()
Definition: Unit.cpp:4212

References WorldObject::ProcessPositionDataChanged(), and ProcessTerrainStatusUpdate().

Referenced by Creature::Create().

◆ ProcessTerrainStatusUpdate()

void Unit::ProcessTerrainStatusUpdate ( )
virtual

Reimplemented in Player.

4213{
4214 if (GetTypeId() == TYPEID_UNIT)
4216
4217 if (IsFlying() || (!IsControlledByPlayer()))
4218 return;
4219
4220 LiquidData const& liquidData = GetLiquidData();
4221
4222 // remove appropriate auras if we are swimming/not swimming respectively
4223 if (liquidData.Status & MAP_LIQUID_STATUS_SWIMMING)
4225 else
4227
4228 // liquid aura handling
4229 LiquidTypeEntry const* curLiquid = nullptr;
4230 if ((liquidData.Status & MAP_LIQUID_STATUS_SWIMMING))
4231 curLiquid = sLiquidTypeStore.LookupEntry(liquidData.Entry);
4232
4233 if (curLiquid != _lastLiquid)
4234 {
4237
4238 // Set _lastLiquid before casting liquid spell to avoid infinite loops
4239 _lastLiquid = curLiquid;
4240
4242 if (curLiquid && curLiquid->SpellId && (!player || !player->IsGameMaster()))
4243 CastSpell(this, curLiquid->SpellId, true);
4244 }
4245}
DBCStorage< LiquidTypeEntry > sLiquidTypeStore(LiquidTypefmt)
@ AURA_INTERRUPT_FLAG_NOT_ABOVEWATER
Definition: SpellDefines.h:51
@ AURA_INTERRUPT_FLAG_NOT_UNDERWATER
Definition: SpellDefines.h:52
void UpdateMovementFlags()
Definition: Creature.cpp:3340
bool IsFlying() const
Definition: Unit.h:2399
Definition: Map.h:171
uint32 Entry
Definition: Map.h:174
Definition: DBCStructure.h:1281
uint32 SpellId
Definition: DBCStructure.h:1287

References _lastLiquid, AURA_INTERRUPT_FLAG_NOT_ABOVEWATER, AURA_INTERRUPT_FLAG_NOT_UNDERWATER, CastSpell(), LiquidData::Entry, GetCharmerOrOwnerPlayerOrPlayerItself(), WorldObject::GetLiquidData(), Object::GetTypeId(), IsControlledByPlayer(), IsFlying(), Player::IsGameMaster(), MAP_LIQUID_STATUS_SWIMMING, RemoveAurasDueToSpell(), RemoveAurasWithInterruptFlags(), sLiquidTypeStore, LiquidTypeEntry::SpellId, LiquidData::Status, Object::ToCreature(), TYPEID_UNIT, and Creature::UpdateMovementFlags().

Referenced by ProcessPositionDataChanged(), and Player::ProcessTerrainStatusUpdate().

◆ ProhibitSpellSchool()

virtual void Unit::ProhibitSpellSchool ( SpellSchoolMask  ,
uint32   
)
inlinevirtual

Reimplemented in Creature, and Player.

2062{ }

Referenced by Spell::EffectInterruptCast().

◆ propagateSpeedChange()

void Unit::propagateSpeedChange ( )
inline

-------—End of Pet responses methods-------—

void propagateSpeedChange()
Definition: MotionMaster.cpp:836

References GetMotionMaster(), and MotionMaster::propagateSpeedChange().

Referenced by SetSpeed(), and SetWalk().

◆ RecalculateObjectScale()

void Unit::RecalculateObjectScale ( )
virtual
17023{
17025 float scale = GetNativeObjectScale() + CalculatePct(1.0f, scaleAuras);
17026 float scaleMin = GetTypeId() == TYPEID_PLAYER ? 0.1f : 0.01f;
17027 SetObjectScale(std::max(scale, scaleMin));
17028}
@ SPELL_AURA_MOD_SCALE_2
Definition: SpellAuraDefines.h:302
@ SPELL_AURA_MOD_SCALE
Definition: SpellAuraDefines.h:124
virtual void SetObjectScale(float scale)
Definition: Object.h:113
virtual float GetNativeObjectScale() const
Definition: Unit.h:2180

References CalculatePct(), GetNativeObjectScale(), GetTotalAuraModifier(), Object::GetTypeId(), Object::SetObjectScale(), SPELL_AURA_MOD_SCALE, SPELL_AURA_MOD_SCALE_2, and TYPEID_PLAYER.

Referenced by AuraEffect::HandleAuraModScale().

◆ RemoveAllAttackers()

void Unit::RemoveAllAttackers ( )
10484{
10485 while (!m_attackers.empty())
10486 {
10487 AttackerSet::iterator iter = m_attackers.begin();
10488 if (!(*iter)->AttackStop())
10489 {
10490 LOG_ERROR("entities.unit", "WORLD: Unit has an attacker that isn't attacking it!");
10491 m_attackers.erase(iter);
10492 }
10493 }
10494}

References LOG_ERROR, and m_attackers.

Referenced by CombatStop(), Spell::EffectSanctuary(), AuraEffect::HandleFeignDeath(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), spell_halion_twilight_phasing::spell_halion_twilight_phasing_AuraScript::OnApply(), spell_halion_twilight_phasing::spell_halion_twilight_phasing_AuraScript::OnRemove(), and npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI().

◆ RemoveAllAuras()

void Unit::RemoveAllAuras ( )
5260{
5261 // this may be a dead loop if some events on aura remove will continiously apply aura on remove
5262 // we want to have all auras removed, so use your brain when linking events
5263 while (!m_appliedAuras.empty() || !m_ownedAuras.empty())
5264 {
5265 AuraApplicationMap::iterator aurAppIter;
5266 for (aurAppIter = m_appliedAuras.begin(); aurAppIter != m_appliedAuras.end();)
5268
5269 AuraMap::iterator aurIter;
5270 for (aurIter = m_ownedAuras.begin(); aurIter != m_ownedAuras.end();)
5271 RemoveOwnedAura(aurIter);
5272 }
5273}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by CleanupBeforeRemoveFromMap(), npc_mograine::npc_mograineAI::DamageTaken(), boss_kiljaeden::boss_kiljaedenAI::DamageTaken(), boss_muru::boss_muruAI::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::npc_crystalline_frayerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), spell_rotface_unstable_ooze_explosion_suicide::spell_rotface_unstable_ooze_explosion_suicide_AuraScript::DespawnSelf(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_taldaram::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), boss_leotheras_the_blind::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), boss_razorgore::boss_razorgoreAI::DoChangePhase(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), boss_mimiron::boss_mimironAI::EnterEvadeMode(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::EnterEvadeMode(), npc_ulduar_vx001::npc_ulduar_vx001AI::EnterEvadeMode(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), hyjalAI::EnterEvadeMode(), LichKingDeathEvent::Execute(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::FinishQuest(), spell_herald_volzaj_insanity::HandleDummyEffect(), misc_commandscript::HandleUnAuraCommand(), boss_ick::boss_ickAI::JustDied(), boss_venoxis::JustDied(), boss_taldaram::JustEngagedWith(), boss_mimiron::boss_mimironAI::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_commander_stoutbeard::boss_commander_stoutbeardAI::JustEngagedWith(), boss_steelbreaker::boss_steelbreakerAI::JustReachedHome(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustReachedHome(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustReachedHome(), boss_urom::boss_uromAI::LeaveCombat(), boss_taldaram::MovementInform(), npc_hallows_end_soh::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), spell_kaelthas_flame_strike::spell_kaelthas_flame_strike_AuraScript::OnRemove(), PretendToDie(), Creature::RemoveCorpse(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::Reset(), boss_venoxis::Reset(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_bjarngrim::boss_bjarngrimAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_hodir::boss_hodirAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_skadi::boss_skadiAI::Reset(), boss_skadi_grauf::boss_skadi_graufAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), Pet::SavePetToDB(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), npc_harrison_jones::npc_harrison_jonesAI::SpellHit(), npc_frost_sphere::npc_frost_sphereAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_magus_telestra::boss_magus_telestraAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), and npc_aeranas::npc_aeranasAI::UpdateAI().

◆ RemoveAllAurasExceptType()

void Unit::RemoveAllAurasExceptType ( AuraType  type)
5334{
5335 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5336 {
5337 Aura const* aura = iter->second->GetBase();
5338 if (aura->GetSpellInfo()->HasAura(type))
5339 ++iter;
5340 else
5342 }
5343
5344 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5345 {
5346 Aura* aura = iter->second;
5347 if (aura->GetSpellInfo()->HasAura(type))
5348 ++iter;
5349 else
5351 }
5352}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), SpellInfo::HasAura(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), spell_q11919_q11940_drake_hunt::spell_q11919_q11940_drake_hunt_AuraScript::HandleEffectRemove(), and npc_iron_watcher::npc_iron_watcherAI::SpellHit().

◆ RemoveAllAurasOnDeath()

void Unit::RemoveAllAurasOnDeath ( )
5290{
5291 // used just after dieing to remove all visible auras
5292 // and disable the mods for the passive ones
5293 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5294 {
5295 Aura const* aura = iter->second->GetBase();
5298 else
5299 ++iter;
5300 }
5301
5302 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5303 {
5304 Aura* aura = iter->second;
5307 else
5308 ++iter;
5309 }
5310}
@ AURA_REMOVE_BY_DEATH
Definition: SpellAuraDefines.h:396
@ SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD
Definition: SharedDefines.h:643
bool IsDeathPersistent() const
Definition: SpellAuras.cpp:1101

References _UnapplyAura(), AURA_REMOVE_BY_DEATH, Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsDeathPersistent(), Aura::IsPassive(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), and SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD.

Referenced by spell_dk_death_pact::FilterTargets(), Kill(), Player::LoadFromDB(), and setDeathState().

◆ RemoveAllAurasRequiringDeadTarget()

void Unit::RemoveAllAurasRequiringDeadTarget ( )
5313{
5314 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5315 {
5316 Aura const* aura = iter->second->GetBase();
5317 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5319 else
5320 ++iter;
5321 }
5322
5323 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5324 {
5325 Aura* aura = iter->second;
5326 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5328 else
5329 ++iter;
5330 }
5331}
bool IsRequiringDeadTarget() const
Definition: SpellInfo.cpp:1209

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), Aura::IsPassive(), SpellInfo::IsRequiringDeadTarget(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by Player::LoadFromDB().

◆ RemoveAllControlled()

void Unit::RemoveAllControlled ( bool  onDeath = false)
11081{
11082 // possessed pet and vehicle
11083 if (GetTypeId() == TYPEID_PLAYER)
11085
11086 while (!m_Controlled.empty())
11087 {
11088 Unit* target = *m_Controlled.begin();
11089 m_Controlled.erase(m_Controlled.begin());
11090 if (target->GetCharmerGUID() == GetGUID())
11091 {
11092 target->RemoveCharmAuras();
11093 }
11094 else if (target->GetOwnerGUID() == GetGUID() && target->IsSummon())
11095 {
11096 if (!(onDeath && !IsPlayer() && target->IsGuardian()))
11097 {
11098 target->ToTempSummon()->UnSummon();
11099 }
11100 }
11101 else
11102 {
11103 LOG_ERROR("entities.unit", "Unit {} is trying to release unit {} which is neither charmed nor owned by it", GetEntry(), target->GetEntry());
11104 }
11105 }
11106}
void StopCastingCharm(Aura *except=nullptr)
Definition: Player.cpp:9207
bool IsGuardian() const
Definition: Unit.h:1423
void RemoveCharmAuras()
Definition: Unit.cpp:11191

References GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), Object::GetTypeId(), IsGuardian(), Object::IsPlayer(), IsSummon(), LOG_ERROR, m_Controlled, RemoveCharmAuras(), Player::StopCastingCharm(), Object::ToPlayer(), ToTempSummon(), TYPEID_PLAYER, and TempSummon::UnSummon().

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ RemoveAllDynObjects()

void Unit::RemoveAllDynObjects ( )
6102{
6103 while (!m_dynObj.empty())
6104 m_dynObj.front()->Remove();
6105}

References m_dynObj.

Referenced by RemoveFromWorld(), Player::TeleportTo(), and npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI().

◆ RemoveAllGameObjects()

void Unit::RemoveAllGameObjects ( )
6202{
6203 while(!m_gameObj.empty())
6204 {
6205 GameObject* go = ObjectAccessor::GetGameObject(*this, *m_gameObj.begin());
6206 if(go)
6207 {
6209 go->SetRespawnTime(0);
6210 go->Delete();
6211 }
6212 m_gameObj.erase(m_gameObj.begin());
6213 }
6214}
void Delete()
Definition: GameObject.cpp:976
void SetRespawnTime(int32 respawn)
Definition: GameObject.cpp:1301

References GameObject::Delete(), ObjectGuid::Empty, ObjectAccessor::GetGameObject(), m_gameObj, GameObject::SetOwnerGUID(), and GameObject::SetRespawnTime().

Referenced by CleanupBeforeRemoveFromMap(), npc_ice_tomb::npc_ice_tombAI::JustDied(), RemoveFromWorld(), npc_brewfest_super_brew_trigger::UpdateAI(), and boss_sapphiron::boss_sapphironAI::UpdateAI().

◆ RemoveAllMinionsByEntry()

void Unit::RemoveAllMinionsByEntry ( uint32  entry)
10858{
10859 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
10860 {
10861 Unit* unit = *itr;
10862 ++itr;
10863 if (unit->GetEntry() == entry && unit->GetTypeId() == TYPEID_UNIT
10864 && unit->ToCreature()->IsSummon()) // minion, actually
10865 unit->ToTempSummon()->UnSummon();
10866 // i think this is safe because i have never heard that a despawned minion will trigger a same minion
10867 }
10868}

References Object::GetEntry(), Object::GetTypeId(), IsSummon(), m_Controlled, Object::ToCreature(), ToTempSummon(), TYPEID_UNIT, and TempSummon::UnSummon().

Referenced by Player::ApplyEquipSpell(), Spell::EffectSummonType(), npc_nelson::npc_nelsonAI::Reset(), SetMinion(), and npc_nelson::npc_nelsonAI::UpdateAI().

◆ RemoveAppliedAuras() [1/2]

void Unit::RemoveAppliedAuras ( std::function< bool(AuraApplication const *)> const &  check)
4817{
4818 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
4819 {
4820 if (check(iter->second))
4821 {
4822 RemoveAura(iter);
4823 continue;
4824 }
4825 ++iter;
4826 }
4827}

References m_appliedAuras, and RemoveAura().

Referenced by RemoveArenaAuras().

◆ RemoveAppliedAuras() [2/2]

void Unit::RemoveAppliedAuras ( uint32  spellId,
std::function< bool(AuraApplication const *)> const &  check 
)
4843{
4844 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
4845 {
4846 if (check(iter->second))
4847 {
4848 RemoveAura(iter);
4849 continue;
4850 }
4851 ++iter;
4852 }
4853}

References m_appliedAuras, and RemoveAura().

◆ RemoveAreaAurasDueToLeaveWorld()

void Unit::RemoveAreaAurasDueToLeaveWorld ( )
5227{
5228 // make sure that all area auras not applied on self are removed - prevent access to deleted pointer later
5229 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5230 {
5231 Aura* aura = iter->second;
5232 ++iter;
5233 Aura::ApplicationMap const& appMap = aura->GetApplicationMap();
5234 for (Aura::ApplicationMap::const_iterator itr = appMap.begin(); itr != appMap.end();)
5235 {
5236 AuraApplication* aurApp = itr->second;
5237 ++itr;
5238 Unit* target = aurApp->GetTarget();
5239 if (target == this)
5240 continue;
5241 target->RemoveAura(aurApp);
5242 // things linked on aura remove may apply new area aura - so start from the beginning
5243 iter = m_ownedAuras.begin();
5244 }
5245 }
5246
5247 // remove area auras owned by others
5248 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5249 {
5250 if (iter->second->GetBase()->GetOwner() != this)
5251 {
5252 RemoveAura(iter);
5253 }
5254 else
5255 ++iter;
5256 }
5257}
ApplicationMap const & GetApplicationMap()
Definition: SpellAuras.h:181
std::map< ObjectGuid, AuraApplication * > ApplicationMap
Definition: SpellAuras.h:90

References Aura::GetApplicationMap(), AuraApplication::GetTarget(), m_appliedAuras, m_ownedAuras, and RemoveAura().

Referenced by RemoveFromWorld().

◆ RemoveArenaAuras()

void Unit::RemoveArenaAuras ( )
5276{
5277 // in join, remove positive buffs, on end, remove negative
5278 // used to remove positive visible auras in arenas
5279 RemoveAppliedAuras([](AuraApplication const* aurApp)
5280 {
5281 Aura const* aura = aurApp->GetBase();
5282 return (!aura->GetSpellInfo()->HasAttribute(SPELL_ATTR4_ALLOW_ENETRING_ARENA) // don't remove stances, shadowform, pally/hunter auras
5283 && !aura->IsPassive() // don't remove passive auras
5284 && (aurApp->IsPositive() || !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD))) || // not negative death persistent auras
5285 aura->GetSpellInfo()->HasAttribute(SPELL_ATTR5_REMOVE_ENTERING_ARENA); // special marker, always remove
5286 });
5287}
@ SPELL_ATTR5_REMOVE_ENTERING_ARENA
Definition: SharedDefines.h:569
@ SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD
Definition: SharedDefines.h:513
@ SPELL_ATTR4_ALLOW_ENETRING_ARENA
Definition: SharedDefines.h:551
void RemoveAppliedAuras(std::function< bool(AuraApplication const *)> const &check)
Definition: Unit.cpp:4816
bool IsPositive() const
Definition: SpellAuras.h:68

References AuraApplication::GetBase(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsPassive(), AuraApplication::IsPositive(), RemoveAppliedAuras(), SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD, SPELL_ATTR4_ALLOW_ENETRING_ARENA, and SPELL_ATTR5_REMOVE_ENTERING_ARENA.

Referenced by Player::TeleportTo().

◆ RemoveAura() [1/4]

void Unit::RemoveAura ( Aura aur,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4796{
4797 if (aura->IsRemoved())
4798 return;
4799 if (AuraApplication* aurApp = aura->GetApplicationOfTarget(GetGUID()))
4800 RemoveAura(aurApp, mode);
4801}

References Aura::GetApplicationOfTarget(), Object::GetGUID(), Aura::IsRemoved(), and RemoveAura().

◆ RemoveAura() [2/4]

void Unit::RemoveAura ( AuraApplication aurApp,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4753{
4754 // we've special situation here, RemoveAura called while during aura removal
4755 // this kind of call is needed only when aura effect removal handler
4756 // or event triggered by it expects to remove
4757 // not yet removed effects of an aura
4758 if (aurApp->GetRemoveMode())
4759 {
4760 // remove remaining effects of an aura
4761 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4762 {
4763 if (aurApp->HasEffect(itr))
4764 aurApp->_HandleEffect(itr, false);
4765 }
4766 return;
4767 }
4768 // no need to remove
4769 if (aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) != aurApp || aurApp->GetBase()->IsRemoved())
4770 return;
4771
4772 uint32 spellId = aurApp->GetBase()->GetId();
4773 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4774
4775 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4776 {
4777 if (aurApp == iter->second)
4778 {
4779 // Prevent Arena Preparation aura from being removed by player actions
4780 // It's an invisibility spell so any interaction/spell cast etc. removes it.
4781 // Should only be removed by the arena script, once the match starts.
4783 {
4784 return;
4785 }
4786
4787 RemoveAura(iter, mode);
4788 return;
4789 }
4790 else
4791 ++iter;
4792 }
4793}
@ SPELL_AURA_ARENA_PREPARATION
Definition: SpellAuraDefines.h:278

References AuraApplication::_HandleEffect(), Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), AuraApplication::GetRemoveMode(), AuraApplication::HasEffect(), Aura::HasEffectType(), Aura::IsRemoved(), m_appliedAuras, MAX_SPELL_EFFECTS, RemoveAura(), and SPELL_AURA_ARENA_PREPARATION.

◆ RemoveAura() [3/4]

void Unit::RemoveAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4723{
4724 AuraApplication* aurApp = i->second;
4725 // Do not remove aura which is already being removed
4726 if (aurApp->GetRemoveMode())
4727 return;
4728 Aura* aura = aurApp->GetBase();
4729 _UnapplyAura(i, mode);
4730 // Remove aura - for Area and Target auras
4731 if (aura->GetOwner() == this)
4732 aura->Remove(mode);
4733}

References _UnapplyAura(), AuraApplication::GetBase(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), and Aura::Remove().

Referenced by _RemoveNoStackAurasDueToAura(), boss_marli::_schedulePhaseTroll(), ApplySpellDispelImmunity(), Player::CheckAreaExploreAndOutdoor(), boss_gyth::boss_gythAI::DamageTaken(), boss_headless_horseman::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_hor_lich_king::npc_hor_lich_kingAI::DoAction(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_paletress::boss_paletressAI::DoAction(), boss_vezax::boss_vezaxAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DoAction(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::DoAction(), boss_yoggsaron_constrictor_tentacle::boss_yoggsaron_constrictor_tentacleAI::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), Player::DuelComplete(), Spell::EffectDispelMechanic(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectSummonPet(), Spell::EffectTriggerSpell(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), GetDiseasesByCaster(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_q12096_q12092_bark::spell_q12096_q12092_bark_SpellScript::HandleDummy(), HandleDummyAuraProc(), spell_valanar_kinetic_bomb::spell_valanar_kinetic_bomb_AuraScript::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_midsummer_ribbon_pole::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), spell_dk_presence::HandleEffectRemove(), spell_pal_blessing_of_sanctuary::HandleEffectRemove(), spell_sha_chain_heal::HandleHeal(), spell_sindragosa_frost_breath::spell_sindragosa_frost_breath_SpellScript::HandleInfusion(), spell_warl_demonic_circle_summon::HandleRemove(), spell_putricide_eat_ooze::spell_putricide_eat_ooze_SpellScript::HandleScript(), AuraEffect::HandleShapeshiftBoosts(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_jaraxxus::boss_jaraxxusAI::JustEngagedWith(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::JustEngagedWith(), npc_ulduar_snow_mound::MoveInLineOfSight(), spell_blood_queen_vampiric_bite::spell_blood_queen_vampiric_bite_SpellScript::OnCast(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), npc_essence_of_twin::OnGossipHello(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_yogg_saron_empowered::spell_yogg_saron_empowered_AuraScript::OnPeriodic(), npc_thrall_bfu::OnQuestReward(), npc_vortex_ride::npc_vortex_rideAI::PassengerBoarded(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::PassengerBoarded(), npc_eastvale_peasent::PathEndReached(), BattlefieldWG::PromotePlayer(), RemoveAppliedAuras(), RemoveAreaAurasDueToLeaveWorld(), RemoveAura(), RemoveAurasByShapeShift(), RemoveAurasByType(), RemoveAurasDueToItemSpell(), RemoveAurasDueToSpell(), RemoveAurasWithAttribute(), RemoveAurasWithFamily(), RemoveAurasWithInterruptFlags(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), BattlegroundIC::RemovePlayer(), BattlegroundMap::RemovePlayerFromMap(), boss_bjarngrim::boss_bjarngrimAI::RemoveStanceAura(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_marli::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), NPCStaveQuestAI::ResetState(), boss_anomalus::boss_anomalusAI::SetData(), boss_hodir::boss_hodirAI::SmallIcicles(), boss_malygos::boss_malygosAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), boss_headless_horseman::SpellHit(), boss_viscidus::SpellHit(), spell_pal_hand_of_sacrifice_aura::Split(), boss_sartharion_shadron::boss_sartharion_shadronAI::SummonedCreatureDies(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_harrison_jones::npc_harrison_jonesAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_viscidus::UpdateAI(), boss_taldaram::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), npc_akama_shade::UpdateAI(), boss_ahune::UpdateAI(), Spell::UpdateChanneledTargetList(), and boss_bjarngrim::boss_bjarngrimAI::WaypointReached().

◆ RemoveAura() [4/4]

void Unit::RemoveAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4736{
4737 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4738 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4739 {
4740 Aura const* aura = iter->second->GetBase();
4741 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4742 && (!caster || aura->GetCasterGUID() == caster))
4743 {
4744 RemoveAura(iter, removeMode);
4745 return;
4746 }
4747 else
4748 ++iter;
4749 }
4750}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

◆ RemoveAuraFromStack()

void Unit::RemoveAuraFromStack ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4872{
4873 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4874 for (AuraMap::iterator iter = range.first; iter != range.second;)
4875 {
4876 Aura* aura = iter->second;
4877 if ((aura->GetType() == UNIT_AURA_TYPE)
4878 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
4879 {
4880 aura->ModStackAmount(-1, removeMode);
4881 return;
4882 }
4883 else
4884 ++iter;
4885 }
4886}
@ UNIT_AURA_TYPE
Definition: SpellAuraDefines.h:385
bool ModStackAmount(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT, bool periodicReset=false)
Definition: SpellAuras.cpp:1035
AuraObjectType GetType() const
Definition: SpellAuras.cpp:481

References Aura::GetCasterGUID(), Aura::GetType(), m_ownedAuras, Aura::ModStackAmount(), and UNIT_AURA_TYPE.

Referenced by Spell::EffectSchoolDMG(), HandleAuraProc(), HandleDummyAuraProc(), spell_putricide_gaseous_bloat::spell_putricide_gaseous_bloat_AuraScript::HandleExtraEffect(), spell_oculus_evasive_maneuvers::spell_oculus_evasive_maneuvers_AuraScript::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_item_brittle_armor::HandleScript(), spell_item_mercurial_shield::HandleScript(), boss_viscidus::SpellHit(), boss_archimonde::boss_archimondeAI::UnleashSoulCharge(), and boss_selin_fireheart::UpdateAI().

◆ RemoveAurasByShapeShift()

void Unit::RemoveAurasByShapeShift ( )
5211{
5212 uint32 mechanic_mask = (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT);
5213 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5214 {
5215 Aura const* aura = iter->second->GetBase();
5216 if ((aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask) &&
5218 {
5219 RemoveAura(iter);
5220 continue;
5221 }
5222 ++iter;
5223 }
5224}
@ SPELL_ATTR0_CU_AURA_CC
Definition: SpellInfo.h:181
uint32 GetAllEffectsMechanicMask() const
Definition: SpellInfo.cpp:1979

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), m_appliedAuras, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), SPELL_ATTR0_CU_AURA_CC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by AuraEffect::HandleAuraModShapeshift().

◆ RemoveAurasByType()

void Unit::RemoveAurasByType ( AuraType  auraType,
ObjectGuid  casterGUID = ObjectGuid::Empty,
Aura except = nullptr,
bool  negative = true,
bool  positive = true 
)
5046{
5047 // simple check if list is empty
5048 if (m_modAuras[auraType].empty())
5049 return;
5050
5051 for (AuraEffectList::iterator iter = m_modAuras[auraType].begin(); iter != m_modAuras[auraType].end();)
5052 {
5053 Aura* aura = (*iter)->GetBase();
5055
5056 ++iter;
5057 if (aura != except && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5058 && ((negative && !aurApp->IsPositive()) || (positive && aurApp->IsPositive())))
5059 {
5060 uint32 removedAuras = m_removedAurasCount;
5061 RemoveAura(aurApp);
5062 if (m_removedAurasCount > removedAuras + 1)
5063 iter = m_modAuras[auraType].begin();
5064 }
5065 }
5066}

References Aura::GetApplicationOfTarget(), Aura::GetCasterGUID(), Object::GetGUID(), AuraApplication::IsPositive(), m_modAuras, m_removedAurasCount, and RemoveAura().

Referenced by _ApplyAura(), _EnterVehicle(), Spell::_handle_finish_phase(), Player::ActivateTaxiPathTo(), Battleground::AddPlayer(), Attack(), spell_gen_summon_tournament_mount::CheckIfLanceEquiped(), ClearComboPoints(), Player::ContinueTaxiFlight(), boss_kologarn_arms::boss_kologarn_armsAI::DamageTaken(), Spell::DoSpellHitOnUnit(), Spell::EffectPowerBurn(), Spell::EffectSanctuary(), Spell::EffectTriggerSpell(), BattlegroundWS::EventPlayerClickedOnFlag(), ExitVehicle(), WorldSession::HandleAuctionHelloOpcode(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItemsEvent(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraModStateImmunity(), AuraEffect::HandleAuraMounted(), AuraEffect::HandleAuraTransform(), WorldSession::HandleBankerActivateOpcode(), WorldSession::HandleBinderActivateOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleBuyStableSlot(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_item_reindeer_transformation::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), HandleDummyAuraProc(), spell_hydross_mark_of_hydross::HandleEffectApply(), WorldSession::HandleGossipSelectOptionOpcode(), spell_finger_of_death::spell_finger_of_death_SpellScript::HandleHit(), spell_hand_of_death::spell_hand_of_death_SpellScript::HandleHit(), WorldSession::HandleListStabledPetsOpcode(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), WorldSession::HandleMoveWorldportAck(), spell_oculus_rider_aura::spell_oculus_rider_auraAuraScript::HandleOnEffectApply(), spell_algalon_remove_phase::spell_algalon_remove_phase_AuraScript::HandlePeriodic(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSaveGuildEmblemOpcode(), spell_gen_mine_sweeper::HandleSchoolDMG(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSpiritHealerActivateOpcode(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleTabardVendorActivateOpcode(), WorldSession::HandleTalentWipeConfirmOpcode(), WorldSession::HandleTaxiQueryAvailableNodes(), WorldSession::HandleTrainerBuySpellOpcode(), WorldSession::HandleUnstablePet(), Player::LeaveBattleground(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), spell_gen_aura_service_uniform::OnApply(), Player::ProcessDelayedOperations(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Vehicle::RemoveAllPassengers(), RemoveBindSightAuras(), RemoveCharmAuras(), Battleground::RemovePlayerAtLeave(), WorldSession::SendDoFlight(), WorldSession::SendListInventory(), Player::SendLoot(), WorldSession::SendTrainerList(), SetCharmedBy(), Player::StopCastingCharm(), Player::TeleportTo(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_gurtogg_bloodboil::boss_gurtogg_bloodboilAI::UpdateAI(), GameObject::Use(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ RemoveAurasDueToItemSpell()

void Unit::RemoveAurasDueToItemSpell ( uint32  spellId,
ObjectGuid  castItemGuid 
)
5032{
5033 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
5034 {
5035 if (iter->second->GetBase()->GetCastItemGUID() == castItemGuid)
5036 {
5037 RemoveAura(iter);
5038 iter = m_appliedAuras.lower_bound(spellId);
5039 }
5040 else
5041 ++iter;
5042 }
5043}

References m_appliedAuras, and RemoveAura().

Referenced by Player::ApplyEnchantment(), and Player::ApplyEquipSpell().

◆ RemoveAurasDueToSpell()

void Unit::RemoveAurasDueToSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4856{
4857 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
4858 {
4859 Aura const* aura = iter->second->GetBase();
4860 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4861 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
4862 {
4863 RemoveAura(iter, removeMode);
4864 iter = m_appliedAuras.lower_bound(spellId);
4865 }
4866 else
4867 ++iter;
4868 }
4869}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

Referenced by Spell::_cast(), Player::_removeTalentAurasAndSpells(), Player::ActivateSpec(), Vehicle::AddPassenger(), spell_commander_sarannis_arcane_devastation::AfterApply(), spell_dru_feral_swiftness::AfterRemove(), spell_dru_barkskin::AfterRemove(), spell_dru_savage_roar_aura::AfterRemove(), spell_dru_survival_instincts_aura::AfterRemove(), Player::ApplyEquipSpell(), boss_hakkar::boss_hakkarAI::ApplyHakkarPowerStacks(), boss_buru::ChaseNewVictim(), spell_eredar_twins_handle_touch::spell_eredar_twins_handle_touch_SpellScript::CheckCast(), boss_volazj::CheckPhaseMinions(), spell_botanica_shift_form::spell_botanica_shift_form_AuraScript::CheckProc(), spell_mage_burning_determination::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), Player::CleanupAfterTaxiFlight(), AuraEffect::CleanupTriggeredSpells(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), spell_ruby_sanctum_rallying_shout::spell_ruby_sanctum_rallying_shout_SpellScript::CountAllies(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_buru::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_leotheras_the_blind::DemonTime(), Player::DestroyItem(), npc_drakonid_spawner::DoAction(), npc_twilight_volunteer::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_illidan_stormrage::boss_illidan_stormrageAI::DoAction(), npc_pet_gen_argent_pony_bridle::DoAction(), InstanceScript::DoRemoveAurasDueToSpellOnPlayers(), Spell::DoTriggersOnSpellHit(), Spell::EffectApplyGlyph(), Spell::EffectHeal(), Spell::EffectRemoveAura(), Spell::EffectSchoolDMG(), boss_zuljin::boss_zuljinAI::EnterPhase(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), BattleExperienceEvent::Execute(), SendEncounterUnit::Execute(), FrostBombExplosion::Execute(), AuraRemoveEvent::Execute(), spell_sindragosa_ice_tomb::spell_sindragosa_ice_tomb_AuraScript::ExtraRemoveEffect(), spell_warr_improved_spell_reflection_trigger::FilterTargets(), lfg::LFGMgr::FinishDungeon(), spell_dru_berserk::HandleAfterCast(), spell_capacitus_polarity_charge_aura::HandleAfterRemove(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), boss_janalai::boss_janalaiAI::HandleBombSequence(), spell_moroes_vanish::HandleDummy(), spell_q13007_iron_colossus::spell_q13007_iron_colossus_SpellScript::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_halion_twilight_division::spell_halion_twilight_division_SpellScript::HandleDummy(), spell_putricide_ooze_eruption_searcher::spell_putricide_ooze_eruption_searcher_SpellScript::HandleDummy(), spell_warhead_detonate::spell_warhead_detonate_SpellScript::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), HandleDummyAuraProc(), spell_shadowfang_keep_forsaken_skills::spell_shadowfang_keep_forsaken_skills_AuraScript::HandleDummyTick(), spell_oculus_soar::spell_oculus_soarAuraScript::HandleEffectPeriodic(), spell_q12730_quenching_mist::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_mc_play_dead::spell_mc_play_dead_AuraScript::HandleEffectRemove(), spell_reliquary_of_souls_aura_of_suffering::spell_reliquary_of_souls_aura_of_suffering_AuraScript::HandleEffectRemove(), spell_serpentshrine_cavern_coilfang_water::HandleEffectRemove(), spell_q10769_dissension_amongst_the_ranks_aura::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), spell_midsummer_fling_torch::HandleFinish(), gm_commandscript::HandleGMVisibleCommand(), spell_oculus_drake_flag::spell_oculus_drake_flagAuraScript::HandleOnEffectApply(), spell_oculus_rider_aura::spell_oculus_rider_auraAuraScript::HandleOnEffectRemove(), spell_transitus_shield_beam::spell_transitus_shield_beam_AuraScript::HandleOnEffectRemove(), OPvPCapturePointZM_GraveYard::HandleOpenGo(), spell_hadronox_summon_periodic::spell_hadronox_summon_periodic_AuraScript::HandlePeriodic(), spell_algalon_phase_punch::spell_algalon_phase_punch_AuraScript::HandlePeriodic(), spell_algalon_remove_phase::spell_algalon_remove_phase_AuraScript::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), OutdoorPvPEP::HandlePlayerLeaveZone(), OutdoorPvPHP::HandlePlayerLeaveZone(), OutdoorPvPNA::HandlePlayerLeaveZone(), OutdoorPvPSI::HandlePlayerLeaveZone(), OutdoorPvPTF::HandlePlayerLeaveZone(), OutdoorPvPZM::HandlePlayerLeaveZone(), spell_gen_consume::HandleProc(), spell_zereketh_seed_of_corruption::HandleProc(), spell_pri_t4_4p_bonus::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), spell_icc_harvest_blight_specimen::spell_icc_harvest_blight_specimen_SpellScript::HandleQuestComplete(), spell_felmyst_fog_of_corruption_charm::spell_felmyst_fog_of_corruption_charm_AuraScript::HandleRemove(), spell_kiljaeden_vengeance_of_the_blue_flight::spell_kiljaeden_vengeance_of_the_blue_flight_AuraScript::HandleRemove(), spell_dru_enrage::HandleRemove(), spell_pal_divine_intervention::HandleRemove(), spell_pal_avenging_wrath::HandleRemove(), spell_rog_killing_spree::spell_rog_killing_spree_AuraScript::HandleRemove(), spell_warr_vigilance::HandleRemove(), WorldSession::HandleRemoveGlyph(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_putricide_clear_aura_effect_value::spell_putricide_clear_aura_effect_value_SpellScript::HandleScript(), spell_the_lich_king_jump::spell_the_lich_king_jump_SpellScript::HandleScript(), spell_the_lich_king_jump_remove_aura::spell_the_lich_king_jump_SpellScript::HandleScript(), spell_icc_harvest_blight_specimen::spell_icc_harvest_blight_specimen_SpellScript::HandleScript(), spell_festergut_pungent_blight::spell_festergut_pungent_blight_SpellScript::HandleScript(), spell_festergut_gastric_bloat::spell_festergut_gastric_bloat_SpellScript::HandleScript(), spell_putricide_unbound_plague::spell_putricide_unbound_plague_SpellScript::HandleScript(), spell_putricide_eat_ooze::spell_putricide_eat_ooze_SpellScript::HandleScript(), spell_rotface_little_ooze_combine::spell_rotface_little_ooze_combine_SpellScript::HandleScript(), spell_rotface_large_ooze_combine::spell_rotface_large_ooze_combine_SpellScript::HandleScript(), spell_rotface_large_ooze_buff_combine::spell_rotface_large_ooze_buff_combine_SpellScript::HandleScript(), spell_q10651_q10692_book_of_fel_names::HandleScript(), spell_black_template_free_friend::spell_black_template_free_friend_SpellScript::HandleScriptEffect(), spell_halion_clear_debuffs::spell_halion_clear_debuffs_SpellScript::HandleScriptEffect(), spell_q12823_remove_collapsing_cave_aura::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), spell_capacitus_polarity_charge::HandleTargets(), misc_commandscript::HandleUnAuraCommand(), misc_commandscript::HandleUnFreezeCommand(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), npc_underbog_mushroom::InitializeAI(), npc_demon_chain::JustDied(), boss_azuregos::boss_azuregosAI::JustDied(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::JustDied(), boss_bronjahm::boss_bronjahmAI::JustEngagedWith(), boss_doomwalker::boss_doomwalkerAI::JustEngagedWith(), boss_gruul::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_buru::JustEngagedWith(), boss_gal_darah::boss_gal_darahAI::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_hydross_the_unstable::JustReachedHome(), boss_garfrost::boss_garfrostAI::MovementInform(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::MovementInform(), boss_felmyst::boss_felmystAI::MovementInform(), boss_kaelthas::boss_kaelthasAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), spell_halion_twilight_realm::spell_halion_twilight_realm_AuraScript::OnApply(), spell_halion_leave_twilight_realm::spell_halion_leave_twilight_realm_AuraScript::OnApply(), spell_systems_shutdown::spell_systems_shutdown_AuraScript::OnApply(), npc_chesspiece::OnCharmed(), npc_eye_of_acherus::OnCharmed(), npc_aged_dying_ancient_kodo::OnGossipHello(), lfg::LFGPlayerScript::OnMapChanged(), spell_yogg_saron_empowered::spell_yogg_saron_empowered_AuraScript::OnPeriodic(), spell_gen_curse_of_pain::OnPeriodic(), spell_illidan_demon_transform2::spell_illidan_demon_transform2_AuraScript::OnPeriodic(), BattlefieldWG::OnPlayerLeaveZone(), boss_shade_of_aran::OnPowerUpdate(), spell_halion_combustion_consumption::spell_halion_combustion_consumption_AuraScript::OnRemove(), spell_halion_leave_twilight_realm::spell_halion_leave_twilight_realm_AuraScript::OnRemove(), spell_algalon_phase_punch::spell_algalon_phase_punch_AuraScript::OnRemove(), spell_load_into_catapult::spell_load_into_catapult_AuraScript::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), spell_hun_ascpect_of_the_viper::OnRemove(), spell_hun_viper_attack_speed::OnRemove(), spell_item_with_mount_speed::OnRemove(), spell_item_desperate_defense::OnRemove(), spell_item_shadowmourne::OnRemove(), spell_item_shadowmourne_soul_fragment::OnRemove(), spell_mage_combustion_proc::OnRemove(), spell_item_shadowmourne_soul_fragment::OnStackChange(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::PassengerBoarded(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::PassengerBoarded(), boss_jeklik::PathEndReached(), spell_fight_fire_bomber::spell_fight_fire_bomber_SpellScript::PrepareSpellScript(), ProcessTerrainStatusUpdate(), spell_gen_defend::RefreshVisualShields(), RemoveAurasDueToSpellByDispel(), BattlefieldWG::RemoveAurasFromPlayer(), boss_festergut::boss_festergutAI::RemoveBlight(), spell_warl_health_funnel::RemoveEffect(), RemoveGameObject(), BattlegroundAV::RemovePlayer(), Battleground::RemovePlayerFromResurrectQueue(), boss_keristrasza::boss_keristraszaAI::RemovePrison(), Pet::removeSpell(), Player::removeSpell(), spell_gen_eject_all_passengers::RemoveVehicleAuras(), spell_gen_defend::RemoveVisualShields(), boss_malchezaar::Reset(), npc_mograine::npc_mograineAI::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), boss_twilight_corrupter::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_thekal::Reset(), boss_cthun::Reset(), boss_viscidus::Reset(), boss_halion::boss_halionAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_leotheras_the_blind::Reset(), boss_lethon::boss_lethonAI::Reset(), boss_taerar::boss_taerarAI::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), Player::ResurrectPlayer(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_magtheridon::ScheduleCombatEvents(), boss_supremus::SchedulePhase(), boss_laj::ScheduleTasks(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), OPvPCapturePointZM_GraveYard::SetBeaconState(), boss_hydross_the_unstable::SetForm(), Player::SetGMVisible(), boss_mandokir::boss_mandokirAI::SetGUID(), Player::SetIsSpectator(), SetModelVisible(), boss_viscidus::SoftReset(), boss_ossirian::SpellHit(), npc_omen::npc_omenAI::SpellHit(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), boss_moorabi::boss_moorabiAI::SpellHitTarget(), boss_festergut::boss_festergutAI::SpellHitTarget(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_cthun::SummonedCreatureDies(), npc_kiljaeden_controller::npc_kiljaeden_controllerAI::SummonedCreatureDies(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonedCreatureDies(), boss_anzu::SummonedCreatureDies(), boss_viscidus::SummonedCreatureDies(), boss_terestian_illhoof::SummonKilrek(), Player::SummonPet(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), boss_netherspite::SwitchToBanishPhase(), boss_netherspite::SwitchToPortalPhase(), Totem::UnSummon(), spell_black_temple_spell_absorption::spell_black_temple_spell_absorption_AuraScript::Update(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_eye_of_acherus::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), npc_singularity::npc_singularityAI::UpdateAI(), boss_nalorakk::boss_nalorakkAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_moam::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_freya_lifebinder::boss_freya_lifebinderAI::UpdateAI(), boss_freya_healthy_spore::boss_freya_healthy_sporeAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_anzu::UpdateAI(), boss_alar::boss_alarAI::UpdateAI(), boss_kaelthas::boss_kaelthasAI::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_darting_hatchling::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ RemoveAurasDueToSpellByDispel()

void Unit::RemoveAurasDueToSpellByDispel ( uint32  spellId,
uint32  dispellerSpellId,
ObjectGuid  casterGUID,
Unit dispeller,
uint8  chargesRemoved = 1 
)
4889{
4890 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4891 for (AuraMap::iterator iter = range.first; iter != range.second;)
4892 {
4893 Aura* aura = iter->second;
4894 if (aura->GetCasterGUID() == casterGUID)
4895 {
4896 DispelInfo dispelInfo(dispeller, dispellerSpellId, chargesRemoved);
4897
4898 // Call OnDispel hook on AuraScript
4899 aura->CallScriptDispel(&dispelInfo);
4900
4902 aura->ModCharges(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
4903 else
4904 aura->ModStackAmount(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
4905
4906 // Call AfterDispel hook on AuraScript
4907 aura->CallScriptAfterDispel(&dispelInfo);
4908
4909 switch (aura->GetSpellInfo()->SpellFamilyName)
4910 {
4911 case SPELLFAMILY_HUNTER:
4912 {
4913 // Noxious Stings
4914 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x1000)
4915 {
4916 if (Unit* caster = aura->GetCaster())
4917 {
4918 if (AuraEffect* aureff = caster->GetAuraEffect(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_HUNTER, 3521, 1))
4919 {
4920 if (Aura* noxious = Aura::TryCreate(aura->GetSpellInfo(), aura->GetEffectMask(), dispeller, caster))
4921 {
4922 noxious->SetDuration(aura->GetDuration() * aureff->GetAmount() / 100);
4923 if (aura->GetUnitOwner() )
4924 if (const std::vector<int32>* spell_triggered = sSpellMgr->GetSpellLinked(-int32(aura->GetId())))
4925 for (std::vector<int32>::const_iterator itr = spell_triggered->begin(); itr != spell_triggered->end(); ++itr)
4926 aura->GetUnitOwner()->RemoveAurasDueToSpell(*itr);
4927 }
4928 }
4929 }
4930 }
4931 break;
4932 }
4934 {
4935 // Icy Clutch, remove with Frost Fever
4936 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x4000000)
4937 {
4938 if (AuraEffect* aureff = GetAuraEffect(SPELL_AURA_MOD_DECREASE_SPEED, SPELLFAMILY_DEATHKNIGHT, 0, 0x40000, 0, casterGUID))
4939 RemoveAurasDueToSpell(aureff->GetId());
4940 }
4941 }
4942 default:
4943 break;
4944 }
4945 return;
4946 }
4947 else
4948 ++iter;
4949 }
4950}
Definition: Unit.h:727
void CallScriptDispel(DispelInfo *dispelInfo)
Definition: SpellAuras.cpp:2404
static Aura * TryCreate(SpellInfo const *spellproto, uint8 effMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemGUID=ObjectGuid::Empty)
Definition: SpellAuras.cpp:352
bool ModCharges(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: SpellAuras.cpp:987
void CallScriptAfterDispel(DispelInfo *dispelInfo)
Definition: SpellAuras.cpp:2417

References AURA_REMOVE_BY_ENEMY_SPELL, Aura::CallScriptAfterDispel(), Aura::CallScriptDispel(), GetAuraEffect(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetDuration(), Aura::GetEffectMask(), Aura::GetId(), DispelInfo::GetRemovedCharges(), Aura::GetSpellInfo(), Aura::GetUnitOwner(), SpellInfo::HasAttribute(), m_ownedAuras, Aura::ModCharges(), Aura::ModStackAmount(), RemoveAurasDueToSpell(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_HUNTER, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, sSpellMgr, and Aura::TryCreate().

Referenced by Spell::EffectDispel().

◆ RemoveAurasDueToSpellBySteal()

void Unit::RemoveAurasDueToSpellBySteal ( uint32  spellId,
ObjectGuid  casterGUID,
Unit stealer 
)
4953{
4954 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4955 for (AuraMap::iterator iter = range.first; iter != range.second;)
4956 {
4957 Aura* aura = iter->second;
4958 if (aura->GetCasterGUID() == casterGUID)
4959 {
4960 int32 damage[MAX_SPELL_EFFECTS];
4961 int32 baseDamage[MAX_SPELL_EFFECTS];
4962 uint8 effMask = 0;
4963 uint8 recalculateMask = 0;
4964 Unit* caster = aura->GetCaster();
4965 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4966 {
4967 if (aura->GetEffect(i))
4968 {
4969 baseDamage[i] = aura->GetEffect(i)->GetBaseAmount();
4970 damage[i] = aura->GetEffect(i)->GetAmount();
4971 effMask |= (1 << i);
4972 if (aura->GetEffect(i)->CanBeRecalculated())
4973 recalculateMask |= (1 << i);
4974 }
4975 else
4976 {
4977 baseDamage[i] = 0;
4978 damage[i] = 0;
4979 }
4980 }
4981
4983 // Cast duration to unsigned to prevent permanent aura's such as Righteous Fury being permanently added to caster
4984 uint32 dur = std::min(2u * MINUTE * IN_MILLISECONDS, uint32(aura->GetDuration()));
4985
4986 if (Aura* oldAura = stealer->GetAura(aura->GetId(), aura->GetCasterGUID()))
4987 {
4988 if (stealCharge)
4989 oldAura->ModCharges(1);
4990 else
4991 oldAura->ModStackAmount(1);
4992 oldAura->SetDuration(int32(dur));
4993 }
4994 else
4995 {
4996 // single target state must be removed before aura creation to preserve existing single target aura
4997 if (aura->IsSingleTarget())
4998 aura->UnregisterSingleTarget();
4999
5000 // Xinef: if stealer has same aura
5001 Aura* curAura = stealer->GetAura(aura->GetId());
5002 if (!curAura || (!curAura->IsPermanent() && curAura->GetDuration() < (int32)dur))
5003 if (Aura* newAura = Aura::TryRefreshStackOrCreate(aura->GetSpellInfo(), effMask, stealer, nullptr, &baseDamage[0], nullptr, aura->GetCasterGUID()))
5004 {
5005 // created aura must not be single target aura,, so stealer won't loose it on recast
5006 if (newAura->IsSingleTarget())
5007 {
5008 newAura->UnregisterSingleTarget();
5009 // bring back single target aura status to the old aura
5010 aura->SetIsSingleTarget(true);
5011 caster->GetSingleCastAuras().push_back(aura);
5012 }
5013 // FIXME: using aura->GetMaxDuration() maybe not blizzlike but it fixes stealing of spells like Innervate
5014 newAura->SetLoadedState(aura->GetMaxDuration(), int32(dur), stealCharge ? 1 : aura->GetCharges(), 1, recalculateMask, &damage[0]);
5015 newAura->ApplyForTargets();
5016 }
5017 }
5018
5019 if (stealCharge)
5021 else
5023
5024 return;
5025 }
5026 else
5027 ++iter;
5028 }
5029}
bool CanBeRecalculated() const
Definition: SpellAuraEffects.h:78
int32 GetBaseAmount() const
Definition: SpellAuraEffects.h:57
void UnregisterSingleTarget()
Definition: SpellAuras.cpp:1181
bool IsPermanent() const
Definition: SpellAuras.h:139

References AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::CanBeRecalculated(), AuraEffect::GetAmount(), GetAura(), AuraEffect::GetBaseAmount(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetCharges(), Aura::GetDuration(), Aura::GetEffect(), Aura::GetId(), Aura::GetMaxDuration(), GetSingleCastAuras(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), IN_MILLISECONDS, Aura::IsPermanent(), Aura::IsSingleTarget(), m_ownedAuras, MAX_SPELL_EFFECTS, MINUTE, Aura::ModCharges(), Aura::ModStackAmount(), Aura::SetIsSingleTarget(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, Aura::TryRefreshStackOrCreate(), and Aura::UnregisterSingleTarget().

Referenced by Spell::EffectStealBeneficialBuff().

◆ RemoveAurasWithAttribute()

void Unit::RemoveAurasWithAttribute ( uint32  flags)
5069{
5070 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5071 {
5072 SpellInfo const* spell = iter->second->GetBase()->GetSpellInfo();
5073 if (spell->Attributes & flags)
5074 RemoveAura(iter);
5075 else
5076 ++iter;
5077 }
5078}

References SpellInfo::Attributes, m_appliedAuras, and RemoveAura().

◆ RemoveAurasWithFamily()

void Unit::RemoveAurasWithFamily ( SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID 
)
5152{
5153 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5154 {
5155 Aura const* aura = iter->second->GetBase();
5156 if (!casterGUID || aura->GetCasterGUID() == casterGUID)
5157 {
5158 SpellInfo const* spell = aura->GetSpellInfo();
5159 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5160 {
5161 RemoveAura(iter);
5162 continue;
5163 }
5164 }
5165 ++iter;
5166 }
5167}

References Aura::GetCasterGUID(), Aura::GetSpellInfo(), flag96::HasFlag(), m_appliedAuras, RemoveAura(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by spell_warl_demonic_aegis::HandleAuraApply(), and Aura::HandleAuraSpecificMods().

◆ RemoveAurasWithInterruptFlags()

void Unit::RemoveAurasWithInterruptFlags ( uint32  flag,
uint32  except = 0,
bool  isAutoshot = false 
)
5117{
5118 if (!(m_interruptMask & flag))
5119 return;
5120
5121 // interrupt auras
5122 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end();)
5123 {
5124 Aura* aura = (*iter)->GetBase();
5125 ++iter;
5126 if ((aura->GetSpellInfo()->AuraInterruptFlags & flag) && (!except || aura->GetId() != except))
5127 {
5128 uint32 removedAuras = m_removedAurasCount;
5129 RemoveAura(aura);
5130 if (m_removedAurasCount > removedAuras + 1)
5131 iter = m_interruptableAuras.begin();
5132 }
5133 }
5134
5135 // interrupt channeled spell
5137 {
5138 if (spell->getState() == SPELL_STATE_CASTING && (spell->m_spellInfo->ChannelInterruptFlags & flag) && spell->m_spellInfo->Id != except)
5139 {
5140 // Do not interrupt if auto shot
5141 if (!(isAutoshot && spell->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS)))
5142 {
5143 InterruptNonMeleeSpells(false, spell->m_spellInfo->Id);
5144 }
5145 }
5146 }
5147
5149}

References SpellInfo::AuraInterruptFlags, CURRENT_CHANNELED_SPELL, Aura::GetId(), Aura::GetSpellInfo(), InterruptNonMeleeSpells(), m_currentSpells, m_interruptableAuras, m_interruptMask, m_removedAurasCount, RemoveAura(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_CASTING, and UpdateInterruptMask().

Referenced by _EnterVehicle(), AttackerStateUpdate(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), DealDamage(), Dismount(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundAB::EventPlayerClickedOnFlag(), spell_rog_killing_spree::spell_rog_killing_spree_SpellScript::FilterTargets(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleFeignDeath(), WorldSession::HandleGossipHelloOpcode(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModStealth(), AuraEffect::HandleModUnattackable(), WorldSession::HandleMovementOpcodes(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePhase(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), Mount(), Spell::prepare(), ProcessTerrainStatusUpdate(), Player::SetInWater(), SetStandState(), Player::TeleportTo(), and UpdatePosition().

◆ RemoveAurasWithMechanic()

void Unit::RemoveAurasWithMechanic ( uint32  mechanic_mask,
AuraRemoveMode  removemode = AURA_REMOVE_BY_DEFAULT,
uint32  except = 0 
)
5194{
5195 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5196 {
5197 Aura const* aura = iter->second->GetBase();
5198 if (!except || aura->GetId() != except)
5199 {
5200 if (aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask)
5201 {
5202 RemoveAura(iter, removemode);
5203 continue;
5204 }
5205 }
5206 ++iter;
5207 }
5208}

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetId(), Aura::GetSpellInfo(), m_appliedAuras, and RemoveAura().

Referenced by HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), and RemoveMovementImpairingAuras().

◆ RemoveBindSightAuras()

void Unit::RemoveBindSightAuras ( )
11187{
11189}
@ SPELL_AURA_BIND_SIGHT
Definition: SpellAuraDefines.h:64

References RemoveAurasByType(), and SPELL_AURA_BIND_SIGHT.

Referenced by RemoveFromWorld().

◆ RemoveCharmAuras()

void Unit::RemoveCharmAuras ( )
11192{
11197}
@ SPELL_AURA_MOD_POSSESS_PET
Definition: SpellAuraDefines.h:191
@ SPELL_AURA_MOD_CHARM
Definition: SpellAuraDefines.h:69
@ SPELL_AURA_AOE_CHARM
Definition: SpellAuraDefines.h:240
@ SPELL_AURA_MOD_POSSESS
Definition: SpellAuraDefines.h:65

References RemoveAurasByType(), SPELL_AURA_AOE_CHARM, SPELL_AURA_MOD_CHARM, SPELL_AURA_MOD_POSSESS, and SPELL_AURA_MOD_POSSESS_PET.

Referenced by misc_commandscript::HandleUnPossessCommand(), RemoveAllControlled(), RemoveFromWorld(), and Creature::Update().

◆ RemoveCharmedBy()

void Unit::RemoveCharmedBy ( Unit charmer)
18817{
18818 if (!IsCharmed())
18819 return;
18820
18821 if (!charmer)
18822 charmer = GetCharmer();
18823 if (charmer != GetCharmer()) // one aura overrides another?
18824 {
18825 // LOG_FATAL("entities.unit", "Unit::RemoveCharmedBy: this: {} true charmer: {} false charmer: {}",
18826 // GetGUID().ToString(), GetCharmerGUID().ToString(), charmer->GetGUID().ToString());
18827 // ABORT();
18828 return;
18829 }
18830
18831 CharmType type;
18833 type = CHARM_TYPE_POSSESS;
18834 else if (charmer && charmer->IsOnVehicle(this))
18835 type = CHARM_TYPE_VEHICLE;
18836 else
18837 type = CHARM_TYPE_CHARM;
18838
18839 if (_oldFactionId)
18840 {
18842 _oldFactionId = 0;
18843 }
18844 else
18846
18847 CastStop();
18848 AttackStop();
18849
18850 // xinef: update speed after charming
18851 UpdateSpeed(MOVE_RUN, false);
18852
18853 // xinef: do not break any controlled motion slot
18854 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == NULL_MOTION_TYPE)
18855 {
18856 StopMoving();
18858 }
18859 // xinef: if we have any controlled movement, clear active and idle only
18860 else
18862
18864
18865 // xinef: remove stunned flag if owner was mounted
18868
18869 // If charmer still exists
18870 if (!charmer)
18871 return;
18872
18873 ASSERT(type != CHARM_TYPE_POSSESS || charmer->GetTypeId() == TYPEID_PLAYER);
18875
18876 charmer->SetCharm(this, false);
18877
18879
18880 Player* playerCharmer = charmer->ToPlayer();
18881 if (playerCharmer)
18882 {
18883 switch (type)
18884 {
18885 case CHARM_TYPE_VEHICLE:
18886 playerCharmer->SetClientControl(this, false);
18887 playerCharmer->SetClientControl(charmer, true); // verified
18890 break;
18891 case CHARM_TYPE_POSSESS:
18892 playerCharmer->SetClientControl(this, false);
18893 playerCharmer->SetClientControl(charmer, true); // verified
18898 break;
18899 case CHARM_TYPE_CHARM:
18900 if (GetTypeId() == TYPEID_UNIT && charmer->getClass() == CLASS_WARLOCK)
18901 {
18903 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18904 {
18906 if (GetCharmInfo())
18907 GetCharmInfo()->SetPetNumber(0, true);
18908 else
18909 LOG_ERROR("entities.unit", "Aura::HandleModCharm: target={} has a charm aura but no charm info!", GetGUID().ToString());
18910 }
18911 }
18912 break;
18913 default:
18914 break;
18915 }
18916 }
18917
18918 if (Player* player = ToPlayer())
18919 {
18920 sScriptMgr->AnticheatSetUnderACKmount(player);
18921 }
18922
18923 // xinef: restore threat
18924 for (CharmThreatMap::const_iterator itr = _charmThreatInfo.begin(); itr != _charmThreatInfo.end(); ++itr)
18925 {
18926 if (Unit* target = ObjectAccessor::GetUnit(*this, itr->first))
18927 if (!IsFriendlyTo(target))
18928 AddThreat(target, itr->second);
18929 }
18930
18931 _charmThreatInfo.clear();
18932
18933 if (Creature* creature = ToCreature())
18934 {
18935 // Vehicle should not attack its passenger after he exists the seat
18936 if (type != CHARM_TYPE_VEHICLE && charmer->IsAlive() && !charmer->IsFriendlyTo(creature))
18937 if (Attack(charmer, true))
18938 GetMotionMaster()->MoveChase(charmer);
18939
18940 // Creature will restore its old AI on next update
18941 if (creature->AI())
18942 creature->AI()->OnCharmed(false);
18943
18944 // Xinef: Remove movement flag flying
18946 }
18947 else
18948 ToPlayer()->SetClientControl(this, true); // verified
18949
18950 // a guardian should always have charminfo
18951 if (playerCharmer && this != charmer->GetFirstControlled())
18952 playerCharmer->SendRemoveControlBar();
18953
18954 // xinef: Always delete charm info (restores react state)
18957}
CharmType
Definition: Unit.h:1086
@ CHARM_TYPE_CHARM
Definition: Unit.h:1087
@ CHARM_TYPE_POSSESS
Definition: Unit.h:1088
@ CHARM_TYPE_VEHICLE
Definition: Unit.h:1089
@ UNIT_STATE_NO_ENVIRONMENT_UPD
Definition: Unit.h:353
@ MOVE_RUN
Definition: Unit.h:379
@ UNIT_FLAG_DISABLE_MOVE
Definition: Unit.h:450
@ MOTION_SLOT_CONTROLLED
Definition: MotionMaster.h:63
@ MOTION_SLOT_ACTIVE
Definition: MotionMaster.h:62
@ NULL_MOTION_TYPE
Definition: MotionMaster.h:56
@ CREATURE_TYPE_DEMON
Definition: SharedDefines.h:2630
uint32 unit_class
Definition: CreatureData.h:206
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition: Object.cpp:750
void SendRemoveControlBar()
Definition: Player.cpp:9616
void SetClientControl(Unit *target, bool allowMove, bool packetOnly=false)
Definition: Player.cpp:12771
void DeleteCharmInfo()
Definition: Unit.cpp:15806
void RestoreFaction()
Definition: Unit.cpp:18959
void SetCharm(Unit *target, bool apply)
Definition: Unit.cpp:10870
void StopAttackingInvalidTarget()
Definition: Unit.cpp:20472
void CastStop(uint32 except_spellid=0, bool withInstant=true)
Definition: Unit.cpp:1162
bool Attack(Unit *victim, bool meleeAttack)
Definition: Unit.cpp:10280
CharmThreatMap _charmThreatInfo
Definition: Unit.h:2546
void RemoveUnitMovementFlag(uint32 f)
Definition: Unit.h:2287
void UpdateSpeed(UnitMoveType mtype, bool forced)
Definition: Unit.cpp:14238
void InitDefault()
Definition: MotionMaster.cpp:87
void MovementExpiredOnSlot(MovementSlot slot, bool reset=true)
Definition: MotionMaster.h:192
void MovementExpired(bool reset=true)
Definition: MotionMaster.h:178

References _charmThreatInfo, _oldFactionId, AddThreat(), ASSERT, Attack(), AttackStop(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, CLASS_WARLOCK, ClearUnitState(), CREATURE_TYPE_DEMON, DeleteCharmInfo(), GetCharmer(), GetCharmInfo(), getClass(), Creature::GetCreatureTemplate(), GetFirstControlled(), Object::GetGUID(), GetMotionMaster(), Object::GetTypeId(), ObjectAccessor::GetUnit(), HasUnitState(), MotionMaster::InitDefault(), IsAlive(), IsCharmed(), IsFriendlyTo(), IsGuardian(), IsOnVehicle(), IsVehicle(), LOG_ERROR, MOTION_SLOT_ACTIVE, MOTION_SLOT_CONTROLLED, MOVE_RUN, MotionMaster::MoveChase(), MotionMaster::MovementExpired(), MotionMaster::MovementExpiredOnSlot(), MOVEMENTFLAG_FLYING, NULL_MOTION_TYPE, RemoveUnitFlag(), RemoveUnitMovementFlag(), RestoreFaction(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), sScriptMgr, StopAttackingInvalidTarget(), StopMoving(), Object::ToCreature(), Object::ToPlayer(), Position::ToString(), CreatureTemplate::type, TYPEID_PLAYER, TYPEID_UNIT, CreatureTemplate::unit_class, UNIT_FIELD_BYTES_0, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_FLAG_STUNNED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, UNIT_STATE_STUNNED, and UpdateSpeed().

Referenced by AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), npc_chesspiece::JustDied(), Puppet::RemoveFromWorld(), Vehicle::RemovePassenger(), and npc_chesspiece::sGossipSelect().

◆ RemoveComboPointHolder()

void Unit::RemoveComboPointHolder ( Unit unit)
inline
2314{ m_ComboPointHolders.erase(unit); }

References m_ComboPointHolders.

Referenced by AddComboPoints(), and ClearComboPoints().

◆ RemoveDynObject()

bool Unit::RemoveDynObject ( uint32  spellId)
6080{
6081 if (m_dynObj.empty())
6082 return false;
6083
6084 bool result = false;
6085 for (DynObjectList::iterator i = m_dynObj.begin(); i != m_dynObj.end();)
6086 {
6087 DynamicObject* dynObj = *i;
6088 if (dynObj->GetSpellId() == spellId)
6089 {
6090 dynObj->Remove();
6091 i = m_dynObj.begin();
6092 result = true;
6093 }
6094 else
6095 ++i;
6096 }
6097
6098 return result;
6099}
void Remove()
Definition: DynamicObject.cpp:188

References DynamicObject::GetSpellId(), m_dynObj, and DynamicObject::Remove().

Referenced by Spell::cancel(), Spell::EffectAddFarsight(), and spell_item_shifting_naaru_silver::OnBaseRemove().

◆ RemoveEvadeAuras()

void Unit::RemoveEvadeAuras ( )
5378{
5379 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5380 {
5381 Aura const* aura = iter->second->GetBase();
5382 SpellInfo const* spellInfo = aura->GetSpellInfo();
5384 ++iter;
5385 else
5387 }
5388
5389 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5390 {
5391 Aura* aura = iter->second;
5392 SpellInfo const* spellInfo = aura->GetSpellInfo();
5394 ++iter;
5395 else
5397 }
5398}
@ SPELL_AURA_CLONE_CASTER
Definition: SpellAuraDefines.h:310
@ SPELL_ATTR0_CU_IGNORE_EVADE
Definition: SpellInfo.h:187

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, GetOwnerGUID(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), Aura::IsPassive(), Object::IsPlayer(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_AURA_CLONE_CASTER, and SPELL_AURA_CONTROL_VEHICLE.

Referenced by CreatureAI::_EnterEvadeMode(), and npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode().

◆ RemoveExtraUnitMovementFlag()

void Unit::RemoveExtraUnitMovementFlag ( uint16  f)
inline

◆ removeFollower()

void Unit::removeFollower ( FollowerReference )
inline
2274{ /* nothing to do yet */ }

Referenced by FollowerReference::targetObjectDestroyLink().

◆ RemoveFromWorld()

void Unit::RemoveFromWorld ( )
overridevirtual

Reimplemented from WorldObject.

15683{
15684 // cleanup
15685 ASSERT(GetGUID());
15686
15687 if (IsInWorld())
15688 {
15690 if (IsVehicle())
15692
15696
15699
15700 ExitVehicle(); // Remove applied auras with SPELL_AURA_CONTROL_VEHICLE
15703
15705
15706 if (GetCharmerGUID())
15707 {
15708 LOG_FATAL("entities.unit", "Unit {} has charmer guid when removed from world", GetEntry());
15709 ABORT();
15710 }
15711
15712 if (Unit* owner = GetOwner())
15713 {
15714 if (owner->m_Controlled.find(this) != owner->m_Controlled.end())
15715 {
15717 owner->SetMinion((Minion*)this, false);
15718 LOG_INFO("entities.unit", "Unit {} is in controlled list of {} when removed from world", GetEntry(), owner->GetEntry());
15719 //ABORT();
15720 }
15721 }
15722
15725 }
15726}
void RemoveFromWorld() override
Definition: Object.cpp:1182
void RemoveNotOwnSingleTargetAuras()
Definition: Unit.cpp:5080
void UnsummonAllTotems(bool onDeath=false)
Definition: Unit.cpp:11199
void RemoveAllDynObjects()
Definition: Unit.cpp:6101
void RemoveAreaAurasDueToLeaveWorld()
Definition: Unit.cpp:5226
void RemoveBindSightAuras()
Definition: Unit.cpp:11186
void RemoveAllControlled(bool onDeath=false)
Definition: Unit.cpp:11080

References ABORT, ASSERT, ExitVehicle(), GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwner(), HasUnitTypeMask(), Object::IsInWorld(), IsVehicle(), LOG_FATAL, LOG_INFO, m_duringRemoveFromWorld, RemoveAllControlled(), RemoveAllDynObjects(), RemoveAllGameObjects(), RemoveAreaAurasDueToLeaveWorld(), RemoveBindSightAuras(), RemoveCharmAuras(), WorldObject::RemoveFromWorld(), RemoveNotOwnSingleTargetAuras(), RemoveVehicleKit(), UNIT_MASK_GUARDIAN, UNIT_MASK_MINION, and UnsummonAllTotems().

Referenced by CleanupBeforeRemoveFromMap(), Creature::RemoveFromWorld(), Pet::RemoveFromWorld(), and Player::RemoveFromWorld().

◆ RemoveGameObject() [1/2]

void Unit::RemoveGameObject ( GameObject gameObj,
bool  del 
)
6136{
6137 if (!gameObj || gameObj->GetOwnerGUID() != GetGUID())
6138 return;
6139
6141
6142 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
6143 {
6144 if (m_ObjectSlot[i] == gameObj->GetGUID())
6145 {
6146 m_ObjectSlot[i].Clear();
6147 break;
6148 }
6149 }
6150
6151 // GO created by some spell
6152 if (uint32 spellid = gameObj->GetSpellId())
6153 {
6154 RemoveAurasDueToSpell(spellid);
6155
6156 if (GetTypeId() == TYPEID_PLAYER)
6157 {
6158 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(spellid);
6159 // Need activate spell use for owner
6160 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6161 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6162 ToPlayer()->SendCooldownEvent(createBySpell);
6163 }
6164 }
6165
6166 m_gameObj.remove(gameObj->GetGUID());
6167
6168 if (del)
6169 {
6170 gameObj->SetRespawnTime(0);
6171 gameObj->Delete();
6172 }
6173}
void Clear()
Definition: ObjectGuid.h:140
void SendCooldownEvent(SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
Definition: Player.cpp:11024

References ObjectGuid::Clear(), GameObject::Delete(), ObjectGuid::Empty, Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), Object::GetTypeId(), SpellInfo::IsCooldownStartedOnEvent(), m_gameObj, m_ObjectSlot, MAX_GAMEOBJECT_SLOT, RemoveAurasDueToSpell(), Player::SendCooldownEvent(), GameObject::SetOwnerGUID(), GameObject::SetRespawnTime(), sSpellMgr, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by Spell::cancel(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), Spell::EffectSummonObject(), gobject_commandscript::HandleGameObjectDeleteCommand(), spell_warl_demonic_circle_summon::HandleRemove(), boss_kologarn::boss_kologarnAI::JustDied(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::JustDied(), boss_ahune::JustDied(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), GameObject::Update(), and npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI().

◆ RemoveGameObject() [2/2]

void Unit::RemoveGameObject ( uint32  spellid,
bool  del 
)
6176{
6177 if (m_gameObj.empty())
6178 return;
6179
6180 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
6181 {
6182 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6183 {
6184 if (spellid > 0 && go->GetSpellId() != spellid)
6185 {
6186 ++itr;
6187 continue;
6188 }
6189
6190 go->SetOwnerGUID(ObjectGuid::Empty);
6191 if(del)
6192 {
6193 go->SetRespawnTime(0);
6194 go->Delete();
6195 }
6196 }
6197 m_gameObj.erase(itr++);
6198 }
6199}

References ObjectGuid::Empty, ObjectAccessor::GetGameObject(), and m_gameObj.

◆ removeHatedBy()

void Unit::removeHatedBy ( HostileReference )
inline
2162{ /* nothing to do yet */ }

Referenced by HostileReference::targetObjectDestroyLink().

◆ RemoveMovementImpairingAuras()

void Unit::RemoveMovementImpairingAuras ( bool  withRoot)
5170{
5171 if (withRoot)
5173
5174 // Snares
5175 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5176 {
5177 Aura const* aura = iter->second->GetBase();
5178 if (aura->GetSpellInfo()->Mechanic == MECHANIC_SNARE)
5179 {
5180 RemoveAura(iter);
5181 continue;
5182 }
5183
5184 // Xinef: turn off snare auras by setting amount to 0 :)
5185 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5186 if (((1 << i) & iter->second->GetEffectMask()) && aura->GetSpellInfo()->Effects[i].Mechanic == MECHANIC_SNARE)
5187 aura->GetEffect(i)->ChangeAmount(0);
5188
5189 ++iter;
5190 }
5191}
void ChangeAmount(int32 newAmount, bool mark=true, bool onStackOrReapply=false)
Definition: SpellAuraEffects.cpp:708

References AuraEffect::ChangeAmount(), SpellInfo::Effects, Aura::GetEffect(), Aura::GetSpellInfo(), m_appliedAuras, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), and RemoveAurasWithMechanic().

Referenced by Spell::CheckCast(), Spell::EffectTriggerSpell(), HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), and spell_gen_remove_impairing_auras::HandleScriptEffect().

◆ RemoveNotOwnSingleTargetAuras()

void Unit::RemoveNotOwnSingleTargetAuras ( )
5081{
5082 // single target auras from other casters
5083 // Iterate m_ownedAuras - aura is marked as single target in Unit::AddAura (and pushed to m_ownedAuras).
5084 // m_appliedAuras will NOT contain the aura before first Unit::Update after adding it to m_ownedAuras.
5085 // Quickly removing such an aura will lead to it not being unregistered from caster's single cast auras container
5086 // leading to assertion failures if the aura was cast on a player that can
5087 // (and is changing map at the point where this function is called).
5088 // Such situation occurs when player is logging in inside an instance and fails the entry check for any reason.
5089 // The aura that was loaded from db (indirectly, via linked casts) gets removed before it has a chance
5090 // to register in m_appliedAuras
5091 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5092 {
5093 Aura const* aura = iter->second;
5094
5095 if (aura->GetCasterGUID() != GetGUID() && aura->IsSingleTarget())
5096 RemoveOwnedAura(iter);
5097 else
5098 ++iter;
5099 }
5100
5101 // single target auras at other targets
5102 AuraList& scAuras = GetSingleCastAuras();
5103 for (AuraList::iterator iter = scAuras.begin(); iter != scAuras.end();)
5104 {
5105 Aura* aura = *iter;
5106 if (aura->GetUnitOwner() != this)
5107 {
5108 aura->Remove();
5109 iter = scAuras.begin();
5110 }
5111 else
5112 ++iter;
5113 }
5114}

References Aura::GetCasterGUID(), Object::GetGUID(), GetSingleCastAuras(), Aura::GetUnitOwner(), Aura::IsSingleTarget(), m_ownedAuras, Aura::Remove(), and RemoveOwnedAura().

Referenced by RemoveFromWorld().

◆ RemoveNpcFlag()

void Unit::RemoveNpcFlag ( NPCFlags  flags)
inline
1662{ RemoveFlag(UNIT_NPC_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_NPC_FLAGS.

Referenced by Vehicle::AddPassenger(), boss_vaelastrasz::boss_vaelAI::BeginSpeech(), npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_fos_leader::npc_fos_leaderAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), spell_q12096_q12092_dummy::spell_q12096_q12092_dummy_SpellScript::HandleDummy(), npc_precious::npc_preciousAI::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), npc_fos_leader_second::npc_fos_leader_secondAI::npc_fos_leader_secondAI(), npc_pos_leader_second::npc_pos_leader_secondAI::npc_pos_leader_secondAI(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_announcer_toc10::OnGossipHello(), boss_doomrel::OnGossipSelect(), boss_majordomo::OnGossipSelect(), npc_zulaman_hostage::OnGossipSelect(), npc_arthas::OnGossipSelect(), npc_announcer_toc5::OnGossipSelect(), npc_announcer_toc10::OnGossipSelect(), npc_hor_leader::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_thrall_old_hillsbrad::OnGossipSelect(), npc_hor_leader_second::OnGossipSelect(), npc_battle_at_valhalas::OnQuestAccept(), npc_riggle_bassbait::OnQuestReward(), NPCStaveQuestAI::PrepareForEncounter(), RemoveVehicleKit(), boss_majordomo::boss_majordomoAI::Reset(), npc_arthas::npc_arthasAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), npc_xerestrasza::npc_xerestraszaAI::Reset(), npc_tirion_fordring_tft::npc_tirion_fordringAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_lake_frog::npc_lake_frogAI::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_magister_aledis::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), hyjalAI::Retreat(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::sGossipSelect(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::sGossipSelect(), boss_apothecary_hummel::boss_apothecary_hummelAI::sGossipSelect(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_harrison_jones::npc_harrison_jonesAI::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_akama_shade::sGossipSelect(), npc_general_andorov::sGossipSelect(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_chesspiece::SpellHitTarget(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), hyjalAI::StartEvent(), npc_magister_aledis::StartFight(), npc_cork_gizelton::npc_cork_gizeltonAI::SummonHelpers(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), and npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI().

◆ RemoveOwnedAura() [1/3]

void Unit::RemoveOwnedAura ( Aura aura,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4685{
4686 if (aura->IsRemoved())
4687 return;
4688
4689 ASSERT(aura->GetOwner() == this);
4690
4691 uint32 spellId = aura->GetId();
4692 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4693
4694 for (AuraMap::iterator itr = range.first; itr != range.second; ++itr)
4695 {
4696 if (itr->second == aura)
4697 {
4698 RemoveOwnedAura(itr, removeMode);
4699 return;
4700 }
4701 }
4702
4703 ABORT();
4704}

References ABORT, ASSERT, Aura::GetId(), Aura::GetOwner(), Aura::IsRemoved(), m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAura() [2/3]

void Unit::RemoveOwnedAura ( AuraMap::iterator &  i,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)

◆ RemoveOwnedAura() [3/3]

void Unit::RemoveOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4673{
4674 for (AuraMap::iterator itr = m_ownedAuras.lower_bound(spellId); itr != m_ownedAuras.upper_bound(spellId);)
4675 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask) && (!casterGUID || itr->second->GetCasterGUID() == casterGUID))
4676 {
4677 RemoveOwnedAura(itr, removeMode);
4678 itr = m_ownedAuras.lower_bound(spellId);
4679 }
4680 else
4681 ++itr;
4682}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [1/2]

void Unit::RemoveOwnedAuras ( std::function< bool(Aura const *)> const &  check)
4804{
4805 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
4806 {
4807 if (check(iter->second))
4808 {
4809 RemoveOwnedAura(iter);
4810 continue;
4811 }
4812 ++iter;
4813 }
4814}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [2/2]

void Unit::RemoveOwnedAuras ( uint32  spellId,
std::function< bool(Aura const *)> const &  check 
)
4830{
4831 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
4832 {
4833 if (check(iter->second))
4834 {
4835 RemoveOwnedAura(iter);
4836 continue;
4837 }
4838 ++iter;
4839 }
4840}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemovePetAura()

void Unit::RemovePetAura ( PetAura const *  petSpell)
17564{
17565 if (GetTypeId() != TYPEID_PLAYER)
17566 return;
17567
17568 m_petAuras.erase(petSpell);
17569 if (Pet* pet = ToPlayer()->GetPet())
17570 pet->RemoveAurasDueToSpell(petSpell->GetAura(pet->GetEntry()));
17571 if (Unit* charm = GetCharm())
17572 charm->RemoveAurasDueToSpell(petSpell->GetAura(charm->GetEntry()));
17573}

References PetAura::GetAura(), GetCharm(), Object::GetTypeId(), m_petAuras, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by Player::_removeTalentAurasAndSpells(), Pet::CastPetAuras(), AuraEffect::HandleAuraDummy(), and Player::removeSpell().

◆ RemovePlayerFromVision()

void Unit::RemovePlayerFromVision ( Player player)
11176{
11177 m_sharedVision.remove(player);
11178 player->m_isInSharedVisionOf.erase(this);
11179 if (m_sharedVision.empty())
11180 {
11181 setActive(false);
11182 SetWorldObject(false);
11183 }
11184}

References Player::m_isInSharedVisionOf, m_sharedVision, WorldObject::setActive(), and WorldObject::SetWorldObject().

Referenced by Player::SetViewpoint(), and Player::~Player().

◆ RemovePointedBy()

void Unit::RemovePointedBy ( SafeUnitPointer sup)
inline

◆ RemoveStandFlags()

void Unit::RemoveStandFlags ( uint8  flags)
inline
@ UNIT_BYTES_1_OFFSET_VIS_FLAG
Definition: Unit.h:46
void RemoveByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition: Object.cpp:930

References Object::RemoveByteFlag(), UNIT_BYTES_1_OFFSET_VIS_FLAG, and UNIT_FIELD_BYTES_1.

Referenced by AuraEffect::HandleModStealth(), Player::InitStatsForLevel(), and npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI().

◆ RemoveUnitFlag()

void Unit::RemoveUnitFlag ( UnitFlags  flags)
inline
1496{ RemoveFlag(UNIT_FIELD_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_FIELD_FLAGS.

Referenced by spell_the_lich_king_trigger_vile_spirit::spell_the_lich_king_trigger_vile_spirit_SpellScript::ActivateSpirit(), Player::BuildPlayerRepop(), boss_thekal::CheckPhaseTransition(), Player::CleanupAfterTaxiFlight(), ClearInCombat(), ClearInPetCombat(), DisableRotate(), boss_thorim::boss_thorimAI::DisableThorim(), Dismount(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_thekal::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), boss_the_lurker_below::DoAction(), boss_broggok::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_cthun::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DoAction(), boss_essence_of_desire::boss_essence_of_desireAI::DoAction(), boss_essence_of_anger::boss_essence_of_angerAI::DoAction(), boss_kelidan_the_breaker::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), HomeMovementGenerator< Creature >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), WorldSession::DoLootRelease(), Spell::EffectResurrectPet(), Spell::EffectSkinning(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_bronjahm::boss_bronjahmAI::EnterEvadeMode(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), boss_kelthuzad::boss_kelthuzadAI::EnterEvadeMode(), boss_malygos::boss_malygosAI::EnterEvadeMode(), boss_ymiron::boss_ymironAI::EnterEvadeMode(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), SACActivateEvent::Execute(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::FeignDeath(), TimedFleeingMovementGenerator::Finalize(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::spell_q13007_iron_colossus_SpellScript::HandleDummy(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_feign_death_all_flags::HandleEffectRemove(), spell_gen_feign_death_no_dyn_flag::HandleEffectRemove(), spell_gen_feign_death_no_prevent_emotes::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLogoutCancelOpcode(), spell_oculus_drake_flag::spell_oculus_drake_flagAuraScript::HandleOnEffectApply(), spell_oculus_rider_aura::spell_oculus_rider_auraAuraScript::HandleOnEffectRemove(), WorldSession::HandlePlayerLoginToCharInWorld(), spell_boss_magus_telestra_summon_telestra_clones::spell_boss_magus_telestra_summon_telestra_clones_AuraScript::HandleRemove(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_jarien::IsSummonedBy(), boss_sothos::IsSummonedBy(), boss_apothecary_hummel::boss_apothecary_hummelAI::JustDied(), boss_volazj::JustDied(), boss_ichoron::boss_ichoronAI::JustDied(), boss_illidan_stormrage::boss_illidan_stormrageAI::JustDied(), boss_taerar::boss_taerarAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_kaelthas::boss_kaelthasAI::JustDied(), boss_ymiron::boss_ymironAI::JustEngagedWith(), boss_hazzarah::JustSummoned(), boss_nalorakk::boss_nalorakkAI::MoveInLineOfSight(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_nightbane::MovementInform(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), boss_kaelthas::boss_kaelthasAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_amanitar_mushrooms::npc_amanitar_mushrooms(), npc_giant_infernal::npc_giant_infernalAI::npc_giant_infernalAI(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), npc_death_knight_initiate::OnGossipSelect(), npc_bessy::OnQuestAccept(), spell_halion_twilight_phasing::spell_halion_twilight_phasing_AuraScript::OnRemove(), spell_alar_ember_blast_death::spell_alar_ember_blast_death_AuraScript::OnRemove(), boss_nefarian::PathEndReached(), RemoveCharmedBy(), Vehicle::RemovePassenger(), boss_keristrasza::boss_keristraszaAI::RemovePrison(), boss_lord_valthalak::boss_lord_valthalakAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_crone::Reset(), boss_julianne::Reset(), npc_mograine::npc_mograineAI::Reset(), boss_felmyst::boss_felmystAI::Reset(), boss_kalecgos::boss_kalecgosAI::Reset(), boss_muru::boss_muruAI::Reset(), boss_eye_of_cthun::Reset(), boss_volazj::Reset(), boss_anub_arak::boss_anub_arakAI::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_novos::boss_novosAI::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_kelthuzad::boss_kelthuzadAI::Reset(), boss_malygos::boss_malygosAI::Reset(), npc_crystalline_frayer::npc_crystalline_frayerAI::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_sjonnir::boss_sjonnirAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_mimiron::boss_mimironAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::Reset(), boss_svala::boss_svalaAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), boss_ichoron::boss_ichoronAI::Reset(), npc_wounded_skirmisher::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), boss_leotheras_the_blind::Reset(), npc_shattered_hand_scout::Reset(), boss_kaelthas::boss_kaelthasAI::Reset(), emerald_dragonAI::Reset(), npc_doctor::npc_doctorAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Resurrect(), boss_magtheridon::ScheduleCombatEvents(), boss_the_lurker_below::SchedulerPhaseTwo(), SetCharm(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::SetData(), npc_ulduar_vx001::npc_ulduar_vx001AI::SetData(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::SetData(), Pet::setDeathState(), SetImmuneToNPC(), SetImmuneToPC(), Player::SetIsSpectator(), SetStunned(), SetSwim(), Battlefield::ShowNpc(), boss_zuljin::boss_zuljinAI::SpawnAdds(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::SpellHit(), npc_ulduar_vx001::npc_ulduar_vx001AI::SpellHit(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::SpellHit(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), boss_lord_valthalak::boss_lord_valthalakAI::StartFighting(), boss_noth::boss_nothAI::StartGroundPhase(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_nightbane::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_giant_infernal::npc_giant_infernalAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_crystalline_frayer::npc_crystalline_frayerAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), boss_shade_of_akama::UpdateAI(), boss_ahune::UpdateAI(), boss_kaelthas::boss_kaelthasAI::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached(), and npc_general_andorov::WaypointReached().

◆ RemoveUnitFlag2()

◆ RemoveUnitMovementFlag()

◆ RemoveVehicleKit()

void Unit::RemoveVehicleKit ( )

◆ RemoveVisibleAura()

void Unit::RemoveVisibleAura ( uint8  slot)
inline
2174{ m_visibleAuras.erase(slot); UpdateAuraForGroup(slot);}
void UpdateAuraForGroup(uint8 slot)
Definition: Unit.cpp:17434

References m_visibleAuras, and UpdateAuraForGroup().

Referenced by AuraApplication::_Remove().

◆ ReplaceAllDynamicFlags()

◆ ReplaceAllNpcFlags()

void Unit::ReplaceAllNpcFlags ( NPCFlags  flags)
inline
1663{ SetUInt32Value(UNIT_NPC_FLAGS, flags); }

References Object::SetUInt32Value(), and UNIT_NPC_FLAGS.

Referenced by Pet::CreateBaseAtTamed(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), Spell::EffectSummonType(), SmartAI::EndPath(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFlagCommand(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_akama_illidan::npc_akama_illidanAI::JustSummoned(), Pet::LoadPetFromDB(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_ulduar_keeper::OnGossipSelect(), npc_shandy_dalaran::OnGossipSelect(), go_crystalline_tear::OnQuestAccept(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), boss_doomrel::boss_doomrelAI::Reset(), npc_eris_hevenfire::npc_eris_hevenfireAI::Reset(), npc_taretha::npc_tarethaAI::Reset(), brann_bronzebeard::brann_bronzebeardAI::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Creature::setDeathState(), npc_eris_hevenfire::npc_eris_hevenfireAI::SetGUID(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), npc_akama_illidan::npc_akama_illidanAI::sGossipSelect(), npc_escortAI::Start(), FollowerAI::StartFollow(), SmartAI::StartPath(), Player::SummonPet(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), Creature::UpdateEntry(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), npc_captain_saeed::npc_captain_saeedAI::WaypointReached(), and npc_akama_illidan::npc_akama_illidanAI::WaypointReached().

◆ ReplaceAllUnitFlags()

◆ ReplaceAllUnitFlags2()

void Unit::ReplaceAllUnitFlags2 ( UnitFlags2  flags)
inline

◆ resetAttackTimer()

void Unit::resetAttackTimer ( WeaponAttackType  type = BASE_ATTACK)

◆ ResetRedirectThreat()

◆ RestoreDisplayId()

void Unit::RestoreDisplayId ( )
17041{
17042 AuraEffect* handledAura = nullptr;
17043 AuraEffect* handledAuraForced = nullptr;
17044 // try to receive model from transform auras
17046 if (!transforms.empty())
17047 {
17048 // iterate over already applied transform auras - from newest to oldest
17049 for (auto i = transforms.rbegin(); i != transforms.rend(); ++i)
17050 {
17051 if (AuraApplication const* aurApp = (*i)->GetBase()->GetApplicationOfTarget(GetGUID()))
17052 {
17053 if (!handledAura)
17054 handledAura = (*i);
17055 // xinef: prefer negative/forced auras
17056 if ((*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) || !aurApp->IsPositive())
17057 {
17058 handledAuraForced = (*i);
17059 break;
17060 }
17061 }
17062 }
17063 }
17064
17065 // Xinef: include clone auras (eg mirror images)
17066 if (!handledAuraForced && !handledAura)
17067 {
17069 if (!cloneAuras.empty())
17070 for (Unit::AuraEffectList::const_iterator i = cloneAuras.begin(); i != cloneAuras.end(); ++i)
17071 handledAura = *i;
17072 }
17073
17075
17076 // xinef: order of execution is important!
17077 // first forced transform auras, then shapeshifts, then normal transform
17078 // transform aura was found
17079 if (handledAuraForced)
17080 {
17081 handledAuraForced->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
17082 return;
17083 }
17084 else if (!shapeshiftAura.empty()) // we've found shapeshift
17085 {
17086 // only one such aura possible at a time
17087 if (uint32 modelId = GetModelForForm(GetShapeshiftForm(), shapeshiftAura.front()->GetId()))
17088 {
17089 SetDisplayId(modelId);
17090 return;
17091 }
17092 }
17093 else if (handledAura)
17094 {
17095 handledAura->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
17096 return;
17097 }
17098
17099 // no auras found - set modelid to default
17101}
@ SPELL_AURA_MOD_SHAPESHIFT
Definition: SpellAuraDefines.h:99
@ AURA_EFFECT_HANDLE_SEND_FOR_CLIENT
Definition: SpellAuraDefines.h:43
uint32 GetModelForForm(ShapeshiftForm form, uint32 spellId) const
Definition: Unit.cpp:19465
void HandleEffect(AuraApplication *aurApp, uint8 mode, bool apply)
Definition: SpellAuraEffects.cpp:741

References AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, Aura::GetApplicationOfTarget(), GetAuraEffectsByType(), AuraApplication::GetBase(), Object::GetGUID(), GetModelForForm(), GetNativeDisplayId(), GetShapeshiftForm(), AuraEffect::HandleEffect(), SetDisplayId(), SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_CLONE_CASTER, SPELL_AURA_MOD_SHAPESHIFT, and SPELL_AURA_TRANSFORM.

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), spell_gen_aura_service_uniform::OnRemove(), and Player::SetIsSpectator().

◆ RestoreFaction()

void Unit::RestoreFaction ( )
18960{
18961 if (GetTypeId() == TYPEID_PLAYER)
18963 else
18964 {
18966 {
18967 if (Unit* owner = GetOwner())
18968 {
18969 SetFaction(owner->GetFaction());
18970 return;
18971 }
18972 }
18973
18974 if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate()) // normal creature
18975 SetFaction(cinfo->faction);
18976 }
18977}
void SetFactionForRace(uint8 race)
Definition: Player.cpp:5764

References GetOwner(), getRace(), Object::GetTypeId(), HasUnitTypeMask(), SetFaction(), Player::SetFactionForRace(), Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, and UNIT_MASK_MINION.

Referenced by npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), npc_calvin_montague::npc_calvin_montagueAI::DamageTaken(), boss_thekal::DoAction(), AuraEffect::HandleAuraModFaction(), npc_commandscript::HandleNpcSetOriginalFaction(), npc_enslaved_netherwing_drake::JustDied(), npc_escortAI::JustRespawned(), SmartAI::JustRespawned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), RemoveCharmedBy(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_crusade_persuaded::npc_crusade_persuadedAI::Reset(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::Reset(), npc_calvin_montague::npc_calvin_montagueAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_ahnqiraji_critter::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_magister_aledis::Reset(), npc_captain_saeed::npc_captain_saeedAI::Reset(), npc_bessy::npc_bessyAI::Reset(), and npc_enslaved_netherwing_drake::Reset().

◆ ResumeMovement()

void Unit::ResumeMovement ( uint32  timer = 0,
uint8  slot = 0 
)
16949{
16950 if (slot >= MAX_MOTION_SLOT)
16951 return;
16952
16953 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16954 movementGenerator->Resume(timer);
16955}

References GetMotionMaster(), and MAX_MOTION_SLOT.

◆ RewardRage()

void Unit::RewardRage ( uint32  damage,
uint32  weaponSpeedHitFactor,
bool  attacker 
)
20408{
20409 float addRage;
20410
20411 float rageconversion = ((0.0091107836f * GetLevel() * GetLevel()) + 3.225598133f * GetLevel()) + 4.2652911f;
20412
20413 // Unknown if correct, but lineary adjust rage conversion above level 70
20414 if (GetLevel() > 70)
20415 rageconversion += 13.27f * (GetLevel() - 70);
20416
20417 if (attacker)
20418 {
20419 addRage = (damage / rageconversion * 7.5f + weaponSpeedHitFactor) / 2;
20420
20421 // talent who gave more rage on attack
20423 }
20424 else
20425 {
20426 addRage = damage / rageconversion * 2.5f;
20427
20428 // Berserker Rage effect
20429 if (HasAura(18499))
20430 addRage *= 3.0f;
20431 }
20432
20433 addRage *= sWorld->getRate(RATE_POWER_RAGE_INCOME);
20434
20435 ModifyPower(POWER_RAGE, uint32(addRage * 10));
20436}
@ SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT
Definition: SpellAuraDefines.h:276
@ RATE_POWER_RAGE_INCOME
Definition: IWorld.h:429

References AddPct(), GetLevel(), GetTotalAuraModifier(), HasAura(), ModifyPower(), POWER_RAGE, RATE_POWER_RAGE_INCOME, SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT, and sWorld.

Referenced by DealDamage().

◆ RollMeleeOutcomeAgainst() [1/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType 
) const
2754{
2755 // This is only wrapper
2756
2757 // Miss chance based on melee
2758 //float miss_chance = MeleeMissChanceCalc(victim, attType);
2759 float miss_chance = MeleeSpellMissChance(victim, attType, int32(GetWeaponSkillValue(attType, victim)) - int32(victim->GetMaxSkillValueForLevel(this)), 0);
2760
2761 // Critical hit chance
2762 float crit_chance = GetUnitCriticalChance(attType, victim);
2763 if( crit_chance < 0 )
2764 crit_chance = 0;
2765
2766 float dodge_chance = victim->GetUnitDodgeChance();
2767 float block_chance = victim->GetUnitBlockChance();
2768 float parry_chance = victim->GetUnitParryChance();
2769
2770 // Useful if want to specify crit & miss chances for melee, else it could be removed
2771 //LOG_DEBUG("entities.unit", "MELEE OUTCOME: miss {} crit {} dodge {} parry {} block {}", miss_chance, crit_chance, dodge_chance, parry_chance, block_chance);
2772
2773 return RollMeleeOutcomeAgainst(victim, attType, int32(crit_chance * 100), int32(miss_chance * 100), int32(dodge_chance * 100), int32(parry_chance * 100), int32(block_chance * 100));
2774}
float GetUnitCriticalChance(WeaponAttackType attackType, Unit const *victim) const
Definition: Unit.cpp:3691

References GetMaxSkillValueForLevel(), GetUnitBlockChance(), GetUnitCriticalChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), MeleeSpellMissChance(), and RollMeleeOutcomeAgainst().

Referenced by CalculateMeleeDamage(), and RollMeleeOutcomeAgainst().

◆ RollMeleeOutcomeAgainst() [2/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType,
int32  crit_chance,
int32  miss_chance,
int32  dodge_chance,
int32  parry_chance,
int32  block_chance 
) const
2777{
2778 if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks())
2779 {
2780 return MELEE_HIT_EVADE;
2781 }
2782
2783 int32 attackerMaxSkillValueForLevel = GetMaxSkillValueForLevel(victim);
2784 int32 victimMaxSkillValueForLevel = victim->GetMaxSkillValueForLevel(this);
2785
2786 int32 attackerWeaponSkill = GetWeaponSkillValue(attType, victim);
2787 int32 victimDefenseSkill = victim->GetDefenseSkillValue(this);
2788
2789 sScriptMgr->OnBeforeRollMeleeOutcomeAgainst(this, victim, attType, attackerMaxSkillValueForLevel, victimMaxSkillValueForLevel, attackerWeaponSkill, victimDefenseSkill, crit_chance, miss_chance, dodge_chance, parry_chance, block_chance);
2790
2791 // bonus from skills is 0.04%
2792 int32 skillBonus = 4 * (attackerWeaponSkill - victimMaxSkillValueForLevel);
2793 int32 sum = 0, tmp = 0;
2794 int32 roll = urand (0, 10000);
2795
2796 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: skill bonus of {} for attacker", skillBonus);
2797 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: rolled {}, miss {}, dodge {}, parry {}, block {}, crit {}",
2798 // roll, miss_chance, dodge_chance, parry_chance, block_chance, crit_chance);
2799
2800 tmp = miss_chance;
2801
2802 if (tmp > 0 && roll < (sum += tmp))
2803 {
2804 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: MISS");
2805 return MELEE_HIT_MISS;
2806 }
2807
2808 // Dodge chance
2809
2810 // only players can't dodge if attacker is behind
2811 if (victim->GetTypeId() == TYPEID_PLAYER && !victim->HasInArc(M_PI, this) && !victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION))
2812 {
2813 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind and victim was a player.");
2814 }
2815 // Xinef: do not allow to dodge with CREATURE_FLAG_EXTRA_NO_DODGE flag
2816 else if (victim->GetTypeId() == TYPEID_PLAYER || !(victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_DODGE))
2817 {
2818 // Reduce dodge chance by attacker expertise rating
2819 if (GetTypeId() == TYPEID_PLAYER)
2820 dodge_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2821 else
2822 dodge_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2823
2824 // Modify dodge chance by attacker SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
2826 dodge_chance = int32 (float (dodge_chance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
2827
2828 tmp = dodge_chance;
2829
2830 // xinef: if casting or stunned - cant dodge
2831 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2832 tmp = 0;
2833
2834 if ((tmp > 0) // check if unit _can_ dodge
2835 && ((tmp -= skillBonus) > 0)
2836 && roll < (sum += tmp))
2837 {
2838 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: DODGE <{}, {})", sum - tmp, sum);
2839 return MELEE_HIT_DODGE;
2840 }
2841 }
2842
2843 // parry & block chances
2844
2845 // check if attack comes from behind, nobody can parry or block if attacker is behind
2846 if (!victim->HasInArc(M_PI, this) && !victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION))
2847 {
2848 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind.");
2849 }
2850 else
2851 {
2852 // Reduce parry chance by attacker expertise rating
2853 if (GetTypeId() == TYPEID_PLAYER)
2854 parry_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2855 else
2856 parry_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2857
2858 if (victim->GetTypeId() == TYPEID_PLAYER || !(victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_PARRY))
2859 {
2860 tmp = parry_chance;
2861
2862 // xinef: cant parry while casting or while stunned
2863 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2864 tmp = 0;
2865
2866 if (tmp > 0 // check if unit _can_ parry
2867 && (tmp -= skillBonus) > 0
2868 && roll < (sum += tmp))
2869 {
2870 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: PARRY <{}, {})", sum - tmp, sum);
2871 return MELEE_HIT_PARRY;
2872 }
2873 }
2874
2875 if (victim->GetTypeId() == TYPEID_PLAYER || !(victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK))
2876 {
2877 tmp = block_chance;
2878
2879 // xinef: cant block while casting or while stunned
2880 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2881 tmp = 0;
2882
2883 if (tmp > 0 // check if unit _can_ block
2884 && (tmp -= skillBonus) > 0
2885 && roll < (sum += tmp))
2886 {
2887 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: BLOCK <{}, {})", sum - tmp, sum);
2888 return MELEE_HIT_BLOCK;
2889 }
2890 }
2891 }
2892
2893 // Max 40% chance to score a glancing blow against mobs that are higher level (can do only players and pets and not with ranged weapon)
2894 if (attType != RANGED_ATTACK &&
2895 (GetTypeId() == TYPEID_PLAYER || IsPet()) &&
2896 victim->GetTypeId() != TYPEID_PLAYER && !victim->IsPet() &&
2897 GetLevel() < victim->getLevelForTarget(this))
2898 {
2899 // cap possible value (with bonuses > max skill)
2900 int32 skill = attackerWeaponSkill;
2901 int32 maxskill = attackerMaxSkillValueForLevel;
2902 skill = (skill > maxskill) ? maxskill : skill;
2903
2904 tmp = (10 + (victimDefenseSkill - skill)) * 100;
2905 tmp = tmp > 4000 ? 4000 : tmp;
2906 if (roll < (sum += tmp))
2907 {
2908 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: GLANCING <{}, {})", sum - 4000, sum);
2909 return MELEE_HIT_GLANCING;
2910 }
2911 }
2912
2913 // mobs can score crushing blows if they're 4 or more levels above victim
2914 if (getLevelForTarget(victim) >= victim->getLevelForTarget(this) + 4 &&
2915 // can be from by creature (if can) or from controlled player that considered as creature
2917 !(GetTypeId() == TYPEID_UNIT && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS))
2918 {
2919 // when their weapon skill is 15 or more above victim's defense skill
2920 tmp = victimDefenseSkill;
2921 int32 tmpmax = victimMaxSkillValueForLevel;
2922 // having defense above your maximum (from items, talents etc.) has no effect
2923 tmp = tmp > tmpmax ? tmpmax : tmp;
2924 // tmp = mob's level * 5 - player's current defense skill
2925 tmp = attackerMaxSkillValueForLevel - tmp;
2926 if (tmp >= 15)
2927 {
2928 // add 2% chance per lacking skill point, min. is 15%
2929 tmp = tmp * 200 - 1500;
2930 if (roll < (sum += tmp))
2931 {
2932 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRUSHING <{}, {})", sum - tmp, sum);
2933 return MELEE_HIT_CRUSHING;
2934 }
2935 }
2936 }
2937
2938 // Critical chance
2939 tmp = crit_chance;
2940
2941 if (tmp > 0 && roll < (sum += tmp))
2942 {
2943 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT <{}, {})", sum - tmp, sum);
2944 if (GetTypeId() == TYPEID_UNIT && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRIT))
2945 {
2946 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT DISABLED)");
2947 }
2948 else
2949 return MELEE_HIT_CRIT;
2950 }
2951
2952 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: NORMAL");
2953 return MELEE_HIT_NORMAL;
2954}
@ CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS
Definition: CreatureData.h:54
@ CREATURE_FLAG_EXTRA_NO_CRIT
Definition: CreatureData.h:66

References CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_CRIT, CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), GetDefenseSkillValue(), GetLevel(), getLevelForTarget(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), Object::GetTypeId(), GetWeaponSkillValue(), HasAuraType(), Position::HasInArc(), HasUnitState(), IsControlledByPlayer(), Creature::IsEvadingAttacks(), IsNonMeleeSpellCast(), IsPet(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, RANGED_ATTACK, SPELL_AURA_IGNORE_HIT_DIRECTION, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, UNIT_STATE_CONTROLLED, urand(), and VICTIMSTATE_DODGE.

◆ Say() [1/2]

◆ Say() [2/2]

void Unit::Say ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21463{
21464 Talk(textId, CHAT_MSG_MONSTER_SAY, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target);
21465}

References CHAT_MSG_MONSTER_SAY, CONFIG_LISTEN_RANGE_SAY, and sWorld.

◆ SelectNearbyNoTotemTarget()

Unit * Unit::SelectNearbyNoTotemTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
17285{
17286 std::list<Unit*> targets;
17287 Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck u_check(this, this, dist);
17289 Cell::VisitAllObjects(this, searcher, dist);
17290
17291 // remove current target
17292 if (GetVictim())
17293 targets.remove(GetVictim());
17294
17295 if (exclude)
17296 targets.remove(exclude);
17297
17298 // remove not LoS targets
17299 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
17300 {
17301 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
17302 {
17303 std::list<Unit*>::iterator tIter2 = tIter;
17304 ++tIter;
17305 targets.erase(tIter2);
17306 }
17307 else
17308 ++tIter;
17309 }
17310
17311 // no appropriate targets
17312 if (targets.empty())
17313 return nullptr;
17314
17315 // select random
17317}
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition: Containers.h:135
bool IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell=nullptr) const
Definition: Unit.cpp:13859
Definition: GridNotifiers.h:420

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitAllObjects().

Referenced by spell_rog_blade_flurry::CheckProc(), and spell_warr_sweeping_strikes::CheckProc().

◆ SelectNearbyTarget()

Unit * Unit::SelectNearbyTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
17250{
17251 std::list<Unit*> targets;
17252 Acore::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, this, dist);
17254 Cell::VisitAllObjects(this, searcher, dist);
17255
17256 // remove current target
17257 if (GetVictim())
17258 targets.remove(GetVictim());
17259
17260 if (exclude)
17261 targets.remove(exclude);
17262
17263 // remove not LoS targets
17264 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
17265 {
17266 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
17267 {
17268 std::list<Unit*>::iterator tIter2 = tIter;
17269 ++tIter;
17270 targets.erase(tIter2);
17271 }
17272 else
17273 ++tIter;
17274 }
17275
17276 // no appropriate targets
17277 if (targets.empty())
17278 return nullptr;
17279
17280 // select random
17282}
Definition: GridNotifiers.h:858

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitAllObjects().

Referenced by npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_curator::JustSummoned(), npc_hodirs_fury::npc_hodirs_furyAI::UpdateAI(), npc_storm_beacon_spawn::npc_storm_beacon_spawnAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_thorim_trap::boss_thorim_trapAI::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), Player::UpdateCharmedAI(), and boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI().

◆ SendAttackStateUpdate() [1/2]

void Unit::SendAttackStateUpdate ( CalcDamageInfo damageInfo)

Probably used for debugging purposes, as it is not known to appear on retail servers

6418{
6419 LOG_DEBUG("entities.unit", "WORLD: Sending SMSG_ATTACKERSTATEUPDATE");
6420
6421 uint32 tmpDamage[MAX_ITEM_PROTO_DAMAGES] = { };
6422 uint32 tmpAbsorb[MAX_ITEM_PROTO_DAMAGES] = { };
6423 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6424 {
6425 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6426 tmpDamage[i] = damageInfo->damages[i].damage;
6427 tmpAbsorb[i] = damageInfo->damages[i].absorb;
6428 if (damageInfo->target->GetTypeId() == TYPEID_PLAYER && damageInfo->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6429 {
6430 tmpAbsorb[i] = tmpDamage[i];
6431 tmpDamage[i] = 0;
6432 }
6433 }
6434
6435 uint32 count = 1;
6436 if (tmpDamage[1] || tmpAbsorb[1] || damageInfo->damages[1].resist)
6437 {
6438 ++count;
6439 }
6440
6441 size_t const maxsize = 4 + 5 + 5 + 4 + 4 + 1 + count * (4 + 4 + 4 + 4 + 4) + 1 + 4 + 4 + 4 + 4 + 4 * 12;
6442 WorldPacket data(SMSG_ATTACKERSTATEUPDATE, maxsize); // we guess size
6443 data << uint32(damageInfo->HitInfo);
6444 data << damageInfo->attacker->GetPackGUID();
6445 data << damageInfo->target->GetPackGUID();
6446 data << uint32(tmpDamage[0] + tmpDamage[1]); // Full damage
6447 int32 overkill = tmpDamage[0] + tmpDamage[1] - damageInfo->target->GetHealth();
6448 data << uint32(overkill < 0 ? 0 : overkill); // Overkill
6449 data << uint8(count); // Sub damage count
6450
6451 for (uint32 i = 0; i < count; ++i)
6452 {
6453 data << uint32(damageInfo->damages[i].damageSchoolMask); // School of sub damage
6454 data << float(tmpDamage[i]); // sub damage
6455 data << uint32(tmpDamage[i]); // Sub Damage
6456 }
6457
6459 {
6460 for (uint32 i = 0; i < count; ++i)
6461 {
6462 data << uint32(tmpAbsorb[i]); // Absorb
6463 }
6464 }
6465
6467 {
6468 for (uint32 i = 0; i < count; ++i)
6469 {
6470 data << uint32(damageInfo->damages[i].resist); // Resist
6471 }
6472 }
6473
6474 data << uint8(damageInfo->TargetState);
6475 data << uint32(0); // Unknown attackerstate
6476 data << uint32(0); // Melee spellid
6477
6478 if (damageInfo->HitInfo & HITINFO_BLOCK)
6479 data << uint32(damageInfo->blocked_amount);
6480
6481 if (damageInfo->HitInfo & HITINFO_RAGE_GAIN)
6482 data << uint32(0);
6483
6485 if (damageInfo->HitInfo & HITINFO_UNK1)
6486 {
6487 data << uint32(0);
6488 data << float(0);
6489 data << float(0);
6490 data << float(0);
6491 data << float(0);
6492 data << float(0);
6493 data << float(0);
6494 data << float(0);
6495 data << float(0);
6496 data << float(0); // Found in a loop with 1 iteration
6497 data << float(0); // ditto ^
6498 data << uint32(0);
6499 }
6500
6501 SendMessageToSet(&data, true);
6502}
@ HITINFO_RAGE_GAIN
Definition: Unit.h:203
@ HITINFO_UNK1
Definition: Unit.h:180
@ SMSG_ATTACKERSTATEUPDATE
Definition: Opcodes.h:360

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CHEAT_GOD, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), Object::GetTypeId(), CalcDamageInfo::HitInfo, HITINFO_BLOCK, HITINFO_FULL_ABSORB, HITINFO_FULL_RESIST, HITINFO_PARTIAL_ABSORB, HITINFO_PARTIAL_RESIST, HITINFO_RAGE_GAIN, HITINFO_UNK1, LOG_DEBUG, MAX_ITEM_PROTO_DAMAGES, CalcDamageInfo::resist, WorldObject::SendMessageToSet(), SMSG_ATTACKERSTATEUPDATE, CalcDamageInfo::target, CalcDamageInfo::TargetState, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by AttackerStateUpdate(), misc_commandscript::HandleDamageCommand(), spell_dk_dancing_rune_weapon::HandleProc(), and SendAttackStateUpdate().

◆ SendAttackStateUpdate() [2/2]

void Unit::SendAttackStateUpdate ( uint32  HitInfo,
Unit target,
uint8  SwingType,
SpellSchoolMask  damageSchoolMask,
uint32  Damage,
uint32  AbsorbDamage,
uint32  Resist,
VictimState  TargetState,
uint32  BlockedAmount 
)
6505{
6506 CalcDamageInfo dmgInfo;
6507 dmgInfo.HitInfo = HitInfo;
6508 dmgInfo.attacker = this;
6509 dmgInfo.target = target;
6510
6511 dmgInfo.damages[0].damage = Damage - AbsorbDamage - Resist - BlockedAmount;
6512 dmgInfo.damages[0].damageSchoolMask = damageSchoolMask;
6513 dmgInfo.damages[0].absorb = AbsorbDamage;
6514 dmgInfo.damages[0].resist = Resist;
6515
6516 dmgInfo.damages[1].damage = 0;
6517 dmgInfo.damages[1].damageSchoolMask = 0;
6518 dmgInfo.damages[1].absorb = 0;
6519 dmgInfo.damages[1].resist = 0;
6520
6521 dmgInfo.TargetState = TargetState;
6522 dmgInfo.blocked_amount = BlockedAmount;
6523 SendAttackStateUpdate(&dmgInfo);
6524}
HitInfo
Definition: Unit.h:178

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, CalcDamageInfo::HitInfo, CalcDamageInfo::resist, SendAttackStateUpdate(), CalcDamageInfo::target, and CalcDamageInfo::TargetState.

◆ SendChangeCurrentVictimOpcode()

void Unit::SendChangeCurrentVictimOpcode ( HostileReference pHostileReference)
20370{
20371 if (!GetThreatMgr().isThreatListEmpty())
20372 {
20373 uint32 count = GetThreatMgr().GetThreatList().size();
20374
20375 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_HIGHEST_THREAT_UPDATE Message");
20376 WorldPacket data(SMSG_HIGHEST_THREAT_UPDATE, 8 + 8 + count * 8);
20377 data << GetPackGUID();
20378 data << pHostileReference->getUnitGuid().WriteAsPacked();
20379 data << uint32(count);
20381 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
20382 {
20383 data << (*itr)->getUnitGuid().WriteAsPacked();
20384 data << uint32((*itr)->GetThreat() * 100);
20385 }
20386 SendMessageToSet(&data, false);
20387 }
20388}
@ SMSG_HIGHEST_THREAT_UPDATE
Definition: Opcodes.h:1184
std::list< HostileReference * > StorageType
Definition: ThreatMgr.h:148
PackedGuid WriteAsPacked() const
Definition: ObjectGuid.h:318

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_HIGHEST_THREAT_UPDATE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::setCurrentVictim().

◆ SendClearTarget()

void Unit::SendClearTarget ( )
20582{
20584 data << GetPackGUID();
20585 SendMessageToSet(&data, false);
20586}
@ SMSG_BREAK_TARGET
Definition: Opcodes.h:368

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_BREAK_TARGET.

Referenced by Vehicle::AddPassenger(), and Spell::EffectForceDeselect().

◆ SendClearThreatListOpcode()

void Unit::SendClearThreatListOpcode ( )
20391{
20392 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_CLEAR Message");
20394 data << GetPackGUID();
20395 SendMessageToSet(&data, false);
20396}
@ SMSG_THREAT_CLEAR
Definition: Opcodes.h:1187

References Object::GetPackGUID(), LOG_DEBUG, WorldObject::SendMessageToSet(), and SMSG_THREAT_CLEAR.

Referenced by ThreatMgr::ClearAllThreat().

◆ SendComboPoints()

void Unit::SendComboPoints ( )
17147{
17148 if (m_cleanupDone)
17149 {
17150 return;
17151 }
17152
17154 if (Player* playerMe = ToPlayer())
17155 {
17156 WorldPacket data(SMSG_UPDATE_COMBO_POINTS, packGUID.size() + 1);
17157 data << packGUID;
17158 data << uint8(m_comboPoints);
17159 playerMe->SendDirectMessage(&data);
17160 }
17161
17162 ObjectGuid ownerGuid = GetCharmerOrOwnerGUID();
17163 Player* owner = nullptr;
17164 if (ownerGuid.IsPlayer())
17165 {
17166 owner = ObjectAccessor::GetPlayer(*this, ownerGuid);
17167 }
17168
17169 if (m_movedByPlayer || owner)
17170 {
17171 WorldPacket data(SMSG_PET_UPDATE_COMBO_POINTS, GetPackGUID().size() + packGUID.size() + 1);
17172 data << GetPackGUID();
17173 data << packGUID;
17174 data << uint8(m_comboPoints);
17175
17176 if (m_movedByPlayer)
17178
17179 if (owner && owner != m_movedByPlayer)
17180 owner->SendDirectMessage(&data);
17181 }
17182}
@ SMSG_PET_UPDATE_COMBO_POINTS
Definition: Opcodes.h:1200
@ SMSG_UPDATE_COMBO_POINTS
Definition: Opcodes.h:955
Definition: ObjectGuid.h:265
std::size_t size() const
Definition: ObjectGuid.h:276

References GetCharmerOrOwnerGUID(), Object::GetPackGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), m_cleanupDone, m_comboPoints, m_comboTarget, m_movedByPlayer, Player::SendDirectMessage(), PackedGuid::size(), SMSG_PET_UPDATE_COMBO_POINTS, SMSG_UPDATE_COMBO_POINTS, and Object::ToPlayer().

Referenced by AddComboPoints(), and ClearComboPoints().

◆ SendEnergizeSpellLog()

void Unit::SendEnergizeSpellLog ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11255{
11256 WorldPacket data(SMSG_SPELLENERGIZELOG, (8 + 8 + 4 + 4 + 4 + 1));
11257 data << victim->GetPackGUID();
11258 data << GetPackGUID();
11259 data << uint32(spellID);
11260 data << uint32(powerType);
11261 data << uint32(damage);
11262 SendMessageToSet(&data, true);
11263}
@ SMSG_SPELLENERGIZELOG
Definition: Opcodes.h:367

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLENERGIZELOG.

Referenced by EnergizeBySpell(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ SendHealSpellLog()

void Unit::SendHealSpellLog ( HealInfo const &  healInfo,
bool  critical = false 
)
11222{
11223 uint32 overheal = healInfo.GetHeal() - healInfo.GetEffectiveHeal();
11224
11225 // we guess size
11226 WorldPacket data(SMSG_SPELLHEALLOG, (8 + 8 + 4 + 4 + 4 + 4 + 1 + 1));
11227 data << healInfo.GetTarget()->GetPackGUID();
11228 data << GetPackGUID();
11229 data << uint32(healInfo.GetSpellInfo()->Id);
11230 data << uint32(healInfo.GetHeal());
11231 data << uint32(overheal);
11232 data << uint32(healInfo.GetAbsorb()); // Absorb amount
11233 data << uint8(critical ? 1 : 0);
11234 data << uint8(0); // unused
11235 SendMessageToSet(&data, true);
11236}
@ SMSG_SPELLHEALLOG
Definition: Opcodes.h:366

References HealInfo::GetAbsorb(), HealInfo::GetEffectiveHeal(), HealInfo::GetHeal(), Object::GetPackGUID(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SpellInfo::Id, WorldObject::SendMessageToSet(), and SMSG_SPELLHEALLOG.

Referenced by HealBySpell().

◆ SendMeleeAttackStart()

void Unit::SendMeleeAttackStart ( Unit victim,
Player sendTo = nullptr 
)
3034{
3035 WorldPacket data(SMSG_ATTACKSTART, 8 + 8);
3036 data << GetGUID();
3037 data << victim->GetGUID();
3038 if (sendTo)
3039 sendTo->SendDirectMessage(&data);
3040 else
3041 SendMessageToSet(&data, true);
3042 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTART");
3043}
@ SMSG_ATTACKSTART
Definition: Opcodes.h:353

References Object::GetGUID(), LOG_DEBUG, Player::SendDirectMessage(), WorldObject::SendMessageToSet(), and SMSG_ATTACKSTART.

Referenced by Attack(), Player::GetInitialVisiblePackets(), and boss_leotheras_the_blind::Reset().

◆ SendMeleeAttackStop()

void Unit::SendMeleeAttackStop ( Unit victim = nullptr)

Can also take the value 0x01, which seems related to updating rotation

3046{
3047 // pussywizard: calling SendMeleeAttackStop without clearing UNIT_STATE_MELEE_ATTACKING and then AttackStart the same player may spoil npc rotating!
3048 // pussywizard: this happens in some boss scripts, just add clearing here
3049 // ClearUnitState(UNIT_STATE_MELEE_ATTACKING); // commented out for now
3050
3051 WorldPacket data(SMSG_ATTACKSTOP, (8 + 8 + 4));
3052 data << GetPackGUID();
3053 data << (victim ? victim->GetPackGUID() : PackedGuid());
3054 data << uint32(0);
3055 SendMessageToSet(&data, true);
3056 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTOP");
3057
3058 if (victim)
3059 LOG_DEBUG("entities.unit", "{} {} stopped attacking {} {}", (GetTypeId() == TYPEID_PLAYER ? "Player" : "Creature"), GetGUID().ToString(), (victim->GetTypeId() == TYPEID_PLAYER ? "player" : "creature"), victim->GetGUID().ToString());
3060 else
3061 LOG_DEBUG("entities.unit", "{} {} stopped attacking", (GetTypeId() == TYPEID_PLAYER ? "Player" : "Creature"), GetGUID().ToString());
3062}
@ SMSG_ATTACKSTOP
Definition: Opcodes.h:354

References Object::GetGUID(), Object::GetPackGUID(), Object::GetTypeId(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_ATTACKSTOP, ObjectGuid::ToString(), Position::ToString(), and TYPEID_PLAYER.

Referenced by Attack(), AttackStop(), boss_garfrost::boss_garfrostAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_svalna_revive_champion::spell_svalna_revive_champion_SpellScript::Land(), boss_leotheras_the_blind::Reset(), SetControlled(), boss_razorscale::boss_razorscaleAI::SpellHit(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), and boss_kaelthas::boss_kaelthasAI::UpdateAI().

◆ SendMonsterMove()

void Unit::SendMonsterMove ( float  NewPosX,
float  NewPosY,
float  NewPosZ,
uint32  TransitTime,
SplineFlags  sf = SPLINEFLAG_WALK_MODE 
)
557{
558 WorldPacket data(SMSG_MONSTER_MOVE, 1 + 12 + 4 + 1 + 4 + 4 + 4 + 12 + GetPackGUID().size());
559 data << GetPackGUID();
560
561 data << uint8(0); // new in 3.1
562 data << GetPositionX() << GetPositionY() << GetPositionZ();
563 data << GameTime::GetGameTimeMS().count();
564 data << uint8(0);
565 data << uint32(sf);
566 data << TransitTime; // Time in between points
567 data << uint32(1); // 1 single waypoint
568 data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B
569
570 SendMessageToSet(&data, true);
571}
@ SMSG_MONSTER_MOVE
Definition: Opcodes.h:251

References GameTime::GetGameTimeMS(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::SendMessageToSet(), and SMSG_MONSTER_MOVE.

Referenced by npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI().

◆ SendMovementFeatherFall()

void Unit::SendMovementFeatherFall ( Player sendTo)
21012{
21013 if (!movespline->Initialized())
21014 return;
21016 data << GetPackGUID();
21017 sendTo->SendDirectMessage(&data);
21018}
@ SMSG_SPLINE_MOVE_FEATHER_FALL
Definition: Opcodes.h:803

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_FEATHER_FALL.

Referenced by Player::GetAurasForTarget().

◆ SendMovementFlagUpdate()

void Unit::SendMovementFlagUpdate ( bool  self = false)
16973{
16974 WorldPacket data;
16975 BuildHeartBeatMsg(&data);
16976 SendMessageToSet(&data, self);
16977}
void BuildHeartBeatMsg(WorldPacket *data) const
Definition: Object.cpp:2073

References BuildHeartBeatMsg(), and WorldObject::SendMessageToSet().

Referenced by boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_nightbane::EnterEvadeMode(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_harbinger_skyriss::JustSummoned(), MotionMaster::MoveFall(), npc_twilight_volunteer::MovementInform(), boss_felmyst::boss_felmystAI::MovementInform(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), npc_dancing_flames::npc_dancing_flamesAI::Reset(), SetCharm(), SetHover(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_kaelthas::boss_kaelthasAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ SendMovementHover()

void Unit::SendMovementHover ( Player sendTo)
21049{
21050 if (!movespline->Initialized())
21051 return;
21053 data << GetPackGUID();
21054 sendTo->SendDirectMessage(&data);
21055}
@ SMSG_SPLINE_MOVE_SET_HOVER
Definition: Opcodes.h:805

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_SET_HOVER.

Referenced by Player::GetAurasForTarget().

◆ SendMovementWaterWalking()

void Unit::SendMovementWaterWalking ( Player sendTo)
20990{
20991 if (!movespline->Initialized())
20992 return;
20994 data << GetPackGUID();
20995 sendTo->SendDirectMessage(&data);
20996}
@ SMSG_SPLINE_MOVE_WATER_WALK
Definition: Opcodes.h:807

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_WATER_WALK.

Referenced by Player::GetAurasForTarget().

◆ SendPeriodicAuraLog()

void Unit::SendPeriodicAuraLog ( SpellPeriodicAuraLogInfo pInfo)
6328{
6329 AuraEffect const* aura = pInfo->auraEff;
6331 data << GetPackGUID();
6332 data << aura->GetCasterGUID().WriteAsPacked();
6333 data << uint32(aura->GetId()); // spellId
6334 data << uint32(1); // count
6335 data << uint32(aura->GetAuraType()); // auraId
6336 switch (aura->GetAuraType())
6337 {
6340 {
6341 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6342 uint32 damage = pInfo->damage;
6343 uint32 absorb = pInfo->absorb;
6344 if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->GetCommandStatus(CHEAT_GOD))
6345 {
6346 absorb = damage;
6347 damage = 0;
6348 }
6349
6350 data << uint32(damage); // damage
6351 data << uint32(pInfo->overDamage); // overkill?
6352 data << uint32(aura->GetSpellInfo()->GetSchoolMask());
6353 data << uint32(absorb); // absorb
6354 data << uint32(pInfo->resist); // resist
6355 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6356 }
6357 break;
6360 data << uint32(pInfo->damage); // damage
6361 data << uint32(pInfo->overDamage); // overheal
6362 data << uint32(pInfo->absorb); // absorb
6363 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6364 break;
6367 data << uint32(aura->GetMiscValue()); // power type
6368 data << uint32(pInfo->damage); // damage
6369 break;
6371 data << uint32(aura->GetMiscValue()); // power type
6372 data << uint32(pInfo->damage); // amount
6373 data << float(pInfo->multiplier); // gain multiplier
6374 break;
6375 default:
6376 LOG_ERROR("entities.unit", "Unit::SendPeriodicAuraLog: unknown aura {}", uint32(aura->GetAuraType()));
6377 return;
6378 }
6379
6380 SendMessageToSet(&data, true);
6381}
@ SPELL_AURA_OBS_MOD_HEALTH
Definition: SpellAuraDefines.h:83
@ SPELL_AURA_PERIODIC_MANA_LEECH
Definition: SpellAuraDefines.h:127
@ SPELL_AURA_PERIODIC_ENERGIZE
Definition: SpellAuraDefines.h:87
@ SMSG_PERIODICAURALOG
Definition: Opcodes.h:620
float multiplier
Definition: Unit.h:952
bool critical
Definition: Unit.h:953
uint32 overDamage
Definition: Unit.h:949
uint32 resist
Definition: Unit.h:951
uint32 damage
Definition: Unit.h:948
AuraEffect const * auraEff
Definition: Unit.h:947
uint32 absorb
Definition: Unit.h:950

References SpellPeriodicAuraLogInfo::absorb, SpellPeriodicAuraLogInfo::auraEff, CHEAT_GOD, SpellPeriodicAuraLogInfo::critical, SpellPeriodicAuraLogInfo::damage, AuraEffect::GetAuraType(), AuraEffect::GetCasterGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), Object::GetPackGUID(), SpellInfo::GetSchoolMask(), AuraEffect::GetSpellInfo(), Object::GetTypeId(), LOG_ERROR, SpellPeriodicAuraLogInfo::multiplier, SpellPeriodicAuraLogInfo::overDamage, SpellPeriodicAuraLogInfo::resist, WorldObject::SendMessageToSet(), SMSG_PERIODICAURALOG, SPELL_AURA_OBS_MOD_HEALTH, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_ENERGIZE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_MANA_LEECH, Object::ToPlayer(), TYPEID_PLAYER, and ObjectGuid::WriteAsPacked().

Referenced by AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SendPetActionFeedback()

void Unit::SendPetActionFeedback ( uint8  msg)

-------—Pet responses methods--------------—

16877{
16878 Unit* owner = GetOwner();
16879 if (!owner || owner->GetTypeId() != TYPEID_PLAYER)
16880 return;
16881
16883 data << uint8(msg);
16884 owner->ToPlayer()->GetSession()->SendPacket(&data);
16885}
@ SMSG_PET_ACTION_FEEDBACK
Definition: Opcodes.h:740

References GetOwner(), Player::GetSession(), Object::GetTypeId(), WorldSession::SendPacket(), SMSG_PET_ACTION_FEEDBACK, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by WorldSession::HandlePetCancelAuraOpcode().

◆ SendPetAIReaction()

void Unit::SendPetAIReaction ( ObjectGuid  guid)
16900{
16901 Unit* owner = GetOwner();
16902 if (!owner || owner->GetTypeId() != TYPEID_PLAYER)
16903 return;
16904
16905 WorldPacket data(SMSG_AI_REACTION, 8 + 4);
16906 data << guid;
16907 data << uint32(AI_REACTION_HOSTILE);
16908 owner->ToPlayer()->GetSession()->SendPacket(&data);
16909}
@ SMSG_AI_REACTION
Definition: Opcodes.h:346

References AI_REACTION_HOSTILE, GetOwner(), Player::GetSession(), Object::GetTypeId(), WorldSession::SendPacket(), SMSG_AI_REACTION, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by PetAI::DoAttack(), and WorldSession::HandlePetActionHelper().

◆ SendPetTalk()

void Unit::SendPetTalk ( uint32  pettalk)
16888{
16889 Unit* owner = GetOwner();
16890 if (!owner || owner->GetTypeId() != TYPEID_PLAYER)
16891 return;
16892
16894 data << GetGUID();
16895 data << uint32(pettalk);
16896 owner->ToPlayer()->GetSession()->SendPacket(&data);
16897}
@ SMSG_PET_ACTION_SOUND
Definition: Opcodes.h:834

References Object::GetGUID(), GetOwner(), Player::GetSession(), Object::GetTypeId(), WorldSession::SendPacket(), SMSG_PET_ACTION_SOUND, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by WorldSession::HandlePetActionHelper().

◆ SendPlaySpellImpact()

void Unit::SendPlaySpellImpact ( ObjectGuid  guid,
uint32  id 
)
19184{
19186 data << guid; // target
19187 data << uint32(id); // SpellVisualKit.dbc index
19188 SendMessageToSet(&data, true);
19189}
@ SMSG_PLAY_SPELL_IMPACT
Definition: Opcodes.h:533

References WorldObject::SendMessageToSet(), and SMSG_PLAY_SPELL_IMPACT.

Referenced by debug_commandscript::HandleDebugVisualCommand(), and WorldSession::HandleTrainerBuySpellOpcode().

◆ SendPlaySpellVisual()

void Unit::SendPlaySpellVisual ( uint32  id)
19176{
19178 data << GetGUID();
19179 data << uint32(id); // SpellVisualKit.dbc index
19180 SendMessageToSet(&data, true);
19181}
@ SMSG_PLAY_SPELL_VISUAL
Definition: Opcodes.h:529

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_PLAY_SPELL_VISUAL.

Referenced by debug_commandscript::HandleDebugVisualCommand(), WorldSession::HandleTrainerBuySpellOpcode(), and Player::RegenerateAll().

◆ SendRemoveFromThreatListOpcode()

void Unit::SendRemoveFromThreatListOpcode ( HostileReference pHostileReference)
20399{
20400 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_REMOVE Message");
20401 WorldPacket data(SMSG_THREAT_REMOVE, 8 + 8);
20402 data << GetPackGUID();
20403 data << pHostileReference->getUnitGuid().WriteAsPacked();
20404 SendMessageToSet(&data, false);
20405}
@ SMSG_THREAT_REMOVE
Definition: Opcodes.h:1186

References Object::GetPackGUID(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_THREAT_REMOVE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::processThreatEvent().

◆ SendSpellDamageImmune()

void Unit::SendSpellDamageImmune ( Unit target,
uint32  spellId 
)
6408{
6409 WorldPacket data(SMSG_SPELLORDAMAGE_IMMUNE, 8 + 8 + 4 + 1);
6410 data << GetGUID();
6411 data << target->GetGUID();
6412 data << uint32(spellId);
6413 data << uint8(0); // bool - log format: 0-default, 1-debug
6414 SendMessageToSet(&data, true);
6415}
@ SMSG_SPELLORDAMAGE_IMMUNE
Definition: Opcodes.h:641

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLORDAMAGE_IMMUNE.

Referenced by DealMeleeDamage(), and AuraEffect::SendTickImmune().

◆ SendSpellDamageResist()

void Unit::SendSpellDamageResist ( Unit target,
uint32  spellId 
)
6398{
6399 WorldPacket data(SMSG_PROCRESIST, 8 + 8 + 4 + 1);
6400 data << GetGUID();
6401 data << target->GetGUID();
6402 data << uint32(spellId);
6403 data << uint8(0); // bool - log format: 0-default, 1-debug
6404 SendMessageToSet(&data, true);
6405}
@ SMSG_PROCRESIST
Definition: Opcodes.h:638

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_PROCRESIST.

◆ SendSpellMiss()

void Unit::SendSpellMiss ( Unit target,
uint32  spellID,
SpellMissInfo  missInfo 
)
6384{
6385 WorldPacket data(SMSG_SPELLLOGMISS, (4 + 8 + 1 + 4 + 8 + 1));
6386 data << uint32(spellID);
6387 data << GetGUID();
6388 data << uint8(0); // can be 0 or 1
6389 data << uint32(1); // target count
6390 // for (i = 0; i < target count; ++i)
6391 data << target->GetGUID(); // target GUID
6392 data << uint8(missInfo);
6393 // end loop
6394 SendMessageToSet(&data, true);
6395}
@ SMSG_SPELLLOGMISS
Definition: Opcodes.h:617

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLLOGMISS.

Referenced by DealMeleeDamage(), and Spell::DoAllEffectOnTarget().

◆ SendSpellNonMeleeDamageLog() [1/2]

void Unit::SendSpellNonMeleeDamageLog ( SpellNonMeleeDamage log)
6249{
6250 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6251 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6252 uint32 damage = log->damage;
6253 uint32 absorb = log->absorb;
6255 {
6256 absorb = damage;
6257 damage = 0;
6258 }
6259 data << log->target->GetPackGUID();
6260 data << log->attacker->GetPackGUID();
6261 data << uint32(log->spellInfo->Id);
6262 data << uint32(damage); // damage amount
6263 int32 overkill = damage - log->target->GetHealth();
6264 data << uint32(overkill > 0 ? overkill : 0); // overkill
6265 data << uint8 (log->schoolMask); // damage school
6266 data << uint32(absorb); // AbsorbedDamage
6267 data << uint32(log->resist); // resist
6268 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6269 data << uint8 (log->unused); // unused
6270 data << uint32(log->blocked); // blocked
6271 data << uint32(log->HitInfo);
6272 data << uint32(log->HitInfo);
6274 //if (log->HitInfo & SPELL_HIT_TYPE_CRIT_DEBUG)
6275 //{
6276 // data << float(log->CritRoll);
6277 // data << float(log->CritNeeded);
6278 //}
6279 //if (log->HitInfo & SPELL_HIT_TYPE_HIT_DEBUG)
6280 //{
6281 // data << float(log->HitRoll);
6282 // data << float(log->HitNeeded);
6283 //}
6284 //if (log->HitInfo & SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG)
6285 //{
6286 // data << float(log->MissChance);
6287 // data << float(log->DodgeChance);
6288 // data << float(log->ParryChance);
6289 // data << float(log->BlockChance);
6290 // data << float(log->GlanceChance);
6291 // data << float(log->CrushChance);
6292 //}
6293 SendMessageToSet(&data, true);
6294}
@ SPELL_HIT_TYPE_HIT_DEBUG
Definition: SharedDefines.h:1537
@ SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG
Definition: SharedDefines.h:1540
@ SPELL_HIT_TYPE_CRIT_DEBUG
Definition: SharedDefines.h:1535
@ SMSG_SPELLNONMELEEDAMAGELOG
Definition: Opcodes.h:622
bool physicalLog
Definition: Unit.h:934
bool unused
Definition: Unit.h:935

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), Object::GetTypeId(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, WorldObject::SendMessageToSet(), SMSG_SPELLNONMELEEDAMAGELOG, SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG, SPELL_HIT_TYPE_CRIT_DEBUG, SPELL_HIT_TYPE_HIT_DEBUG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), TYPEID_PLAYER, and SpellNonMeleeDamage::unused.

Referenced by CalcAbsorbResist(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectEnvironmentalDMG(), spell_sindragosa_s_fury::spell_sindragosa_s_fury_SpellScript::HandleDummy(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandleProcTriggerDamageAuraProc(), and SendSpellNonMeleeDamageLog().

◆ SendSpellNonMeleeDamageLog() [2/2]

void Unit::SendSpellNonMeleeDamageLog ( Unit target,
SpellInfo const *  spellInfo,
uint32  Damage,
SpellSchoolMask  damageSchoolMask,
uint32  AbsorbedDamage,
uint32  Resist,
bool  PhysicalDamage,
uint32  Blocked,
bool  CriticalHit = false,
bool  Split = false 
)
6297{
6298 SpellNonMeleeDamage log(this, target, spellInfo, damageSchoolMask);
6299 log.damage = Damage;
6300 log.absorb = AbsorbedDamage;
6301 log.resist = Resist;
6302 log.physicalLog = PhysicalDamage;
6303 log.blocked = Blocked;
6304 log.HitInfo = 0;
6305 if (CriticalHit)
6306 {
6307 log.HitInfo |= SPELL_HIT_TYPE_CRIT;
6308 }
6309 if (Split)
6310 {
6311 log.HitInfo |= SPELL_HIT_TYPE_SPLIT;
6312 }
6314}
@ SPELL_HIT_TYPE_SPLIT
Definition: SharedDefines.h:1538
Definition: Unit.h:920

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, SpellNonMeleeDamage::damage, SpellNonMeleeDamage::HitInfo, SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SendSpellNonMeleeDamageLog(), SPELL_HIT_TYPE_CRIT, and SPELL_HIT_TYPE_SPLIT.

◆ SendSpellNonMeleeReflectLog()

void Unit::SendSpellNonMeleeReflectLog ( SpellNonMeleeDamage log,
Unit attacker 
)
6217{
6218 // Xinef: function for players only, placed in unit because of cosmetics
6219 if (GetTypeId() != TYPEID_PLAYER)
6220 return;
6221
6222 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6223 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6224 uint32 damage = log->damage;
6225 uint32 absorb = log->absorb;
6227 {
6228 absorb = damage;
6229 damage = 0;
6230 }
6231 data << log->target->GetPackGUID();
6232 data << attacker->GetPackGUID();
6233 data << uint32(log->spellInfo->Id);
6234 data << uint32(damage); // damage amount
6235 int32 overkill = damage - log->target->GetHealth();
6236 data << uint32(overkill > 0 ? overkill : 0); // overkill
6237 data << uint8 (log->schoolMask); // damage school
6238 data << uint32(absorb); // AbsorbedDamage
6239 data << uint32(log->resist); // resist
6240 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6241 data << uint8 (log->unused); // unused
6242 data << uint32(log->blocked); // blocked
6243 data << uint32(log->HitInfo);
6244 data << uint8 (0); // flag to use extend data
6245 ToPlayer()->SendDirectMessage(&data);
6246}

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), Object::GetTypeId(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, Player::SendDirectMessage(), SMSG_SPELLNONMELEEDAMAGELOG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), TYPEID_PLAYER, and SpellNonMeleeDamage::unused.

Referenced by Spell::DoAllEffectOnTarget().

◆ SendTameFailure()

void Unit::SendTameFailure ( uint8  result)
20271{
20273 data << uint8(result);
20274 ToPlayer()->SendDirectMessage(&data);
20275}
@ SMSG_PET_TAME_FAILURE
Definition: Opcodes.h:401

References Player::SendDirectMessage(), SMSG_PET_TAME_FAILURE, and Object::ToPlayer().

Referenced by spell_hun_tame_beast::CheckCast(), and Spell::CheckCast().

◆ SendTeleportPacket()

void Unit::SendTeleportPacket ( Position pos)

◆ SendThreatListUpdate()

void Unit::SendThreatListUpdate ( )
20350{
20351 if (!GetThreatMgr().isThreatListEmpty())
20352 {
20353 uint32 count = GetThreatMgr().GetThreatList().size();
20354
20355 //LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_UPDATE Message");
20356 WorldPacket data(SMSG_THREAT_UPDATE, 8 + count * 8);
20357 data << GetPackGUID();
20358 data << uint32(count);
20360 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
20361 {
20362 data << (*itr)->getUnitGuid().WriteAsPacked();
20363 data << uint32((*itr)->GetThreat() * 100);
20364 }
20365 SendMessageToSet(&data, false);
20366 }
20367}
@ SMSG_THREAT_UPDATE
Definition: Opcodes.h:1185

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), WorldObject::SendMessageToSet(), and SMSG_THREAT_UPDATE.

Referenced by Update().

◆ SetAI()

void Unit::SetAI ( UnitAI newAI)
inline
1329{ i_AI = newAI; }

References i_AI.

◆ SetArmor()

void Unit::SetArmor ( int32  val)
inline

◆ SetAttackTime()

◆ setAttackTimer()

◆ SetAuraStack()

void Unit::SetAuraStack ( uint32  spellId,
Unit target,
uint32  stack 
)
19167{
19168 Aura* aura = target->GetAura(spellId, GetGUID());
19169 if (!aura)
19170 aura = AddAura(spellId, target);
19171 if (aura && stack)
19172 aura->SetStackAmount(stack);
19173}
void SetStackAmount(uint8 num)
Definition: SpellAuras.cpp:1009

References AddAura(), GetAura(), Object::GetGUID(), and Aura::SetStackAmount().

Referenced by boss_viscidus::DamageTaken(), spell_capacitus_polarity_charge::HandleTargets(), spell_thaddius_pos_neg_charge::spell_thaddius_pos_neg_charge_SpellScript::HandleTargets(), and BattlefieldWG::OnPlayerJoinWar().

◆ SetBaseWeaponDamage()

void Unit::SetBaseWeaponDamage ( WeaponAttackType  attType,
WeaponDamageRange  damageRange,
float  value,
uint8  damageIndex = 0 
)
inline
2132{ m_weaponDamage[attType][damageRange][damageIndex] = value; }

References m_weaponDamage.

Referenced by Player::_ApplyWeaponDamage(), Guardian::InitStatsForLevel(), and Creature::SelectLevel().

◆ SetCanDualWield()

virtual void Unit::SetCanDualWield ( bool  value)
inlinevirtual

◆ SetCanFly()

◆ SetCanModifyStats()

◆ SetCantProc()

void Unit::SetCantProc ( bool  apply)
inline
2336 {
2337 if (apply)
2338 ++m_procDeep;
2339 else
2340 {
2342 --m_procDeep;
2343 }
2344 }

References ASSERT, and m_procDeep.

Referenced by HandleDummyAuraProc(), and ProcDamageAndSpellFor().

◆ SetCharm()

void Unit::SetCharm ( Unit target,
bool  apply 
)
Todo:
: maybe we can use this flag to check if controlled by player
10871{
10872 if (apply)
10873 {
10874 if (GetTypeId() == TYPEID_PLAYER)
10875 {
10876 if (!AddGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
10877 LOG_FATAL("entities.unit", "Player {} is trying to charm unit {}, but it already has a charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
10878
10879 charm->m_ControlledByPlayer = true;
10881 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10882 }
10883 else
10884 charm->m_ControlledByPlayer = false;
10885
10886 // PvP, FFAPvP
10887 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, GetByteValue(UNIT_FIELD_BYTES_2, 1));
10888
10889 if (!charm->AddGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
10890 LOG_FATAL("entities.unit", "Unit {} is being charmed, but it already has a charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
10891
10892 _isWalkingBeforeCharm = charm->IsWalking();
10894 {
10895 charm->SetWalk(false);
10896 charm->SendMovementFlagUpdate();
10897 }
10898
10899 m_Controlled.insert(charm);
10900 }
10901 else
10902 {
10903 if (GetTypeId() == TYPEID_PLAYER)
10904 {
10905 if (!RemoveGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
10906 LOG_FATAL("entities.unit", "Player {} is trying to uncharm unit {}, but it has another charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
10907 }
10908
10909 if (!charm->RemoveGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
10910 LOG_FATAL("entities.unit", "Unit {} is being uncharmed, but it has another charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
10911
10912 if (charm->GetTypeId() == TYPEID_PLAYER)
10913 {
10914 charm->m_ControlledByPlayer = true;
10915 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10916 charm->ToPlayer()->UpdatePvPState();
10917 }
10918 else if (Player* player = charm->GetCharmerOrOwnerPlayerOrPlayerItself())
10919 {
10920 charm->m_ControlledByPlayer = true;
10921 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10922 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, player->GetByteValue(UNIT_FIELD_BYTES_2, 1));
10923
10924 // Xinef: skip controlled erase if charmed unit is owned by charmer
10925 if (charm->IsInWorld() && !charm->IsDuringRemoveFromWorld() && player->GetGUID() == this->GetGUID() && (charm->IsPet() || charm->HasUnitTypeMask(UNIT_MASK_MINION)))
10926 return;
10927 }
10928 else
10929 {
10930 charm->m_ControlledByPlayer = false;
10931 charm->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10932 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, 0);
10933 }
10934
10935 if (charm->IsWalking() != _isWalkingBeforeCharm)
10936 {
10937 charm->SetWalk(_isWalkingBeforeCharm);
10938 charm->SendMovementFlagUpdate(true); // send packet to self, to update movement state on player.
10939 }
10940
10941 m_Controlled.erase(charm);
10942 }
10943}
bool AddGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:686
bool RemoveGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:704

References _isWalkingBeforeCharm, Object::AddGuidValue(), Object::GetByteValue(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), HasUnitTypeMask(), IsDuringRemoveFromWorld(), Object::IsInWorld(), IsPet(), IsWalking(), LOG_FATAL, m_Controlled, m_ControlledByPlayer, Object::RemoveGuidValue(), RemoveUnitFlag(), SendMovementFlagUpdate(), Object::SetByteValue(), SetUnitFlag(), SetWalk(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), TYPEID_PLAYER, UNIT_FIELD_BYTES_2, UNIT_FIELD_CHARM, UNIT_FIELD_CHARMEDBY, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_MASK_MINION, and Player::UpdatePvPState().

Referenced by RemoveCharmedBy(), SetCharmedBy(), and Player::StopCastingCharm().

◆ SetCharmedBy()

bool Unit::SetCharmedBy ( Unit charmer,
CharmType  type,
AuraApplication const *  aurApp = nullptr 
)
18615{
18616 if (!charmer)
18617 return false;
18618
18619 if (!charmer->IsInWorld() || charmer->IsDuringRemoveFromWorld())
18620 {
18621 return false;
18622 }
18623
18624 // dismount players when charmed
18625 if (GetTypeId() == TYPEID_PLAYER)
18627
18628 if (charmer->GetTypeId() == TYPEID_PLAYER)
18630
18631 ASSERT(type != CHARM_TYPE_POSSESS || charmer->GetTypeId() == TYPEID_PLAYER);
18632 if (type == CHARM_TYPE_VEHICLE && !IsVehicle()) // pussywizard
18633 throw 1;
18634 ASSERT((type == CHARM_TYPE_VEHICLE) == IsVehicle());
18635
18636 LOG_DEBUG("entities.unit", "SetCharmedBy: charmer {} ({}), charmed {} ({}), type {}.",
18637 charmer->GetEntry(), charmer->GetGUID().ToString(), GetEntry(), GetGUID().ToString(), uint32(type));
18638
18639 if (this == charmer)
18640 {
18641 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Unit {} ({}) is trying to charm itself!", GetEntry(), GetGUID().ToString());
18642 return false;
18643 }
18644
18645 //if (HasUnitState(UNIT_STATE_UNATTACKABLE))
18646 // return false;
18647
18649 {
18650 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Player on transport is trying to charm {} ({})", GetEntry(), GetGUID().ToString());
18651 return false;
18652 }
18653
18654 // Already charmed
18655 if (GetCharmerGUID())
18656 {
18657 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) has already been charmed but {} ({}) is trying to charm it!",
18658 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18659 return false;
18660 }
18661
18662 CastStop();
18663 AttackStop();
18664
18665 // Xinef: dont reset threat and combat, put them on offline list, moved down after faction changes
18666 // CombatStop(); /// @todo: CombatStop(true) may cause crash (interrupt spells)
18667 // DeleteThreatList();
18668
18669 Player* playerCharmer = charmer->ToPlayer();
18670
18671 // Charmer stop charming
18672 if (playerCharmer)
18673 {
18674 playerCharmer->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18675 playerCharmer->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18676 }
18677
18678 // Charmed stop charming
18679 if (GetTypeId() == TYPEID_PLAYER)
18680 {
18681 ToPlayer()->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18682 ToPlayer()->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18683 }
18684
18685 // StopCastingCharm may remove a possessed pet?
18686 if (!IsInWorld())
18687 {
18688 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) is not in world but {} ({}) is trying to charm it!",
18689 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18690 return false;
18691 }
18692
18693 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18694 // prevent undefined behaviour
18695 if (aurApp && aurApp->GetRemoveMode())
18696 return false;
18697
18699 SetFaction(charmer->GetFaction());
18700
18701 // Set charmed
18702 charmer->SetCharm(this, true);
18703
18705
18706 if (GetTypeId() == TYPEID_UNIT)
18707 {
18708 GetMotionMaster()->Clear(false);
18710 StopMoving();
18711
18712 if (charmer->GetTypeId() == TYPEID_PLAYER && charmer->getClass() == CLASS_WARLOCK && ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_DEMON)
18713 {
18714 // Disable CreatureAI/SmartAI and switch to CharmAI when charmed by warlock
18715 Creature* charmed = ToCreature();
18716 charmed->NeedChangeAI = true;
18717 charmed->IsAIEnabled = false;
18718 }
18719 else
18720 {
18721 ToCreature()->AI()->OnCharmed(true);
18722 }
18723
18724 // Xinef: If creature can fly, add normal player flying flag (fixes speed)
18725 if (charmer->GetTypeId() == TYPEID_PLAYER && ToCreature()->CanFly())
18727 }
18728 else
18729 {
18730 Player* player = ToPlayer();
18731 if (player->isAFK())
18732 player->ToggleAFK();
18733
18734 player->SetClientControl(this, false); // verified
18735 }
18736
18737 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18738 // prevent undefined behaviour
18739 if (aurApp && aurApp->GetRemoveMode())
18740 return false;
18741
18742 // Pets already have a properly initialized CharmInfo, don't overwrite it.
18743 // Xinef: I need charmInfo for vehicle
18744 if (/*type != CHARM_TYPE_VEHICLE &&*/ !GetCharmInfo())
18745 {
18746 InitCharmInfo();
18747 if (type == CHARM_TYPE_POSSESS)
18749 else if (type != CHARM_TYPE_VEHICLE)
18750 {
18752
18753 // Xinef: convert charm npcs dont have pet bar so initialize them as defensive helpers
18754 if (type == CHARM_TYPE_CONVERT && GetTypeId() == TYPEID_UNIT)
18756 }
18757 }
18758
18759 if (playerCharmer)
18760 {
18761 switch (type)
18762 {
18763 case CHARM_TYPE_VEHICLE:
18766 playerCharmer->SetClientControl(this, true); // verified
18767 playerCharmer->VehicleSpellInitialize();
18768 break;
18769 case CHARM_TYPE_POSSESS:
18774 playerCharmer->SetClientControl(this, true); // verified
18775 playerCharmer->PossessSpellInitialize();
18776 break;
18777 case CHARM_TYPE_CHARM:
18778 if (GetTypeId() == TYPEID_UNIT && charmer->getClass() == CLASS_WARLOCK)
18779 {
18781 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18782 {
18783 // to prevent client crash
18785
18786 // just to enable stat window
18787 if (GetCharmInfo())
18788 GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
18789
18790 // if charmed two demons the same session, the 2nd gets the 1st one's name
18791 SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(GameTime::GetGameTime().count())); // cast can't be helped
18792 }
18793 }
18794 if (playerCharmer->m_seer != this)
18795 {
18797 playerCharmer->CharmSpellInitialize();
18798 }
18799 break;
18800 default:
18801 break;
18802 }
18803 }
18804 else if (GetTypeId() == TYPEID_PLAYER)
18806
18807 if (Creature* creature = ToCreature())
18808 creature->RefreshSwimmingFlag();
18809
18810 if (GetTypeId() == TYPEID_PLAYER)
18811 sScriptMgr->OnPlayerBeingCharmed(ToPlayer(), charmer, _oldFactionId, charmer->GetFaction());
18812
18813 return true;
18814}
@ UNIT_FIELD_PET_NAME_TIMESTAMP
Definition: UpdateFields.h:133
@ REACT_DEFENSIVE
Definition: Unit.h:1036
@ CHARM_TYPE_CONVERT
Definition: Unit.h:1090
void OnCharmed(bool apply) override
Definition: CreatureAI.cpp:32
void SetReactState(ReactStates st)
Definition: Creature.h:90
void CharmSpellInitialize()
Definition: Player.cpp:9562
WorldObject * m_seer
Definition: Player.h:2296
void ToggleAFK()
Definition: Player.cpp:1273
void PossessSpellInitialize()
Definition: Player.cpp:9459
bool isAFK() const
Definition: Player.h:1124
void VehicleSpellInitialize()
Definition: Player.cpp:9487
void StopCastingBindSight(Aura *except=nullptr)
Definition: Player.cpp:13072
void InitPossessCreateSpells()
Definition: Unit.cpp:15866
void InitCharmCreateSpells()
Definition: Unit.cpp:15902
virtual float GetFollowAngle() const
Definition: Unit.h:2406
CharmInfo * InitCharmInfo()
Definition: Unit.cpp:15798
void MoveIdle()
Definition: MotionMaster.cpp:232

References _oldFactionId, AddUnitMovementFlag(), AddUnitState(), Creature::AI(), ASSERT, AttackStop(), CanFly(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_CONVERT, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, Player::CharmSpellInitialize(), CLASS_MAGE, CLASS_WARLOCK, MotionMaster::Clear(), CREATURE_TYPE_DEMON, AuraApplication::GetBase(), GetCharmerGUID(), GetCharmInfo(), getClass(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFaction(), GetFollowAngle(), GameTime::GetGameTime(), Object::GetGUID(), GetMotionMaster(), AuraApplication::GetRemoveMode(), WorldObject::GetTransport(), Object::GetTypeId(), CharmInfo::InitCharmCreateSpells(), InitCharmInfo(), CharmInfo::InitPossessCreateSpells(), Player::isAFK(), IsAIEnabled, IsDuringRemoveFromWorld(), Object::IsInWorld(), IsVehicle(), LOG_DEBUG, LOG_FATAL, Player::m_seer, MotionMaster::MoveFollow(), MotionMaster::MoveIdle(), MOVEMENTFLAG_FLYING, NeedChangeAI, CreatureAI::OnCharmed(), PET_FOLLOW_DIST, Player::PossessSpellInitialize(), REACT_DEFENSIVE, RemoveAurasByType(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), Creature::SetReactState(), Object::SetUInt32Value(), SetUnitFlag(), sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sScriptMgr, StopAttackingInvalidTarget(), Player::StopCastingBindSight(), Player::StopCastingCharm(), StopMoving(), Object::ToCreature(), Player::ToggleAFK(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), CreatureTemplate::type, TYPEID_PLAYER, TYPEID_UNIT, UNIT_FIELD_BYTES_0, UNIT_FIELD_PET_NAME_TIMESTAMP, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, and Player::VehicleSpellInitialize().

Referenced by Vehicle::AddPassenger(), AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), and Puppet::InitSummon().

◆ SetCharmerGUID()

void Unit::SetCharmerGUID ( ObjectGuid  owner)
inline

◆ SetCombatTimer()

void Unit::SetCombatTimer ( uint32  timer)
inline
1713{ m_CombatTimer = timer; }

References m_CombatTimer.

◆ SetConfused()

void Unit::SetConfused ( bool  apply)
protected
18578{
18579 if (apply)
18580 {
18581 SetTarget();
18583
18584 if (GetTypeId() == TYPEID_PLAYER)
18585 {
18586 sScriptMgr->AnticheatSetSkipOnePacketForASH(ToPlayer(), true);
18587 }
18588 }
18589 else
18590 {
18591 if (IsAlive())
18592 {
18593 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == CONFUSED_MOTION_TYPE)
18594 {
18596 StopMoving();
18597 }
18598
18599 if (GetVictim())
18601 }
18602 }
18603
18604 // xinef: block / allow control to real mover (eg. charmer)
18605 if (GetTypeId() == TYPEID_PLAYER)
18606 {
18607 if (m_movedByPlayer)
18608 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18609 //else
18610 // ToPlayer()->SetClientControl(this, !apply);
18611 }
18612}
@ CONFUSED_MOTION_TYPE
Definition: MotionMaster.h:42
void MoveConfused()
Definition: MotionMaster.cpp:282

References CONFUSED_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), Object::GetTypeId(), GetVictim(), IsAlive(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveConfused(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), sScriptMgr, StopMoving(), Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by SetControlled().

◆ SetContestedPvP()

void Unit::SetContestedPvP ( Player attackedPlayer = nullptr,
bool  lookForNearContestedGuards = true 
)
17514{
17516
17517 if (!player || ((attackedPlayer && (attackedPlayer == player || (player->duel && player->duel->Opponent == attackedPlayer))) || player->InBattleground()))
17518 return;
17519
17520 // check if there any guards that should care about the contested flag on player
17521 if (lookForNearContestedGuards)
17522 {
17523 std::list<Unit*> targets;
17526 Cell::VisitAllObjects(this, searcher, MAX_AGGRO_RADIUS);
17527
17528 // return if there are no contested guards found
17529 if (!targets.size())
17530 {
17531 return;
17532 }
17533 }
17534
17535 player->SetContestedPvPTimer(30000);
17537 {
17540 // call MoveInLineOfSight for nearby contested guards
17542 }
17544 {
17546 // call MoveInLineOfSight for nearby contested guards
17548 }
17549}
#define MAX_AGGRO_RADIUS
Definition: Unit.h:162
void SetPlayerFlag(PlayerFlags flags)
Definition: Player.h:1101
bool InBattleground() const
Definition: Player.h:2214
void SetContestedPvPTimer(uint32 newTime)
Definition: Player.h:1832

References WorldObject::AddToNotify(), AddUnitState(), Player::duel, GetCharmerOrOwnerPlayerOrPlayerItself(), HasUnitState(), Player::InBattleground(), MAX_AGGRO_RADIUS, NOTIFY_AI_RELOCATION, PLAYER_FLAGS_CONTESTED_PVP, Player::SetContestedPvPTimer(), Player::SetPlayerFlag(), UNIT_STATE_ATTACK_PLAYER, and Cell::VisitAllObjects().

Referenced by CombatStart(), CombatStartOnCast(), Spell::DoSpellHitOnUnit(), and WorldSession::HandlePlayerLoginFromDB().

◆ SetControlled()

void Unit::SetControlled ( bool  apply,
UnitState  state,
Unit source = nullptr,
bool  isFear = false 
)
18289{
18290 if (apply)
18291 {
18292 if (HasUnitState(state))
18293 return;
18294
18295 AddUnitState(state);
18296 switch (state)
18297 {
18298 case UNIT_STATE_STUNNED:
18299 SetStunned(true);
18300 break;
18301 case UNIT_STATE_ROOT:
18303 SetRooted(true);
18304 break;
18307 {
18310 // SendAutoRepeatCancel ?
18311 SetConfused(true);
18312 CastStop(0, false);
18313 }
18314 break;
18315 case UNIT_STATE_FLEEING:
18317 {
18320 // SendAutoRepeatCancel ?
18321 SetFeared(true, source, isFear);
18322 CastStop(0, false);
18323 }
18324 break;
18325 default:
18326 break;
18327 }
18328
18329 if (GetTypeId() == TYPEID_PLAYER)
18330 {
18331 sScriptMgr->AnticheatSetRootACKUpd(ToPlayer());
18332 }
18333 }
18334 else
18335 {
18336 // xinef: moved from below, checked all SetX functions, no calls to currently modified state
18337 // xinef: added to each case because of return
18338 //ClearUnitState(state);
18339
18340 switch (state)
18341 {
18342 case UNIT_STATE_STUNNED:
18344 return;
18345 ClearUnitState(state);
18346 SetStunned(false);
18347 break;
18348 case UNIT_STATE_ROOT:
18349 // Prevent creature_template_movement rooted flag from being removed on aura expiration.
18350 if (GetTypeId() == TYPEID_UNIT)
18351 {
18352 if (ToCreature()->GetCreatureTemplate()->Movement.Rooted)
18353 {
18354 return;
18355 }
18356 }
18357
18359 return;
18360 ClearUnitState(state);
18361 SetRooted(false);
18362 break;
18365 return;
18366 ClearUnitState(state);
18367 SetConfused(false);
18368 break;
18369 case UNIT_STATE_FLEEING:
18371 return;
18372 ClearUnitState(state);
18373 SetFeared(false);
18374 break;
18375 default:
18376 return;
18377 }
18378
18379 //ClearUnitState(state);
18380
18382 SetStunned(true);
18383 else
18384 {
18386 SetRooted(true);
18387
18389 SetConfused(true);
18391 {
18392 bool isFear = false;
18394 {
18395 isFear = true;
18396 source = ObjectAccessor::GetUnit(*this, GetAuraEffectsByType(SPELL_AURA_MOD_FEAR).front()->GetCasterGUID());
18397 }
18398
18399 if (!source)
18400 {
18401 source = getAttackerForHelper();
18402 }
18403
18404 SetFeared(true, source, isFear);
18405 }
18406 }
18407 }
18408}
Definition: Unit.h:688
void SetFeared(bool apply, Unit *fearedBy=nullptr, bool isFear=false)
Definition: Unit.cpp:18540
void SetConfused(bool apply)
Definition: Unit.cpp:18577
void SetStunned(bool apply)
Definition: Unit.cpp:18410
Unit * getAttackerForHelper() const
Definition: Unit.h:1378
void SetRooted(bool apply, bool isStun=false)
Definition: Unit.cpp:18458

References AddUnitState(), CastStop(), ClearUnitState(), getAttackerForHelper(), GetAuraEffectsByType(), Object::GetTypeId(), ObjectAccessor::GetUnit(), GetVehicle(), HasAuraType(), HasUnitState(), SendMeleeAttackStop(), SetConfused(), SetFeared(), SetRooted(), SetStunned(), SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, UNIT_STATE_CONFUSED, UNIT_STATE_FLEEING, UNIT_STATE_MELEE_ATTACKING, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by _ExitVehicle(), Vehicle::AddPassenger(), boss_ouro::boss_ouro(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_palehoof::boss_palehoofAI::DoAction(), Creature::DoFleeToGetAssistance(), boss_skeram::DoTeleport(), CritterAI::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_falric::boss_falricAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_noth::boss_nothAI::EnterEvadeMode(), boss_thaddius_summon::boss_thaddius_summonAI::EnterEvadeMode(), boss_urom::boss_uromAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::boss_ignisAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::EnterEvadeMode(), boss_svala::boss_svalaAI::EnterEvadeMode(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_shirrak_the_dead_watcher::EnterEvadeMode(), spell_boss_magus_telestra_summon_telestra_clones::spell_boss_magus_telestra_summon_telestra_clones_AuraScript::HandleApply(), AuraEffect::HandleAuraModRoot(), AuraEffect::HandleAuraModStun(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_q13007_iron_colossus::spell_q13007_iron_colossus_SpellScript::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_mc_play_dead::spell_mc_play_dead_AuraScript::HandleEffectApply(), spell_gen_visual_dummy_stun::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_mc_play_dead::spell_mc_play_dead_AuraScript::HandleEffectRemove(), spell_gen_visual_dummy_stun::HandleEffectRemove(), AuraEffect::HandleModConfuse(), AuraEffect::HandleModFear(), AuraEffect::HandlePreventFleeing(), spell_boss_magus_telestra_summon_telestra_clones::spell_boss_magus_telestra_summon_telestra_clones_AuraScript::HandleRemove(), boss_volazj::JustDied(), CritterAI::JustEngagedWith(), boss_skadi::boss_skadiAI::JustEngagedWith(), boss_skeram::JustSummoned(), npc_twilight_volunteer::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), npc_gunship_gunner::npc_gunship_gunnerAI::MovementInform(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_iron_watcher::npc_iron_watcherAI::MovementInform(), npc_buru_egg::npc_buru_egg(), npc_icc_blood_beast::npc_icc_blood_beastAI::npc_icc_blood_beastAI(), npc_raging_spirit::npc_raging_spiritAI::npc_raging_spiritAI(), npc_vengeful_shade::npc_vengeful_shadeAI::npc_vengeful_shadeAI(), spell_systems_shutdown::spell_systems_shutdown_AuraScript::OnApply(), spell_systems_shutdown::spell_systems_shutdown_AuraScript::OnRemove(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_skeram::Reset(), boss_volazj::Reset(), npc_twilight_summon::npc_twilight_summonAI::Reset(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_thaddius_summon::boss_thaddius_summonAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_ignis::boss_ignisAI::Reset(), boss_thorim_pillar::boss_thorim_pillarAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), boss_skadi::boss_skadiAI::Reset(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::Reset(), npc_iron_watcher::npc_iron_watcherAI::Reset(), boss_shirrak_the_dead_watcher::Reset(), npc_target_dummy::npc_target_dummyAI::Reset(), Player::SetClientControl(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_ionar::boss_ionarAI::Split(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_noth::boss_nothAI::StartGroundPhase(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonedCreatureDies(), boss_skeram::UpdateAI(), boss_volazj::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), npc_icc_blood_beast::npc_icc_blood_beastAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ SetCreateHealth()

◆ SetCreateMana()

◆ SetCreateStat()

void Unit::SetCreateStat ( Stats  stat,
float  val 
)
inline

◆ SetCreatorGUID()

◆ SetCritterGUID()

void Unit::SetCritterGUID ( ObjectGuid  guid)
inline

References Object::SetGuidValue(), and UNIT_FIELD_CRITTER.

Referenced by SetMinion().

◆ SetCurrentCastedSpell()

void Unit::SetCurrentCastedSpell ( Spell pSpell)
3922{
3923 ASSERT(pSpell); // nullptr may be never passed here, use InterruptSpell or InterruptNonMeleeSpells
3924
3925 CurrentSpellTypes CSpellType = pSpell->GetCurrentContainer();
3926
3927 if (pSpell == m_currentSpells[CSpellType]) // avoid breaking self
3928 return;
3929
3930 bool bySelf = m_currentSpells[CSpellType] && m_currentSpells[CSpellType]->m_spellInfo->Id == pSpell->m_spellInfo->Id;
3931
3932 // break same type spell if it is not delayed
3933 InterruptSpell(CSpellType, false, true, bySelf);
3934
3935 // special breakage effects:
3936 switch (CSpellType)
3937 {
3939 {
3940 // generic spells always break channeled not delayed spells
3942 {
3943 if (!s->GetSpellInfo()->IsActionAllowedChannel())
3944 {
3946 }
3947 }
3948
3949 // autorepeat breaking
3951 {
3952 // break autorepeat if not Auto Shot
3953 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
3955 m_AutoRepeatFirstCast = true;
3956 }
3957 if (pSpell->GetCastTime() > 0)
3959
3960 break;
3961 }
3963 {
3964 // channel spells always break generic non-delayed and any channeled spells
3966 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
3967
3968 // it also does break autorepeat if not Auto Shot
3970 m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
3973
3974 break;
3975 }
3977 {
3978 // only Auto Shoot does not break anything
3979 if (pSpell->m_spellInfo->Id != 75)
3980 {
3981 // generic autorepeats break generic non-delayed and channeled non-delayed spells
3983 {
3984 if (!s->GetSpellInfo()->IsActionAllowedChannel())
3985 {
3987 }
3988 }
3989
3991 }
3992 // special action: set first cast flag
3993 m_AutoRepeatFirstCast = true;
3994
3995 break;
3996 }
3997
3998 default:
3999 // other spell types don't break anything now
4000 break;
4001 }
4002
4003 // current spell (if it is still here) may be safely deleted now
4004 if (m_currentSpells[CSpellType])
4005 m_currentSpells[CSpellType]->SetReferencedFromCurrent(false);
4006
4007 // set new current spell
4008 m_currentSpells[CSpellType] = pSpell;
4009 pSpell->SetReferencedFromCurrent(true);
4010
4011 pSpell->m_selfContainer = &(m_currentSpells[pSpell->GetCurrentContainer()]);
4012}
CurrentSpellTypes GetCurrentContainer() const
Definition: Spell.cpp:7873
Spell ** m_selfContainer
Definition: Spell.h:609

References AddUnitState(), ASSERT, CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, Spell::GetCastTime(), Spell::GetCurrentContainer(), GetCurrentSpell(), SpellInfo::Id, InterruptSpell(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_selfContainer, Spell::m_spellInfo, Spell::SetReferencedFromCurrent(), and UNIT_STATE_CASTING.

Referenced by Spell::prepare().

◆ setDeathState()

void Unit::setDeathState ( DeathState  s,
bool  despawn = false 
)
virtual

Reimplemented in Creature, Minion, Pet, and Player.

14539{
14540 // death state needs to be updated before RemoveAllAurasOnDeath() calls HandleChannelDeathItem(..) so that
14541 // it can be used to check creation of death items (such as soul shards).
14542
14543 if (s != DeathState::Alive && s != DeathState::JustRespawned)
14544 {
14545 CombatStop();
14548 ClearComboPointHolders(); // any combo points pointed to unit lost at it death
14549
14550 if (IsNonMeleeSpellCast(false))
14552
14553 UnsummonAllTotems(true);
14554 RemoveAllControlled(true);
14556 }
14557
14558 if (s == DeathState::JustDied)
14559 {
14560 // remove aurastates allowing special moves
14563
14564 GetMotionMaster()->Clear(false);
14566
14567 // Xinef: Remove Hover so the corpse can fall to the ground
14568 SetHover(false);
14569
14570 if (despawn)
14571 DisableSpline();
14572 else
14573 StopMoving();
14574
14575 // without this when removing IncreaseMaxHealth aura player may stuck with 1 hp
14576 // do not why since in IncreaseMaxHealth currenthealth is checked
14577 SetHealth(0);
14578 SetPower(getPowerType(), 0);
14579
14580 // Stop emote on death
14582
14583 // players in instance don't have ZoneScript, but they have InstanceScript
14585 zoneScript->OnUnitDeath(this);
14586 }
14587 else if (s == DeathState::JustRespawned)
14588 {
14589 RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground)
14590 }
14591
14592 m_deathState = s;
14593}
@ UNIT_FLAG_SKINNABLE
Definition: Unit.h:474
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1192
ZoneScript * GetZoneScript() const
Definition: Object.h:523
void ClearAllReactives()
Definition: Unit.cpp:17192
virtual bool SetHover(bool enable, bool packetOnly=false, bool updateAnimationTier=true)
Definition: Unit.cpp:21020
void ClearDiminishings()
Definition: Unit.h:1344
Definition: ZoneScript.h:27

References MotionMaster::Clear(), ClearAllReactives(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearDiminishings(), CombatStop(), HostileRefMgr::deleteReferences(), DisableSpline(), getHostileRefMgr(), WorldObject::GetInstanceScript(), GetMotionMaster(), getPowerType(), GetThreatMgr(), WorldObject::GetZoneScript(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), m_deathState, MotionMaster::MoveIdle(), RemoveAllAurasOnDeath(), RemoveAllControlled(), Object::RemoveFlag(), SetHealth(), SetHover(), SetPower(), Object::SetUInt32Value(), StopMoving(), UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE, UNIT_NPC_EMOTESTATE, and UnsummonAllTotems().

Referenced by _ExitVehicle(), KillMagnetEvent::Execute(), Spell::finish(), WorldSession::HandlePetActionHelper(), AuraEffect::HandleSpiritOfRedemption(), Kill(), Creature::setDeathState(), and Player::setDeathState().

◆ SetDisableGravity()

◆ SetDisplayId()

◆ SetExtraUnitMovementFlags()

void Unit::SetExtraUnitMovementFlags ( uint16  f)
inline

◆ SetFacingTo()

void Unit::SetFacingTo ( float  ori)
20885{
20886 Movement::MoveSplineInit init(this);
20887 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ(), false);
20889 init.DisableTransportPathTransformations(); // It makes no sense to target global orientation
20890 init.SetFacing(ori);
20891 init.Launch();
20892}
ObjectGuid GetTransGUID() const override
Definition: Unit.cpp:19020

References Movement::MoveSplineInit::DisableTransportPathTransformations(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetTransGUID(), HasUnitMovementFlag(), Movement::MoveSplineInit::Launch(), MOVEMENTFLAG_ONTRANSPORT, Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetFacing().

Referenced by boss_twinemperorsAI::DoAction(), npc_arthas::npc_arthasAI::DoAction(), Spell::EffectDistract(), UtherBatteredHiltEvent::Execute(), DistractMovementGenerator::Finalize(), Creature::FocusTarget(), spell_item_unusual_compass::HandleDummy(), spell_drakkari_colossus_face_me::spell_drakkari_colossus_face_me_SpellScript::HandleScriptEffect(), boss_grand_warlock_nethekurse::IntroRP(), boss_ragnaros::boss_ragnarosAI::JustDied(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::MovementInform(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::MovementInform(), boss_onyxia::MovementInform(), npc_twilight_volunteer::MovementInform(), boss_eadric::boss_eadricAI::MovementInform(), boss_paletress::boss_paletressAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_enslaved_proto_drake::npc_enslaved_proto_drakeAI::MovementInform(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::MovementInform(), boss_illidan_stormrage::boss_illidan_stormrageAI::MovementInform(), boss_essence_of_suffering::boss_essence_of_sufferingAI::MovementInform(), boss_essence_of_desire::boss_essence_of_desireAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), boss_felmyst::boss_felmystAI::MovementInform(), boss_saviana_ragefire::boss_saviana_ragefireAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), npc_akama_shade::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), spell_lurker_below_spout::OnPeriodic(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), SmartAI::PausePath(), SmartScript::ProcessAction(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), Player::SetClientControl(), boss_grand_warlock_nethekurse::SetData(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_chesspiece::SpellHitTarget(), boss_heigan::boss_heiganAI::StartFightPhase(), CreatureAI::TriggerAlert(), RotateMovementGenerator::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_harrison_jones::npc_harrison_jonesAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), boss_onyxia::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), boss_kaelthas::boss_kaelthasAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_general_andorov::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_akama_illidan::npc_akama_illidanAI::UpdateEscortAI(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), npc_argent_soldier::npc_argent_soldierAI::WaypointReached(), npc_ranger_lilatha::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetFacingToObject()

void Unit::SetFacingToObject ( WorldObject object)
Todo:
figure out under what conditions creature will move towards object instead of facing it where it currently is.
20895{
20896 // never face when already moving
20897 if (!IsStopped())
20898 return;
20899
20901 Movement::MoveSplineInit init(this);
20902 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
20903 init.SetFacing(GetAngle(object)); // when on transport, GetAngle will still return global coordinates (and angle) that needs transforming
20904 init.Launch();
20905}
bool IsStopped() const
Definition: Unit.h:2280

References Position::GetAngle(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), IsStopped(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetFacing().

Referenced by npc_ranshalla::npc_ranshallaAI::DoChannelTorchSpell(), spell_yogg_saron_target_selectors::spell_yogg_saron_target_selectors_SpellScript::HandleScript(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), boss_illidan_stormrage::boss_illidan_stormrageAI::JustSummoned(), npc_drakuru_shackles::npc_drakuru_shacklesAI::LockRageclaw(), npc_mograine::npc_mograineAI::MoveInLineOfSight(), npc_fairbanks::npc_fairbanksAI::MoveInLineOfSight(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), npc_image_of_medivh::npc_image_of_medivhAI::Reset(), boss_the_lurker_below::SchedulerPhaseOne(), boss_shade_of_aran::SetGUID(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::SetGUID(), npc_harrison_jones::npc_harrison_jonesAI::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), npc_forest_frog::npc_forest_frogAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_magister_aledis::StartFight(), boss_hydross_the_unstable::SummonMovementInform(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_pilgrims_bounty_chair::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_hidden_cultist::npc_hidden_cultistAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI(), npc_ranshalla::npc_ranshallaAI::WaypointReached(), npc_arthas::npc_arthasAI::WaypointReached(), npc_scarlet_miner::npc_scarlet_minerAI::WaypointReached(), and npc_kaya_flathoof::npc_kaya_flathoofAI::WaypointReached().

◆ SetFaction()

void Unit::SetFaction ( uint32  faction)
10065{
10067 if (GetTypeId() == TYPEID_UNIT)
10069}
void UpdateMoveInLineOfSightState()
Definition: Creature.cpp:2521

References Object::GetTypeId(), Object::SetUInt32Value(), Object::ToCreature(), TYPEID_UNIT, UNIT_FIELD_FACTIONTEMPLATE, and Creature::UpdateMoveInLineOfSightState().

Referenced by npc_mograine::npc_mograineAI::AshbringerEvent(), npc_hidden_cultist::npc_hidden_cultistAI::AttackPlayer(), GameObject::CastSpell(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSummonType(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::EnterEvadeMode(), BattlegroundEY::EventTeamCapturedPoint(), AuraEffect::HandleAuraModFaction(), BattlegroundIC::HandleCapturedNodes(), spell_q12096_q12092_dummy::spell_q12096_q12092_dummy_SpellScript::HandleDummy(), spell_q11919_q11940_drake_hunt::spell_q11919_q11940_drake_hunt_AuraScript::HandleEffectRemove(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFactionIdCommand(), npc_commandscript::HandleNpcSetFactionTempIdCommand(), spell_mutate_explode_bug::HandleOnHit(), spell_q10612_10613_the_fel_and_the_furious::spell_q10612_10613_the_fel_and_the_furious_SpellScript::HandleScriptEffect(), spell_item_draenic_pale_ale::HandleSummon(), npc_cork_gizelton::npc_cork_gizeltonAI::ImmuneFlagSet(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_general_andorov::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), Minion::InitStats(), TempSummon::InitStats(), InitTamedPet(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), FollowerAI::JustRespawned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_volkhan::boss_volkhanAI::JustSummoned(), boss_balinda::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::boss_archimondeAI::JustSummoned(), boss_broggok::JustSummoned(), Pet::LoadPetFromDB(), npc_mograine::npc_mograineAI::MoveInLineOfSight(), npc_fairbanks::npc_fairbanksAI::MoveInLineOfSight(), boss_twilight_corrupter::MoveInLineOfSight(), BattlegroundAB::NodeOccupied(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::npc_scarlet_miner_cartAI(), spell_brewfest_reveler_transform::OnApply(), npc_chesspiece::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_nexus::instance_nexus_InstanceMapScript::OnCreatureCreate(), instance_black_temple::instance_black_temple_InstanceMapScript::OnCreatureCreate(), boss_azuregos::OnGossipSelect(), npc_prospector_remtravel::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_lakota_windsong::OnQuestAccept(), npc_paoka_swiftmountain::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_maxx_a_million_escort::OnQuestAccept(), npc_calvin_montague::OnQuestAccept(), npc_kaya_flathoof::OnQuestAccept(), npc_wizzlecrank_shredder::OnQuestAccept(), npc_ame::OnQuestAccept(), npc_ranshalla::OnQuestAccept(), npc_lurgglbr::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_apothecary_hanes::OnQuestAccept(), npc_bessy::OnQuestAccept(), npc_isla_starmane::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), BattlegroundAV::PopulateNode(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), RemoveCharmedBy(), boss_doomrel::boss_doomrelAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_coren_direbrew::Reset(), npc_direbrew_minion::Reset(), npc_aquementas::npc_aquementasAI::Reset(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::Reset(), brann_bronzebeard::brann_bronzebeardAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), npc_captured_rageclaw::npc_captured_rageclawAI::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), RestoreFaction(), SetCharmedBy(), Player::SetFactionForRace(), Player::SetGameMaster(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), BattlegroundIC::SetupBattleground(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::SpawnCreature(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_crusade_persuaded::npc_crusade_persuadedAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_professor_phizzlethorpe::npc_professor_phizzlethorpeAI::sQuestAccept(), npc_ranger_lilatha::sQuestAccept(), npc_corporal_keeshan::npc_corporal_keeshanAI::sQuestAccept(), npc_muglash::npc_muglashAI::sQuestAccept(), npc_wounded_blood_elf::npc_wounded_blood_elfAI::sQuestAccept(), FollowerAI::StartFollow(), pyrewood_ambush::pyrewood_ambushAI::SummonCreatureWithRandomTarget(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), Spell::SummonGuardian(), Player::SummonPet(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), WorldObject::SummonTrigger(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), boss_archimonde::boss_archimondeAI::UpdateAI(), npc_giant_infernal::npc_giant_infernalAI::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), npc_sergeant_bly::npc_sergeant_blyAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_magister_aledis::UpdateAI(), npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI::UpdateAI(), Creature::UpdateEntry(), npc_magwin::npc_magwinAI::UpdateEscortAI(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ SetFeared()

void Unit::SetFeared ( bool  apply,
Unit fearedBy = nullptr,
bool  isFear = false 
)
protected
18541{
18542 if (apply)
18543 {
18544 SetTarget();
18545 GetMotionMaster()->MoveFleeing(fearedBy, isFear ? 0 : sWorld->getIntConfig(CONFIG_CREATURE_FAMILY_FLEE_DELAY));
18546
18547 if (GetTypeId() == TYPEID_PLAYER)
18548 {
18549 sScriptMgr->AnticheatSetSkipOnePacketForASH(ToPlayer(), true);
18550 }
18551 }
18552 else
18553 {
18554 if (IsAlive())
18555 {
18556 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == FLEEING_MOTION_TYPE)
18557 {
18559 StopMoving();
18560 }
18561
18562 if (GetVictim())
18564 }
18565 }
18566
18567 // xinef: block / allow control to real mover (eg. charmer)
18568 if (GetTypeId() == TYPEID_PLAYER)
18569 {
18570 if (m_movedByPlayer)
18571 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18572 //else
18573 // ToPlayer()->SetClientControl(this, !apply);
18574 }
18575}
@ FLEEING_MOTION_TYPE
Definition: MotionMaster.h:47
@ CONFIG_CREATURE_FAMILY_FLEE_DELAY
Definition: IWorld.h:285
void MoveFleeing(Unit *enemy, uint32 time=0)
Definition: MotionMaster.cpp:699

References CONFIG_CREATURE_FAMILY_FLEE_DELAY, FLEEING_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), Object::GetTypeId(), GetVictim(), IsAlive(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveFleeing(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), sScriptMgr, StopMoving(), sWorld, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by SetControlled().

◆ SetFeatherFall()

bool Unit::SetFeatherFall ( bool  enable,
bool  packetOnly = false 
)
virtual

◆ SetFullHealth()

◆ SetHealth()

void Unit::SetHealth ( uint32  val)
15465{
15466 if (getDeathState() == DeathState::JustDied)
15467 val = 0;
15468 else if (GetTypeId() == TYPEID_PLAYER && getDeathState() == DeathState::Dead)
15469 val = 1;
15470 else
15471 {
15472 uint32 maxHealth = GetMaxHealth();
15473 if (maxHealth < val)
15474 val = maxHealth;
15475 }
15476
15477 float prevHealthPct = GetHealthPct();
15478
15480
15481 // mobs that are now or were below 30% need to update their speed
15482 if (GetTypeId() == TYPEID_UNIT && !(IsPet() && ToPet()->isControlled() && IsControlledByPlayer()) && (prevHealthPct < 30.0 || HealthBelowPct(30)))
15483 {
15484 UpdateSpeed(MOVE_RUN, false);
15485 }
15486
15487 // group update
15488 if (GetTypeId() == TYPEID_PLAYER)
15489 {
15490 Player* player = ToPlayer();
15491 if (player->NeedSendSpectatorData())
15493
15494 if (player->GetGroup())
15496 }
15497 else if (Pet* pet = ToCreature()->ToPet())
15498 {
15499 if (pet->isControlled())
15500 {
15501 if (Unit* owner = GetOwner())
15502 if (Player* player = owner->ToPlayer())
15503 {
15504 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15505 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15506
15507 if (player->GetGroup())
15509 }
15510 }
15511 }
15512}
@ GROUP_UPDATE_FLAG_CUR_HP
Definition: Group.h:101
@ GROUP_UPDATE_FLAG_PET_CUR_HP
Definition: Group.h:113
void SendCommand_UInt32Value(T *o, ObjectGuid targetGUID, const char *prefix, uint32 t)
Definition: ArenaSpectator.h:62
bool NeedSendSpectatorData() const
Definition: Player.cpp:15319
void SetGroupUpdateFlag(uint32 flag)
Definition: Player.h:2437
float GetHealthPct() const
Definition: Unit.h:1462

References WorldObject::FindMap(), getDeathState(), Player::GetGroup(), Object::GetGUID(), GetHealthPct(), GetMaxHealth(), GetOwner(), Object::GetTypeId(), GROUP_UPDATE_FLAG_CUR_HP, GROUP_UPDATE_FLAG_PET_CUR_HP, HealthBelowPct(), IsControlledByPlayer(), IsPet(), MOVE_RUN, Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), Object::SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, UNIT_FIELD_HEALTH, and UpdateSpeed().

Referenced by boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), Player::BuildPlayerRepop(), npc_mograine::npc_mograineAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_alar::boss_alarAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), DealDamage(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Spell::EffectSummonType(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), boss_halazzi::boss_halazziAI::EnterPhase(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_oculus_soar::spell_oculus_soarAuraScript::HandleEffectPeriodic(), modify_commandscript::HandleModifyHPCommand(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcSetLevelCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), npc_echo_of_medivh::HandlePieceJustDied(), spell_stinky_precious_decimate::spell_stinky_precious_decimate_SpellScript::HandleScript(), AuraEffect::HandleSpiritOfRedemption(), npc_pet_pri_lightwell::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustReachedHome(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustReachedHome(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_nether_drake::npc_nether_drakeAI::MovementInform(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Player::ProcessDelayedOperations(), boss_vaelastrasz::boss_vaelAI::Reset(), boss_kalecgos::boss_kalecgosAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetAllPowers(), Player::RestoreHealthAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetFullHealth(), SetMaxHealth(), boss_headless_horseman::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), boss_ahune::SummonedCreatureDespawn(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_phase_hunter::npc_phase_hunterAI::UpdateAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ SetHover()

bool Unit::SetHover ( bool  enable,
bool  packetOnly = false,
bool  updateAnimationTier = true 
)
virtual

Reimplemented in Creature, and Player.

21021{
21023 return false;
21024
21025 float hoverHeight = GetFloatValue(UNIT_FIELD_HOVERHEIGHT);
21026
21027 if (enable)
21028 {
21030 if (hoverHeight && GetPositionZ() - GetFloorZ() < hoverHeight)
21031 UpdateHeight(GetPositionZ() + hoverHeight);
21032 }
21033 else
21034 {
21036 if (hoverHeight && (!isDying() || GetTypeId() != TYPEID_UNIT))
21037 {
21038 float newZ = std::max<float>(GetFloorZ(), GetPositionZ() - hoverHeight);
21040 UpdateHeight(newZ);
21041 }
21042 SendMovementFlagUpdate(); // pussywizard: needed for falling after death (instead of falling onto air at hover height)
21043 }
21044
21045 return true;
21046}
void UpdateAllowedPositionZ(float x, float y, float &z, float *groundZ=nullptr) const
Definition: Object.cpp:1554
float GetFloorZ() const
Definition: Object.cpp:3089
void UpdateHeight(float newZ)
Only server-side height update, does not broadcast to client.
Definition: Unit.cpp:20342
void SendMovementFlagUpdate(bool self=false)
Definition: Unit.cpp:16972

References AddUnitMovementFlag(), Object::GetFloatValue(), WorldObject::GetFloorZ(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::GetTypeId(), HasUnitMovementFlag(), isDying(), MOVEMENTFLAG_HOVER, RemoveUnitMovementFlag(), SendMovementFlagUpdate(), TYPEID_UNIT, UNIT_FIELD_HOVERHEIGHT, WorldObject::UpdateAllowedPositionZ(), and UpdateHeight().

Referenced by AuraEffect::HandleAuraHover(), debug_commandscript::HandleDebugMoveflagsCommand(), setDeathState(), Creature::SetHover(), and Player::SetHover().

◆ SetImmuneToAll()

void Unit::SetImmuneToAll ( bool  apply,
bool  keepCombat = false 
)
inline
1692{ SetImmuneToPC(apply, keepCombat); SetImmuneToNPC(apply, keepCombat); }
void SetImmuneToNPC(bool apply, bool keepCombat=false)
Definition: Unit.cpp:13610

References SetImmuneToNPC(), and SetImmuneToPC().

Referenced by spell_the_lich_king_trigger_vile_spirit::spell_the_lich_king_trigger_vile_spirit_SpellScript::ActivateSpirit(), boss_chromaggus::boss_chromaggusAI::boss_chromaggusAI(), boss_felblood_kaelthas::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), boss_broggok::DoAction(), boss_grand_warlock_nethekurse::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_ambassador_hellmaw::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), boss_skeram::DoTeleport(), Spell::EffectSummonType(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), spell_uldaman_stoned::spell_uldaman_stoned_AuraScript::HandleEffectApply(), spell_uldaman_stoned::spell_uldaman_stoned_AuraScript::HandleEffectRemove(), spell_q11919_q11940_drake_hunt::spell_q11919_q11940_drake_hunt_AuraScript::HandleEffectRemove(), spell_item_draenic_pale_ale::HandleSummon(), boss_majordomo::boss_majordomoAI::InitializeAI(), boss_felblood_kaelthas::InitializeAI(), boss_captain_skarloc::InitializeAI(), boss_taldaram::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::InitializeAI(), Player::InitStatsForLevel(), boss_falric::boss_falricAI::JustEngagedWith(), boss_marwyn::boss_marwynAI::JustEngagedWith(), boss_moroes::JustEngagedWith(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_rinji::npc_rinjiAI::JustRespawned(), npc_isla_starmane::npc_isla_starmaneAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_skeram::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), boss_captain_skarloc::MovementInform(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_sister_svalna::boss_sister_svalnaAI::MovementInform(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MovementInform(), npc_enslaved_proto_drake::npc_enslaved_proto_drakeAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_memory::npc_memoryAI::npc_memoryAI(), npc_rinji::npc_rinjiAI::npc_rinjiAI(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::npc_scarlet_miner_cartAI(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_felblood_kaelthas::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_skeram::Reset(), boss_jedoga_shadowseeker::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_marwyn::boss_marwynAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), boss_svala::boss_svalaAI::Reset(), npc_thassarian::npc_thassarianAI::Reset(), boss_ambassador_hellmaw::Reset(), boss_illidan_stormrage::boss_illidan_stormrageAI::Reset(), boss_shade_of_akama::Reset(), boss_broggok::Reset(), boss_grand_warlock_nethekurse::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_svala::boss_svalaAI::SetData(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_chromaggus::boss_chromaggusAI::SetGUID(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_rinji::npc_rinjiAI::sQuestAccept(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_felblood_kaelthas::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_skeram::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_anzu::UpdateAI(), boss_shade_of_akama::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), and npc_franklin::npc_franklinAI::UpdateAI().

◆ SetImmuneToNPC()

void Unit::SetImmuneToNPC ( bool  apply,
bool  keepCombat = false 
)

◆ SetImmuneToPC()

void Unit::SetImmuneToPC ( bool  apply,
bool  keepCombat = false 
)
13602{
13603 (void)keepCombat;
13604 if (apply)
13606 else
13608}

References RemoveUnitFlag(), SetUnitFlag(), and UNIT_FLAG_IMMUNE_TO_PC.

Referenced by boss_victor_nefarius::boss_victor_nefariusAI::BeginEvent(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), ClearInCombat(), npc_magister_aledis::DamageTaken(), npc_calvin_montague::npc_calvin_montagueAI::DamageTaken(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectRemove(), boss_blackheart_the_inciter::JustEngagedWith(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::JustSummoned(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), npc_omen::npc_omenAI::MovementInform(), npc_omen::npc_omenAI::npc_omenAI(), npc_death_knight_initiate::OnGossipSelect(), instance_ulduar::instance_ulduar_InstanceMapScript::OnPlayerEnter(), npc_calvin_montague::OnQuestAccept(), npc_kaya_flathoof::OnQuestAccept(), boss_doomrel::boss_doomrelAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_julianne::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_a_special_surprise::npc_a_special_surpriseAI::Reset(), npc_calvin_montague::npc_calvin_montagueAI::Reset(), npc_coren_direbrew::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), boss_blackheart_the_inciter::Reset(), boss_magtheridon::Reset(), npc_magister_aledis::Reset(), boss_magtheridon::ScheduleCombatEvents(), SetImmuneToAll(), SetInCombatState(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_magister_aledis::UpdateAI(), and npc_tallhorn_stag::npc_tallhorn_stagAI::UpdateAI().

◆ SetInCombatState()

void Unit::SetInCombatState ( bool  PvP,
Unit enemy = nullptr,
uint32  duration = 0 
)
13723{
13724 // only alive units can be in combat
13725 if (!IsAlive())
13726 return;
13727
13728 if (PvP)
13729 m_CombatTimer = std::max<uint32>(GetCombatTimer(), std::max<uint32>(5500, duration));
13730 else if (duration)
13731 m_CombatTimer = std::max<uint32>(GetCombatTimer(), duration);
13732
13734 return;
13735
13736 // xinef: if we somehow engage in combat (scripts, dunno) with player, remove this flag so he can fight back
13738 SetImmuneToPC(false); // unit has engaged in combat, remove immunity so players can fight back
13739
13740 if (IsInCombat())
13741 return;
13742
13744
13745 if (Creature* creature = ToCreature())
13746 {
13747 // Set home position at place of engaging combat for escorted creatures
13748 if ((IsAIEnabled && creature->AI()->IsEscorted()) ||
13749 GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE ||
13750 GetMotionMaster()->GetCurrentMovementGeneratorType() == ESCORT_MOTION_TYPE)
13751 creature->SetHomePosition(GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
13752
13753 if (enemy)
13754 {
13755 if (IsAIEnabled)
13756 creature->AI()->JustEngagedWith(enemy);
13757
13758 if (creature->GetFormation())
13759 creature->GetFormation()->MemberEngagingTarget(creature, enemy);
13760
13761 sScriptMgr->OnUnitEnterCombat(creature, enemy);
13762 }
13763
13764 creature->RefreshSwimmingFlag();
13765
13766 if (IsPet())
13767 {
13768 UpdateSpeed(MOVE_RUN, true);
13769 UpdateSpeed(MOVE_SWIM, true);
13770 UpdateSpeed(MOVE_FLIGHT, true);
13771 }
13772
13773 if (!(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT))
13774 Dismount();
13775 if (!IsStandState()) // pussywizard: already done in CombatStart(target, initialAggro) for the target, but when aggro'ing from MoveInLOS CombatStart is not called!
13777 }
13778
13779 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
13780 {
13781 Unit* controlled = *itr;
13782 ++itr;
13783
13784 // Xinef: Dont set combat for passive units, they will evade in next update...
13785 if (controlled->GetTypeId() == TYPEID_UNIT && controlled->ToCreature()->HasReactState(REACT_PASSIVE))
13786 continue;
13787
13788 controlled->SetInCombatState(PvP, enemy, duration);
13789 }
13790
13791 if (Player* player = this->ToPlayer())
13792 {
13793 sScriptMgr->OnPlayerEnterCombat(player, enemy);
13794 }
13795}
@ MOVE_FLIGHT
Definition: Unit.h:384
@ MOVE_SWIM
Definition: Unit.h:381
@ ESCORT_MOTION_TYPE
Definition: MotionMaster.h:55
@ WAYPOINT_MOTION_TYPE
Definition: MotionMaster.h:39
@ CREATURE_TYPE_NON_COMBAT_PET
Definition: SharedDefines.h:2639
@ CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT
Definition: SharedDefines.h:2706
bool HasReactState(ReactStates state) const
Definition: Creature.h:92
uint32 GetCombatTimer() const
Definition: Unit.h:1712
void SetInCombatState(bool PvP, Unit *enemy=nullptr, uint32 duration=0)
Definition: Unit.cpp:13722
bool IsStandState() const
Definition: Unit.cpp:16988

References CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT, CREATURE_TYPE_NON_COMBAT_PET, Dismount(), ESCORT_MOTION_TYPE, GetCharmerOrOwnerPlayerOrPlayerItself(), GetCombatTimer(), GetCreatureType(), GetMotionMaster(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::GetTypeId(), Creature::HasReactState(), HasUnitState(), IsAIEnabled, IsAlive(), IsImmuneToPC(), IsInCombat(), IsPet(), IsStandState(), m_CombatTimer, m_Controlled, MOVE_FLIGHT, MOVE_RUN, MOVE_SWIM, REACT_PASSIVE, SetImmuneToPC(), SetInCombatState(), SetStandState(), SetUnitFlag(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), TYPEID_UNIT, UNIT_FLAG_IN_COMBAT, UNIT_STAND_STATE_STAND, UNIT_STATE_EVADE, UpdateSpeed(), and WAYPOINT_MOTION_TYPE.

Referenced by Spell::DoSpellHitOnUnit(), SetInCombatState(), and SetInCombatWith().

◆ SetInCombatWith()

void Unit::SetInCombatWith ( Unit enemy,
uint32  duration = 0 
)
13576{
13577 // Xinef: Dont allow to start combat with triggers
13578 if (enemy->GetTypeId() == TYPEID_UNIT && enemy->ToCreature()->IsTrigger())
13579 return;
13580
13581 Unit* eOwner = enemy->GetCharmerOrOwnerOrSelf();
13582 if (eOwner->IsPvP() || eOwner->IsFFAPvP())
13583 {
13584 SetInCombatState(true, enemy, duration);
13585 return;
13586 }
13587
13588 // check for duel
13589 if (eOwner->GetTypeId() == TYPEID_PLAYER && eOwner->ToPlayer()->duel)
13590 {
13591 Unit const* myOwner = GetCharmerOrOwnerOrSelf();
13592 if (((Player const*)eOwner)->duel->Opponent == myOwner)
13593 {
13594 SetInCombatState(true, enemy, duration);
13595 return;
13596 }
13597 }
13598 SetInCombatState(false, enemy, duration);
13599}

References Player::duel, GetCharmerOrOwnerOrSelf(), Object::GetTypeId(), IsFFAPvP(), IsPvP(), Creature::IsTrigger(), SetInCombatState(), Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, and TYPEID_UNIT.

Referenced by Attack(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), CombatStart(), CombatStartOnCast(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), Spell::DoAllEffectOnTarget(), CreatureAI::DoZoneInCombat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), spell_herald_volzaj_insanity::HandleDummyEffect(), boss_chromaggus::boss_chromaggusAI::PathEndReached(), SmartScript::ProcessAction(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), and npc_phase_hunter::npc_phase_hunterAI::UpdateAI().

◆ SetInFront()

◆ SetInstantCast()

void Unit::SetInstantCast ( bool  set)
inline
2450{ _instantCast = set; }

References _instantCast.

Referenced by AuraEffect::HandleModCastingSpeed().

◆ SetLastDamagedTargetGuid()

void Unit::SetLastDamagedTargetGuid ( ObjectGuid const &  guid)
inline

◆ SetLastExtraAttackSpell()

void Unit::SetLastExtraAttackSpell ( uint32  spellId)
inline
1583{ _lastExtraAttackSpell = spellId; }

References _lastExtraAttackSpell.

Referenced by Spell::_handle_finish_phase().

◆ SetLastManaUse()

void Unit::SetLastManaUse ( uint32  spellCastTime)
inline
2231{ m_lastManaUse = spellCastTime; }

References m_lastManaUse.

Referenced by Spell::TakePower().

◆ SetLevel()

◆ SetMaxHealth()

void Unit::SetMaxHealth ( uint32  val)
15515{
15516 if (!val)
15517 val = 1;
15518
15519 uint32 health = GetHealth();
15521
15522 // group update
15523 if (GetTypeId() == TYPEID_PLAYER)
15524 {
15525 Player* player = ToPlayer();
15526 if (player->NeedSendSpectatorData())
15528
15529 if (player->GetGroup())
15531 }
15532 else if (Pet* pet = ToCreature()->ToPet())
15533 {
15534 if (pet->isControlled())
15535 {
15536 if (Unit* owner = GetOwner())
15537 if (Player* player = owner->ToPlayer())
15538 {
15539 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15540 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15541
15542 if (player->GetGroup())
15544 }
15545 }
15546 }
15547
15548 if (val < health)
15549 SetHealth(val);
15550}
@ GROUP_UPDATE_FLAG_MAX_HP
Definition: Group.h:102
@ GROUP_UPDATE_FLAG_PET_MAX_HP
Definition: Group.h:114

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetHealth(), GetOwner(), Object::GetTypeId(), GROUP_UPDATE_FLAG_MAX_HP, GROUP_UPDATE_FLAG_PET_MAX_HP, Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetHealth(), Object::SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), TYPEID_PLAYER, and UNIT_FIELD_MAXHEALTH.

Referenced by boss_xt002::boss_xt002AI::DoAction(), Spell::EffectSummonType(), boss_halazzi::boss_halazziAI::EnterPhase(), modify_commandscript::HandleModifyHPCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_pet_pri_lightwell::InitializeAI(), Player::InitStatsForLevel(), boss_skeram::JustSummoned(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), Creature::SelectLevel(), boss_akilzon::boss_akilzonAI::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), Creature::UpdateMaxHealth(), Guardian::UpdateMaxHealth(), and Player::UpdateMaxHealth().

◆ SetMaxPower()

void Unit::SetMaxPower ( Powers  power,
uint32  val 
)
15618{
15619 uint32 cur_power = GetPower(power);
15620 SetStatInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power, val);
15621
15622 // group update
15623 if (GetTypeId() == TYPEID_PLAYER)
15624 {
15625 Player* player = ToPlayer();
15626 if (getPowerType() == power && player->NeedSendSpectatorData())
15627 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15628
15629 if (player->GetGroup())
15631 }
15632 else if (Pet* pet = ToCreature()->ToPet())
15633 {
15634 if (pet->isControlled())
15635 {
15636 Unit* owner = GetOwner();
15637 if (owner && (owner->GetTypeId() == TYPEID_PLAYER) && owner->ToPlayer()->GetGroup())
15639 }
15640 }
15641
15642 if (val < cur_power)
15643 SetPower(power, val);
15644}
@ GROUP_UPDATE_FLAG_PET_MAX_POWER
Definition: Group.h:117
@ GROUP_UPDATE_FLAG_MAX_POWER
Definition: Group.h:105
void SetStatInt32Value(uint16 index, int32 value)
Definition: Object.cpp:798

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetOwner(), GetPower(), getPowerType(), Object::GetTypeId(), GROUP_UPDATE_FLAG_MAX_POWER, GROUP_UPDATE_FLAG_PET_MAX_POWER, Player::NeedSendSpectatorData(), POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetPower(), Object::SetStatInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), TYPEID_PLAYER, and UNIT_FIELD_MAXPOWER1.

Referenced by Player::Create(), Pet::CreateBaseAtTamed(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_putricide_mutated_transformation::spell_putricide_mutated_transformation_SpellScript::HandleSummon(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), Creature::SelectLevel(), setPowerType(), Creature::UpdateMaxPower(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ SetMinion()

void Unit::SetMinion ( Minion minion,
bool  apply 
)
10680{
10681 LOG_DEBUG("entities.unit", "SetMinion {} for {}, apply {}", minion->GetEntry(), GetEntry(), apply);
10682
10683 if (apply)
10684 {
10685 if (minion->GetOwnerGUID())
10686 {
10687 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10688 return;
10689 }
10690
10691 minion->SetOwnerGUID(GetGUID());
10692
10693 m_Controlled.insert(minion);
10694
10695 if (GetTypeId() == TYPEID_PLAYER)
10696 {
10697 minion->m_ControlledByPlayer = true;
10699 }
10700
10701 // Can only have one pet. If a new one is summoned, dismiss the old one.
10702 if (minion->IsGuardianPet())
10703 {
10704 if (Guardian* oldPet = GetGuardianPet())
10705 {
10706 if (oldPet != minion && (oldPet->IsPet() || minion->IsPet() || oldPet->GetEntry() != minion->GetEntry()))
10707 {
10708 // remove existing minion pet
10709 if (Pet* oldPetAsPet = oldPet->ToPet())
10710 {
10711 oldPetAsPet->Remove(PET_SAVE_NOT_IN_SLOT);
10712 }
10713 else
10714 {
10715 oldPet->UnSummon();
10716 }
10717
10718 SetPetGUID(minion->GetGUID());
10720 }
10721 }
10722 else
10723 {
10724 SetPetGUID(minion->GetGUID());
10726 }
10727 }
10728
10730 {
10732 }
10733
10734 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10735 {
10736 SetCritterGUID(minion->GetGUID());
10737 }
10738
10739 // PvP, FFAPvP
10741
10742 // Ghoul pets have energy instead of mana (is anywhere better place for this code?)
10743 if (minion->IsPetGhoul() || minion->GetEntry() == 24207 /*ENTRY_ARMY_OF_THE_DEAD*/)
10744 minion->setPowerType(POWER_ENERGY);
10745
10746 if (GetTypeId() == TYPEID_PLAYER)
10747 {
10748 // Send infinity cooldown - client does that automatically but after relog cooldown needs to be set again
10749 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10750
10751 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10752 ToPlayer()->AddSpellAndCategoryCooldowns(spellInfo, 0, nullptr, true);
10753 }
10754 }
10755 else
10756 {
10757 if (minion->GetOwnerGUID() != GetGUID())
10758 {
10759 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10760 return;
10761 }
10762
10763 m_Controlled.erase(minion);
10764
10765 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10766 {
10767 if (GetCritterGUID() == minion->GetGUID())
10769 }
10770
10771 if (minion->IsGuardianPet())
10772 {
10773 if (GetPetGUID() == minion->GetGUID())
10775 }
10776 else if (minion->IsTotem())
10777 {
10778 // All summoned by totem minions must disappear when it is removed.
10779 if (SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(minion->ToTotem()->GetSpell()))
10780 {
10781 for (int i = 0; i < MAX_SPELL_EFFECTS; ++i)
10782 {
10783 if (spInfo->Effects[i].Effect != SPELL_EFFECT_SUMMON)
10784 continue;
10785
10786 RemoveAllMinionsByEntry(spInfo->Effects[i].MiscValue);
10787 }
10788 }
10789 }
10790
10791 if (GetTypeId() == TYPEID_PLAYER)
10792 {
10793 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10794 // Remove infinity cooldown
10795 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10796 ToPlayer()->SendCooldownEvent(spellInfo);
10797
10798 // xinef: clear spell book
10799 if (m_Controlled.empty())
10801 }
10802
10803 //if (minion->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10804 {
10806 {
10807 // Check if there is another minion
10808 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10809 {
10810 // do not use this check, creature do not have charm guid
10811 //if (GetCharmGUID() == (*itr)->GetGUID())
10812 if (GetGUID() == (*itr)->GetCharmerGUID())
10813 continue;
10814
10815 //ASSERT((*itr)->GetOwnerGUID() == GetGUID());
10816 if ((*itr)->GetOwnerGUID() != GetGUID())
10817 {
10818 OutDebugInfo();
10819 (*itr)->OutDebugInfo();
10820 ABORT();
10821 }
10822 ASSERT((*itr)->GetTypeId() == TYPEID_UNIT);
10823
10824 if (!(*itr)->HasUnitTypeMask(UNIT_MASK_CONTROLABLE_GUARDIAN))
10825 continue;
10826
10827 if (AddGuidValue(UNIT_FIELD_SUMMON, (*itr)->GetGUID()))
10828 {
10829 // show another pet bar if there is no charm bar
10830 if (GetTypeId() == TYPEID_PLAYER && !GetCharmGUID())
10831 {
10832 if ((*itr)->IsPet())
10834 else
10836 }
10837 }
10838 break;
10839 }
10840 }
10841 }
10842 }
10843}
@ PET_SAVE_NOT_IN_SLOT
Definition: PetDefines.h:45
@ SPELL_EFFECT_SUMMON
Definition: SharedDefines.h:806
@ SUMMON_TYPE_MINIPET
Definition: SharedDefines.h:3299
const SummonPropertiesEntry *const m_Properties
Definition: TemporarySummon.h:63
bool IsGuardianPet() const
Definition: TemporarySummon.cpp:390
bool IsPetGhoul() const
Definition: TemporarySummon.h:84
void PetSpellInitialize()
Definition: Player.cpp:9387
uint32 GetSpell(uint8 slot=0) const
Definition: Totem.h:51
void OutDebugInfo() const
Definition: Unit.cpp:20503
ObjectGuid GetCritterGUID() const
Definition: Unit.h:1840
void SetOwnerGUID(ObjectGuid owner)
Definition: Unit.cpp:10572
void SetCritterGUID(ObjectGuid guid)
Definition: Unit.h:1839
void setPowerType(Powers power)
Definition: Unit.cpp:9987
void RemoveAllMinionsByEntry(uint32 entry)
Definition: Unit.cpp:10857
uint32 Type
Definition: DBCStructure.h:1914

References ABORT, Object::AddGuidValue(), Player::AddSpellAndCategoryCooldowns(), ASSERT, Player::CharmSpellInitialize(), ObjectGuid::Empty, Object::GetByteValue(), GetCharmGUID(), GetCritterGUID(), Object::GetEntry(), GetGuardianPet(), Object::GetGUID(), GetOwnerGUID(), GetPetGUID(), Totem::GetSpell(), Object::GetTypeId(), Object::GetUInt32Value(), HasUnitTypeMask(), SpellInfo::IsCooldownStartedOnEvent(), Minion::IsGuardianPet(), IsPet(), Minion::IsPetGhoul(), IsTotem(), LOG_DEBUG, LOG_FATAL, m_Controlled, m_ControlledByPlayer, TempSummon::m_Properties, MAX_SPELL_EFFECTS, OutDebugInfo(), PET_SAVE_NOT_IN_SLOT, Player::PetSpellInitialize(), POWER_ENERGY, RemoveAllMinionsByEntry(), Object::RemoveGuidValue(), Player::SendCooldownEvent(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCritterGUID(), SetMinionGUID(), SetOwnerGUID(), SetPetGUID(), setPowerType(), SetUnitFlag(), SPELL_EFFECT_SUMMON, sSpellMgr, SUMMON_TYPE_MINIPET, ToPet(), Object::ToPlayer(), ToTotem(), SummonPropertiesEntry::Type, TYPEID_PLAYER, TYPEID_UNIT, UNIT_CREATED_BY_SPELL, UNIT_FIELD_BYTES_2, UNIT_FIELD_SUMMON, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_CONTROLABLE_GUARDIAN.

Referenced by Player::CreatePet(), Spell::EffectCreateTamedPet(), Spell::EffectTameCreature(), Pet::LoadPetFromDB(), Player::RemovePet(), and Player::SummonPet().

◆ SetMinionGUID()

void Unit::SetMinionGUID ( ObjectGuid  guid)
inline

◆ SetModelVisible()

◆ SetModifierValue()

◆ SetNativeDisplayId()

◆ SetNpcFlag()

void Unit::SetNpcFlag ( NPCFlags  flags)
inline
1661{ SetFlag(UNIT_NPC_FLAGS, flags); }

References Object::SetFlag(), and UNIT_NPC_FLAGS.

Referenced by npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::InitializeAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::JustReachedHome(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_fairbanks::npc_fairbanksAI::MoveInLineOfSight(), npc_chesspiece::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), npc_pos_leader_second::npc_pos_leader_secondAI::MovementInform(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::MovementInform(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::MovementInform(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), Vehicle::RemovePassenger(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), hyjalAI::Reset(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::Reset(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_akama_illidan::npc_akama_illidanAI::Reset(), npc_akama_shade::Reset(), npc_magister_aledis::Reset(), Vehicle::Reset(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::ResetData(), NPCStaveQuestAI::ResetState(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_harrison_jones::npc_harrison_jonesAI::UpdateAI(), hyjalAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_arthas::npc_arthasAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_general_andorov::WaypointReached(), and npc_cork_gizelton::npc_cork_gizeltonAI::WaypointReached().

◆ SetOwnerGUID()

void Unit::SetOwnerGUID ( ObjectGuid  owner)
10573{
10574 if (GetOwnerGUID() == owner)
10575 return;
10576
10578 if (!owner)
10579 return;
10580
10581 m_applyResilience = !IsVehicle() && owner.IsPlayer();
10582
10583 // Update owner dependent fields
10584 Player* player = ObjectAccessor::GetPlayer(*this, owner);
10585 if (!player || !player->HaveAtClient(this)) // if player cannot see this unit yet, he will receive needed data with create object
10586 return;
10587
10589
10590 UpdateData udata;
10591 WorldPacket packet;
10592 BuildValuesUpdateBlockForPlayer(&udata, player);
10593 udata.BuildPacket(&packet);
10594 player->SendDirectMessage(&packet);
10595
10597}
void RemoveFieldNotifyFlag(uint16 flag)
Definition: Object.h:189
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target) const
Definition: Object.cpp:257
void SetFieldNotifyFlag(uint16 flag)
Definition: Object.h:188
Definition: UpdateData.h:52
bool BuildPacket(WorldPacket *packet)
Definition: UpdateData.cpp:105
bool HaveAtClient(WorldObject const *u) const
Definition: Player.cpp:11327

References UpdateData::BuildPacket(), Object::BuildValuesUpdateBlockForPlayer(), GetOwnerGUID(), ObjectAccessor::GetPlayer(), Player::HaveAtClient(), ObjectGuid::IsPlayer(), IsVehicle(), m_applyResilience, Object::RemoveFieldNotifyFlag(), Player::SendDirectMessage(), Object::SetFieldNotifyFlag(), Object::SetGuidValue(), UF_FLAG_OWNER, and UNIT_FIELD_SUMMONEDBY.

Referenced by GameObject::CastSpell(), Spell::EffectSummonType(), boss_illidari_council_memberAI::EnterEvadeMode(), spell_item_draenic_pale_ale::HandleSummon(), npc_pet_gen_fetch_ball::IsSummonedBy(), boss_razorgore::boss_razorgoreAI::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), Player::LoadFromDB(), SetMinion(), and npc_grimstone::npc_grimstoneAI::UpdateEscortAI().

◆ SetPetGUID()

◆ SetPhaseMask()

void Unit::SetPhaseMask ( uint32  newPhaseMask,
bool  update 
)
overridevirtual

Reimplemented from WorldObject.

19314{
19315 if (newPhaseMask == GetPhaseMask())
19316 return;
19317
19318 if (IsInWorld())
19319 {
19320 // xinef: to comment, bellow line should be removed
19321 // pussywizard: goign to other phase (valithria, algalon) should not remove such auras
19322 //RemoveNotOwnSingleTargetAuras(newPhaseMask, true); // we can lost access to caster or target
19323
19324 if (!sScriptMgr->CanSetPhaseMask(this, newPhaseMask, update))
19325 return;
19326
19327 // modify hostile references for new phasemask, some special cases deal with hostile references themselves
19328 if (GetTypeId() == TYPEID_UNIT || (!ToPlayer()->IsGameMaster() && !ToPlayer()->GetSession()->PlayerLogout()))
19329 {
19330 HostileRefMgr& refMgr = getHostileRefMgr();
19331 HostileReference* ref = refMgr.getFirst();
19332
19333 while (ref)
19334 {
19335 if (Unit* unit = ref->GetSource()->GetOwner())
19336 if (Creature* creature = unit->ToCreature())
19337 refMgr.setOnlineOfflineState(creature, creature->InSamePhase(newPhaseMask));
19338
19339 ref = ref->next();
19340 }
19341
19342 // modify threat lists for new phasemask
19343 if (GetTypeId() != TYPEID_PLAYER)
19344 {
19347
19348 // merge expects sorted lists
19349 threatList.sort();
19350 offlineThreatList.sort();
19351 threatList.merge(offlineThreatList);
19352
19353 for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr)
19354 if (Unit* unit = (*itr)->getTarget())
19355 unit->getHostileRefMgr().setOnlineOfflineState(ToCreature(), unit->InSamePhase(newPhaseMask));
19356 }
19357 }
19358 }
19359
19360 WorldObject::SetPhaseMask(newPhaseMask, false);
19361
19362 if (!IsInWorld())
19363 {
19364 return;
19365 }
19366
19367 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); )
19368 {
19369 Unit* controlled = *itr;
19370 ++itr;
19371 if (controlled->GetTypeId() == TYPEID_UNIT)
19372 {
19373 controlled->SetPhaseMask(newPhaseMask, true);
19374 }
19375 }
19376
19377 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
19378 {
19379 if (m_SummonSlot[i])
19380 {
19381 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
19382 {
19383 summon->SetPhaseMask(newPhaseMask, true);
19384 }
19385 }
19386 }
19387
19388 if (update)
19389 {
19391 }
19392}
FROM * GetSource() const
Definition: Reference.h:97
Definition: HostileRefMgr.h:32
void setOnlineOfflineState(bool isOnline)
Definition: HostileRefMgr.cpp:98
HostileReference * getFirst()
Definition: HostileRefMgr.h:60
HostileReference * next()
Definition: ThreatMgr.h:116
ThreatContainer::StorageType const & GetOfflineThreatList() const
Definition: ThreatMgr.h:275
Unit * GetOwner() const
Definition: ThreatMgr.h:237
virtual void SetPhaseMask(uint32 newPhaseMask, bool update)
Definition: Object.cpp:2861
uint32 GetPhaseMask() const
Definition: Object.h:434
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition: Unit.cpp:19313

References HostileRefMgr::getFirst(), getHostileRefMgr(), WorldObject::GetMap(), ThreatMgr::GetOfflineThreatList(), ThreatMgr::GetOwner(), WorldObject::GetPhaseMask(), Reference< TO, FROM >::GetSource(), ThreatMgr::GetThreatList(), GetThreatMgr(), Object::GetTypeId(), WorldObject::InSamePhase(), Object::IsInWorld(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, HostileReference::next(), HostileRefMgr::setOnlineOfflineState(), WorldObject::SetPhaseMask(), SetPhaseMask(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, and UpdateObjectVisibility().

Referenced by Pet::Create(), Creature::Create(), misc_commandscript::HandleAppearCommand(), modify_commandscript::HandleModifyPhaseCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), spell_wintergrasp_hide_small_elementals::spell_wintergrasp_hide_small_elementals_AuraScript::HandlePeriodicDummy(), AuraEffect::HandlePhase(), Battlefield::HideNpc(), boss_volazj::InitializeAI(), boss_zuramat::boss_zuramatAI::JustSummoned(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::JustSummoned(), BattlegroundAB::RemovePlayer(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_twilight_halion::boss_twilight_halionAI::Reset(), Creature::setDeathState(), Player::SetGameMaster(), SetPhaseMask(), Battlefield::ShowNpc(), WorldObject::SummonTrigger(), and npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached().

◆ SetPower()

void Unit::SetPower ( Powers  power,
uint32  val,
bool  withPowerUpdate = true,
bool  fromRegenerate = false 
)
15553{
15554 if (!fromRegenerate && GetPower(power) == val)
15555 {
15556 return;
15557 }
15558
15559 uint32 maxPower = GetMaxPower(power);
15560 if (maxPower < val)
15561 {
15562 val = maxPower;
15563 }
15564
15565 if (fromRegenerate)
15566 {
15567 UpdateUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, val);
15569 }
15570 else
15571 {
15572 SetStatInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, val);
15573 }
15574
15575 if (withPowerUpdate)
15576 {
15578 data << GetPackGUID();
15579 data << uint8(power);
15580 data << uint32(val);
15582 }
15583
15584 // group update
15585 if (GetTypeId() == TYPEID_PLAYER)
15586 {
15587 Player* player = ToPlayer();
15588 if (getPowerType() == power && player->NeedSendSpectatorData())
15589 {
15590 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15591 }
15592
15593 if (player->GetGroup())
15594 {
15596 }
15597 }
15598 else if (Pet* pet = ToCreature()->ToPet())
15599 {
15600 if (pet->isControlled())
15601 {
15602 Unit* owner = GetOwner();
15603 if (owner && (owner->GetTypeId() == TYPEID_PLAYER) && owner->ToPlayer()->GetGroup())
15604 {
15606 }
15607 }
15608
15609 // Update the pet's character sheet with happiness damage bonus
15610 if (pet->getPetType() == HUNTER_PET && power == POWER_HAPPINESS)
15611 {
15612 pet->UpdateDamagePhysical(BASE_ATTACK);
15613 }
15614 }
15615}
@ GROUP_UPDATE_FLAG_PET_CUR_POWER
Definition: Group.h:116
@ GROUP_UPDATE_FLAG_CUR_POWER
Definition: Group.h:104
@ SMSG_POWER_UPDATE
Definition: Opcodes.h:1182
void UpdateUInt32Value(uint16 index, uint32 value)
Definition: Object.cpp:663
void AddToObjectUpdateIfNeeded()
Definition: Object.cpp:524

References Object::AddToObjectUpdateIfNeeded(), BASE_ATTACK, WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), Object::GetPackGUID(), GetPower(), getPowerType(), Object::GetTypeId(), GROUP_UPDATE_FLAG_CUR_POWER, GROUP_UPDATE_FLAG_PET_CUR_POWER, HUNTER_PET, Player::NeedSendSpectatorData(), POWER_HAPPINESS, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), WorldObject::SendMessageToSet(), Player::SetGroupUpdateFlag(), Object::SetStatInt32Value(), SMSG_POWER_UPDATE, Object::ToCreature(), ToPet(), Object::ToPlayer(), TYPEID_PLAYER, UNIT_FIELD_POWER1, and Object::UpdateUInt32Value().

Referenced by Player::ActivateSpec(), Player::Create(), Pet::CreateBaseAtTamed(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), WorldSession::HandlePetAbandon(), spell_gen_pet_summoned::HandleScript(), spell_putricide_mutated_transformation::spell_putricide_mutated_transformation_SpellScript::HandleSummon(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), boss_shade_of_aran::OnPowerUpdate(), Player::ProcessDelayedOperations(), Player::Regenerate(), spell_igb_incinerating_blast::spell_igb_incinerating_blast_SpellScript::RemoveEnergy(), spell_igb_below_zero::spell_igb_below_zero_SpellScript::RemovePassengers(), boss_curator::Reset(), boss_selin_fireheart::Reset(), boss_moam::Reset(), npc_obsidian_destroyer::Reset(), npc_obsidian_eradicator::Reset(), npc_obsidian_nullifier::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::RestoreManaAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetMaxPower(), setPowerType(), Player::SummonPet(), and npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI().

◆ setPowerType()

void Unit::setPowerType ( Powers  power)
9988{
9989 SetByteValue(UNIT_FIELD_BYTES_0, 3, new_powertype);
9990
9991 if (GetTypeId() == TYPEID_PLAYER)
9992 {
9993 if (ToPlayer()->GetGroup())
9995 }
9996 else if (Pet* pet = ToCreature()->ToPet())
9997 {
9998 if (pet->isControlled())
9999 {
10000 Unit* owner = GetOwner();
10001 if (owner && (owner->GetTypeId() == TYPEID_PLAYER) && owner->ToPlayer()->GetGroup())
10003 }
10004 }
10005
10006 float powerMultiplier = 1.0f;
10007 if (!IsPet())
10008 if (Creature* creature = ToCreature())
10009 powerMultiplier = creature->GetCreatureTemplate()->ModMana;
10010
10011 switch (new_powertype)
10012 {
10013 default:
10014 case POWER_MANA:
10015 break;
10016 case POWER_RAGE:
10017 SetMaxPower(POWER_RAGE, uint32(std::ceil(GetCreatePowers(POWER_RAGE) * powerMultiplier)));
10018 SetPower(POWER_RAGE, 0);
10019 break;
10020 case POWER_FOCUS:
10021 SetMaxPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10022 SetPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10023 break;
10024 case POWER_ENERGY:
10025 SetMaxPower(POWER_ENERGY, uint32(std::ceil(GetCreatePowers(POWER_ENERGY) * powerMultiplier)));
10026 break;
10027 case POWER_HAPPINESS:
10028 SetMaxPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10029 SetPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10030 break;
10031 }
10032
10033 if (Player const* player = ToPlayer())
10034 if (player->NeedSendSpectatorData())
10035 {
10036 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "PWT", new_powertype);
10037 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetMaxPower(new_powertype) / 10 : GetMaxPower(new_powertype));
10038 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetPower(new_powertype) / 10 : GetPower(new_powertype));
10039 }
10040}
@ GROUP_UPDATE_FLAG_POWER_TYPE
Definition: Group.h:103
@ GROUP_UPDATE_FLAG_PET_POWER_TYPE
Definition: Group.h:115
void SetMaxPower(Powers power, uint32 val)
Definition: Unit.cpp:15617

References WorldObject::FindMap(), GetCreatePowers(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), GetPower(), Object::GetTypeId(), GROUP_UPDATE_FLAG_PET_POWER_TYPE, GROUP_UPDATE_FLAG_POWER_TYPE, IsPet(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Object::SetByteValue(), Player::SetGroupUpdateFlag(), SetMaxPower(), SetPower(), Object::ToCreature(), ToPet(), Object::ToPlayer(), TYPEID_PLAYER, and UNIT_FIELD_BYTES_0.

Referenced by Pet::CreateBaseAtTamed(), AuraEffect::HandleAuraModShapeshift(), spell_putricide_mutated_transformation::spell_putricide_mutated_transformation_SpellScript::HandleSummon(), Player::InitDataForForm(), Vehicle::Install(), Pet::LoadPetFromDB(), npc_toc_rogue::npc_toc_rogueAI::npc_toc_rogueAI(), SetMinion(), and Player::SummonPet().

◆ SetPvP()

void Unit::SetPvP ( bool  state)
inline

◆ setRace()

void Unit::setRace ( uint8  race)
21301{
21302 if (GetTypeId() == TYPEID_PLAYER)
21303 m_race = race;
21304}

References Object::GetTypeId(), m_race, and TYPEID_PLAYER.

◆ SetRedirectThreat()

void Unit::SetRedirectThreat ( ObjectGuid  guid,
uint32  pct 
)
inline
2358{ _redirectThreatInfo.Set(guid, pct); }
void Set(ObjectGuid guid, uint32 pct)
Definition: Unit.h:968

References _redirectThreatInfo, and RedirectThreatInfo::Set().

Referenced by Spell::EffectRedirectThreat(), and ResetRedirectThreat().

◆ SetResistance()

◆ SetResistanceBuffMods()

void Unit::SetResistanceBuffMods ( SpellSchools  school,
bool  positive,
float  val 
)
inline

◆ SetRooted()

void Unit::SetRooted ( bool  apply,
bool  isStun = false 
)
protected
18459{
18460 if (apply)
18461 {
18462 if (m_rootTimes > 0) // blizzard internal check?
18463 m_rootTimes++;
18464
18465 // MOVEMENTFLAG_ROOT cannot be used in conjunction with MOVEMENTFLAG_MASK_MOVING (tested 3.3.5a)
18466 // this will freeze clients. That's why we remove MOVEMENTFLAG_MASK_MOVING before
18467 // setting MOVEMENTFLAG_ROOT
18469
18470 if (IsFalling())
18471 {
18473 }
18474 else
18475 {
18477 }
18478
18479 // Creature specific
18480 if (GetTypeId() != TYPEID_PLAYER)
18481 {
18482 if (isStun && movespline->Finalized())
18483 {
18485 }
18486 else
18487 {
18488 StopMoving();
18489 }
18490 }
18491
18492 if (m_movedByPlayer)
18493 {
18494 WorldPacket data(SMSG_FORCE_MOVE_ROOT, GetPackGUID().size() + 4);
18495 data << GetPackGUID();
18496 data << m_rootTimes;
18498 }
18499 else
18500 {
18502 data << GetPackGUID();
18503 SendMessageToSet(&data, true);
18504 }
18505 }
18506 else
18507 {
18509
18510 if (!HasUnitState(UNIT_STATE_STUNNED)) // prevent moving if it also has stun effect
18511 {
18512 if (m_movedByPlayer)
18513 {
18515 data << GetPackGUID();
18516 data << m_rootTimes;
18518 }
18519 else
18520 {
18522 data << GetPackGUID();
18523 SendMessageToSet(&data, true);
18524 }
18525 }
18526 }
18527}
@ MOVEMENTFLAG_PENDING_ROOT
Definition: Unit.h:572
@ SMSG_FORCE_MOVE_UNROOT
Definition: Opcodes.h:264
@ SMSG_FORCE_MOVE_ROOT
Definition: Opcodes.h:262
@ SMSG_SPLINE_MOVE_ROOT
Definition: Opcodes.h:824
void StopMovingOnCurrentPos()
Definition: Unit.cpp:16957

References AddUnitMovementFlag(), Movement::MoveSpline::Finalized(), Object::GetPackGUID(), Object::GetTypeId(), HasUnitState(), IsFalling(), m_movedByPlayer, m_rootTimes, MOVEMENTFLAG_MASK_MOVING, MOVEMENTFLAG_PENDING_ROOT, MOVEMENTFLAG_ROOT, movespline, RemoveUnitMovementFlag(), Player::SendDirectMessage(), WorldObject::SendMessageToSet(), SMSG_FORCE_MOVE_ROOT, SMSG_FORCE_MOVE_UNROOT, SMSG_SPLINE_MOVE_ROOT, SMSG_SPLINE_MOVE_UNROOT, StopMoving(), StopMovingOnCurrentPos(), Object::ToPlayer(), TYPEID_PLAYER, and UNIT_STATE_STUNNED.

Referenced by WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), SetControlled(), and SetStunned().

◆ SetShapeshiftForm()

void Unit::SetShapeshiftForm ( ShapeshiftForm  form)
inline

◆ SetSheath()

◆ SetSpeed()

void Unit::SetSpeed ( UnitMoveType  mtype,
float  rate,
bool  forced = false 
)
14415{
14416 if (rate < 0)
14417 rate = 0.0f;
14418
14419 // Update speed only on change
14420 if (m_speed_rate[mtype] == rate)
14421 return;
14422
14423 m_speed_rate[mtype] = rate;
14424
14426
14427 WorldPacket data;
14428 if (!forced)
14429 {
14430 switch (mtype)
14431 {
14432 case MOVE_WALK:
14433 data.Initialize(MSG_MOVE_SET_WALK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14434 break;
14435 case MOVE_RUN:
14436 data.Initialize(MSG_MOVE_SET_RUN_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14437 break;
14438 case MOVE_RUN_BACK:
14439 data.Initialize(MSG_MOVE_SET_RUN_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14440 break;
14441 case MOVE_SWIM:
14442 data.Initialize(MSG_MOVE_SET_SWIM_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14443 break;
14444 case MOVE_SWIM_BACK:
14445 data.Initialize(MSG_MOVE_SET_SWIM_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14446 break;
14447 case MOVE_TURN_RATE:
14448 data.Initialize(MSG_MOVE_SET_TURN_RATE, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14449 break;
14450 case MOVE_FLIGHT:
14451 data.Initialize(MSG_MOVE_SET_FLIGHT_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14452 break;
14453 case MOVE_FLIGHT_BACK:
14454 data.Initialize(MSG_MOVE_SET_FLIGHT_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14455 break;
14456 case MOVE_PITCH_RATE:
14457 data.Initialize(MSG_MOVE_SET_PITCH_RATE, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14458 break;
14459 default:
14460 LOG_ERROR("entities.unit", "Unit::SetSpeed: Unsupported move type ({}), data not sent to client.", mtype);
14461 return;
14462 }
14463
14464 data << GetPackGUID();
14465 BuildMovementPacket(&data);
14466 data << float(GetSpeed(mtype));
14467 SendMessageToSet(&data, true);
14468 }
14469 else
14470 {
14471 if (GetTypeId() == TYPEID_PLAYER)
14472 {
14473 // register forced speed changes for WorldSession::HandleForceSpeedChangeAck
14474 // and do it only for real sent packets and use run for run/mounted as client expected
14475 ++ToPlayer()->m_forced_speed_changes[mtype];
14476
14477 // Xinef: update speed of pet also
14478 if (!IsInCombat())
14479 {
14480 Unit* pet = ToPlayer()->GetPet();
14481 if (!pet)
14482 pet = GetCharm();
14483
14484 // xinef: do not affect vehicles and possesed pets
14485 if (pet && (pet->HasUnitFlag(UNIT_FLAG_POSSESSED) || pet->IsVehicle()))
14486 pet = nullptr;
14487
14489 pet->UpdateSpeed(mtype, forced);
14490 if (Unit* critter = ObjectAccessor::GetUnit(*this, GetCritterGUID()))
14491 critter->UpdateSpeed(mtype, forced);
14492 }
14493 ToPlayer()->SetCanTeleport(true);
14494 }
14495
14496 switch (mtype)
14497 {
14498 case MOVE_WALK:
14500 break;
14501 case MOVE_RUN:
14503 break;
14504 case MOVE_RUN_BACK:
14506 break;
14507 case MOVE_SWIM:
14509 break;
14510 case MOVE_SWIM_BACK:
14512 break;
14513 case MOVE_TURN_RATE:
14515 break;
14516 case MOVE_FLIGHT:
14518 break;
14519 case MOVE_FLIGHT_BACK:
14521 break;
14522 case MOVE_PITCH_RATE:
14524 break;
14525 default:
14526 LOG_ERROR("entities.unit", "Unit::SetSpeed: Unsupported move type ({}), data not sent to client.", mtype);
14527 return;
14528 }
14529 data << GetPackGUID();
14530 data << (uint32)0; // moveEvent, NUM_PMOVE_EVTS = 0x39
14531 if (mtype == MOVE_RUN)
14532 data << uint8(0); // new 2.1.0
14533 data << float(GetSpeed(mtype));
14534 SendMessageToSet(&data, true);
14535 }
14536}
@ MOVE_TURN_RATE
Definition: Unit.h:383
@ MOVE_FLIGHT_BACK
Definition: Unit.h:385
@ MOVE_SWIM_BACK
Definition: Unit.h:382
@ MOVE_PITCH_RATE
Definition: Unit.h:386
@ MOVE_RUN_BACK
Definition: Unit.h:380
@ MOVE_WALK
Definition: Unit.h:378
@ FOLLOW_MOTION_TYPE
Definition: MotionMaster.h:52
@ SMSG_FORCE_TURN_RATE_CHANGE
Definition: Opcodes.h:764
@ MSG_MOVE_SET_SWIM_BACK_SPEED
Definition: Opcodes.h:243
@ MSG_MOVE_SET_TURN_RATE
Definition: Opcodes.h:246
@ SMSG_FORCE_WALK_SPEED_CHANGE
Definition: Opcodes.h:760
@ SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE
Definition: Opcodes.h:929
@ MSG_MOVE_SET_PITCH_RATE
Definition: Opcodes.h:1145
@ SMSG_FORCE_RUN_SPEED_CHANGE
Definition: Opcodes.h:256
@ SMSG_FORCE_SWIM_BACK_SPEED_CHANGE
Definition: Opcodes.h:762
@ SMSG_FORCE_RUN_BACK_SPEED_CHANGE
Definition: Opcodes.h:258
@ SMSG_FORCE_FLIGHT_SPEED_CHANGE
Definition: Opcodes.h:927
@ SMSG_FORCE_SWIM_SPEED_CHANGE
Definition: Opcodes.h:260
@ MSG_MOVE_SET_RUN_SPEED
Definition: Opcodes.h:235
@ MSG_MOVE_SET_FLIGHT_SPEED
Definition: Opcodes.h:924
@ MSG_MOVE_SET_WALK_SPEED
Definition: Opcodes.h:239
@ MSG_MOVE_SET_SWIM_SPEED
Definition: Opcodes.h:241
@ MSG_MOVE_SET_FLIGHT_BACK_SPEED
Definition: Opcodes.h:926
@ SMSG_FORCE_PITCH_RATE_CHANGE
Definition: Opcodes.h:1146
@ MSG_MOVE_SET_RUN_BACK_SPEED
Definition: Opcodes.h:237
uint8 m_forced_speed_changes[MAX_MOVE_TYPE]
Definition: Player.h:2363
float GetSpeed(UnitMoveType mtype) const
Definition: Unit.cpp:14409
void propagateSpeedChange()
-------—End of Pet responses methods-------—
Definition: Unit.h:2323
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition: MotionMaster.cpp:859

References BuildMovementPacket(), FOLLOW_MOTION_TYPE, GetCharm(), GetCritterGUID(), MotionMaster::GetCurrentMovementGeneratorType(), GetMotionMaster(), Object::GetPackGUID(), Player::GetPet(), GetSpeed(), Object::GetTypeId(), ObjectAccessor::GetUnit(), HasUnitFlag(), WorldPacket::Initialize(), IsInCombat(), IsVehicle(), LOG_ERROR, Player::m_forced_speed_changes, m_speed_rate, MOVE_FLIGHT, MOVE_FLIGHT_BACK, MOVE_PITCH_RATE, MOVE_RUN, MOVE_RUN_BACK, MOVE_SWIM, MOVE_SWIM_BACK, MOVE_TURN_RATE, MOVE_WALK, MSG_MOVE_SET_FLIGHT_BACK_SPEED, MSG_MOVE_SET_FLIGHT_SPEED, MSG_MOVE_SET_PITCH_RATE, MSG_MOVE_SET_RUN_BACK_SPEED, MSG_MOVE_SET_RUN_SPEED, MSG_MOVE_SET_SWIM_BACK_SPEED, MSG_MOVE_SET_SWIM_SPEED, MSG_MOVE_SET_TURN_RATE, MSG_MOVE_SET_WALK_SPEED, propagateSpeedChange(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE, SMSG_FORCE_FLIGHT_SPEED_CHANGE, SMSG_FORCE_PITCH_RATE_CHANGE, SMSG_FORCE_RUN_BACK_SPEED_CHANGE, SMSG_FORCE_RUN_SPEED_CHANGE, SMSG_FORCE_SWIM_BACK_SPEED_CHANGE, SMSG_FORCE_SWIM_SPEED_CHANGE, SMSG_FORCE_TURN_RATE_CHANGE, SMSG_FORCE_WALK_SPEED_CHANGE, Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, UNIT_FLAG_POSSESSED, and UpdateSpeed().

Referenced by Battleground::AddCreature(), boss_bug_trio::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), boss_zuljin::boss_zuljinAI::EnterPhase(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::FlyAway(), boss_volkhan::boss_volkhanAI::GoToAnvil(), misc_commandscript::HandleDismountCommand(), spell_mount_check::spell_mount_check_AuraScript::HandleEffectPeriodic(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), WorldSession::HandleForceSpeedChangeAck(), modify_commandscript::HandleModifyASpeedCommand(), modify_commandscript::HandleModifyMountCommand(), Creature::InitEntry(), boss_glob_of_viscidus::InitializeAI(), Guardian::InitStatsForLevel(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), boss_sartharion_dragonAI::JustEngagedWith(), boss_four_horsemen::boss_four_horsemenAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_sartharion::boss_sartharionAI::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), boss_onyxia::MovementInform(), boss_bug_trio::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_akilzon_eagle::npc_akilzon_eagleAI::MovementInform(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_batrider::npc_batrider(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), npc_eastvale_peasent::PathEndReached(), SmartScript::ProcessAction(), boss_nightbane::Reset(), boss_kalec::boss_kalecAI::Reset(), boss_nalorakk::boss_nalorakkAI::Reset(), boss_headless_horseman::Reset(), boss_onyxia::Reset(), boss_bug_trio::Reset(), boss_sartharion_dragonAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_volkhan::boss_volkhanAI::Reset(), boss_thorim_sif_blizzard::boss_thorim_sif_blizzardAI::Reset(), npc_wild_wyrm::npc_wild_wyrmAI::Reset(), npc_freed_protodrake::npc_freed_protodrakeAI::Reset(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), npc_eastvale_peasent::SetData(), Battlefield::SpawnCreature(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), npc_akilzon_eagle::npc_akilzon_eagleAI::UpdateAI(), boss_zuljin::boss_zuljinAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::UpdateAI(), UpdateSpeed(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetSpeedRate()

◆ SetStandFlags()

◆ SetStandState()

void Unit::SetStandState ( uint8  state)
16995{
16997
16998 if (IsStandState())
17000
17001 if (GetTypeId() == TYPEID_PLAYER)
17002 {
17004 data << (uint8)state;
17005 ToPlayer()->GetSession()->SendPacket(&data);
17006 }
17007}
@ UNIT_BYTES_1_OFFSET_STAND_STATE
Definition: Unit.h:44
@ SMSG_STANDSTATE_UPDATE
Definition: Opcodes.h:699

References AURA_INTERRUPT_FLAG_NOT_SEATED, Player::GetSession(), Object::GetTypeId(), IsStandState(), RemoveAurasWithInterruptFlags(), WorldSession::SendPacket(), Object::SetByteValue(), SMSG_STANDSTATE_UPDATE, Object::ToPlayer(), TYPEID_PLAYER, UNIT_BYTES_1_OFFSET_STAND_STATE, and UNIT_FIELD_BYTES_1.

Referenced by _ApplyAura(), npc_mograine::npc_mograineAI::AshbringerEvent(), boss_felmyst::boss_felmystAI::boss_felmystAI(), boss_kologarn::boss_kologarnAI::boss_kologarnAI(), boss_twinemperorsAI::boss_twinemperorsAI(), boss_thekal::CheckPhaseTransition(), npc_ringo::npc_ringoAI::ClearFaint(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), CombatStart(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), boss_thekal::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_the_lurker_below::DoAction(), boss_leotheras_the_blind::DoAction(), npc_madrigosa::npc_madrigosaAI::DoAction(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), Spell::DoAllEffectOnTarget(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), UtherBatteredHiltEvent::Execute(), SuckBackEvent::Execute(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::FeignDeath(), WorldSession::HandleAlterAppearance(), WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandleMovementOpcodes(), WorldSession::HandlePlayerLoginFromDB(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStandStateChangeOpcode(), spell_q11322_q11317_the_cleansing::if(), DistractMovementGenerator::Initialize(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), boss_kalecgos::boss_kalecgosAI::JustEngagedWith(), boss_palehoof::boss_palehoofAI::JustReachedHome(), npc_massive_jormungar::npc_massive_jormungarAI::JustReachedHome(), npc_ferocious_rhino::npc_ferocious_rhinoAI::JustReachedHome(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::JustReachedHome(), npc_frenzied_worgen::npc_frenzied_worgenAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::JustSummoned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), npc_mograine::npc_mograineAI::MoveInLineOfSight(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_kologarn::boss_kologarnAI::MoveInLineOfSight(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::MoveInLineOfSight(), npc_twilight_volunteer::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), npc_madrigosa::npc_madrigosaAI::npc_madrigosaAI(), spell_love_is_in_the_air_romantic_picnic::OnApply(), spell_alar_ember_blast_death::spell_alar_ember_blast_death_AuraScript::OnApply(), boss_shade_of_aran::OnPowerUpdate(), npc_kernobee::OnQuestAccept(), npc_koltira_deathweaver::OnQuestAccept(), npc_kerlonian::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_ringo::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_bonker_togglevolt::OnQuestAccept(), spell_alar_ember_blast_death::spell_alar_ember_blast_death_AuraScript::OnRemove(), Spell::prepare(), PretendToDie(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_vaelastrasz::boss_vaelAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_kalecgos::boss_kalecgosAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_thekal::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Reset(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::Reset(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), Resurrect(), boss_the_lurker_below::SchedulerPhaseOne(), boss_the_lurker_below::SchedulerPhaseTwo(), npc_ringo::npc_ringoAI::SetFaint(), npc_kurenai_captive::npc_kurenai_captiveAI::SetGUID(), SetInCombatState(), npc_kerlonian::npc_kerlonianAI::SetSleeping(), SetStunned(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_corporal_keeshan::npc_corporal_keeshanAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::npc_forest_frogAI::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::UpdateAI(), npc_tallhorn_stag::npc_tallhorn_stagAI::UpdateAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), GameObject::Use(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetStat()

void Unit::SetStat ( Stats  stat,
int32  val 
)
inline

◆ SetStunned()

void Unit::SetStunned ( bool  apply)
protected
18411{
18413 {
18414 return;
18415 }
18416
18417 if (apply)
18418 {
18419 SetTarget();
18421
18422 if (GetTypeId() == TYPEID_PLAYER)
18423 {
18425 }
18426
18427 SetRooted(true, true);
18428
18429 CastStop();
18430 }
18431 else
18432 {
18433 if (IsAlive() && GetVictim())
18435
18436 if (GetTypeId() == TYPEID_UNIT)
18437 {
18438 // don't remove UNIT_FLAG_STUNNED for pet when owner is mounted (disabled pet's interface)
18439 Unit* owner = GetOwner();
18440 if (!owner || owner->GetTypeId() != TYPEID_PLAYER || !owner->ToPlayer()->IsMounted())
18442
18443 // Xinef: same for charmed npcs
18444 owner = GetCharmer();
18445 if (!owner || owner->GetTypeId() != TYPEID_PLAYER || !owner->ToPlayer()->IsMounted())
18447 }
18448 else
18450
18451 if (!HasUnitState(UNIT_STATE_ROOT)) // prevent moving if it also has root effect
18452 {
18453 SetRooted(false, true);
18454 }
18455 }
18456}

References CastStop(), GetCharmer(), Object::GetGUID(), GetOwner(), Object::GetTypeId(), GetVictim(), HasUnitState(), IsAlive(), IsMounted(), RemoveUnitFlag(), SetRooted(), SetStandState(), SetTarget(), SetUnitFlag(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, UNIT_FLAG_STUNNED, UNIT_STAND_STATE_STAND, UNIT_STATE_IN_FLIGHT, and UNIT_STATE_ROOT.

Referenced by SetControlled().

◆ SetSwim()

bool Unit::SetSwim ( bool  enable)
virtual

◆ SetTarget()

virtual void Unit::SetTarget ( ObjectGuid  = ObjectGuid::Empty)
pure virtual

◆ setTransForm()

void Unit::setTransForm ( uint32  spellid)
inline
2187{ m_transform = spellid;}

References m_transform.

Referenced by AuraEffect::HandleAuraTransform().

◆ SetUnitFlag()

void Unit::SetUnitFlag ( UnitFlags  flags)
inline
1495{ SetFlag(UNIT_FIELD_FLAGS, flags); }

References Object::SetFlag(), and UNIT_FIELD_FLAGS.

Referenced by Vehicle::AddPassenger(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::AddPortals(), Creature::AllLootRemovedFromCorpse(), npc_doctor::npc_doctorAI::BeginEvent(), boss_ahune::boss_ahune(), boss_jarien::boss_jarien(), boss_sothos::boss_sothos(), GameObject::CastSpell(), Player::Create(), boss_felblood_kaelthas::DamageTaken(), npc_mograine::npc_mograineAI::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_kiljaeden::boss_kiljaedenAI::DamageTaken(), boss_muru::boss_muruAI::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_crystalline_frayer::npc_crystalline_frayerAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_illidan_stormrage::boss_illidan_stormrageAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Deactivate(), DisableRotate(), boss_thorim::boss_thorimAI::DisableThorim(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_felmyst::boss_felmystAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), PetAI::DoAttack(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_erekem::boss_erekemAI::EnterEvadeMode(), boss_ichoron::boss_ichoronAI::EnterEvadeMode(), boss_lavanthor::boss_lavanthorAI::EnterEvadeMode(), boss_moragg::boss_moraggAI::EnterEvadeMode(), boss_xevozz::boss_xevozzAI::EnterEvadeMode(), boss_zuramat::boss_zuramatAI::EnterEvadeMode(), boss_ahune::EnterEvadeMode(), boss_anubarak_trial::boss_anubarak_trialAI::EnterEvadeMode(), boss_jaraxxus::boss_jaraxxusAI::EnterEvadeMode(), boss_gormok::boss_gormokAI::EnterEvadeMode(), boss_jormungarAI::EnterEvadeMode(), boss_icehowl::boss_icehowlAI::EnterEvadeMode(), boss_zuljin::boss_zuljinAI::EnterPhase(), SACDeactivateEvent::Execute(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::FeignDeath(), spell_boss_magus_telestra_summon_telestra_clones::spell_boss_magus_telestra_summon_telestra_clones_AuraScript::HandleApply(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::spell_q13007_iron_colossus_SpellScript::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_gen_model_visible::HandleEffectApply(), spell_gen_feign_death_all_flags::HandleEffectApply(), spell_gen_feign_death_no_dyn_flag::HandleEffectApply(), spell_gen_feign_death_no_prevent_emotes::HandleEffectApply(), AuraEffect::HandleFeignDeath(), BattlefieldWG::HandleKill(), Battleground::HandleKillPlayer(), WorldSession::HandleLogoutRequestOpcode(), spell_oculus_rider_aura::spell_oculus_rider_auraAuraScript::HandleOnEffectApply(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_malchezaar_axe::Initialize(), npc_captured_beryl_sorcerer::npc_captured_beryl_sorcererAI::Initialize(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::InitializeAI(), boss_kiljaeden::boss_kiljaedenAI::InitializeAI(), npc_general_andorov::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), Player::InitStatsForLevel(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustEngagedWith(), boss_mimiron::boss_mimironAI::JustEngagedWith(), boss_felmyst::boss_felmystAI::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_gothik::boss_gothikAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), boss_hazzarah::JustSummoned(), boss_illidan_stormrage::boss_illidan_stormrageAI::JustSummoned(), boss_vaelastrasz::boss_vaelAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::boss_archimondeAI::JustSummoned(), boss_broggok::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Mount(), npc_shattered_hand_scout::MoveInLineOfSight(), npc_batrider::npc_batrider(), npc_chess_move_trigger::npc_chess_move_trigger(), npc_giant_infernal::npc_giant_infernalAI::npc_giant_infernalAI(), npc_hol_monument::npc_hol_monumentAI::npc_hol_monumentAI(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_q24545_vegard::npc_q24545_vegardAI::npc_q24545_vegardAI(), npc_xt002_heart::npc_xt002_heartAI::npc_xt002_heartAI(), spell_halion_twilight_phasing::spell_halion_twilight_phasing_AuraScript::OnApply(), spell_alar_ember_blast_death::spell_alar_ember_blast_death_AuraScript::OnApply(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), Creature::RefreshSwimmingFlag(), boss_keristrasza::boss_keristraszaAI::RemovePrison(), npc_grimstone::npc_grimstoneAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_nefarian::Reset(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_nalorakk::boss_nalorakkAI::Reset(), npc_hallows_end_soh::Reset(), npc_ancient_wisp::npc_ancient_wispAI::Reset(), boss_cthun::Reset(), npc_depth_charge::npc_depth_chargeAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_death_ravager::npc_death_ravagerAI::Reset(), npc_giant_spotlight::npc_giant_spotlightAI::Reset(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::Reset(), boss_jedoga_shadowseeker::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_announcer_toc5::npc_announcer_toc5AI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_novos::boss_novosAI::Reset(), boss_tyrannus::boss_tyrannusAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_malygos::boss_malygosAI::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_sjonnir::boss_sjonnirAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::Reset(), boss_kologarn::boss_kologarnAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_massive_jormungar::npc_massive_jormungarAI::Reset(), npc_ferocious_rhino::npc_ferocious_rhinoAI::Reset(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::Reset(), npc_frenzied_worgen::npc_frenzied_worgenAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), npc_drakuru_shackles::npc_drakuru_shacklesAI::Reset(), boss_shade_of_akama::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), boss_warlord_kalithresh::Reset(), boss_broggok::Reset(), boss_kelidan_the_breaker::Reset(), boss_magtheridon::Reset(), boss_kaelthas::boss_kaelthasAI::Reset(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_the_lurker_below::SchedulerPhaseOne(), Player::SendLoot(), SetCharm(), SetCharmedBy(), SetImmuneToNPC(), SetImmuneToPC(), SetInCombatState(), Player::SetIsSpectator(), SetMinion(), SetStunned(), SetSwim(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::ShowNpc(), boss_zuljin::boss_zuljinAI::SpawnAdds(), npc_netherspite_infernal::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_ionar::boss_ionarAI::Split(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), boss_ouro::Submerge(), npc_drakonid_spawner::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_blistering_zombie::npc_blistering_zombieAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), boss_ahune::UpdateAI(), boss_kaelthas::boss_kaelthasAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and Creature::UpdateEntry().

◆ SetUnitFlag2()

◆ SetUnitMovementFlags()

◆ SetVisible()

void Unit::SetVisible ( bool  x)
14221{
14222 if (!x)
14224 else
14226
14228}
@ SEC_GAMEMASTER
Definition: Common.h:61

References WorldObject::m_serverSideVisibility, SEC_GAMEMASTER, SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and UpdateObjectVisibility().

Referenced by _ExitVehicle(), boss_felmyst::boss_felmystAI::boss_felmystAI(), Creature::Create(), spell_rotface_unstable_ooze_explosion_suicide::spell_rotface_unstable_ooze_explosion_suicide_AuraScript::DespawnSelf(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), boss_the_lurker_below::DoAction(), boss_felmyst::boss_felmystAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), boss_shade_of_akama::EnterEvadeMode(), HideNpcEvent::Execute(), UtherBatteredHiltEvent::Execute(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::FinishQuest(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), BattlegroundSA::HandleKillUnit(), Battlefield::HideNpc(), boss_kiljaeden::boss_kiljaedenAI::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), hyjalAI::JustDied(), npc_xt002_heart::npc_xt002_heartAI::JustDied(), boss_kalecgos::boss_kalecgosAI::JustReachedHome(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::JustReachedHome(), SmartAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_hazzarah::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), npc_enslaved_netherwing_drake::MovementInform(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::MovementInform(), boss_vazruden_the_herald::MovementInform(), npc_shattered_hand_scout::MovementInform(), npc_madrigosa::npc_madrigosaAI::npc_madrigosaAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::npc_time_lost_proto_drakeAI(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnCreatureCreate(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::OnCreatureCreate(), instance_forge_of_souls::instance_forge_of_souls_InstanceScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_pit_of_saron::instance_pit_of_saron_InstanceScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::PassengerBoarded(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_midnight::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_muru::boss_muruAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_eye_of_cthun::Reset(), npc_murkdeep::npc_murkdeepAI::Reset(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::Reset(), boss_halion::boss_halionAI::Reset(), npc_pos_leader::npc_pos_leaderAI::Reset(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::Reset(), boss_ionar::boss_ionarAI::Reset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::Reset(), npc_minigob_manabonk::npc_minigob_manabonkAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), npc_akama_illidan::npc_akama_illidanAI::Reset(), boss_the_lurker_below::Reset(), boss_vazruden_the_herald::Reset(), npc_enslaved_netherwing_drake::Reset(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::Reset(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::SetData(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SetData(), instance_ulduar::instance_ulduar_InstanceMapScript::ShowKeeperGossip(), Battlefield::ShowNpc(), boss_ionar::boss_ionarAI::Split(), boss_archimonde::boss_archimondeAI::SummonDoomfire(), boss_warchief_kargath_bladefist::SummonedCreatureDies(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), boss_muru::boss_muruAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), boss_archimonde::boss_archimondeAI::UpdateAI(), npc_giant_infernal::npc_giant_infernalAI::UpdateAI(), hyjalAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_minigob_manabonk::npc_minigob_manabonkAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_shade_of_akama::UpdateAI(), boss_ahune::UpdateAI(), npc_commander_dawnforge::npc_commander_dawnforgeAI::UpdateAI(), SmartAI::UpdateDespawn(), npc_grimstone::npc_grimstoneAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_taretha::npc_tarethaAI::WaypointReached().

◆ SetVisibleAura()

void Unit::SetVisibleAura ( uint8  slot,
AuraApplication aur 
)
inline

◆ SetWalk()

bool Unit::SetWalk ( bool  enable)
virtual

Reimplemented in Creature.

20908{
20909 if (enable == IsWalking())
20910 return false;
20911
20912 if (enable)
20914 else
20916
20918 return true;
20919}
bool IsWalking() const
Definition: Unit.h:2393

References AddUnitMovementFlag(), IsWalking(), MOVEMENTFLAG_WALKING, propagateSpeedChange(), and RemoveUnitMovementFlag().

Referenced by debug_commandscript::HandleDebugMoveflagsCommand(), SetCharm(), and Creature::SetWalk().

◆ SetWaterWalking()

bool Unit::SetWaterWalking ( bool  enable,
bool  packetOnly = false 
)
virtual

◆ SpellBaseDamageBonusDone()

int32 Unit::SpellBaseDamageBonusDone ( SpellSchoolMask  schoolMask)
11932{
11933 int32 DoneAdvertisedBenefit = 0;
11934
11936 for (AuraEffectList::const_iterator i = mDamageDone.begin(); i != mDamageDone.end(); ++i)
11937 if (((*i)->GetMiscValue() & schoolMask) != 0 &&
11938 (*i)->GetSpellInfo()->EquippedItemClass == -1 &&
11939 // -1 == any item class (not wand then)
11940 (*i)->GetSpellInfo()->EquippedItemInventoryTypeMask == 0)
11941 // 0 == any inventory type (not wand then)
11942 DoneAdvertisedBenefit += (*i)->GetAmount();
11943
11944 if (GetTypeId() == TYPEID_PLAYER)
11945 {
11946 // Base value
11947 DoneAdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
11948
11949 // Damage bonus from stats
11951 for (AuraEffectList::const_iterator i = mDamageDoneOfStatPercent.begin(); i != mDamageDoneOfStatPercent.end(); ++i)
11952 {
11953 if ((*i)->GetMiscValue() & schoolMask)
11954 {
11955 // stat used stored in miscValueB for this aura
11956 Stats usedStat = Stats((*i)->GetMiscValueB());
11957 DoneAdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
11958 }
11959 }
11960 // ... and attack power
11962 for (AuraEffectList::const_iterator i = mDamageDonebyAP.begin(); i != mDamageDonebyAP.end(); ++i)
11963 if ((*i)->GetMiscValue() & schoolMask)
11964 DoneAdvertisedBenefit += int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount()));
11965 }
11966 return DoneAdvertisedBenefit;
11967}
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER
Definition: SpellAuraDefines.h:300
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT
Definition: SpellAuraDefines.h:237
@ SPELL_AURA_MOD_DAMAGE_DONE
Definition: SpellAuraDefines.h:76
uint32 GetBaseSpellPowerBonus()
Definition: Player.h:1934

References BASE_ATTACK, CalculatePct(), GetAuraEffectsByType(), Player::GetBaseSpellPowerBonus(), GetStat(), GetTotalAttackPowerValue(), Object::GetTypeId(), SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by spell_item_wraith_scythe_drain_life::CalculateDamage(), spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), Spell::EffectWeaponDmg(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), SpellDamageBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellBaseDamageBonusTaken()

int32 Unit::SpellBaseDamageBonusTaken ( SpellSchoolMask  schoolMask,
bool  isDoT = false 
)
11970{
11971 int32 TakenAdvertisedBenefit = 0;
11972
11974 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
11975 if (((*i)->GetMiscValue() & schoolMask) != 0)
11976 {
11977 // Xinef: if we have DoT damage type and aura has charges, check if it affects DoTs
11978 // Xinef: required for hemorrhage & rupture / garrote
11979 if (isDoT && (*i)->GetBase()->IsUsingCharges() && !((*i)->GetSpellInfo()->ProcFlags & PROC_FLAG_TAKEN_PERIODIC))
11980 continue;
11981
11982 TakenAdvertisedBenefit += (*i)->GetAmount();
11983 }
11984
11985 return TakenAdvertisedBenefit;
11986}

References GetAuraEffectsByType(), PROC_FLAG_TAKEN_PERIODIC, and SPELL_AURA_MOD_DAMAGE_TAKEN.

Referenced by HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), and SpellDamageBonusTaken().

◆ SpellBaseHealingBonusDone()

int32 Unit::SpellBaseHealingBonusDone ( SpellSchoolMask  schoolMask)
12697{
12698 int32 AdvertisedBenefit = 0;
12699
12701 for (AuraEffectList::const_iterator i = mHealingDone.begin(); i != mHealingDone.end(); ++i)
12702 if (!(*i)->GetMiscValue() || ((*i)->GetMiscValue() & schoolMask) != 0)
12703 AdvertisedBenefit += (*i)->GetAmount();
12704
12705 // Healing bonus of spirit, intellect and strength
12706 if (GetTypeId() == TYPEID_PLAYER)
12707 {
12708 // Base value
12709 AdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
12710
12711 // Healing bonus from stats
12713 for (AuraEffectList::const_iterator i = mHealingDoneOfStatPercent.begin(); i != mHealingDoneOfStatPercent.end(); ++i)
12714 {
12715 // stat used dependent from misc value (stat index)
12716 Stats usedStat = Stats((*i)->GetSpellInfo()->Effects[(*i)->GetEffIndex()].MiscValue);
12717 AdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
12718 }
12719
12720 // ... and attack power
12722 for (AuraEffectList::const_iterator i = mHealingDonebyAP.begin(); i != mHealingDonebyAP.end(); ++i)
12723 if ((*i)->GetMiscValue() & schoolMask)
12724 AdvertisedBenefit += int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount()));
12725 }
12726 return AdvertisedBenefit;
12727}
@ SPELL_AURA_MOD_HEALING_DONE
Definition: SpellAuraDefines.h:198
@ SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT
Definition: SpellAuraDefines.h:238
@ SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER
Definition: SpellAuraDefines.h:301

References BASE_ATTACK, CalculatePct(), GetAuraEffectsByType(), Player::GetBaseSpellPowerBonus(), GetStat(), GetTotalAttackPowerValue(), Object::GetTypeId(), SPELL_AURA_MOD_HEALING_DONE, SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by CalculateSpellAmount(), SpellHealingBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellBaseHealingBonusTaken()

int32 Unit::SpellBaseHealingBonusTaken ( SpellSchoolMask  schoolMask)
12730{
12731 int32 AdvertisedBenefit = 0;
12732
12734 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
12735 if (((*i)->GetMiscValue() & schoolMask) != 0)
12736 AdvertisedBenefit += (*i)->GetAmount();
12737
12738 return AdvertisedBenefit;
12739}
@ SPELL_AURA_MOD_HEALING
Definition: SpellAuraDefines.h:178

References GetAuraEffectsByType(), and SPELL_AURA_MOD_HEALING.

Referenced by SpellHealingBonusTaken().

◆ SpellCriticalDamageBonus()

uint32 Unit::SpellCriticalDamageBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12276{
12277 // Calculate critical bonus
12278 int32 crit_bonus = damage;
12279 float crit_mod = 0.0f;
12280
12281 switch (spellProto->DmgClass)
12282 {
12283 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12286 crit_bonus += damage;
12287 break;
12288 default:
12289 crit_bonus += damage / 2; // for spells is 50%
12290 break;
12291 }
12292
12293 if (caster)
12294 {
12295 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellProto->GetSchoolMask());
12296
12297 if (victim)
12298 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, victim->GetCreatureTypeMask());
12299
12300 if (crit_bonus != 0 && crit_mod != 0.0f)
12301 AddPct(crit_bonus, crit_mod);
12302
12303 crit_bonus -= damage;
12304
12305 // adds additional damage to critBonus (from talents)
12306 if (Player* modOwner = caster->GetSpellModOwner())
12307 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12308
12309 crit_bonus += damage;
12310 }
12311
12312 return crit_bonus;
12313}

References AddPct(), SpellInfo::DmgClass, GetCreatureTypeMask(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellCriticalHealingBonus()

uint32 Unit::SpellCriticalHealingBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12316{
12317 // Calculate critical bonus
12318 int32 crit_bonus;
12319 switch (spellProto->DmgClass)
12320 {
12321 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12324 crit_bonus = damage;
12325 break;
12326 default:
12327 crit_bonus = damage / 2; // for spells is 50%
12328 break;
12329 }
12330
12331 if (caster)
12332 {
12333 if (victim)
12334 {
12335 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
12336 crit_bonus = int32(crit_bonus * caster->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, creatureTypeMask));
12337 }
12338
12339 // adds additional damage to critBonus (from talents)
12340 // xinef: used for death knight death coil
12341 if (Player* modOwner = caster->GetSpellModOwner())
12342 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12343 }
12344
12345 if (crit_bonus > 0)
12346 damage += crit_bonus;
12347
12348 if (caster)
12349 damage = int32(float(damage) * caster->GetTotalAuraMultiplier(SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT));
12350
12351 return damage;
12352}
@ SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT
Definition: SpellAuraDefines.h:113

References SpellInfo::DmgClass, GetCreatureTypeMask(), GetSpellModOwner(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by Spell::DoAllEffectOnTarget(), and AuraEffect::HandlePeriodicHealAurasTick().

◆ SpellDamageBonusDone()

uint32 Unit::SpellDamageBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
11610{
11611 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11612 return pdamage;
11613
11614 // Some spells don't benefit from done mods
11615 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11616 return pdamage;
11617
11618 // For totems get damage bonus from owner
11619 if (GetTypeId() == TYPEID_UNIT)
11620 {
11621 if (IsTotem())
11622 {
11623 if (Unit* owner = GetOwner())
11624 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, effIndex, TotalMod, stack);
11625 }
11626 // Dancing Rune Weapon...
11627 else if (GetEntry() == 27893)
11628 {
11629 if (Unit* owner = GetOwner())
11630 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, TotalMod, stack) / 2;
11631 }
11632 }
11633
11634 // Done total percent damage auras
11635 float ApCoeffMod = 1.0f;
11636 int32 DoneTotal = 0;
11637 float DoneTotalMod = TotalMod ? TotalMod : SpellPctDamageModsDone(victim, spellProto, damagetype);
11638
11639 // Config : RATE_CREATURE_X_SPELLDAMAGE & Do Not Modify Pet/Guardian/Mind Controled Damage
11641 DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank);
11642
11643 // Some spells don't benefit from pct done mods
11644 if (!spellProto->HasAttribute(SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS))
11645 {
11646 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11647 // Add flat bonus from spell damage versus
11649 }
11650
11651 // done scripted mod (take it from owner)
11652 Unit* owner = GetOwner() ? GetOwner() : this;
11653 int32 DoneAdvertisedBenefit = 0;
11654 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11655 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11656 {
11657 if (!(*i)->IsAffectedOnSpell(spellProto))
11658 continue;
11659
11660 switch ((*i)->GetMiscValue())
11661 {
11662 case 4418: // Increased Shock Damage
11663 case 4554: // Increased Lightning Damage
11664 case 4555: // Improved Moonfire
11665 case 5142: // Increased Lightning Damage
11666 case 5147: // Improved Consecration / Libram of Resurgence
11667 case 5148: // Idol of the Shooting Star
11668 case 6008: // Increased Lightning Damage
11669 case 8627: // Totem of Hex
11670 {
11671 DoneAdvertisedBenefit += (*i)->GetAmount();
11672 break;
11673 }
11674 }
11675 }
11676
11677 // Custom scripted damage
11678 switch (spellProto->SpellFamilyName)
11679 {
11680 case SPELLFAMILY_DRUID:
11681 {
11682 // Insect Swarm vs Item - Druid T8 Balance Relic
11683 if (spellProto->SpellFamilyFlags[0] & 0x00200000)
11684 {
11685 if (AuraEffect const* relicAurEff = GetAuraEffect(64950, EFFECT_0))
11686 {
11687 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11688 }
11689 }
11690
11691 // Nourish vs Idol of the Flourishing Life
11692 if (spellProto->SpellFamilyFlags[1] & 0x02000000)
11693 {
11694 if (AuraEffect const* relicAurEff = GetAuraEffect(64949, EFFECT_0))
11695 {
11696 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11697 }
11698 }
11699 break;
11700 }
11702 {
11703 // Sigil of the Vengeful Heart
11704 if (spellProto->SpellFamilyFlags[0] & 0x2000)
11705 {
11706 if (AuraEffect* aurEff = GetAuraEffect(64962, EFFECT_1))
11707 {
11708 AddPct(DoneTotal, aurEff->GetAmount());
11709 }
11710 }
11711
11712 // Impurity
11714 {
11715 AddPct(ApCoeffMod, aurEff->GetAmount());
11716 }
11717
11718 // Blood Boil - bonus for diseased targets
11719 if ((spellProto->SpellFamilyFlags[0] & 0x00040000) && victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0, 0x00000002, GetGUID()))
11720 {
11721 DoneTotal += 95;
11722 ApCoeffMod = 1.5835f;
11723 }
11724 break;
11725 }
11726 default:
11727 break;
11728 }
11729
11730 // Done fixed damage bonus auras
11731 DoneAdvertisedBenefit += SpellBaseDamageBonusDone(spellProto->GetSchoolMask());
11732
11733 // Check for table values
11734 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
11735 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11736 if (bonus)
11737 {
11738 if (damagetype == DOT)
11739 {
11740 coeff = bonus->dot_damage;
11741 if (bonus->ap_dot_bonus > 0)
11742 {
11743 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11745 APbonus += GetTotalAttackPowerValue(attType);
11746 DoneTotal += int32(bonus->ap_dot_bonus * stack * ApCoeffMod * APbonus);
11747 }
11748 }
11749 else
11750 {
11751 coeff = bonus->direct_damage;
11752 if (bonus->ap_bonus > 0)
11753 {
11754 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11756 APbonus += GetTotalAttackPowerValue(attType);
11757 DoneTotal += int32(bonus->ap_bonus * stack * ApCoeffMod * APbonus);
11758 }
11759 }
11760 }
11761
11762 // Default calculation
11763 if (coeff && DoneAdvertisedBenefit)
11764 {
11765 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11766
11767 if (Player* modOwner = GetSpellModOwner())
11768 {
11769 coeff *= 100.0f;
11770 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
11771 coeff /= 100.0f;
11772 }
11773
11774 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
11775 }
11776
11777 float tmpDamage = (float(pdamage) + DoneTotal) * DoneTotalMod;
11778 // apply spellmod to Done damage (flat and pct)
11779 if (Player* modOwner = GetSpellModOwner())
11780 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, tmpDamage);
11781
11782 return uint32(std::max(tmpDamage, 0.0f));
11783}
@ SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS
Definition: SpellAuraDefines.h:243
@ SPELLMOD_DOT
Definition: SpellDefines.h:99
@ SPELLMOD_BONUS_MULTIPLIER
Definition: SpellDefines.h:101
@ SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS
Definition: SharedDefines.h:633
float GetSpellDamageMod(int32 Rank)
Definition: Creature.cpp:1549
float SpellPctDamageModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition: Unit.cpp:11278
float CalculateLevelPenalty(SpellInfo const *spellProto) const
Definition: Unit.cpp:3012
Definition: SpellMgr.h:324
float ap_dot_bonus
Definition: SpellMgr.h:328
float dot_damage
Definition: SpellMgr.h:326
float ap_bonus
Definition: SpellMgr.h:327
float direct_damage
Definition: SpellMgr.h:325

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, EFFECT_0, EFFECT_1, SpellInfo::Effects, GetAuraEffect(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetOwner(), SpellInfo::GetSchoolMask(), Creature::GetSpellDamageMod(), GetSpellModOwner(), GetTotalAttackPowerValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), Object::GetTypeId(), SpellInfo::HasAttribute(), SpellInfo::Id, IsControlledByPlayer(), IsGuardian(), IsPet(), SpellInfo::IsRangedWeaponSpell(), IsTotem(), RANGED_ATTACK, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_DAMAGE_CLASS_MELEE, SpellBaseDamageBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctDamageModsDone(), sSpellMgr, Object::ToCreature(), and TYPEID_UNIT.

Referenced by AuraEffect::CalculateAmount(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), spell_warr_bloodthirst::HandleDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ SpellDamageBonusTaken()

uint32 Unit::SpellDamageBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint32  stack = 1 
)
11786{
11787 if (!spellProto || damagetype == DIRECT_DAMAGE)
11788 return pdamage;
11789
11790 int32 TakenTotal = 0;
11791 float TakenTotalMod = 1.0f;
11792
11793 // from positive and negative SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
11794 // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085)
11796 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
11797 if (((*i)->GetMiscValue() & spellProto->GetSchoolMask()))
11798 if (spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11799 AddPct(TakenTotalMod, (*i)->GetAmount());
11800
11801 TakenTotalMod = processDummyAuras(TakenTotalMod);
11802
11803 // From caster spells
11804 if (caster)
11805 {
11807 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
11808 if ((*i)->GetCasterGUID() == caster->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
11809 if (spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11810 AddPct(TakenTotalMod, (*i)->GetAmount());
11811 }
11812
11813 if (uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask())
11814 {
11815 int32 modifierMax = 0;
11816 int32 modifierMin = 0;
11818 for (AuraEffectList::const_iterator i = auraEffectList.begin(); i != auraEffectList.end(); ++i)
11819 {
11820 if (!spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11821 continue;
11822
11823 // Only death knight spell with this aura
11824 if ((*i)->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
11825 if (!caster || caster->GetGUID() != (*i)->GetCasterGUID())
11826 continue;
11827
11828 if (mechanicMask & uint32(1 << (*i)->GetMiscValue()))
11829 {
11830 if ((*i)->GetAmount() > 0)
11831 {
11832 if ((*i)->GetAmount() > modifierMax)
11833 modifierMax = (*i)->GetAmount();
11834 }
11835 else if ((*i)->GetAmount() < modifierMin)
11836 modifierMin = (*i)->GetAmount();
11837 }
11838 }
11839
11840 AddPct(TakenTotalMod, modifierMax);
11841 AddPct(TakenTotalMod, modifierMin);
11842 }
11843
11844 int32 TakenAdvertisedBenefit = SpellBaseDamageBonusTaken(spellProto->GetSchoolMask(), damagetype == DOT);
11845
11846 // Check for table values
11847 float coeff = 0;
11848 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11849 if (bonus)
11850 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
11851
11852 // Default calculation
11853 if (TakenAdvertisedBenefit)
11854 {
11855 if (coeff <= 0.0f)
11856 {
11857 if (caster)
11858 coeff = caster->CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
11859 else
11860 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
11861 }
11862
11863 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11864 TakenTotal += int32(TakenAdvertisedBenefit * coeff * factorMod);
11865 }
11866
11867 // No positive taken bonus, custom attr
11868 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
11869 {
11870 TakenTotal = 0;
11871 TakenTotalMod = 1.0f;
11872 }
11873
11874 // xinef: sanctified wrath talent
11875 if (caster && TakenTotalMod < 1.0f && caster->HasAuraType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST))
11876 {
11877 float ignoreModifier = 1.0f - TakenTotalMod;
11878 bool addModifier = false;
11880 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
11881 if ((*j)->GetMiscValue() & spellProto->SchoolMask)
11882 {
11883 ApplyPct(ignoreModifier, (*j)->GetAmount());
11884 addModifier = true;
11885 }
11886
11887 if (addModifier)
11888 TakenTotalMod += ignoreModifier;
11889 }
11890
11891 float tmpDamage = (float(pdamage) + TakenTotal) * TakenTotalMod;
11892
11893 return uint32(std::max(tmpDamage, 0.0f));
11894}
float CalculateDefaultCoefficient(SpellInfo const *spellInfo, DamageEffectType damagetype) const
Definition: Unit.cpp:17461

References AddPct(), ApplyPct(), CalculateDefaultCoefficient(), CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, DOT, SpellBonusEntry::dot_damage, SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), Object::GetGUID(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasAuraType(), SpellInfo::Id, processDummyAuras(), SpellInfo::SchoolMask, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, sSpellMgr, and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by DealMeleeDamage(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), Aura::HandleAuraSpecificMods(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ SpellDoneCritChance()

float Unit::SpellDoneCritChance ( Unit const *  ,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
11989{
11990 // Mobs can't crit with spells.
11991 if (GetTypeId() == TYPEID_UNIT && !GetSpellModOwner())
11992 return -100.0f;
11993
11994 // not critting spell
11995 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
11996 return 0.0f;
11997
11998 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
11999 if (!skipEffectCheck && !spellProto->IsCritCapable())
12000 return 0.0f;
12001
12002 float crit_chance = 0.0f;
12003 switch (spellProto->DmgClass)
12004 {
12006 {
12007 if (schoolMask & SPELL_SCHOOL_MASK_NORMAL)
12008 crit_chance = 0.0f;
12009 // For other schools
12010 else if (GetTypeId() == TYPEID_PLAYER)
12011 crit_chance = GetFloatValue(static_cast<uint16>(PLAYER_SPELL_CRIT_PERCENTAGE1) + GetFirstSchoolInMask(schoolMask));
12012 else
12013 {
12014 crit_chance = (float)m_baseSpellCritChance;
12016 }
12017 break;
12018 }
12021 {
12022 if (GetTypeId() == TYPEID_PLAYER)
12023 {
12024 switch (attackType)
12025 {
12026 case BASE_ATTACK:
12028 break;
12029 case OFF_ATTACK:
12031 break;
12032 case RANGED_ATTACK:
12034 break;
12035 default:
12036 break;
12037 }
12038 }
12039 else
12040 {
12041 crit_chance = 5.0f;
12044 }
12046 break;
12047 }
12048 // values overridden in spellmgr for lifebloom and earth shield
12050 default:
12051 return 0.0f;
12052 }
12053
12054 // percent done
12055 // only players use intelligence for critical chance computations
12056 if (Player* modOwner = GetSpellModOwner())
12057 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRITICAL_CHANCE, crit_chance);
12058
12059 // xinef: can be negative!
12060 return crit_chance;
12061}
@ PLAYER_SPELL_CRIT_PERCENTAGE1
Definition: UpdateFields.h:354
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
Definition: SpellAuraDefines.h:134
@ SPELLMOD_CRITICAL_CHANCE
Definition: SpellDefines.h:84
@ SPELL_ATTR2_CANT_CRIT
Definition: SharedDefines.h:485

References BASE_ATTACK, SpellInfo::DmgClass, GetFirstSchoolInMask(), Object::GetFloatValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), Object::GetTypeId(), SpellInfo::HasAttribute(), SpellInfo::Id, SpellInfo::IsCritCapable(), m_baseSpellCritChance, OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SPELL_CRIT_PERCENTAGE1, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_CRIT_PCT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, SPELL_AURA_MOD_WEAPON_CRIT_PERCENT, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_SCHOOL_MASK_NORMAL, SPELLMOD_CRITICAL_CHANCE, TYPEID_PLAYER, and TYPEID_UNIT.

Referenced by Spell::DoAllEffectOnLaunchTarget().

◆ SpellHealingBonusDone()

uint32 Unit::SpellHealingBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
12447{
12448 // For totems get healing bonus from owner (statue isn't totem in fact)
12449 if (GetTypeId() == TYPEID_UNIT && IsTotem())
12450 if (Unit* owner = GetOwner())
12451 return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, effIndex, TotalMod, stack);
12452
12453 // No bonus healing for potion spells
12454 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12455 return healamount;
12456
12457 float ApCoeffMod = 1.0f;
12458 float DoneTotalMod = TotalMod ? TotalMod : SpellPctHealingModsDone(victim, spellProto, damagetype);
12459 int32 DoneTotal = 0;
12460
12461 // done scripted mod (take it from owner)
12462 Unit* owner = GetOwner() ? GetOwner() : this;
12463 int32 DoneAdvertisedBenefit = 0;
12464 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12465 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12466 {
12467 if (!(*i)->IsAffectedOnSpell(spellProto))
12468 continue;
12469
12470 switch ((*i)->GetMiscValue())
12471 {
12472 case 4415: // Increased Rejuvenation Healing
12473 case 4953:
12474 DoneAdvertisedBenefit += (*i)->GetAmount();
12475 break;
12476 case 3736: // Hateful Totem of the Third Wind / Increased Lesser Healing Wave / LK Arena (4/5/6) Totem of the Third Wind / Savage Totem of the Third Wind
12477 DoneAdvertisedBenefit += (*i)->GetAmount();
12478 break;
12479 }
12480 }
12481
12482 switch (spellProto->SpellFamilyName)
12483 {
12485 {
12486 // Impurity
12488 {
12489 AddPct(ApCoeffMod, aurEff->GetAmount());
12490 }
12491 break;
12492 }
12493 default:
12494 break;
12495 }
12496
12497 // Done fixed damage bonus auras
12498 DoneAdvertisedBenefit += SpellBaseHealingBonusDone(spellProto->GetSchoolMask());
12499 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
12500
12501 // Check for table values
12502 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12503 if(bonus)
12504 {
12505 if (damagetype == DOT)
12506 {
12507 coeff = bonus->dot_damage;
12508 if (bonus->ap_dot_bonus > 0)
12509 DoneTotal += int32(bonus->ap_dot_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12510 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12511 }
12512 else
12513 {
12514 coeff = bonus->direct_damage;
12515 if (bonus->ap_bonus > 0)
12516 DoneTotal += int32(bonus->ap_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12517 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12518 }
12519 }
12520 else
12521 {
12522 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12523 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12524 return healamount;
12525 }
12526
12527 // Default calculation
12528 if (DoneAdvertisedBenefit)
12529 {
12530 float factorMod = CalculateLevelPenalty(spellProto) * stack;
12531 if (Player* modOwner = GetSpellModOwner())
12532 {
12533 coeff *= 100.0f;
12534 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12535 coeff /= 100.0f;
12536 }
12537 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
12538 }
12539
12540 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12541 {
12542 switch (spellProto->Effects[i].ApplyAuraName)
12543 {
12544 // Bonus healing does not apply to these spells
12547 DoneTotal = 0;
12548 break;
12549 }
12550 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12551 DoneTotal = 0;
12552 }
12553
12554 // use float as more appropriate for negative values and percent applying
12555 float heal = float(int32(healamount) + DoneTotal) * DoneTotalMod;
12556 // apply spellmod to Done amount
12557
12558 if (Player* modOwner = GetSpellModOwner())
12559 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, heal);
12560
12561 return uint32(std::max(heal, 0.0f));
12562}
@ SPELL_AURA_PERIODIC_HEALTH_FUNNEL
Definition: SpellAuraDefines.h:125
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition: Unit.cpp:12696
float SpellPctHealingModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition: Unit.cpp:12354

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, SpellInfo::Effects, GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAttackPowerValue(), Object::GetTypeId(), SpellInfo::Id, SpellInfo::IsRangedWeaponSpell(), IsTotem(), MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEALTH_FUNNEL, SPELL_AURA_PERIODIC_LEECH, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_EFFECT_HEALTH_LEECH, SpellBaseHealingBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_POTION, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctHealingModsDone(), sSpellMgr, and TYPEID_UNIT.

Referenced by AuraEffect::CalculateAmount(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_dru_lifebloom::HandleDispel(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHealingBonusTaken()

uint32 Unit::SpellHealingBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint32  stack = 1 
)
12565{
12566 float TakenTotalMod = 1.0f;
12567 float minval = 0.0f;
12568
12569 // Healing taken percent
12570 if (!sScriptMgr->OnSpellHealingBonusTakenNegativeModifiers(this, caster, spellProto, minval))
12571 {
12573 }
12574
12575 if (minval)
12576 AddPct(TakenTotalMod, minval);
12577
12579 if (maxval)
12580 AddPct(TakenTotalMod, maxval);
12581
12582 // Tenacity increase healing % taken
12583 if (AuraEffect const* Tenacity = GetAuraEffect(58549, 0))
12584 AddPct(TakenTotalMod, Tenacity->GetAmount());
12585
12586 // Healing Done
12587 int32 TakenTotal = 0;
12588
12589 // Taken fixed damage bonus auras
12590 int32 TakenAdvertisedBenefit = SpellBaseHealingBonusTaken(spellProto->GetSchoolMask());
12591
12592 // Nourish cast, glyph of nourish
12593 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[1] & 0x2000000 && caster)
12594 {
12595 bool any = false;
12596 bool hasglyph = caster->GetAuraEffectDummy(62971);
12598 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
12599 {
12600 if (((*i)->GetCasterGUID() == caster->GetGUID()))
12601 {
12602 SpellInfo const* spell = (*i)->GetSpellInfo();
12603 // Rejuvenation, Regrowth, Lifebloom, or Wild Growth
12604 if (!any && spell->SpellFamilyFlags.HasFlag(0x50, 0x4000010, 0))
12605 {
12606 TakenTotalMod *= 1.2f;
12607 any = true;
12608 }
12609
12610 if (hasglyph)
12611 TakenTotalMod += 0.06f;
12612 }
12613 }
12614 }
12615
12616 if (damagetype == DOT)
12617 {
12618 // Healing over time taken percent
12619 float minval_hot = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12620 if (minval_hot)
12621 AddPct(TakenTotalMod, minval_hot);
12622
12623 float maxval_hot = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12624 if (maxval_hot)
12625 AddPct(TakenTotalMod, maxval_hot);
12626 }
12627
12628 // Check for table values
12629 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12630 float coeff = 0;
12631 float factorMod = 1.0f;
12632 if (bonus)
12633 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
12634 else
12635 {
12636 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12637 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12638 {
12639 healamount = uint32(std::max((float(healamount) * TakenTotalMod), 0.0f));
12640 return healamount;
12641 }
12642 }
12643
12644 // Default calculation
12645 if (TakenAdvertisedBenefit)
12646 {
12647 float TakenCoeff = 0.0f;
12648 if (coeff <= 0)
12649 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack) * 1.88f; // As wowwiki says: C = (Cast Time / 3.5) * 1.88 (for healing spells)
12650
12651 factorMod *= CalculateLevelPenalty(spellProto) * int32(stack);
12652 if (Player* modOwner = GetSpellModOwner())
12653 {
12654 coeff *= 100.0f;
12655 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12656 coeff /= 100.0f;
12657 }
12658
12659 TakenTotal += int32(TakenAdvertisedBenefit * (coeff > 0 ? coeff : TakenCoeff) * factorMod);
12660 }
12661
12662 if (caster)
12663 {
12665 for (AuraEffectList::const_iterator i = mHealingGet.begin(); i != mHealingGet.end(); ++i)
12666 if (caster->GetGUID() == (*i)->GetCasterGUID() && (*i)->IsAffectedOnSpell(spellProto))
12667 AddPct(TakenTotalMod, (*i)->GetAmount());
12668 }
12669
12670 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12671 {
12672 switch (spellProto->Effects[i].ApplyAuraName)
12673 {
12674 // Bonus healing does not apply to these spells
12677 TakenTotal = 0;
12678 break;
12679 }
12680 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12681 TakenTotal = 0;
12682 }
12683
12684 // No positive taken bonus, custom attr
12685 if ((spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS) || spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS)) && TakenTotalMod > 1.0f)
12686 {
12687 TakenTotal = 0;
12688 TakenTotalMod = 1.0f;
12689 }
12690
12691 float heal = float(int32(healamount) + TakenTotal) * TakenTotalMod;
12692
12693 return uint32(std::max(heal, 0.0f));
12694}
@ SPELL_AURA_MOD_HEALING_RECEIVED
Definition: SpellAuraDefines.h:346
@ SPELL_AURA_MOD_HEALING_PCT
Definition: SpellAuraDefines.h:181
@ SPELL_AURA_MOD_HOT_PCT
Definition: SpellAuraDefines.h:322
@ SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS
Definition: SharedDefines.h:631
int32 GetMaxPositiveAuraModifier(AuraType auratype)
Definition: Unit.cpp:5873
int32 GetMaxNegativeAuraModifier(AuraType auratype) const
Definition: Unit.cpp:5887
int32 SpellBaseHealingBonusTaken(SpellSchoolMask schoolMask)
Definition: Unit.cpp:12729

References AddPct(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, GetAuraEffect(), GetAuraEffectDummy(), GetAuraEffectsByType(), Object::GetGUID(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), SpellInfo::GetSchoolMask(), flag96::HasFlag(), SpellInfo::Id, SPELL_AURA_MOD_HEALING_PCT, SPELL_AURA_MOD_HOT_PCT, SPELL_AURA_PERIODIC_HEAL, SPELL_DAMAGE_CLASS_NONE, SpellBaseHealingBonusTaken(), SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, sScriptMgr, and sSpellMgr.

Referenced by spell_dru_lifebloom::AfterRemove(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_pri_renew::HandleApplyEffect(), Aura::HandleAuraSpecificMods(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHitResult() [1/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
Spell const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3499{
3500 SpellInfo const* spellInfo = spell->GetSpellInfo();
3501
3502 // Check for immune
3503 if (victim->IsImmunedToSpell(spellInfo, spell))
3504 {
3505 return SPELL_MISS_IMMUNE;
3506 }
3507
3508 // All positive spells can`t miss
3510 if ((spellInfo->IsPositive() || spellInfo->HasEffect(SPELL_EFFECT_DISPEL))
3511 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3512 {
3513 return SPELL_MISS_NONE;
3514 }
3515
3516 // Check for immune
3517 // xinef: check for school immunity only
3518 if (victim->IsImmunedToSchool(spell))
3519 {
3520 return SPELL_MISS_IMMUNE;
3521 }
3522
3523 if (this == victim)
3524 {
3525 return SPELL_MISS_NONE;
3526 }
3527
3528 // Return evade for units in evade mode
3529 if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks() && !spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) &&
3531 {
3532 return SPELL_MISS_EVADE;
3533 }
3534
3535 // Try victim reflect spell
3536 if (CanReflect)
3537 {
3538 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3539 Unit::AuraEffectList const& mReflectSpellsSchool = victim->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL);
3540 for (Unit::AuraEffectList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i)
3541 {
3542 if ((*i)->GetMiscValue() & spell->GetSpellSchoolMask())
3543 {
3544 reflectchance += (*i)->GetAmount();
3545 }
3546 }
3547
3548 if (reflectchance > 0 && roll_chance_i(reflectchance))
3549 {
3550 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3551 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3552 return SPELL_MISS_REFLECT;
3553 }
3554 }
3555
3556 switch (spellInfo->DmgClass)
3557 {
3560 return MeleeSpellHitResult(victim, spellInfo);
3562 {
3563 if (spellInfo->SpellFamilyName)
3564 {
3565 return SPELL_MISS_NONE;
3566 }
3567
3568 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3569 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3570 {
3571 if (spellInfo->Effects[i].Effect && spellInfo->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3572 {
3573 if (spellInfo->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3574 {
3575 return SPELL_MISS_NONE;
3576 }
3577 }
3578 }
3579 [[fallthrough]];
3580 }
3582 return MagicSpellHitResult(victim, spellInfo);
3583 }
3584
3585 return SPELL_MISS_NONE;
3586}
@ SPELL_AURA_REFLECT_SPELLS
Definition: SpellAuraDefines.h:91
@ SPELL_EFFECT_DISPEL
Definition: SharedDefines.h:816
@ SPELL_MISS_IMMUNE
Definition: SharedDefines.h:1526
@ SPELL_MISS_EVADE
Definition: SharedDefines.h:1525
@ SPELL_MISS_REFLECT
Definition: SharedDefines.h:1530
SpellMissInfo MagicSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition: Unit.cpp:3291
SpellMissInfo MeleeSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition: Unit.cpp:3118
uint32 DmgClass
Definition: SpellInfo.h:387

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, GetAuraEffectsByType(), Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), GetTotalAuraModifier(), Object::GetTypeId(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, Object::ToCreature(), and TYPEID_UNIT.

◆ SpellHitResult() [2/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
SpellInfo const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3435{
3436 // Check for immune
3437 if (victim->IsImmunedToSpell(spell))
3438 return SPELL_MISS_IMMUNE;
3439
3440 // All positive spells can`t miss
3442 if ((spell->IsPositive() || spell->HasEffect(SPELL_EFFECT_DISPEL))
3443 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3444 return SPELL_MISS_NONE;
3445
3446 // Check for immune
3447 // xinef: check for school immunity only
3448 if (victim->IsImmunedToSchool(spell))
3449 return SPELL_MISS_IMMUNE;
3450
3451 if (this == victim)
3452 return SPELL_MISS_NONE;
3453
3454 // Return evade for units in evade mode
3455 if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks() && !spell->HasAura(SPELL_AURA_CONTROL_VEHICLE) && !spell->HasAttribute(SPELL_ATTR0_CU_IGNORE_EVADE))
3456 return SPELL_MISS_EVADE;
3457
3458 // Try victim reflect spell
3459 if (CanReflect)
3460 {
3461 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3462 Unit::AuraEffectList const& mReflectSpellsSchool = victim->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL);
3463 for (Unit::AuraEffectList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i)
3464 if ((*i)->GetMiscValue() & spell->GetSchoolMask())
3465 reflectchance += (*i)->GetAmount();
3466 if (reflectchance > 0 && roll_chance_i(reflectchance))
3467 {
3468 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3469 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3470 return SPELL_MISS_REFLECT;
3471 }
3472 }
3473
3474 switch (spell->DmgClass)
3475 {
3478 return MeleeSpellHitResult(victim, spell);
3480 {
3481 if (spell->SpellFamilyName)
3482 {
3483 return SPELL_MISS_NONE;
3484 }
3485 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3486 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3487 if (spell->Effects[i].Effect && spell->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3488 if (spell->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3489 return SPELL_MISS_NONE;
3490 [[fallthrough]];
3491 }
3493 return MagicSpellHitResult(victim, spell);
3494 }
3495 return SPELL_MISS_NONE;
3496}

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), GetTotalAuraModifier(), Object::GetTypeId(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, Object::ToCreature(), and TYPEID_UNIT.

Referenced by Spell::AddUnitTarget(), DealMeleeDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SpellPctDamageModsDone()

float Unit::SpellPctDamageModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
11279{
11280 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11281 return 1.0f;
11282
11283 // Some spells don't benefit from done mods
11284 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11285 return 1.0f;
11286
11287 // For totems get damage bonus from owner
11288 if (GetTypeId() == TYPEID_UNIT)
11289 {
11290 if (IsTotem())
11291 {
11292 if (Unit* owner = GetOwner())
11293 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11294 }
11295 // Dancing Rune Weapon...
11296 else if (GetEntry() == 27893)
11297 {
11298 if (Unit* owner = GetOwner())
11299 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11300 }
11301 }
11302
11303 // Done total percent damage auras
11304 float DoneTotalMod = 1.0f;
11305
11307 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
11308 {
11309 // prevent apply mods from weapon specific case to non weapon specific spells (Example: thunder clap and two-handed weapon specialization)
11310 if (spellProto->EquippedItemClass == -1 && (*i)->GetSpellInfo()->EquippedItemClass != -1 &&
11311 !(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM) && (*i)->GetMiscValue() == SPELL_SCHOOL_MASK_NORMAL)
11312 {
11313 continue;
11314 }
11315
11316 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11317 continue;
11318
11319 if (!sScriptMgr->IsNeedModSpellDamagePercent(this, *i, DoneTotalMod, spellProto))
11320 continue;
11321
11322 if ((*i)->GetMiscValue() & spellProto->GetSchoolMask())
11323 {
11324 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
11325 AddPct(DoneTotalMod, (*i)->GetAmount());
11326 else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
11327 AddPct(DoneTotalMod, (*i)->GetAmount());
11328 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
11329 AddPct(DoneTotalMod, (*i)->GetAmount());
11330 }
11331 }
11332
11333 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11335 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
11336 if ((creatureTypeMask & uint32((*i)->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11337 AddPct(DoneTotalMod, (*i)->GetAmount());
11338
11339 // bonus against aurastate
11341 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
11342 if (victim->HasAuraState(AuraStateType((*i)->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11343 AddPct(DoneTotalMod, (*i)->GetAmount());
11344
11345 // done scripted mod (take it from owner)
11346 Unit* owner = GetOwner() ? GetOwner() : this;
11347 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11348 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11349 {
11350 // Xinef: self cast is ommited (because of Rage of Rivendare)
11351 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11352 continue;
11353
11354 // xinef: Molten Fury should work on all spells
11355 switch ((*i)->GetMiscValue())
11356 {
11357 case 4920: // Molten Fury
11358 case 4919:
11359 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11360 AddPct(DoneTotalMod, (*i)->GetAmount());
11361 break;
11362 }
11363
11364 if (!(*i)->IsAffectedOnSpell(spellProto))
11365 continue;
11366
11367 switch ((*i)->GetMiscValue())
11368 {
11369 case 6917: // Death's Embrace
11370 case 6926:
11371 case 6928:
11372 {
11373 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11374 AddPct(DoneTotalMod, (*i)->GetAmount());
11375 break;
11376 }
11377 // Soul Siphon
11378 case 4992:
11379 case 4993:
11380 {
11381 // effect 1 m_amount
11382 int32 maxPercent = (*i)->GetAmount();
11383 // effect 0 m_amount
11384 int32 stepPercent = CalculateSpellDamage(this, (*i)->GetSpellInfo(), 0);
11385 // count affliction effects and calc additional damage in percentage
11386 int32 modPercent = 0;
11387 AuraApplicationMap const& victimAuras = victim->GetAppliedAuras();
11388 for (AuraApplicationMap::const_iterator itr = victimAuras.begin(); itr != victimAuras.end(); ++itr)
11389 {
11390 Aura const* aura = itr->second->GetBase();
11391 SpellInfo const* m_spell = aura->GetSpellInfo();
11392 if (m_spell->SpellFamilyName != SPELLFAMILY_WARLOCK || !(m_spell->SpellFamilyFlags[1] & 0x0004071B || m_spell->SpellFamilyFlags[0] & 0x8044C402))
11393 continue;
11394 modPercent += stepPercent * aura->GetStackAmount();
11395 if (modPercent >= maxPercent)
11396 {
11397 modPercent = maxPercent;
11398 break;
11399 }
11400 }
11401 AddPct(DoneTotalMod, modPercent);
11402 break;
11403 }
11404 case 6916: // Death's Embrace
11405 case 6925:
11406 case 6927:
11407 if (HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, spellProto, this))
11408 AddPct(DoneTotalMod, (*i)->GetAmount());
11409 break;
11410 case 5481: // Starfire Bonus
11411 {
11412 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x200002, 0, 0))
11413 AddPct(DoneTotalMod, (*i)->GetAmount());
11414 break;
11415 }
11416 // Tundra Stalker
11417 // Merciless Combat
11418 case 7277:
11419 {
11420 // Merciless Combat
11421 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
11422 {
11423 if( (spellProto && spellProto->SpellFamilyFlags[0] & 0x2) || spellProto->SpellFamilyFlags[1] & 0x2 )
11424 if (!victim->HealthAbovePct(35))
11425 AddPct(DoneTotalMod, (*i)->GetAmount());
11426 }
11427 // Tundra Stalker
11428 else
11429 {
11430 // Frost Fever (target debuff)
11431 if (victim->HasAura(55095))
11432 AddPct(DoneTotalMod, (*i)->GetAmount());
11433 break;
11434 }
11435 break;
11436 }
11437 // Rage of Rivendare
11438 case 7293:
11439 {
11441 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
11442 break;
11443 }
11444 // Twisted Faith
11445 case 7377:
11446 {
11448 AddPct(DoneTotalMod, (*i)->GetAmount());
11449 break;
11450 }
11451 // Marked for Death
11452 case 7598:
11453 case 7599:
11454 case 7600:
11455 case 7601:
11456 case 7602:
11457 {
11458 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
11459 AddPct(DoneTotalMod, (*i)->GetAmount());
11460 break;
11461 }
11462 // Dirty Deeds
11463 case 6427:
11464 case 6428:
11465 case 6579:
11466 case 6580:
11467 {
11468 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11469 {
11470 // effect 0 has expected value but in negative state
11471 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
11472 AddPct(DoneTotalMod, bonus);
11473 }
11474 break;
11475 }
11476 }
11477 }
11478
11479 // Custom scripted damage
11480 switch (spellProto->SpellFamilyName)
11481 {
11482 case SPELLFAMILY_MAGE:
11483 // Ice Lance
11484 if (spellProto->SpellIconID == 186)
11485 {
11486 if (victim->HasAuraState(AURA_STATE_FROZEN, spellProto, this))
11487 {
11488 // Glyph of Ice Lance
11489 if (owner->HasAura(56377) && victim->GetLevel() > owner->GetLevel())
11490 DoneTotalMod *= 4.0f;
11491 else
11492 DoneTotalMod *= 3.0f;
11493 }
11494 }
11495
11496 // Torment the weak
11497 if (spellProto->SpellFamilyFlags[0] & 0x20600021 || spellProto->SpellFamilyFlags[1] & 0x9000)
11498 if (victim->HasAuraWithMechanic((1 << MECHANIC_SNARE) | (1 << MECHANIC_SLOW_ATTACK)))
11500 AddPct(DoneTotalMod, aurEff->GetAmount());
11501 break;
11502 case SPELLFAMILY_PRIEST:
11503 // Mind Flay
11504 if (spellProto->SpellFamilyFlags[0] & 0x800000)
11505 {
11506 // Glyph of Shadow Word: Pain
11507 if (AuraEffect* aurEff = GetAuraEffect(55687, 0))
11508 // Increase Mind Flay damage if Shadow Word: Pain present on target
11510 AddPct(DoneTotalMod, aurEff->GetAmount());
11511
11512 // Twisted Faith - Mind Flay part
11514 // Increase Mind Flay damage if Shadow Word: Pain present on target
11516 AddPct(DoneTotalMod, aurEff->GetAmount());
11517 }
11518 // Smite
11519 else if (spellProto->SpellFamilyFlags[0] & 0x80)
11520 {
11521 // Glyph of Smite
11522 if (AuraEffect* aurEff = GetAuraEffect(55692, 0))
11523 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x100000, 0, 0, GetGUID()))
11524 AddPct(DoneTotalMod, aurEff->GetAmount());
11525 }
11526 // Shadow Word: Death
11527 else if (spellProto->SpellFamilyFlags[1] & 0x2)
11528 {
11529 // Glyph of Shadow Word: Death
11530 if (AuraEffect* aurEff = GetAuraEffect(55682, 1))
11532 AddPct(DoneTotalMod, aurEff->GetAmount());
11533 }
11534
11535 break;
11537 // Judgement of Vengeance/Judgement of Corruption
11538 if ((spellProto->SpellFamilyFlags[1] & 0x400000) && spellProto->SpellIconID == 2292)
11539 {
11540 // Get stack of Holy Vengeance/Blood Corruption on the target added by caster
11541 uint32 stacks = 0;
11543 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
11544 if (((*itr)->GetId() == 31803 || (*itr)->GetId() == 53742) && (*itr)->GetCasterGUID() == GetGUID())
11545 {
11546 stacks = (*itr)->GetBase()->GetStackAmount();
11547 break;
11548 }
11549 // + 10% for each application of Holy Vengeance/Blood Corruption on the target
11550 if (stacks)
11551 AddPct(DoneTotalMod, 10 * stacks);
11552 }
11553 break;
11554 case SPELLFAMILY_DRUID:
11555 // Thorns
11556 if (spellProto->SpellFamilyFlags[0] & 0x100)
11557 {
11558 // Brambles
11559 if (AuraEffect* aurEff = GetAuraEffectOfRankedSpell(16836, 0))
11560 AddPct(DoneTotalMod, aurEff->GetAmount());
11561 }
11562 break;
11564 // Fire and Brimstone
11565 if (spellProto->SpellFamilyFlags[1] & 0x00020040)
11567 {
11569 for (AuraEffectList::const_iterator i = mDumyAuras.begin(); i != mDumyAuras.end(); ++i)
11570 if ((*i)->GetSpellInfo()->SpellIconID == 3173)
11571 {
11572 AddPct(DoneTotalMod, (*i)->GetAmount());
11573 break;
11574 }
11575 }
11576 // Drain Soul - increased damage for targets under 25 % HP
11577 if (spellProto->SpellFamilyFlags[0] & 0x00004000)
11578 if (!victim->HealthAbovePct(25))
11579 DoneTotalMod *= 4;
11580 // Shadow Bite (15% increase from each dot)
11581 if (spellProto->SpellFamilyFlags[1] & 0x00400000 && IsPet())
11582 if (uint8 count = victim->GetDoTsByCaster(GetOwnerGUID()))
11583 AddPct(DoneTotalMod, 15 * count);
11584 break;
11585 case SPELLFAMILY_HUNTER:
11586 // Steady Shot
11587 if (spellProto->SpellFamilyFlags[1] & 0x1)
11588 if (AuraEffect* aurEff = GetAuraEffect(56826, 0)) // Glyph of Steady Shot
11589 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_HUNTER, 0x00004000, 0, 0, GetGUID()))
11590 AddPct(DoneTotalMod, aurEff->GetAmount());
11591 break;
11593 // Improved Icy Touch
11594 if (spellProto->SpellFamilyFlags[0] & 0x2)
11596 AddPct(DoneTotalMod, aurEff->GetAmount());
11597
11598 // Glacier Rot
11599 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
11601 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
11602 AddPct(DoneTotalMod, aurEff->GetAmount());
11603 break;
11604 }
11605
11606 return DoneTotalMod;
11607}
@ MECHANIC_SLOW_ATTACK
Definition: SharedDefines.h:1333
@ AURA_STATE_HEALTHLESS_20_PERCENT
Definition: SharedDefines.h:1293
uint32 GetDiseasesByCaster(ObjectGuid casterGUID, uint8 mode=0)
Definition: Unit.cpp:5759
bool HasAuraWithMechanic(uint32 mechanicMask) const
Definition: Unit.cpp:5730
AuraEffect * GetAuraEffectOfRankedSpell(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition: Unit.cpp:5446
uint32 GetDoTsByCaster(ObjectGuid casterGUID) const
Definition: Unit.cpp:5805

References AddPct(), AURA_STATE_CONFLAGRATE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, CalculateSpellDamage(), DIRECT_DAMAGE, DOT, EFFECT_0, SpellInfo::EquippedItemClass, GetAppliedAuras(), GetAuraEffect(), GetAuraEffectOfRankedSpell(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDiseasesByCaster(), GetDoTsByCaster(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetLevel(), GetOwner(), GetOwnerGUID(), SpellInfo::GetSchoolMask(), Aura::GetSpellInfo(), Aura::GetStackAmount(), Object::GetTypeId(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraWithMechanic(), HealthAbovePct(), IsPet(), IsTotem(), MECHANIC_SLOW_ATTACK, MECHANIC_SNARE, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM, SPELL_AURA_DUMMY, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_STALKED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, sScriptMgr, Object::ToPlayer(), TYPEID_UNIT, and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by AuraEffect::CalculatePeriodicData(), and SpellDamageBonusDone().

◆ SpellPctHealingModsDone()

float Unit::SpellPctHealingModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
12355{
12356 // For totems get healing bonus from owner (statue isn't totem in fact)
12357 if (GetTypeId() == TYPEID_UNIT && IsTotem())
12358 if (Unit* owner = GetOwner())
12359 return owner->SpellPctHealingModsDone(victim, spellProto, damagetype);
12360
12361 // Some spells don't benefit from done mods
12362 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
12363 return 1.0f;
12364
12365 // xinef: Some spells don't benefit from done mods
12366 if (spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS))
12367 return 1.0f;
12368
12369 // No bonus healing for potion spells
12370 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12371 return 1.0f;
12372
12373 float DoneTotalMod = 1.0f;
12374
12375 // Healing done percent
12377 for (auto const& auraEff : mHealingDonePct)
12378 {
12379 if (!sScriptMgr->IsNeedModHealPercent(this, auraEff, DoneTotalMod, spellProto))
12380 continue;
12381
12382 AddPct(DoneTotalMod, auraEff->GetAmount());
12383 }
12384
12385 // done scripted mod (take it from owner)
12386 Unit* owner = GetOwner() ? GetOwner() : this;
12387 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12388 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12389 {
12390 if (!(*i)->IsAffectedOnSpell(spellProto))
12391 continue;
12392
12393 switch ((*i)->GetMiscValue())
12394 {
12395 case 21: // Test of Faith
12396 case 6935:
12397 case 6918:
12398 if (victim->HealthBelowPct(50))
12399 AddPct(DoneTotalMod, (*i)->GetAmount());
12400 break;
12401 case 7798: // Glyph of Regrowth
12402 {
12404 AddPct(DoneTotalMod, (*i)->GetAmount());
12405 break;
12406 }
12407
12408 case 7871: // Glyph of Lesser Healing Wave
12409 {
12410 // xinef: affected by any earth shield
12411 if (victim->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 0, 0x00000400, 0))
12412 AddPct(DoneTotalMod, (*i)->GetAmount());
12413 break;
12414 }
12415 default:
12416 break;
12417 }
12418 }
12419
12420 switch (spellProto->SpellFamilyName)
12421 {
12423 // Talents and glyphs for healing stream totem
12424 if (spellProto->Id == 52042)
12425 {
12426 // Glyph of Healing Stream Totem
12427 if (AuraEffect* dummy = owner->GetAuraEffect(55456, EFFECT_0))
12428 AddPct(DoneTotalMod, dummy->GetAmount());
12429
12430 // Healing Stream totem - Restorative Totems
12431 if (AuraEffect* aurEff = GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 338, 1))
12432 AddPct(DoneTotalMod, aurEff->GetAmount());
12433 }
12434 break;
12435 case SPELLFAMILY_PRIEST:
12436 // T9 HEALING 4P, empowered renew instant heal
12437 if (spellProto->Id == 63544)
12438 if (AuraEffect* aurEff = GetAuraEffect(67202, EFFECT_0))
12439 AddPct(DoneTotalMod, aurEff->GetAmount());
12440 break;
12441 }
12442
12443 return DoneTotalMod;
12444}
@ SPELL_AURA_MOD_HEALING_DONE_PERCENT
Definition: SpellAuraDefines.h:199

References AddPct(), EFFECT_0, GetAuraEffect(), GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), Object::GetTypeId(), SpellInfo::HasAttribute(), HealthBelowPct(), SpellInfo::Id, IsTotem(), SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS, SPELL_AURA_DUMMY, SPELL_AURA_MOD_HEALING_DONE_PERCENT, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, SpellInfo::SpellFamilyName, sScriptMgr, and TYPEID_UNIT.

Referenced by AuraEffect::CalculatePeriodicData(), and SpellHealingBonusDone().

◆ SpellTakenCritChance()

float Unit::SpellTakenCritChance ( Unit const *  caster,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
float  doneChance,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
12064{
12065 // not critting spell
12066 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
12067 return 0.0f;
12068
12069 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
12070 if (!skipEffectCheck && !spellProto->IsCritCapable())
12071 return 0.0f;
12072
12073 float crit_chance = doneChance;
12074 switch (spellProto->DmgClass)
12075 {
12077 {
12078 if (!spellProto->IsPositive())
12079 {
12080 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
12081 // xinef: apply max and min only
12083 {
12086 }
12087
12088 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_SPELL);
12089 }
12090 // scripted (increase crit chance ... against ... target by x%
12091 if (caster)
12092 {
12093 AuraEffectList const& mOverrideClassScript = caster->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12094 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12095 {
12096 if (!((*i)->IsAffectedOnSpell(spellProto)))
12097 continue;
12098 int32 modChance = 0;
12099 switch ((*i)->GetMiscValue())
12100 {
12101 // Shatter
12102 case 911:
12103 modChance += 16;
12104 [[fallthrough]];
12105 case 910:
12106 modChance += 17;
12107 [[fallthrough]];
12108 case 849:
12109 modChance += 17;
12110 if (!HasAuraState(AURA_STATE_FROZEN, spellProto, caster))
12111 break;
12112 crit_chance += modChance;
12113 break;
12114 case 7917: // Glyph of Shadowburn
12115 if (HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, caster))
12116 crit_chance += (*i)->GetAmount();
12117 break;
12118 case 7997: // Renewed Hope
12119 case 7998:
12120 if (HasAura(6788))
12121 crit_chance += (*i)->GetAmount();
12122 break;
12123 default:
12124 break;
12125 }
12126 }
12127 // Custom crit by class
12128 switch (spellProto->SpellFamilyName)
12129 {
12130 case SPELLFAMILY_MAGE:
12131 // Glyph of Fire Blast
12132 if (spellProto->SpellFamilyFlags[0] == 0x2 && spellProto->SpellIconID == 12)
12134 if (AuraEffect const* aurEff = caster->GetAuraEffect(56369, EFFECT_0))
12135 crit_chance += aurEff->GetAmount();
12136 break;
12137 case SPELLFAMILY_DRUID:
12138 // Improved Faerie Fire
12140 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 109, 0))
12141 crit_chance += aurEff->GetAmount();
12142
12143 // cumulative effect - don't break
12144
12145 // Starfire
12146 if (spellProto->SpellFamilyFlags[0] & 0x4 && spellProto->SpellIconID == 1485)
12147 {
12148 // Improved Insect Swarm
12149 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 1771, 0))
12151 crit_chance += aurEff->GetAmount();
12152 break;
12153 }
12154 break;
12155 case SPELLFAMILY_ROGUE:
12156 // Shiv-applied poisons can't crit
12157 if (caster->FindCurrentSpellBySpellId(5938))
12158 crit_chance = 0.0f;
12159 break;
12161 // Flash of light
12162 if (spellProto->SpellFamilyFlags[0] & 0x40000000)
12163 {
12164 // Sacred Shield
12165 if (AuraEffect const* aura = GetAuraEffect(58597, 1, GetGUID()))
12166 crit_chance += aura->GetAmount();
12167 break;
12168 }
12169 // Exorcism
12170 else if (spellProto->GetCategory() == 19)
12171 {
12173 return 100.0f;
12174 break;
12175 }
12176 break;
12177 case SPELLFAMILY_SHAMAN:
12178 // Lava Burst
12179 if (spellProto->SpellFamilyFlags[1] & 0x00001000)
12180 {
12181 if (GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0, 0, caster->GetGUID()))
12183 return 100.0f;
12184 break;
12185 }
12186 break;
12187 }
12188 }
12189 break;
12190 }
12192 // Custom crit by class
12193 if (caster)
12194 {
12195 switch (spellProto->SpellFamilyName)
12196 {
12197 case SPELLFAMILY_DRUID:
12198 // Rend and Tear - bonus crit chance for Ferocious Bite on bleeding targets
12199 if (spellProto->SpellFamilyFlags[0] & 0x00800000 && spellProto->SpellIconID == 1680 && HasAuraState(AURA_STATE_BLEEDING))
12200 {
12201 if (AuraEffect const* rendAndTear = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 2859, 1))
12202 crit_chance += rendAndTear->GetAmount();
12203 break;
12204 }
12205 break;
12207 // Victory Rush
12208 if (spellProto->SpellFamilyFlags[1] & 0x100)
12209 {
12210 // Glyph of Victory Rush
12211 if (AuraEffect const* aurEff = caster->GetAuraEffect(58382, 0))
12212 crit_chance += aurEff->GetAmount();
12213 break;
12214 }
12215 break;
12216 }
12217 }
12218
12219 // 100% critical chance against sitting target
12221 {
12222 return 100.0f;
12223 }
12224 [[fallthrough]];
12226 {
12227 // flat aura mods
12228 if (attackType == RANGED_ATTACK)
12230 else
12232
12233 // reduce crit chance from Rating for players
12234 if (attackType != RANGED_ATTACK)
12235 {
12236 // xinef: little hack, crit chance dont require caster to calculate, pass victim
12237 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_MELEE);
12238 }
12239 else
12240 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_RANGED);
12241
12242 // Apply crit chance from defence skill
12243 if (caster)
12244 crit_chance += (int32(caster->GetMaxSkillValueForLevel(this)) - int32(GetDefenseSkillValue(caster))) * 0.04f;
12245
12246 break;
12247 }
12248 // values overridden in spellmgr for lifebloom and earth shield
12250 default:
12251 return 0.0f;
12252 }
12253
12254 if (caster)
12255 {
12257 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
12258 {
12259 if (caster->GetGUID() != (*i)->GetCasterGUID())
12260 continue;
12261
12262 crit_chance += (*i)->GetAmount();
12263 }
12264 }
12265
12266 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
12267 // xinef: should be calculated at the end
12268 if (!spellProto->IsPositive())
12270
12271 // xinef: can be negative!
12272 return crit_chance;
12273}
@ SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
Definition: SpellAuraDefines.h:242
uint32 const CREATURE_TYPEMASK_DEMON_OR_UNDEAD
Definition: SharedDefines.h:2643
@ MECHANIC_KNOCKOUT
Definition: SharedDefines.h:1339
@ AURA_STATE_BLEEDING
Definition: SharedDefines.h:1310
int32 GetMaxPositiveAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
Definition: Unit.cpp:5924
int32 GetMaxNegativeAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition: Unit.cpp:5938

References ApplyResilience(), AURA_STATE_BLEEDING, AURA_STATE_FAERIE_FIRE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_35_PERCENT, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CREATURE_TYPEMASK_DEMON_OR_UNDEAD, SpellInfo::DmgClass, EFFECT_0, FindCurrentSpellBySpellId(), GetAuraEffect(), GetAuraEffectsByType(), SpellInfo::GetCategory(), GetCreatureTypeMask(), GetDefenseSkillValue(), GetDummyAuraEffect(), Object::GetGUID(), GetMaxNegativeAuraModifierByMiscMask(), GetMaxPositiveAuraModifierByMiscMask(), GetMaxSkillValueForLevel(), getStandState(), GetTotalAuraModifier(), Object::GetTypeId(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraType(), HasAuraWithMechanic(), SpellInfo::IsCritCapable(), SpellInfo::IsPositive(), IsSitState(), MECHANIC_KNOCKOUT, MECHANIC_STUN, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLFAMILY_DRUID, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, TYPEID_PLAYER, and UNIT_STAND_STATE_SLEEP.

Referenced by AuraEffect::CalcPeriodicCritChance(), and Spell::DoAllEffectOnLaunchTarget().

◆ StartReactiveTimer()

void Unit::StartReactiveTimer ( ReactiveType  reactive)
inline
#define REACTIVE_TIMER_START
Definition: Unit.h:1210

References m_reactiveTimer, and REACTIVE_TIMER_START.

Referenced by ProcDamageAndSpellFor().

◆ StopAttackFaction()

void Unit::StopAttackFaction ( uint32  faction_id)
20439{
20440 if (Unit* victim = GetVictim())
20441 {
20442 if (victim->GetFactionTemplateEntry()->faction == faction_id)
20443 {
20444 AttackStop();
20445 if (IsNonMeleeSpellCast(false))
20447
20448 // melee and ranged forced attack cancel
20449 if (GetTypeId() == TYPEID_PLAYER)
20451 }
20452 }
20453
20454 AttackerSet const& attackers = getAttackers();
20455 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20456 {
20457 if ((*itr)->GetFactionTemplateEntry()->faction == faction_id)
20458 {
20459 (*itr)->AttackStop();
20460 itr = attackers.begin();
20461 }
20462 else
20463 ++itr;
20464 }
20465
20467
20468 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20469 (*itr)->StopAttackFaction(faction_id);
20470}
void deleteReferencesForFaction(uint32 faction)
Definition: HostileRefMgr.cpp:162

References AttackStop(), HostileRefMgr::deleteReferencesForFaction(), getAttackers(), getHostileRefMgr(), Object::GetTypeId(), GetVictim(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), m_Controlled, Player::SendAttackSwingCancelAttack(), Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by AuraEffect::HandleForceReaction().

◆ StopAttackingInvalidTarget()

void Unit::StopAttackingInvalidTarget ( )
20473{
20474 AttackerSet const& attackers = getAttackers();
20475 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20476 {
20477 Unit* attacker = (*itr);
20478 if (!attacker->IsValidAttackTarget(this))
20479 {
20480 attacker->AttackStop();
20481 if (attacker->GetTypeId() == TYPEID_PLAYER)
20482 {
20484 }
20485
20486 for (Unit* controled : attacker->m_Controlled)
20487 {
20488 if (controled->GetVictim() == this && !controled->IsValidAttackTarget(this))
20489 {
20490 controled->AttackStop();
20491 }
20492 }
20493
20494 itr = attackers.begin();
20495 }
20496 else
20497 {
20498 ++itr;
20499 }
20500 }
20501}

References AttackStop(), getAttackers(), Object::GetTypeId(), GetVictim(), IsValidAttackTarget(), m_Controlled, Player::SendAttackSwingCancelAttack(), Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by RemoveCharmedBy(), and SetCharmedBy().

◆ StopMoving()

void Unit::StopMoving ( )
16919{
16921
16922 // not need send any packets if not in world or not moving
16923 if (!IsInWorld())
16924 return;
16925
16926 if (movespline->Finalized())
16927 return;
16928
16929 // Update position now since Stop does not start a new movement that can be updated later
16930 if (movespline->HasStarted())
16932
16933 Movement::MoveSplineInit init(this);
16934 init.Stop();
16935}
void UpdateSplinePosition()
Definition: Unit.cpp:626
bool HasStarted() const
Definition: MoveSpline.h:129

References ClearUnitState(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::HasStarted(), Object::IsInWorld(), movespline, Movement::MoveSplineInit::Stop(), UNIT_STATE_MOVING, and UpdateSplinePosition().

Referenced by npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), ScriptedAI::DoCastSpell(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), ChaseMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), WorldSession::HandlePetActionHelper(), RotateMovementGenerator::Initialize(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_kologarn::boss_kologarnAI::JustDied(), boss_swamplord_muselek::JustEngagedWith(), Player::LeaveBattleground(), boss_headless_horseman::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), PauseMovement(), SmartAI::PausePath(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), RemoveCharmedBy(), Creature::RemoveCorpse(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::Reset(), npc_xt002_boombot::npc_xt002_boombotAI::Reset(), boss_leotheras_the_blind::Reset(), IdleMovementGenerator::Reset(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SetCharmedBy(), SmartAI::SetCombatMove(), SetConfused(), boss_victor_nefarius::boss_victor_nefariusAI::SetData(), setDeathState(), SetFeared(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), SetRooted(), npc_magister_aledis::sGossipSelect(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_heigan::boss_heiganAI::StartFightPhase(), SmartAI::StopFollow(), SmartAI::StopPath(), CreatureAI::TriggerAlert(), Pet::Update(), TimedFleeingMovementGenerator::Update(), boss_felblood_kaelthas::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), boss_janalai::boss_janalaiAI::UpdateAI(), npc_frost_wyrm::npc_frost_wyrmAI::UpdateAI(), npc_gargoyle::npc_gargoyleAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_alar::boss_alarAI::UpdateAI(), boss_kaelthas::boss_kaelthasAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), and PetAI::UpdateAI().

◆ StopMovingOnCurrentPos()

void Unit::StopMovingOnCurrentPos ( )
16958{
16960
16961 // not need send any packets if not in world
16962 if (!IsInWorld())
16963 return;
16964
16965 DisableSpline(); // pussywizard: required so Launch() won't recalculate position from previous spline
16966 Movement::MoveSplineInit init(this);
16967 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
16968 init.SetFacing(GetOrientation());
16969 init.Launch();
16970}

References ClearUnitState(), DisableSpline(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::IsInWorld(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), Movement::MoveSplineInit::SetFacing(), and UNIT_STATE_MOVING.

Referenced by npc_mograine::npc_mograineAI::AshbringerEvent(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), UtherBatteredHiltEvent::Execute(), WorldSession::HandlePetActionHelper(), boss_flame_leviathan::boss_flame_leviathanAI::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_ulduar::instance_ulduar_InstanceMapScript::OnCreatureCreate(), boss_skadi::boss_skadiAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), SetRooted(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::SpawnAdds(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), Creature::Update(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_janalai::boss_janalaiAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), and boss_alar::boss_alarAI::UpdateAI().

◆ Talk() [1/2]

void Unit::Talk ( std::string_view  text,
ChatMsg  msgType,
Language  language,
float  textRange,
WorldObject const *  target 
)
virtual
21413{
21414 Acore::CustomChatTextBuilder builder(this, msgType, text, language, target);
21417 Cell::VisitWorldObjects(this, worker, textRange);
21418}
static void VisitWorldObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:193
Definition: GridNotifiers.h:589
Definition: GridNotifiers.h:1703
Definition: ChatTextBuilder.h:49

References Cell::VisitWorldObjects().

Referenced by spell_inoculate_nestlewood_owlkin::HandleEffectRemove().

◆ Talk() [2/2]

void Unit::Talk ( uint32  textId,
ChatMsg  msgType,
float  textRange,
WorldObject const *  target 
)
virtual
21449{
21450 if (!sObjectMgr->GetBroadcastText(textId))
21451 {
21452 LOG_ERROR("entities.unit", "Unit::Talk: `broadcast_text` (ID: {}) was not found", textId);
21453 return;
21454 }
21455
21456 Acore::BroadcastTextBuilder builder(this, msgType, textId, getGender(), target);
21459 Cell::VisitWorldObjects(this, worker, textRange);
21460}
Definition: ChatTextBuilder.h:31

References getGender(), LOG_ERROR, sObjectMgr, and Cell::VisitWorldObjects().

◆ TauntApply()

void Unit::TauntApply ( Unit victim)
14651{
14653
14654 if (!taunter || (taunter->GetTypeId() == TYPEID_PLAYER && taunter->ToPlayer()->IsGameMaster()))
14655 return;
14656
14657 if (!CanHaveThreatList())
14658 return;
14659
14660 Creature* creature = ToCreature();
14661
14662 if (creature->HasReactState(REACT_PASSIVE))
14663 return;
14664
14665 Unit* target = GetVictim();
14666 if (target && target == taunter)
14667 return;
14668
14669 SetInFront(taunter);
14670 SetGuidValue(UNIT_FIELD_TARGET, taunter->GetGUID());
14671
14672 if (creature->IsAIEnabled)
14673 creature->AI()->AttackStart(taunter);
14674
14675 //m_ThreatMgr.tauntApply(taunter);
14676}
void SetInFront(WorldObject const *target)
Definition: Unit.cpp:20878

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), Object::GetGUID(), Object::GetTypeId(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Player::IsGameMaster(), REACT_PASSIVE, Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and boss_razorgore::boss_razorgoreAI::OnCharmed().

◆ TauntFadeOut()

void Unit::TauntFadeOut ( Unit taunter)
14681{
14683
14684 if (!taunter || (taunter->GetTypeId() == TYPEID_PLAYER && taunter->ToPlayer()->IsGameMaster()))
14685 return;
14686
14687 if (!CanHaveThreatList())
14688 return;
14689
14690 Creature* creature = ToCreature();
14691
14692 if (creature->HasReactState(REACT_PASSIVE))
14693 return;
14694
14695 Unit* target = GetVictim();
14696 if (!target || target != taunter)
14697 return;
14698
14700 {
14701 if (creature->IsAIEnabled)
14703 return;
14704 }
14705
14706 target = creature->SelectVictim(); // might have more taunt auras remaining
14707
14708 if (target && target != taunter)
14709 {
14711 SetInFront(target);
14712 if (creature->IsAIEnabled)
14713 creature->AI()->AttackStart(target);
14714 }
14715}
@ EVADE_REASON_NO_HOSTILES
Definition: CreatureAI.h:90
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
Definition: CreatureAI.cpp:196
bool isThreatListEmpty() const
Definition: ThreatMgr.h:225
Unit * SelectVictim()
Definition: Unit.cpp:14719

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), CreatureAI::EnterEvadeMode(), CreatureAI::EVADE_REASON_NO_HOSTILES, Object::GetGUID(), Object::GetTypeId(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Player::IsGameMaster(), ThreatMgr::isThreatListEmpty(), m_ThreatMgr, REACT_PASSIVE, Creature::SelectVictim(), Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ TextEmote() [1/2]

void Unit::TextEmote ( std::string_view  text,
WorldObject const *  target = nullptr,
bool  isBossEmote = false 
)
virtual

◆ TextEmote() [2/2]

void Unit::TextEmote ( uint32  textId,
WorldObject const *  target = nullptr,
bool  isBossEmote = false 
)
virtual

Reimplemented in Player.

21473{
21474 Talk(textId, isBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
21475}

References CHAT_MSG_MONSTER_EMOTE, CHAT_MSG_RAID_BOSS_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, and sWorld.

◆ ToPet()

◆ ToTempSummon() [1/2]

TempSummon * Unit::ToTempSummon ( )
inline
2414{ if (IsSummon()) return reinterpret_cast<TempSummon*>(this); else return nullptr; }

References IsSummon().

Referenced by _ExitVehicle(), npc_living_mojo::npc_living_mojoAI::AttackStart(), WorldObject::CanSeeOrDetect(), Spell::CheckCast(), Spell::CheckEffectTarget(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Creature::DespawnOnEvade(), Creature::DespawnOrUnsummon(), npc_bone_spike::npc_bone_spikeAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), ThreatMgr::DoAddThreat(), Spell::EffectScriptEffect(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), npc_raging_flames::FixateRandomTarget(), boss_headless_horseman_head::GetOwner(), GetSpellModOwner(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::GetSummoner(), Creature::GetSummonerGUID(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), spell_pilgrims_bounty_pass_generic::HandleDummy(), WorldSession::HandlePetActionHelper(), spell_pri_lightwell::HandleScriptEffect(), spell_q11026_a11051_banish_the_demons::HandleScriptEffect(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), npc_pet_gen_imp_in_a_bottle::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), npc_raging_spirit::npc_raging_spiritAI::JustDied(), boss_freya_iron_root::boss_freya_iron_rootAI::JustDied(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::JustDied(), npc_counselor_talbot::npc_counselor_talbotAI::JustDied(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::npc_pet_dk_ghoulAI::JustDied(), npc_pet_pri_shadowfiend::JustDied(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::JustEngagedWith(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::JustSummoned(), npc_frosthound::npc_frosthoundAI::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), npc_collapsing_star::npc_collapsing_starAI::JustSummoned(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::JustSummoned(), boss_supremus::JustSummoned(), Kill(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_netherspite_infernal::KilledUnit(), npc_living_mojo::npc_living_mojoAI::MoveInLineOfSight(), WaypointMovementGenerator< Creature >::MovementInform(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::MovementInform(), npc_leryssa::npc_leryssaAI::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::MovementInform(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_claw_tentacle::npc_claw_tentacle(), npc_eye_tentacle::npc_eye_tentacle(), npc_frost_tomb::npc_frost_tombAI::npc_frost_tombAI(), npc_giant_claw_tentacle::npc_giant_claw_tentacle(), npc_giant_eye_tentacle::npc_giant_eye_tentacle(), npc_midsummer_ribbon_pole_target::npc_midsummer_ribbon_pole_target(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), BattlefieldWG::OnCreatureCreate(), instance_blackwing_lair::instance_blackwing_lair_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), RemoveAllControlled(), RemoveAllMinionsByEntry(), spell_gen_defend::RemoveDummyFromDriver(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::Reset(), npc_raging_spirit::npc_raging_spiritAI::Reset(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), npc_voidtraveler::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), Spell::SendSpellGo(), Spell::SendSpellStart(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_pilgrims_bounty_plate::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SummonedCreatureDies(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::Update(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_freya_ward::npc_freya_wardAI::UpdateAI(), npc_ulduar_flash_freeze::npc_ulduar_flash_freezeAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_captured_beryl_sorcerer::npc_captured_beryl_sorcererAI::UpdateAI(), npc_feedin_da_goolz::npc_feedin_da_goolzAI::UpdateAI(), Player::VehicleSpellInitialize(), and npc_frosthound::npc_frosthoundAI::WaypointReached().

◆ ToTempSummon() [2/2]

const TempSummon * Unit::ToTempSummon ( ) const
inline
2415{ if (IsSummon()) return reinterpret_cast<const TempSummon*>(this); else return nullptr; }

References IsSummon().

◆ ToTotem()

Totem * Unit::ToTotem ( )
inline
2413{ if (IsTotem()) return reinterpret_cast<Totem*>(this); else return nullptr; }
Definition: Totem.h:43

References IsTotem().

Referenced by _UnapplyAura(), Spell::EffectDestroyAllTotems(), WorldSession::HandleTotemDestroyed(), SetMinion(), Spell::SummonGuardian(), and TotemAI::UpdateAI().

◆ TriggerAurasProcOnEvent() [1/3]

void Unit::TriggerAurasProcOnEvent ( CalcDamageInfo damageInfo)
16812{
16813 DamageInfo dmgInfo = DamageInfo(damageInfo);
16814 TriggerAurasProcOnEvent(nullptr, nullptr, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, 0, 0, damageInfo.procEx, nullptr, &dmgInfo, nullptr);
16815}
void TriggerAurasProcOnEvent(CalcDamageInfo &damageInfo)
Definition: Unit.cpp:16811

References CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::target, and TriggerAurasProcOnEvent().

Referenced by TriggerAurasProcOnEvent().

◆ TriggerAurasProcOnEvent() [2/3]

void Unit::TriggerAurasProcOnEvent ( ProcEventInfo eventInfo,
std::list< AuraApplication * > &  procAuras 
)
16837{
16838 for (std::list<AuraApplication*>::iterator itr = aurasTriggeringProc.begin(); itr != aurasTriggeringProc.end(); ++itr)
16839 {
16840 if (!(*itr)->GetRemoveMode())
16841 (*itr)->GetBase()->TriggerProcOnEvent(*itr, eventInfo);
16842 }
16843}

◆ TriggerAurasProcOnEvent() [3/3]

void Unit::TriggerAurasProcOnEvent ( std::list< AuraApplication * > *  myProcAuras,
std::list< AuraApplication * > *  targetProcAuras,
Unit actionTarget,
uint32  typeMaskActor,
uint32  typeMaskActionTarget,
uint32  spellTypeMask,
uint32  spellPhaseMask,
uint32  hitMask,
Spell spell,
DamageInfo damageInfo,
HealInfo healInfo 
)
16818{
16819 // prepare data for self trigger
16820 ProcEventInfo myProcEventInfo = ProcEventInfo(this, actionTarget, actionTarget, typeMaskActor, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16821 std::list<AuraApplication*> myAurasTriggeringProc;
16822 GetProcAurasTriggeredOnEvent(myAurasTriggeringProc, myProcAuras, myProcEventInfo);
16823
16824 // prepare data for target trigger
16825 ProcEventInfo targetProcEventInfo = ProcEventInfo(this, actionTarget, this, typeMaskActionTarget, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16826 std::list<AuraApplication*> targetAurasTriggeringProc;
16827 if (typeMaskActionTarget)
16828 GetProcAurasTriggeredOnEvent(targetAurasTriggeringProc, targetProcAuras, targetProcEventInfo);
16829
16830 TriggerAurasProcOnEvent(myProcEventInfo, myAurasTriggeringProc);
16831
16832 if (typeMaskActionTarget)
16833 TriggerAurasProcOnEvent(targetProcEventInfo, targetAurasTriggeringProc);
16834}
void GetProcAurasTriggeredOnEvent(std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
Definition: Unit.cpp:16781

References GetProcAurasTriggeredOnEvent(), and TriggerAurasProcOnEvent().

◆ UnsummonAllTotems()

void Unit::UnsummonAllTotems ( bool  onDeath = false)
11200{
11201 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
11202 {
11203 if (!m_SummonSlot[i])
11204 {
11205 continue;
11206 }
11207
11208 if (Creature* OldTotem = GetMap()->GetCreature(m_SummonSlot[i]))
11209 {
11210 if (OldTotem->IsSummon())
11211 {
11212 if (!(onDeath && !IsPlayer() && OldTotem->IsGuardian()))
11213 {
11214 OldTotem->ToTempSummon()->UnSummon();
11215 }
11216 }
11217 }
11218 }
11219}

References WorldObject::GetMap(), Object::IsPlayer(), m_SummonSlot, and MAX_SUMMON_SLOT.

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ Update()

void Unit::Update ( uint32  time)
overridevirtual

Reimplemented from WorldObject.

404{
405 sScriptMgr->OnUnitUpdate(this, p_time);
406
407 // WARNING! Order of execution here is important, do not change.
408 // Spells must be processed with event system BEFORE they go to _UpdateSpells.
409 // Or else we may have some SPELL_STATE_FINISHED spells stalled in pointers, that is bad.
410 m_Events.Update(p_time);
411
412 if (!IsInWorld())
413 return;
414
415 // pussywizard:
416 if (GetTypeId() != TYPEID_PLAYER || (!ToPlayer()->IsBeingTeleported() && !bRequestForcedVisibilityUpdate))
417 {
419 {
421 {
423 //ExecuteDelayedUnitRelocationEvent();
425 }
426 else
428 }
430 {
431 if (m_delayed_unit_ai_notify_timer <= p_time)
432 {
435 }
436 else
438 }
439 }
440
441 _UpdateSpells( p_time );
442
443 if (CanHaveThreatList() && GetThreatMgr().isNeedUpdateToClient(p_time))
445
446 // update combat timer only for players and pets (only pets with PetAI)
448 {
449 // Check UNIT_STATE_MELEE_ATTACKING or UNIT_STATE_CHASE (without UNIT_STATE_FOLLOW in this case) so pets can reach far away
450 // targets without stopping half way there and running off.
451 // These flags are reset after target dies or another command is given.
453 {
454 // m_CombatTimer set at aura start and it will be freeze until aura removing
455 if (m_CombatTimer <= p_time)
457 else
458 m_CombatTimer -= p_time;
459 }
460 }
461
464 {
465 while (!extraAttacksTargets.empty())
466 {
467 auto itr = extraAttacksTargets.begin();
468 ObjectGuid targetGuid = itr->first;
469 uint32 count = itr->second;
470 extraAttacksTargets.erase(itr);
471 if (Unit* victim = ObjectAccessor::GetUnit(*this, targetGuid))
472 {
474 || victim->IsWithinMeleeRange(this))
475 {
476 HandleProcExtraAttackFor(victim, count);
477 }
478 }
479 }
481 }
482
483 // not implemented before 3.0.2
484 // xinef: if attack time > 0, reduce by diff
485 // if on next update, attack time < 0 assume player didnt attack - set to 0
486 bool suspendAttackTimer = false;
487 bool suspendRangedAttackTimer = false;
489 {
490 for (Spell* spell : m_currentSpells)
491 {
492 if (spell)
493 {
494 if (spell->GetSpellInfo()->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
495 {
496 if (spell->IsChannelActive())
497 {
498 suspendRangedAttackTimer = true;
499 }
500
501 suspendAttackTimer = true;
502 break;
503 }
504 }
505 }
506 }
507
508 if (!suspendAttackTimer)
509 {
510 if (int32 base_attack = getAttackTimer(BASE_ATTACK))
511 {
512 setAttackTimer(BASE_ATTACK, base_attack > 0 ? base_attack - (int32) p_time : 0);
513 }
514
515 if (int32 off_attack = getAttackTimer(OFF_ATTACK))
516 {
517 setAttackTimer(OFF_ATTACK, off_attack > 0 ? off_attack - (int32) p_time : 0);
518 }
519 }
520
521 if (!suspendRangedAttackTimer)
522 {
523 if (int32 ranged_attack = getAttackTimer(RANGED_ATTACK))
524 {
525 setAttackTimer(RANGED_ATTACK, ranged_attack > 0 ? ranged_attack - (int32)p_time : 0);
526 }
527 }
528
529 // update abilities available only for fraction of time
530 UpdateReactives(p_time);
531
535
536 UpdateSplineMovement(p_time);
537 GetMotionMaster()->UpdateMotion(p_time);
538}
@ AURA_STATE_HEALTH_ABOVE_75_PERCENT
Definition: SharedDefines.h:1315
bool IsEmpty() const
Definition: LinkedList.h:97
void Update(uint32 p_time)
Definition: EventProcessor.cpp:40
void _UpdateSpells(uint32 time)
Definition: Unit.cpp:3807
void UpdateSplineMovement(uint32 t_diff)
Definition: Unit.cpp:594
void UpdateReactives(uint32 p_time)
Definition: Unit.cpp:17205
void ExecuteDelayedUnitAINotifyEvent()
Definition: Unit.cpp:20867
void HandleProcExtraAttackFor(Unit *victim, uint32 count)
Definition: Unit.cpp:2728
void SendThreatListUpdate()
Definition: Unit.cpp:20349
std::unordered_set< Unit * > i_objectsForDelayedVisibility
Definition: Map.h:389
void UpdateMotion(uint32 diff)
Definition: MotionMaster.cpp:104

References _lastDamagedTargetGuid, _lastExtraAttackSpell, _UpdateSpells(), AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, bRequestForcedVisibilityUpdate, CanHaveThreatList(), ClearInCombat(), ObjectGuid::Empty, ExecuteDelayedUnitAINotifyEvent(), extraAttacksTargets, WorldObject::FindMap(), getAttackTimer(), GetMotionMaster(), GetThreatMgr(), Object::GetTypeId(), ObjectAccessor::GetUnit(), HandleProcExtraAttackFor(), HasUnitState(), HasUnitTypeMask(), HealthAbovePct(), HealthBelowPct(), Map::i_objectsForDelayedVisibility, IsAlive(), IsControlledByPlayer(), LinkedListHead::IsEmpty(), IsInCombat(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), m_CombatTimer, m_currentSpells, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_Events, m_HostileRefMgr, ModifyAuraState(), OFF_ATTACK, RANGED_ATTACK, SendThreatListUpdate(), setAttackTimer(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_HACK_AND_SLASH, SPELL_SWORD_SPECIALIZATION, sScriptMgr, Object::ToPlayer(), TYPEID_PLAYER, UNIT_MASK_CONTROLABLE_GUARDIAN, UNIT_STATE_CASTING, EventProcessor::Update(), MotionMaster::UpdateMotion(), UpdateReactives(), and UpdateSplineMovement().

Referenced by Creature::Update(), and Player::Update().

◆ UpdateAllResistances()

void Unit::UpdateAllResistances ( )
virtual

◆ UpdateAllStats()

virtual bool Unit::UpdateAllStats ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

◆ UpdateArmor()

virtual void Unit::UpdateArmor ( )
pure virtual

◆ UpdateAttackPowerAndDamage()

virtual void Unit::UpdateAttackPowerAndDamage ( bool  ranged = false)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateAuraForGroup()

void Unit::UpdateAuraForGroup ( uint8  slot)
17435{
17436 if (slot >= MAX_AURAS) // slot not found, return
17437 return;
17438 if (Player* player = ToPlayer())
17439 {
17440 if (player->GetGroup())
17441 {
17442 player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_AURAS);
17443 player->SetAuraUpdateMaskForRaid(slot);
17444 }
17445 }
17446 else if (GetTypeId() == TYPEID_UNIT && IsPet())
17447 {
17448 Pet* pet = ((Pet*)this);
17449 if (pet->isControlled())
17450 {
17451 Unit* owner = GetOwner();
17452 if (owner && (owner->GetTypeId() == TYPEID_PLAYER) && owner->ToPlayer()->GetGroup())
17453 {
17455 pet->SetAuraUpdateMaskForRaid(slot);
17456 }
17457 }
17458 }
17459}
@ GROUP_UPDATE_FLAG_PET_AURAS
Definition: Group.h:118
@ GROUP_UPDATE_FLAG_AURAS
Definition: Group.h:109
#define MAX_AURAS
Definition: SpellAuraDefines.h:21
void SetAuraUpdateMaskForRaid(uint8 slot)
Definition: Pet.h:136

References Player::GetGroup(), GetOwner(), Object::GetTypeId(), GROUP_UPDATE_FLAG_AURAS, GROUP_UPDATE_FLAG_PET_AURAS, Pet::isControlled(), IsPet(), MAX_AURAS, Pet::SetAuraUpdateMaskForRaid(), Player::SetGroupUpdateFlag(), Object::ToPlayer(), TYPEID_PLAYER, and TYPEID_UNIT.

Referenced by RemoveVisibleAura(), and SetVisibleAura().

◆ UpdateCharmAI()

void Unit::UpdateCharmAI ( )
15772{
15773 if (GetTypeId() == TYPEID_PLAYER)
15774 return;
15775
15776 if (i_disabledAI) // disabled AI must be primary AI
15777 {
15778 if (!IsCharmed())
15779 {
15780 delete i_AI;
15782 i_disabledAI = nullptr;
15783 }
15784 }
15785 else
15786 {
15787 if (IsCharmed())
15788 {
15790 if (isPossessed() || IsVehicle())
15791 i_AI = new PossessedAI(ToCreature());
15792 else
15793 i_AI = new PetAI(ToCreature());
15794 }
15795 }
15796}
Definition: PassiveAI.h:37
Definition: PetAI.h:47

References Object::GetTypeId(), i_AI, i_disabledAI, IsCharmed(), isPossessed(), IsVehicle(), Object::ToCreature(), and TYPEID_PLAYER.

Referenced by Creature::Update().

◆ UpdateDamagePhysical()

void Unit::UpdateDamagePhysical ( WeaponAttackType  attType)
virtual

Reimplemented in Guardian, and Totem.

61{
62 float totalMin = 0.f;
63 float totalMax = 0.f;
64
65 float tmpMin, tmpMax;
66 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
67 {
68 CalculateMinMaxDamage(attType, false, true, tmpMin, tmpMax, i);
69 totalMin += tmpMin;
70 totalMax += tmpMax;
71 }
72
73 switch (attType)
74 {
75 case BASE_ATTACK:
76 default:
79 break;
80 case OFF_ATTACK:
83 break;
84 case RANGED_ATTACK:
87 break;
88 }
89}
void SetStatFloatValue(uint16 index, float value)
Definition: Object.cpp:790

References BASE_ATTACK, CalculateMinMaxDamage(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, Object::SetStatFloatValue(), UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, and UNIT_FIELD_MINRANGEDDAMAGE.

Referenced by Player::_ApplyAmmoBonuses(), Player::_ApplyWeaponDamage(), boss_twin_valkyrAI::boss_twin_valkyrAI(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleModAttackSpeed(), HandleStatModifier(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::npc_toc_enh_shamanAI(), Player::RemoveAmmo(), Creature::SetCanDualWield(), Creature::UpdateAttackPowerAndDamage(), and Player::UpdateAttackPowerAndDamage().

◆ UpdateHeight()

void Unit::UpdateHeight ( float  newZ)

Only server-side height update, does not broadcast to client.

20343{
20345 if (IsVehicle())
20347}
void RelocatePassengers()
Definition: Vehicle.cpp:498

References Position::GetPositionX(), Position::GetPositionY(), GetVehicleKit(), IsVehicle(), Position::Relocate(), and Vehicle::RelocatePassengers().

Referenced by npc_dancing_flames::npc_dancing_flamesAI::Reset(), and SetHover().

◆ UpdateInterruptMask()

void Unit::UpdateInterruptMask ( )
760{
761 m_interruptMask = 0;
762 for (AuraApplicationList::const_iterator i = m_interruptableAuras.begin(); i != m_interruptableAuras.end(); ++i)
763 m_interruptMask |= (*i)->GetBase()->GetSpellInfo()->AuraInterruptFlags;
764
766 if (spell->getState() == SPELL_STATE_CASTING)
767 m_interruptMask |= spell->m_spellInfo->ChannelInterruptFlags;
768}

References CURRENT_CHANNELED_SPELL, m_currentSpells, m_interruptableAuras, m_interruptMask, and SPELL_STATE_CASTING.

Referenced by _UnapplyAura(), Spell::finish(), and RemoveAurasWithInterruptFlags().

◆ UpdateMaxHealth()

virtual void Unit::UpdateMaxHealth ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateMaxPower()

virtual void Unit::UpdateMaxPower ( Powers  power)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateObjectVisibility()

◆ UpdateOrientation()

void Unit::UpdateOrientation ( float  orientation)

Only server-side orientation update, does not broadcast to client.

20335{
20336 SetOrientation(orientation);
20337 if (IsVehicle())
20339}

References GetVehicleKit(), IsVehicle(), Vehicle::RelocatePassengers(), and Position::SetOrientation().

Referenced by Spell::UpdateChanneledTargetList(), and UpdatePosition().

◆ UpdatePosition() [1/2]

bool Unit::UpdatePosition ( const Position pos,
bool  teleport = false 
)
inline

◆ UpdatePosition() [2/2]

bool Unit::UpdatePosition ( float  x,
float  y,
float  z,
float  ang,
bool  teleport = false 
)
virtual

Reimplemented in Player.

20297{
20298 if (!Acore::IsValidMapCoord(x, y, z, orientation))
20299 return false;
20300
20301 float old_orientation = GetOrientation();
20302 float current_z = GetPositionZ();
20303 bool turn = (old_orientation != orientation);
20304 bool relocated = (teleport || GetPositionX() != x || GetPositionY() != y || current_z != z);
20305
20306 if (!GetVehicle())
20307 {
20308 uint32 mask = 0;
20309 if (turn) mask |= AURA_INTERRUPT_FLAG_TURNING;
20310 if (relocated) mask |= AURA_INTERRUPT_FLAG_MOVE;
20311 if (mask)
20313 }
20314
20315 if (relocated)
20316 {
20317 if (GetTypeId() == TYPEID_PLAYER)
20318 GetMap()->PlayerRelocation(ToPlayer(), x, y, z, orientation);
20319 else
20320 GetMap()->CreatureRelocation(ToCreature(), x, y, z, orientation);
20321 }
20322 else if (turn)
20323 {
20324 UpdateOrientation(orientation);
20325
20326 if (GetTypeId() == TYPEID_PLAYER && ToPlayer()->GetFarSightDistance())
20328 }
20329
20330 return (relocated || turn);
20331}
bool IsValidMapCoord(float c)
Definition: GridDefines.h:216
void UpdateOrientation(float orientation)
Only server-side orientation update, does not broadcast to client.
Definition: Unit.cpp:20334
void PlayerRelocation(Player *, float x, float y, float z, float o)
Definition: Map.cpp:1003
void CreatureRelocation(Creature *creature, float x, float y, float z, float o)
Definition: Map.cpp:1025

References AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, Map::CreatureRelocation(), WorldObject::GetMap(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::GetTypeId(), GetVehicle(), Acore::IsValidMapCoord(), Map::PlayerRelocation(), RemoveAurasWithInterruptFlags(), Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, UpdateObjectVisibility(), and UpdateOrientation().

Referenced by npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_taldaram::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleMoveRootAck(), WorldSession::HandleMoveUnRootAck(), boss_flame_leviathan::boss_flame_leviathanAI::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), NearTeleportTo(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), boss_skadi::boss_skadiAI::Reset(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_escortAI::SetNextWaypoint(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), Player::UpdatePosition(), and UpdateSplinePosition().

◆ UpdateReactives()

void Unit::UpdateReactives ( uint32  p_time)
17206{
17207 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
17208 {
17209 ReactiveType reactive = ReactiveType(i);
17210
17211 if (!m_reactiveTimer[reactive])
17212 continue;
17213
17214 if (m_reactiveTimer[reactive] <= p_time)
17215 {
17216 m_reactiveTimer[reactive] = 0;
17217
17218 switch (reactive)
17219 {
17220 case REACTIVE_DEFENSE:
17223 break;
17227 break;
17228 case REACTIVE_OVERPOWER:
17229 if (getClass() == CLASS_WARRIOR)
17230 {
17232 }
17233 break;
17235 if (IsHunterPet())
17237 break;
17238 default:
17239 break;
17240 }
17241 }
17242 else
17243 {
17244 m_reactiveTimer[reactive] -= p_time;
17245 }
17246 }
17247}
ReactiveType
Definition: Unit.h:1213

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), getClass(), HasAuraState(), IsHunterPet(), m_reactiveTimer, MAX_REACTIVE, ModifyAuraState(), REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, and REACTIVE_WOLVERINE_BITE.

Referenced by Update().

◆ UpdateResistances()

virtual void Unit::UpdateResistances ( uint32  school)
pure virtual

Implemented in Creature, Player, and Totem.

Referenced by HandleStatModifier(), and UpdateAllResistances().

◆ UpdateSpeed()

void Unit::UpdateSpeed ( UnitMoveType  mtype,
bool  forced 
)
Todo:
possible affect only on MOVE_RUN
14239{
14240 int32 main_speed_mod = 0;
14241 float stack_bonus = 1.0f;
14242 float non_stack_bonus = 1.0f;
14243
14244 switch (mtype)
14245 {
14246 // Only apply debuffs
14247 case MOVE_FLIGHT_BACK:
14248 case MOVE_RUN_BACK:
14249 case MOVE_SWIM_BACK:
14250 case MOVE_WALK:
14251 break;
14252 case MOVE_RUN:
14253 {
14254 if (IsMounted()) // Use on mount auras
14255 {
14259 }
14260 else
14261 {
14265 }
14266 break;
14267 }
14268 case MOVE_SWIM:
14269 {
14270 // xinef: check for forced_speed_mod of sea turtle
14272 for (Unit::AuraEffectList::const_iterator itr = swimAuras.begin(); itr != swimAuras.end(); ++itr)
14273 {
14274 // xinef: sea turtle only, it is not affected by any increasing / decreasing effects
14275 if ((*itr)->GetId() == 64731 /*SPELL_SEA_TURTLE*/)
14276 {
14277 SetSpeed(mtype, AddPct(non_stack_bonus, (*itr)->GetAmount()), forced);
14278 return;
14279 }
14280 else if (
14281 // case: increase speed
14282 ((*itr)->GetAmount() > 0 && (*itr)->GetAmount() > main_speed_mod) ||
14283 // case: decrease speed
14284 ((*itr)->GetAmount() < 0 && (*itr)->GetAmount() < main_speed_mod)
14285 )
14286 {
14287 main_speed_mod = (*itr)->GetAmount();
14288 }
14289 }
14290 break;
14291 }
14292 case MOVE_FLIGHT:
14293 {
14294 if (GetTypeId() == TYPEID_UNIT && IsControlledByPlayer()) // not sure if good for pet
14295 {
14298
14299 // for some spells this mod is applied on vehicle owner
14300 int32 owner_speed_mod = 0;
14301
14302 if (Unit* owner = GetCharmer())
14303 owner_speed_mod = owner->GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED);
14304
14305 main_speed_mod = std::max(main_speed_mod, owner_speed_mod);
14306 }
14307 else if (IsMounted())
14308 {
14311 }
14312 else // Use not mount (shapeshift for example) auras (should stack)
14314
14316
14317 // Update speed for vehicle if available
14318 if (GetTypeId() == TYPEID_PLAYER && GetVehicle())
14320 break;
14321 }
14322 default:
14323 LOG_ERROR("entities.unit", "Unit::UpdateSpeed: Unsupported move type ({})", mtype);
14324 return;
14325 }
14326
14327 // now we ready for speed calculation
14328 float speed = std::max(non_stack_bonus, stack_bonus);
14329 if (main_speed_mod)
14330 AddPct(speed, main_speed_mod);
14331
14332 switch (mtype)
14333 {
14334 case MOVE_RUN:
14335 case MOVE_SWIM:
14336 case MOVE_FLIGHT:
14337 {
14338 // Set creature speed rate
14339 if (GetTypeId() == TYPEID_UNIT)
14340 {
14341 if (IsPet() && ToPet()->isControlled() && IsControlledByPlayer())
14342 {
14343 // contant value for player pets
14344 speed *= 1.15f;
14345 }
14346 else
14347 {
14348 speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached
14349 }
14350 }
14351
14352 // Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need
14355 {
14356 if (Creature* creature = ToCreature())
14357 {
14358 uint32 immuneMask = creature->GetCreatureTemplate()->MechanicImmuneMask;
14359 if (immuneMask & (1 << (MECHANIC_SNARE - 1)) || immuneMask & (1 << (MECHANIC_DAZE - 1)))
14360 break;
14361 }
14362
14363 // Use speed from aura
14364 float max_speed = normalization / (IsControlledByPlayer() ? playerBaseMoveSpeed[mtype] : baseMoveSpeed[mtype]);
14365 if (speed > max_speed)
14366 speed = max_speed;
14367 }
14368 break;
14369 }
14370 default:
14371 break;
14372 }
14373
14374 int32 slowFromHealth = 0;
14375 Creature* creature = ToCreature();
14376 // ignore pets, player owned vehicles, and mobs immune to snare
14377 if (creature
14378 && !IsPet()
14379 && !(IsControlledByPlayer() && IsVehicle())
14381 && !(creature->IsDungeonBoss()))
14382 {
14383 // 1.6% for each % under 30.
14384 // use min(0, health-30) so that we don't boost mobs above 30.
14385 slowFromHealth = (int32) std::min(0.0f, (1.66f * (GetHealthPct() - 30.0f)));
14386 }
14387
14388 if (slowFromHealth)
14389 {
14390 AddPct(speed, slowFromHealth);
14391 }
14392
14393 // Apply strongest slow aura mod to speed
14395 if (slow)
14396 AddPct(speed, slow);
14397
14398 if (float minSpeedMod = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MINIMUM_SPEED))
14399 {
14400 float base_speed = (GetTypeId() == TYPEID_UNIT ? ToCreature()->GetCreatureTemplate()->speed_run : 1.0f);
14401 float min_speed = base_speed * (minSpeedMod / 100.0f);
14402 if (speed < min_speed)
14403 speed = min_speed;
14404 }
14405
14406 SetSpeed(mtype, speed, forced);
14407}
@ SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK
Definition: SpellAuraDefines.h:274
@ SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED
Definition: SpellAuraDefines.h:271
@ SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS
Definition: SpellAuraDefines.h:272
@ SPELL_AURA_MOD_INCREASE_SPEED
Definition: SpellAuraDefines.h:94
@ SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK
Definition: SpellAuraDefines.h:235
@ SPELL_AURA_MOD_SPEED_NOT_STACK
Definition: SpellAuraDefines.h:234
@ SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED
Definition: SpellAuraDefines.h:269
@ SPELL_AURA_MOD_INCREASE_SWIM_SPEED
Definition: SpellAuraDefines.h:121
@ SPELL_AURA_MOD_VEHICLE_SPEED_ALWAYS
Definition: SpellAuraDefines.h:273
@ SPELL_AURA_MOD_MINIMUM_SPEED
Definition: SpellAuraDefines.h:368
@ SPELL_AURA_MOD_SPEED_ALWAYS
Definition: SpellAuraDefines.h:192
@ SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS
Definition: SpellAuraDefines.h:193
@ SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED
Definition: SpellAuraDefines.h:95
@ SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED
Definition: SpellAuraDefines.h:254
@ MECHANIC_DAZE
Definition: SharedDefines.h:1352
float speed_run
Definition: CreatureData.h:194
void SetSpeed(UnitMoveType mtype, float rate, bool forced=false)
Definition: Unit.cpp:14414

References AddPct(), baseMoveSpeed, GetAuraEffectsByType(), GetCharmer(), Creature::GetCreatureTemplate(), GetHealthPct(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), GetTotalAuraModifier(), GetTotalAuraMultiplier(), Object::GetTypeId(), GetVehicle(), GetVehicleBase(), Creature::HasMechanicTemplateImmunity(), IsControlledByPlayer(), Creature::IsDungeonBoss(), IsMounted(), IsPet(), IsVehicle(), LOG_ERROR, MECHANIC_DAZE, MECHANIC_SNARE, MOVE_FLIGHT, MOVE_FLIGHT_BACK, MOVE_RUN, MOVE_RUN_BACK, MOVE_SWIM, MOVE_SWIM_BACK, MOVE_WALK, playerBaseMoveSpeed, SetSpeed(), CreatureTemplate::speed_run, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK, SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED, SPELL_AURA_MOD_INCREASE_SPEED, SPELL_AURA_MOD_INCREASE_SWIM_SPEED, SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED, SPELL_AURA_MOD_MINIMUM_SPEED, SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK, SPELL_AURA_MOD_SPEED_ALWAYS, SPELL_AURA_MOD_SPEED_NOT_STACK, SPELL_AURA_MOD_VEHICLE_SPEED_ALWAYS, SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED, Object::ToCreature(), ToPet(), TYPEID_PLAYER, TYPEID_UNIT, and UpdateSpeed().

Referenced by Creature::DoFleeToGetAssistance(), AuraEffect::HandleAuraModDecreaseSpeed(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModIncreaseSpeed(), AuraEffect::HandleAuraModIncreaseSwimSpeed(), AuraEffect::HandleAuraModUseNormalSpeed(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), RemoveCharmedBy(), SetHealth(), SetInCombatState(), SetSpeed(), and UpdateSpeed().

◆ UpdateSplineMovement()

void Unit::UpdateSplineMovement ( uint32  t_diff)
private
595{
596 if (movespline->Finalized())
597 return;
598
599 // xinef: process movementinform
600 // this code cant be placed inside EscortMovementGenerator, because we cant delete active MoveGen while it is updated
601 SplineHandler handler(this);
602 movespline->updateState(t_diff, handler);
603 // Xinef: Spline was cleared by StopMoving, return
604 if (!movespline->Initialized())
605 {
607 return;
608 }
609
610 bool arrived = movespline->Finalized();
611
612 if (arrived)
613 {
615
618 }
619
620 // pussywizard: update always! not every 400ms, because movement generators need the actual position
621 //m_movesplineTimer.Update(t_diff);
622 //if (m_movesplineTimer.Passed() || arrived)
624}
@ UNIT_BYTES_1_OFFSET_ANIM_TIER
Definition: Unit.h:47
Definition: Unit.cpp:574
uint8 GetAnimationType() const
Definition: MoveSpline.h:125
void updateState(int32 difftime, UpdateHandler &handler)
Definition: MoveSpline.h:98
bool HasAnimation() const
Definition: MoveSpline.h:124

References DisableSpline(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::GetAnimationType(), Object::GetTypeId(), Movement::MoveSpline::HasAnimation(), Movement::MoveSpline::Initialized(), IsAlive(), movespline, Object::SetByteValue(), TYPEID_UNIT, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_FIELD_BYTES_1, UpdateSplinePosition(), and Movement::MoveSpline::updateState().

Referenced by Update().

◆ UpdateSplinePosition()

void Unit::UpdateSplinePosition ( )
private
627{
628 //static uint32 const positionUpdateDelay = 400;
629
630 //m_movesplineTimer.Reset(positionUpdateDelay);
632
634 {
636 pos.m_positionX = loc.x;
637 pos.m_positionY = loc.y;
638 pos.m_positionZ = loc.z;
640
641 if (TransportBase* transport = GetDirectTransport())
642 transport->CalculatePassengerPosition(loc.x, loc.y, loc.z, &loc.orientation);
643 }
644
645 // Xinef: if we had spline running update orientation along with position
646 //if (HasUnitState(UNIT_STATE_CANNOT_TURN))
647 // loc.orientation = GetOrientation();
648
649 if (GetTypeId() == TYPEID_PLAYER)
650 UpdatePosition(loc.x, loc.y, loc.z, loc.orientation);
651 else
652 ToCreature()->SetPosition(loc.x, loc.y, loc.z, loc.orientation);
653}
void SetPosition(float x, float y, float z, float o)
Definition: Creature.cpp:3072
Position pos
Definition: Object.h:285
float m_positionZ
Definition: Position.h:58
float m_positionX
Definition: Position.h:56
float m_positionY
Definition: Position.h:57
TransportBase * GetDirectTransport() const
Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
Definition: Unit.cpp:19031
Definition: VehicleDefines.h:107
Definition: MoveSpline.h:27
float orientation
Definition: MoveSpline.h:33
Location ComputePosition() const
Definition: MoveSpline.cpp:26
bool onTransport
Definition: MoveSpline.h:127

References Movement::MoveSpline::ComputePosition(), GetDirectTransport(), Object::GetTypeId(), WorldObject::m_movementInfo, Position::m_positionX, Position::m_positionY, Position::m_positionZ, movespline, Movement::MoveSpline::onTransport, Movement::Location::orientation, MovementInfo::TransportInfo::pos, Position::SetOrientation(), Creature::SetPosition(), Object::ToCreature(), MovementInfo::transport, TYPEID_PLAYER, and UpdatePosition().

Referenced by StopMoving(), and UpdateSplineMovement().

◆ UpdateStats()

virtual bool Unit::UpdateStats ( Stats  stat)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ Whisper() [1/2]

void Unit::Whisper ( std::string_view  text,
Language  language,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21436{
21437 if (!target)
21438 {
21439 return;
21440 }
21441
21443 WorldPacket data;
21444 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, language, this, target, text, 0, "", locale);
21445 target->SendDirectMessage(&data);
21446}
LocaleConstant
Definition: Common.h:67
@ CHAT_MSG_MONSTER_WHISPER
Definition: SharedDefines.h:3167
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition: SharedDefines.h:3194
static size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="")
Definition: Chat.cpp:201
LocaleConstant GetSessionDbLocaleIndex() const
Definition: WorldSession.h:500

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), and Player::SendDirectMessage().

Referenced by npc_commandscript::HandleNpcWhisperCommand(), Map::ScriptsProcess(), and boss_zuramat::boss_zuramatAI::UpdateAI().

◆ Whisper() [2/2]

void Unit::Whisper ( uint32  textId,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21478{
21479 if (!target)
21480 {
21481 return;
21482 }
21483
21484 BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId);
21485 if (!bct)
21486 {
21487 LOG_ERROR("entities.unit", "Unit::Whisper: `broadcast_text` was not {} found", textId);
21488 return;
21489 }
21490
21492 WorldPacket data;
21493 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
21494 target->SendDirectMessage(&data);
21495}
Definition: ObjectMgr.h:435
std::string const & GetText(LocaleConstant locale=DEFAULT_LOCALE, uint8 gender=GENDER_MALE, bool forceGender=false) const
Definition: ObjectMgr.h:457

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, getGender(), Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), BroadcastText::GetText(), LANG_UNIVERSAL, LOG_ERROR, Player::SendDirectMessage(), and sObjectMgr.

◆ Yell() [1/2]

◆ Yell() [2/2]

void Unit::Yell ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21468{
21469 Talk(textId, CHAT_MSG_MONSTER_YELL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target);
21470}

References CHAT_MSG_MONSTER_YELL, CONFIG_LISTEN_RANGE_YELL, and sWorld.

Member Data Documentation

◆ _charmThreatInfo

CharmThreatMap Unit::_charmThreatInfo
protected

Referenced by RemoveCharmedBy().

◆ _instantCast

bool Unit::_instantCast
protected

◆ _isWalkingBeforeCharm

bool Unit::_isWalkingBeforeCharm
private

Are we walking before we were charmed?

Referenced by SetCharm(), and Unit().

◆ _lastDamagedTargetGuid

◆ _lastExtraAttackSpell

uint32 Unit::_lastExtraAttackSpell
private

◆ _lastLiquid

LiquidTypeEntry const* Unit::_lastLiquid
protected

◆ _oldFactionId

uint32 Unit::_oldFactionId
private

faction before charm

Referenced by GetOldFactionId(), RemoveCharmedBy(), SetCharmedBy(), and Unit().

◆ _redirectThreatInfo

◆ bRequestForcedVisibilityUpdate

◆ extraAttacksTargets

std::unordered_map<ObjectGuid , uint32 > Unit::extraAttacksTargets
private

Referenced by AddExtraAttacks(), and Update().

◆ i_AI

◆ i_disabledAI

UnitAI * Unit::i_disabledAI
protected

Referenced by UpdateCharmAI().

◆ i_motionMaster

MotionMaster* Unit::i_motionMaster
protected

Referenced by GetMotionMaster(), and ~Unit().

◆ IsAIEnabled

◆ m_appliedAuras

◆ m_applyResilience

bool Unit::m_applyResilience
protected

◆ m_attackers

◆ m_attacking

Unit* Unit::m_attacking
protected

◆ m_attackTimer

◆ m_auraModifiersGroup

◆ m_auraStateAuras

◆ m_auraUpdateIterator

AuraMap::iterator Unit::m_auraUpdateIterator
protected

◆ m_AutoRepeatFirstCast

bool Unit::m_AutoRepeatFirstCast
protected

◆ m_baseSpellCritChance

◆ m_canDualWield

bool Unit::m_canDualWield

◆ m_canModifyStats

bool Unit::m_canModifyStats
protected

◆ m_charmInfo

◆ m_cleanupDone

bool Unit::m_cleanupDone
private

◆ m_CombatTimer

uint32 Unit::m_CombatTimer
private

◆ m_ComboPointHolders

std::unordered_set<Unit*> Unit::m_ComboPointHolders
private

◆ m_comboPoints

int8 Unit::m_comboPoints
private

◆ m_comboTarget

◆ m_Controlled

◆ m_ControlledByPlayer

bool Unit::m_ControlledByPlayer

◆ m_CreatedByPlayer

bool Unit::m_CreatedByPlayer

◆ m_createStats

float Unit::m_createStats[MAX_STATS]
protected

◆ m_currentSpells

◆ m_deathState

◆ m_delayed_unit_ai_notify_timer

uint16 Unit::m_delayed_unit_ai_notify_timer

Referenced by Unit(), and Update().

◆ m_delayed_unit_relocation_timer

◆ m_Diminishing

◆ m_duringRemoveFromWorld

bool Unit::m_duringRemoveFromWorld
private

◆ m_dynObj

◆ m_Events

EventProcessor Unit::m_Events

Referenced by _ApplyAura(), _ExitVehicle(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Activate(), CharmInfo::AddSpellToActionBar(), Spell::AddUnitTarget(), spell_sindragosa_ice_tomb::spell_sindragosa_ice_tomb_AuraScript::AfterApply(), Creature::CallAssistance(), CastDelayedSpellWithPeriodicAmount(), boss_murmur::CastSupressionOOC(), CleanupBeforeRemoveFromMap(), boss_romulo::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), boss_julianne::DoAction(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::DoAction(), boss_cthun::DoAction(), boss_ouro::Emerge(), SpellEvent::Execute(), BattleExperienceEvent::Execute(), UtherBatteredHiltEvent::Execute(), TriggerWickedSpirit::Execute(), lapseTeleport::Execute(), PartyTimeEmoteEvent::Execute(), npc_xt002_boombot::npc_xt002_boombotAI::Explode(), Creature::ForcedDespawn(), WorldSession::HandleAuctionListOwnerItems(), spell_item_party_time::HandleEffectApply(), spell_alar_flame_quills::spell_alar_flame_quills_AuraScript::HandlePeriodic(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), boss_ambassador_hellmaw::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), Totem::InitSummon(), npc_swarm_scarab::npc_swarm_scarabAI::JustDied(), npc_nerubian_burrower::npc_nerubian_burrowerAI::JustDied(), npc_gunship::npc_gunshipAI::JustDied(), npc_xt002_boombot::npc_xt002_boombotAI::JustDied(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::JustDied(), boss_swamplord_muselek::JustEngagedWith(), boss_murmur::JustEngagedWith(), boss_hydross_the_unstable::JustEngagedWith(), boss_kiljaeden::boss_kiljaedenAI::JustSummoned(), boss_hazzarah::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_prince_valanar_icc::boss_prince_valanarAI::JustSummoned(), boss_sindragosa::boss_sindragosaAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::JustSummoned(), npc_risen_archmage::npc_risen_archmageAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), Creature::ModifyThreatPercentTemp(), boss_ebonroc::boss_ebonrocAI::MovementInform(), boss_captain_skarloc::MovementInform(), boss_ayamiss::MovementInform(), boss_essence_of_suffering::boss_essence_of_sufferingAI::MovementInform(), boss_essence_of_desire::boss_essence_of_desireAI::MovementInform(), npc_kalecgos::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), boss_ghazan::MovementInform(), spell_halion_twilight_realm::spell_halion_twilight_realm_AuraScript::OnApply(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), go_main_chambers_access_panel::OnGossipHello(), spell_halion_leave_twilight_realm::spell_halion_leave_twilight_realm_AuraScript::OnRemove(), at_cthun_stomach_exit::OnTrigger(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnUnitDeath(), npc_hyldsmeet_protodrake::npc_hyldsmeet_protodrakeAI::PassengerBoarded(), boss_ambassador_hellmaw::PathEndReached(), npc_hive_zara_swarmer::PathEndReached(), Spell::prepare(), SmartScript::ProcessAction(), Spell::RecalculateDelayMomentForDst(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::Reset(), NPCStaveQuestAI::ResetState(), npc_gunship_boarding_addAI::SetData(), boss_the_beast::boss_thebeastAI::SetData(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::SummonedCreatureDies(), boss_hydross_the_unstable::SummonMovementInform(), boss_hydross_the_unstable::SummonTaintedElementalOOC(), CreatureAI::Talk(), TempSummon::UnSummon(), Totem::UnSummon(), spell_illidari_council_deadly_strike::spell_illidari_council_deadly_strike_AuraScript::Update(), Update(), boss_felmyst::boss_felmystAI::UpdateAI(), and boss_anomalus::boss_anomalusAI::UpdateAI().

◆ m_extraAttacks

uint32 Unit::m_extraAttacks

◆ m_FollowingRefMgr

FollowerRefMgr Unit::m_FollowingRefMgr
private

Referenced by addFollower().

◆ m_gameObj

◆ m_HostileRefMgr

HostileRefMgr Unit::m_HostileRefMgr
private

◆ m_interruptableAuras

◆ m_interruptMask

◆ m_last_notify_mstime

uint32 Unit::m_last_notify_mstime

◆ m_last_notify_position

◆ m_lastManaUse

uint32 Unit::m_lastManaUse
private

◆ m_lastSanctuaryTime

uint32 Unit::m_lastSanctuaryTime

◆ m_modAttackSpeedPct

◆ m_modAuras

◆ m_modMeleeHitChance

◆ m_modRangedHitChance

◆ m_modSpellHitChance

◆ m_movedByPlayer

◆ m_ObjectSlot

◆ m_ownedAuras

◆ m_petAuras

PetAuraSet Unit::m_petAuras

◆ m_procDeep

int32 Unit::m_procDeep
protected

Referenced by CanProc(), and SetCantProc().

◆ m_race

uint8 Unit::m_race
protected

◆ m_reactiveTimer

uint32 Unit::m_reactiveTimer[MAX_REACTIVE]
protected

◆ m_realRace

uint8 Unit::m_realRace
protected

◆ m_regenTimer

◆ m_removedAuras

AuraList Unit::m_removedAuras
protected

◆ m_removedAurasCount

uint32 Unit::m_removedAurasCount
protected

◆ m_rootTimes

uint32 Unit::m_rootTimes
protected

Referenced by SetRooted(), and Unit().

◆ m_scAuras

AuraList Unit::m_scAuras
protected

Referenced by GetSingleCastAuras().

◆ m_sharedVision

◆ m_speed_rate

float Unit::m_speed_rate[MAX_MOVE_TYPE]
protected

◆ m_spellImmune

◆ m_state

uint32 Unit::m_state
private

◆ m_SummonSlot

◆ m_ThreatMgr

◆ m_threatModifier

float Unit::m_threatModifier[MAX_SPELL_SCHOOL]

◆ m_transform

uint32 Unit::m_transform
protected

Referenced by getTransForm(), setTransForm(), and Unit().

◆ m_unitTypeMask

◆ m_vehicle

◆ m_vehicleKit

Vehicle* Unit::m_vehicleKit
protected

◆ m_visibleAuras

◆ m_weaponDamage

◆ movespline

◆ NeedChangeAI

bool Unit::NeedChangeAI

◆ SafeUnitPointerSet

std::set<SafeUnitPointer*> Unit::SafeUnitPointerSet