AzerothCore 3.3.5a
OpenSource WoW Emulator
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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
 
void Update (uint32 time) override
 
UnitAIGetAI ()
 
void SetAI (UnitAI *newAI)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void CleanupBeforeRemoveFromMap (bool finalCleanup)
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
virtual bool isBeingLoaded () const
 
bool IsDuringRemoveFromWorld () const
 
void SetUInt32Value (uint16 index, uint32 value)
 
UnitGetOwner () const
 
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
 
ObjectGuid GetTransGUID () const override
 
PetToPet ()
 
TotemToTotem ()
 
TempSummonToTempSummon ()
 
const TempSummonToTempSummon () const
 
void AddUnitState (uint32 f)
 
bool HasUnitState (const uint32 f) const
 
void ClearUnitState (uint32 f)
 
uint32 GetUnitState () const
 
uint32 HasUnitTypeMask (uint32 mask) const
 
void AddUnitTypeMask (uint32 mask)
 
uint32 GetUnitTypeMask () const
 
UnitFlags GetUnitFlags () const
 
bool HasUnitFlag (UnitFlags flags) const
 
void SetUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h.
 
void RemoveUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h.
 
void ReplaceAllUnitFlags (UnitFlags flags)
 Remove the Unit flag specify only.
 
UnitFlags2 GetUnitFlags2 () const
 Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h.
 
bool HasUnitFlag2 (UnitFlags2 flags) const
 
void SetUnitFlag2 (UnitFlags2 flags)
 
void RemoveUnitFlag2 (UnitFlags2 flags)
 
void ReplaceAllUnitFlags2 (UnitFlags2 flags)
 
void SetEmoteState (Emote emoteState)
 
void ClearEmoteState ()
 Sets emote state (looping emote). Emotes available in SharedDefines.h.
 
NPCFlags GetNpcFlags () const
 Clears emote state (looping emote)
 
bool HasNpcFlag (NPCFlags flags) const
 
void SetNpcFlag (NPCFlags flags)
 
void RemoveNpcFlag (NPCFlags flags)
 
void ReplaceAllNpcFlags (NPCFlags flags)
 
uint32 GetDynamicFlags () const override
 
void ReplaceAllDynamicFlags (uint32 flag) override
 
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)
 
bool IsSummon () const
 
bool IsGuardian () const
 
bool IsControllableGuardian () const
 
bool IsPet () const
 
bool IsHunterPet () const
 
bool IsTotem () const
 
bool IsVehicle () const
 
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
 
uint32 GetCreatureType () const
 
uint32 GetCreatureTypeMask () const
 
bool IsCritter () const
 
uint8 getRace (bool original=false) const
 
void setRace (uint8 race)
 
uint32 getRaceMask () const
 
DisplayRace GetDisplayRaceFromModelId (uint32 modelId) const
 
DisplayRace GetDisplayRace () const
 
uint8 getClass () const
 
virtual bool IsClass (Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
 
uint32 getClassMask () const
 
uint8 getGender () const
 
uint32 GetFaction () const
 
FactionTemplateEntry const * GetFactionTemplateEntry () const
 
void SetFaction (uint32 faction)
 
void RestoreFaction ()
 
uint32 GetOldFactionId () const
 
ObjectGuid GetTarget () const
 
virtual void SetTarget (ObjectGuid=ObjectGuid::Empty)=0
 
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
 
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
 
void setAttackTimer (WeaponAttackType type, int32 time)
 
void resetAttackTimer (WeaponAttackType type=BASE_ATTACK)
 
int32 getAttackTimer (WeaponAttackType type) const
 
bool isAttackReady (WeaponAttackType type=BASE_ATTACK) 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
 
UnitgetAttackerForHelper () const
 
bool Attack (Unit *victim, bool meleeAttack)
 
void CastStop (uint32 except_spellid=0, bool withInstant=true)
 Interrupt the unit cast for all the current spells.
 
bool AttackStop ()
 Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client.
 
void RemoveAllAttackers ()
 Remove all units in m_attackers list and send them AttackStop()
 
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)
 Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead.
 
void SendMeleeAttackStart (Unit *victim, Player *sendTo=nullptr)
 
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)
 
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 CanHaveThreatList (bool skipAliveCheck=false) 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 ()
 
void SetRedirectThreat (ObjectGuid guid, uint32 pct)
 
void ResetRedirectThreat ()
 
void ModifyRedirectThreat (int32 amount)
 
uint32 GetRedirectThreatPercent ()
 
UnitGetRedirectThreatTarget () const
 
void SetLastDamagedTargetGuid (ObjectGuid const &guid)
 
ObjectGuid const & GetLastDamagedTargetGuid () const
 
void AttackerStateUpdate (Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
 
bool haveOffhandWeapon () const
 
bool CanDualWield () const
 
virtual void SetCanDualWield (bool value)
 
virtual bool HasWeapon (WeaponAttackType type) const =0
 
bool HasMainhandWeapon () const
 
bool HasOffhandWeapon () const
 
bool HasRangedWeapon () const
 
bool hasMainhandWeaponForAttack () const
 
virtual bool HasWeaponForAttack (WeaponAttackType type) const
 
bool HasMainhandWeaponForAttack () const
 
bool HasOffhandWeaponForAttack () const
 
bool HasRangedWeaponForAttack () const
 
bool CanUseAttackType (uint8 attacktype) const
 
void HandleProcExtraAttackFor (Unit *victim, uint32 count)
 
void SetLastExtraAttackSpell (uint32 spellId)
 
uint32 GetLastExtraAttackSpell () const
 
void AddExtraAttacks (uint32 count)
 
uint8 GetComboPoints (Unit const *who=nullptr) const
 
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 AddComboPointHolder (Unit *unit)
 
void RemoveComboPointHolder (Unit *unit)
 
void ClearComboPointHolders ()
 
void SetContestedPvP (Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
 
bool IsContestedGuard () const
 
bool RespondsToCallForHelp () const
 
bool IsInSanctuary () const
 
bool IsPvP () const
 
bool IsFFAPvP () const
 
void SetPvP (bool state)
 
float GetStat (Stats stat) const
 
void SetStat (Stats stat, int32 val)
 
Stats GetStatByAuraGroup (UnitMods unitMod) const
 
float GetCreateStat (Stats stat) const
 
void SetCreateStat (Stats stat, float val)
 
float GetPosStat (Stats stat) const
 
float GetNegStat (Stats stat) const
 
void InitStatBuffMods ()
 
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
 
void SetCanModifyStats (bool modifyStats)
 
bool CanModifyStats () const
 
void ApplyStatBuffMod (Stats stat, float val, bool apply)
 
void ApplyStatPercentBuffMod (Stats stat, float val, bool apply)
 
uint8 GetLevel () const
 
uint8 getLevelForTarget (WorldObject const *) const override
 
void SetLevel (uint8 lvl, bool showLevelChange=true)
 
uint32 GetHealth () const
 
uint32 GetMaxHealth () const
 
float GetHealthPct () const
 
int32 GetHealthGain (int32 dVal)
 
uint32 GetCreateHealth () 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
 
uint32 CountPctFromMaxHealth (int32 pct) const
 
uint32 CountPctFromCurHealth (int32 pct) const
 
void SetHealth (uint32 val)
 
void SetMaxHealth (uint32 val)
 
void SetFullHealth ()
 
int32 ModifyHealth (int32 val)
 
void SetCreateHealth (uint32 val)
 
Powers getPowerType () const
 
virtual bool HasActivePowerType (Powers power)
 
Powers GetPowerTypeByAuraGroup (UnitMods unitMod) const
 
uint32 GetPower (Powers power) const
 
uint32 GetMaxPower (Powers power) const
 
float GetPowerPct (Powers power) const
 
uint32 GetCreatePowers (Powers power) const
 
void setPowerType (Powers power)
 
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)
 
void RewardRage (uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
 
uint32 GetCreateMana () const
 
void SetCreateMana (uint32 val)
 
bool CanRestoreMana (SpellInfo const *spellInfo) const
 
void SetLastManaUse (uint32 spellCastTime)
 
bool IsUnderLastManaUseEffect () const
 
float GetAPMultiplier (WeaponAttackType attType, bool normalized)
 
uint32 GetArmor () const
 
void SetArmor (int32 val)
 
float GetUnitDodgeChance () const
 
float GetUnitParryChance () const
 
float GetUnitBlockChance () const
 
float GetUnitMissChance (WeaponAttackType attType) const
 
float GetUnitCriticalChance (WeaponAttackType attackType, Unit const *victim) 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
 
bool CanApplyResilience () 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
 
int32 GetMechanicResistChance (SpellInfo const *spell)
 
uint32 GetResistance (SpellSchoolMask mask) const
 
uint32 GetResistance (SpellSchools school) const
 
float GetResistanceBuffMods (SpellSchools school, bool positive) const
 
void SetResistance (SpellSchools school, int32 val)
 
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)
 
uint16 GetMaxSkillValueForLevel (Unit const *target=nullptr) const
 
float GetTotalAuraModValue (UnitMods unitMod) const
 
SpellSchools GetSpellSchoolByAuraGroup (UnitMods unitMod) const
 
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 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)
 
void DealMeleeDamage (CalcDamageInfo *damageInfo, bool durabilityLoss)
 
void DealSpellDamage (SpellNonMeleeDamage *damageInfo, bool durabilityLoss, Spell const *spell=nullptr)
 
void KillSelf (bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
uint32 CalculateDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
 
virtual void CalculateMinMaxDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0
 
void CalculateMeleeDamage (Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
 
void CalculateSpellDamageTaken (SpellNonMeleeDamage *damageInfo, int32 damage, SpellInfo const *spellInfo, WeaponAttackType attackType=BASE_ATTACK, bool crit=false)
 
int32 CalculateSpellDamage (Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
 
float CalculateDefaultCoefficient (SpellInfo const *spellInfo, DamageEffectType damagetype) const
 
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)
 
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 CalculateAOEDamageReduction (int32 damage, uint32 schoolMask, bool npcCaster) const
 
uint32 GetMeleeDamageReduction (uint32 damage) const
 
uint32 GetRangedDamageReduction (uint32 damage) const
 
uint32 GetSpellDamageReduction (uint32 damage) const
 
float GetMeleeCritChanceReduction () const
 
float GetRangedCritChanceReduction () const
 
float GetSpellCritChanceReduction () const
 
uint32 GetMeleeCritDamageReduction (uint32 damage) const
 
uint32 GetRangedCritDamageReduction (uint32 damage) const
 
uint32 GetSpellCritDamageReduction (uint32 damage) const
 
CharmInfoGetCharmInfo ()
 
CharmInfoInitCharmInfo ()
 
UnitGetCharmer () const
 
UnitGetCharm () const
 
UnitGetCharmerOrOwner () const
 
UnitGetCharmerOrOwnerOrSelf () const
 
PlayerGetCharmerOrOwnerPlayerOrPlayerItself () const
 
ObjectGuid GetCharmerOrOwnerGUID () const
 
ObjectGuid GetCharmerOrOwnerOrOwnGUID () const
 
PlayerGetAffectingPlayer () const
 
UnitGetFirstControlled () const
 
bool IsControlledByPlayer () const
 
bool IsCreatedByPlayer () const
 
bool IsCharmedOwnedByPlayerOrPlayer () const
 
bool IsCharmed () const
 
bool isPossessed () const
 
bool isPossessedByPlayer () const
 
bool isPossessing () const
 
bool isPossessing (Unit *u) const
 
void SetCharm (Unit *target, bool apply)
 
bool SetCharmedBy (Unit *charmer, CharmType type, AuraApplication const *aurApp=nullptr)
 
void UpdateCharmAI ()
 
void RemoveCharmedBy (Unit *charmer)
 
void RemoveCharmAuras ()
 
void RemoveAllControlled (bool onDeath=false)
 
void DeleteCharmInfo ()
 
virtual bool HasSpellCooldown (uint32) const
 
virtual bool HasSpellItemCooldown (uint32, uint32) const
 
virtual void AddSpellCooldown (uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, PacketCooldowns const &cooldowns)
 
AuraAddAura (uint32 spellId, Unit *target)
 
AuraAddAura (SpellInfo const *spellInfo, uint8 effMask, Unit *target)
 
void SetAuraStack (uint32 spellId, Unit *target, uint32 stack)
 
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 RemoveBindSightAuras ()
 
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 HasAuras (SearchMethod sm, std::vector< uint32 > &spellIds) const
 Check if unit has ANY or ALL specified auras.
 
template<typename... Auras>
bool HasAnyAuras (Auras... spellIds) const
 Checks if the unit has ANY specified auras.
 
template<typename... Auras>
bool HasAllAuras (Auras... spellIds) const
 Checks if the unit has ALL specified auras.
 
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
 
bool HasAuraTypeWithFamilyFlags (AuraType auraType, uint32 familyName, uint32 familyFlags) const
 
bool HasBreakableByDamageAuraType (AuraType type, uint32 excludeAura=0) const
 
bool HasBreakableByDamageCrowdControlAura (Unit *excludeCasterChannel=nullptr) 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
 
VisibleAuraMap const * GetVisibleAuras ()
 
AuraApplicationGetVisibleAura (uint8 slot)
 
void SetVisibleAura (uint8 slot, AuraApplication *aur)
 
void RemoveVisibleAura (uint8 slot)
 
void ModifyAuraState (AuraStateType flag, bool apply)
 
uint32 BuildAuraStateUpdateForTarget (Unit *target) const
 
bool HasAuraState (AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
 
bool CanProc ()
 
void SetCantProc (bool apply)
 
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)
 
float GetWeaponProcChance () const
 
float GetPPMProcChance (uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
 
PlayerGetSpellModOwner () const
 
SpellGetCurrentSpell (CurrentSpellTypes spellType) const
 
SpellGetCurrentSpell (uint32 spellType) const
 
SpellFindCurrentSpellBySpellId (uint32 spell_id) const
 
int32 GetCurrentSpellCastTime (uint32 spell_id) const
 
virtual bool HasSpell (uint32) const
 
void SetCurrentCastedSpell (Spell *pSpell)
 
virtual void ProhibitSpellSchool (SpellSchoolMask, uint32)
 
void SetInstantCast (bool set)
 
bool CanInstantCast () const
 
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)
 
float GetSpellMaxRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
float GetSpellMinRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
uint32 GetInterruptMask () const
 
void AddInterruptMask (uint32 mask)
 
void UpdateInterruptMask ()
 
void InterruptSpell (CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
 
bool isSpellBlocked (Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
 
void FinishSpell (CurrentSpellTypes spellType, bool ok=true)
 
UnitGetMagicHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo)
 
UnitGetMeleeHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo=nullptr)
 
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)
 
void SendHealSpellLog (HealInfo const &healInfo, bool critical=false)
 
int32 HealBySpell (HealInfo &healInfo, bool critical=false)
 
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)
 
void SendEnergizeSpellLog (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void EnergizeBySpell (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
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
 
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
 
float ApplyEffectModifiers (SpellInfo const *spellProto, uint8 effect_index, float value) 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
 
uint32 GetCastingTimeForBonus (SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
 
void CastDelayedSpellWithPeriodicAmount (Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
 
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)
 
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 ()
 
bool IsPolymorphed () const
 
bool isFrozen () const
 
bool IsInFlight () const
 
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 IsMovementPreventedByCasting () const
 
virtual bool CanEnterWater () const =0
 
virtual bool CanSwim () const
 this method checks the current flag of a unit
 
bool CanFreeMove () const
 
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 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)
 
void propagateSpeedChange ()
 
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)
 
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)
 Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().
 
virtual bool SetWaterWalking (bool enable, bool packetOnly=false)
 Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players.
 
virtual bool SetFeatherFall (bool enable, bool packetOnly=false)
 
virtual bool SetHover (bool enable, bool packetOnly=false, bool updateAnimationTier=true)
 
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)
 Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline.
 
void ResumeMovement (uint32 timer=0, uint8 slot=0)
 
void SetControlled (bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
 
void DisableRotate (bool apply)
 
void DisableSpline ()
 
SheathState GetSheath () const
 
virtual void SetSheath (SheathState sheathed)
 
uint8 getStandState () const
 
bool IsSitState () const
 
bool IsStandState () const
 
void SetStandState (uint8 state)
 
void SetStandFlags (uint8 flags)
 
void RemoveStandFlags (uint8 flags)
 
DeathState getDeathState ()
 
virtual void setDeathState (DeathState s, bool despawn=false)
 
bool IsAlive () const
 
bool isDying () const
 
bool isDead () const
 
bool HasGhostAura () const
 
bool HasMountedAura () const
 
bool HasWaterWalkAura () const
 
bool HasFeatherFallAura () const
 
bool HasHoverAura () const
 
bool HasFlyAura () const
 
bool HasSpiritOfRedemptionAura () const
 
bool HasPreventsFleeingAura () const
 
bool HasPreventDurabilityLossAura () const
 
bool HasPreventResurectionAura () const
 
bool HasTransformAura () const
 
bool HasInterruptRegenAura () const
 
bool HasNoPVPCreditAura () const
 
bool HasWaterBreathingAura () const
 
bool HasIgnoreHitDirectionAura () const
 
bool HasSpellMagnetAura () const
 
bool HasOpenStableAura () const
 
bool HasCloneCasterAura () const
 
bool HasReflectSpellsAura () const
 
bool HasDetectAmoreAura () const
 
bool HasAllowOnlyAbilityAura () const
 
bool HasPeriodicDummyAura () const
 
bool HasControlVehicleAura () const
 
bool HasAOECharmAura () const
 
bool HasDetectSpellsAura () const
 
bool HasPacifySilenceAura () const
 
bool HasSilenceAura () const
 
bool HasShapeshiftAura () const
 
bool HasDecreaseSpeedAura () const
 
bool HasPacifyAura () const
 
bool HasIgnoreTargetResistAura () const
 
bool HasIncreaseMountedSpeedAura () const
 
bool HasIncreaseMountedFlightSpeedAura () const
 
bool HasThreatAura () const
 
bool HasAttackerSpellCritChanceAura () const
 
bool HasUnattackableAura () const
 
bool HasHealthRegenInCombatAura () const
 
bool HasRegenDuringCombatAura () const
 
bool HasFearAura () const
 
bool HasConfuseAura () const
 
bool HasRootAura () const
 
bool HasStunAura () const
 
bool HasTauntAura () const
 
bool HasStealthAura () const
 
bool HasStealthDetectAura () const
 
bool HasInvisibilityAura () const
 
bool HasInvisibilityDetectAura () const
 
bool IsHostileTo (Unit const *unit) const
 
bool IsHostileToPlayers () const
 
bool IsFriendlyTo (Unit const *unit) const
 
bool IsNeutralToAll () const
 
void ClearAllReactives ()
 
void StartReactiveTimer (ReactiveType reactive)
 
void UpdateReactives (uint32 p_time)
 
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 ()
 
bool IsInPartyWith (Unit const *unit) const
 
bool IsInRaidWith (Unit const *unit) const
 
void GetPartyMembers (std::list< Unit * > &units)
 
UnitGetNextRandomRaidMemberOrPet (float radius)
 
void UpdateAuraForGroup (uint8 slot)
 
ReputationRank GetReactionTo (Unit const *target, bool checkOriginalFaction=false) const
 
ReputationRank GetFactionReactionTo (FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
 
SharedVisionList const & GetSharedVisionList ()
 
void AddPlayerToVision (Player *player)
 
void RemovePlayerFromVision (Player *player)
 
bool HasSharedVision () const
 
uint32 GetVirtualItemId (uint32 slot) const
 
void SetVirtualItem (uint32 slot, uint32 itemId)
 
bool IsMounted () const
 
uint32 GetMountID () const
 
void Mount (uint32 mount, uint32 vehicleId=0, uint32 creatureEntry=0)
 
void Dismount ()
 
bool IsInDisallowedMountForm () const
 
void addFollower (FollowerReference *pRef)
 
void removeFollower (FollowerReference *)
 
virtual float GetFollowAngle () const
 
GuardianGetGuardianPet () const
 
MinionGetFirstMinion () const
 
CreatureGetCompanionPet () const
 
PetCreateTamedPetFrom (Creature *creatureTarget, uint32 spell_id=0)
 
PetCreateTamedPetFrom (uint32 creatureEntry, uint32 spell_id=0)
 
bool InitTamedPet (Pet *pet, uint8 level, uint32 spell_id)
 
void SetMinion (Minion *minion, bool apply)
 
void GetAllMinionsByEntry (std::list< Creature * > &Minions, uint32 entry)
 
void RemoveAllMinionsByEntry (uint32 entry)
 
void AddPetAura (PetAura const *petSpell)
 
void RemovePetAura (PetAura const *petSpell)
 
void CastPetAura (PetAura const *aura)
 
bool IsPetAura (Aura const *aura)
 
void PetSpellFail (SpellInfo const *spellInfo, Unit *target, uint32 result)
 
void UnsummonAllTotems (bool onDeath=false)
 
TransportBaseGetDirectTransport () const
 
bool CreateVehicleKit (uint32 id, uint32 creatureEntry)
 Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
 
void RemoveVehicleKit ()
 
VehicleGetVehicleKit () const
 
VehicleGetVehicle () const
 
bool IsOnVehicle (Unit const *vehicle) const
 
UnitGetVehicleBase () const
 
CreatureGetVehicleCreatureBase () const
 
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)
 
bool HandleSpellClick (Unit *clicker, int8 seatId=-1)
 
void _ExitVehicle (Position const *exitPosition=nullptr)
 
void _EnterVehicle (Vehicle *vehicle, int8 seatId, AuraApplication const *aurApp=nullptr)
 
void HandleEmoteCommand (uint32 emoteId)
 
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)
 
ShapeshiftForm GetShapeshiftForm () const
 
void SetShapeshiftForm (ShapeshiftForm form)
 
bool IsAttackSpeedOverridenShapeShift () const
 
bool IsInFeralForm () const
 
void setTransForm (uint32 spellid)
 
uint32 getTransForm () const
 
void DeMorph ()
 
virtual float GetNativeObjectScale () const
 
virtual void RecalculateObjectScale ()
 
uint32 GetDisplayId () const
 
virtual void SetDisplayId (uint32 modelId, float displayScale=1.f)
 
uint32 GetNativeDisplayId () const
 
void RestoreDisplayId ()
 
void SetNativeDisplayId (uint32 displayId)
 
uint32 GetModelForForm (ShapeshiftForm form, uint32 spellId) const
 
uint32 GetModelForTotem (PlayerTotemType totemType)
 
virtual bool IsInWater () const
 
virtual bool IsUnderWater () const
 
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 SetInFront (WorldObject const *target)
 
void SetFacingTo (float ori)
 
void SetFacingToObject (WorldObject *object)
 
bool isInAccessiblePlaceFor (Creature const *c) const
 
bool isInFrontInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool isInBackInMap (Unit const *target, float distance, float arc=M_PI) const
 
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 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.
 
virtual bool UpdatePosition (float x, float y, float z, float ang, bool teleport=false)
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void ProcessPositionDataChanged (PositionFullTerrainStatus const &data) override
 
virtual void ProcessTerrainStatusUpdate ()
 
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
 
void AddPointedBy (SafeUnitPointer *sup)
 
void RemovePointedBy (SafeUnitPointer *sup)
 
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 SendComboPoints ()
 
void SendPlaySpellVisual (uint32 id)
 
void SendPlaySpellImpact (ObjectGuid guid, uint32 id)
 
void SendPetActionFeedback (uint8 msg)
 -------—Pet responses methods--------------—
 
void SendPetTalk (uint32 pettalk)
 
void SendPetAIReaction (ObjectGuid guid)
 
void SendPeriodicAuraLog (SpellPeriodicAuraLogInfo *pInfo)
 
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 SendSpellMiss (Unit *target, uint32 spellID, SpellMissInfo missInfo)
 
void SendSpellDamageResist (Unit *target, uint32 spellId)
 
void SendSpellDamageImmune (Unit *target, uint32 spellId)
 
void SendTameFailure (uint8 result)
 
void SendTeleportPacket (Position &pos)
 
void SendMovementFlagUpdate (bool self=false)
 
void SendMovementWaterWalking (Player *sendTo)
 
void SendMovementFeatherFall (Player *sendTo)
 
void SendMovementHover (Player *sendTo)
 
void SendChangeCurrentVictimOpcode (HostileReference *pHostileReference)
 
void SendClearThreatListOpcode ()
 
void SendRemoveFromThreatListOpcode (HostileReference *pHostileReference)
 
void SendThreatListUpdate ()
 
void SendClearTarget ()
 
void ExecuteDelayedUnitRelocationEvent ()
 
void ExecuteDelayedUnitAINotifyEvent ()
 
void BuildHeartBeatMsg (WorldPacket *data) const
 
void BuildMovementPacket (ByteBuffer *data) const
 
void OutDebugInfo () const
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from WorldObject
 ~WorldObject () override
 
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
 
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
 
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 SendMessageToSet (WorldPacket const *data, bool self) const
 
virtual void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self) const
 
virtual void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const
 
void PlayDistanceSound (uint32 sound_id, Player *target=nullptr)
 
void PlayDirectSound (uint32 sound_id, Player *target=nullptr)
 
void PlayRadiusSound (uint32 sound_id, float radius)
 
void PlayDirectMusic (uint32 music_id, Player *target=nullptr)
 
void PlayRadiusMusic (uint32 music_id, float radius)
 
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 UpdateObjectVisibilityOnCreate ()
 
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
 
void SetTransport (Transport *t)
 
virtual float GetStationaryX () const
 
virtual float GetStationaryY () const
 
virtual float GetStationaryZ () const
 
virtual float GetStationaryO () const
 
float GetMapWaterOrGroundLevel (Position pos, float *ground=nullptr) 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.
 
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
 
ObjectGuid GetGUID () const
 
PackedGuid const & GetPackGUID () const
 
uint32 GetEntry () const
 
void SetEntry (uint32 entry)
 
float GetObjectScale () const
 
virtual void SetObjectScale (float scale)
 
bool HasDynamicFlag (uint32 flag) const
 
virtual void SetDynamicFlag (uint32 flag)
 
virtual void RemoveDynamicFlag (uint32 flag)
 
TypeID GetTypeId () const
 
bool isType (uint16 mask) const
 
virtual void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void SendUpdateToPlayer (Player *player)
 
void BuildValuesUpdateBlockForPlayer (UpdateData *data, Player *target)
 
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
 
void BuildFieldsUpdate (Player *, UpdateDataMapType &)
 
void SetFieldNotifyFlag (uint16 flag)
 
void RemoveFieldNotifyFlag (uint16 flag)
 
void ForceValuesUpdateAtIndex (uint32)
 
bool IsPlayer () const
 
PlayerToPlayer ()
 
Player const * ToPlayer () const
 
bool IsCreature () const
 
CreatureToCreature ()
 
Creature const * ToCreature () const
 
bool IsUnit () const
 
UnitToUnit ()
 
Unit const * ToUnit () const
 
bool IsGameObject () const
 
GameObjectToGameObject ()
 
GameObject const * ToGameObject () const
 
bool IsCorpse () const
 
CorpseToCorpse ()
 
Corpse const * ToCorpse () const
 
bool IsDynamicObject () const
 
DynamicObjectToDynObject ()
 
DynamicObject const * ToDynObject () const
 
bool IsItem () const
 
virtual void Heartbeat ()
 
- 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)
 
bool operator!= (Position const &a) const
 
 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 void ApplyResilience (Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
 
static float GetEffectiveResistChance (Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
 
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 DealDamageMods (Unit const *victim, uint32 &damage, uint32 *absorb)
 
static void Kill (Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
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 uint32 SpellCriticalDamageBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
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 int32 DealHeal (Unit *healer, Unit *victim, uint32 addhealth)
 
static uint32 SpellCriticalHealingBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
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]
 
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
 
EventProcessor m_Events
 
- 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) override
 
void _UpdateSpells (uint32 time)
 
void _DeleteRemovedAuras ()
 
void _UpdateAutoRepeatSpell ()
 
bool CanSparringWith (Unit const *attacker) const
 
bool IsAlwaysVisibleFor (WorldObject const *seer) const override
 : Check if unit is eligible for sparring damages. Work only if attacker and victim are creatures.
 
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)
 
void SetLocationMapId (uint32 _mapId)
 
void SetLocationInstanceId (uint32 _instanceId)
 
virtual bool IsNeverVisible () const
 
virtual bool IsInvisibleDueToDespawn () 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
 
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 Types

typedef std::unordered_map< uint64, BuildValuesCachedBufferValuesUpdateCache
 

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
 
void PatchValuesUpdate (ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
 
void InvalidateValuesUpdateCache ()
 
float processDummyAuras (float TakenTotalMod) const
 
void _addAttacker (Unit *pAttacker)
 
void _removeAttacker (Unit *pAttacker)
 

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
 
ValuesUpdateCache _valuesUpdateCache
 

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

◆ ValuesUpdateCache

typedef std::unordered_map<uint64 , BuildValuesCachedBuffer> Unit::ValuesUpdateCache
private

◆ VisibleAuraMap

Constructor & Destructor Documentation

◆ ~Unit()

Unit::~Unit ( )
override
340{
341 // set current spells as deletable
342 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
343 if (m_currentSpells[i])
344 {
346 m_currentSpells[i] = nullptr;
347 }
348
350
351 delete i_motionMaster;
352 delete m_charmInfo;
353 delete movespline;
354
357 ASSERT(m_attackers.empty());
358
359 // pussywizard: clear m_sharedVision along with back references
360 if (!m_sharedVision.empty())
361 {
362 do
363 {
364 Player* p = *(m_sharedVision.begin());
365 p->m_isInSharedVisionOf.erase(this);
366 m_sharedVision.remove(p);
367 } while (!m_sharedVision.empty());
368 }
369
370 ASSERT(m_Controlled.empty());
371 ASSERT(m_appliedAuras.empty());
372 ASSERT(m_ownedAuras.empty());
373 ASSERT(m_removedAuras.empty());
374 ASSERT(m_gameObj.empty());
375 ASSERT(m_dynObj.empty());
376
377 if (m_movedByPlayer && m_movedByPlayer != this)
378 LOG_INFO("misc", "Unit::~Unit (A1)");
379
381}
std::uint8_t uint8
Definition Define.h:109
#define ASSERT
Definition Errors.h:68
#define LOG_INFO(filterType__,...)
Definition Log.h:165
#define CURRENT_MAX_SPELL
Definition Unit.h:544
Definition Player.h:1082
std::set< Unit * > m_isInSharedVisionOf
Definition Player.h:2345
void SetReferencedFromCurrent(bool yes)
Definition Spell.h:563
bool m_duringRemoveFromWorld
Definition Unit.h:2173
Spell * m_currentSpells[CURRENT_MAX_SPELL]
Definition Unit.h:2085
AuraList m_removedAuras
Definition Unit.h:2089
ControlSet m_Controlled
Definition Unit.h:1997
Movement::MoveSpline * movespline
Definition Unit.h:2036
CharmInfo * m_charmInfo
Definition Unit.h:2106
MotionMaster * i_motionMaster
Definition Unit.h:2109
void _DeleteRemovedAuras()
Definition Unit.cpp:3849
DynObjectList m_dynObj
Definition Unit.h:2079
SafeUnitPointer m_movedByPlayer
Definition Unit.h:1999
AttackerSet m_attackers
Definition Unit.h:2071
Unit * m_attacking
Definition Unit.h:2072
GameObjectList m_gameObj
Definition Unit.h:2082
AuraMap m_ownedAuras
Definition Unit.h:2087
AuraApplicationMap m_appliedAuras
Definition Unit.h:2088
static void HandleSafeUnitPointersOnDelete(Unit *thisUnit)
Definition Unit.cpp:4362
SharedVisionList m_sharedVision
Definition Unit.h:2107

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
204 : WorldObject(isWorldObject),
205 m_movedByPlayer(nullptr),
207 IsAIEnabled(false),
208 NeedChangeAI(false),
210 m_CreatedByPlayer(false),
212 i_AI(nullptr),
213 i_disabledAI(nullptr),
214 m_realRace(0),
215 m_race(0),
217 m_procDeep(0),
219 i_motionMaster(new MotionMaster(this)),
220 m_regenTimer(0),
221 m_ThreatMgr(this),
222 m_vehicle(nullptr),
223 m_vehicleKit(nullptr),
225 m_HostileRefMgr(this),
226 m_comboTarget(nullptr),
228{
229#ifdef _MSC_VER
230#pragma warning(default:4355)
231#endif
234
236
243
244 m_canDualWield = false;
245
246 m_rootTimes = 0;
247
248 m_state = 0;
250
251 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
252 m_currentSpells[i] = nullptr;
253
254 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
255 m_SummonSlot[i].Clear();
256
257 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
258 m_ObjectSlot[i].Clear();
259
261
262 m_interruptMask = 0;
263 m_transform = 0;
264 m_canModifyStats = false;
265
266 for (uint8 i = 0; i < MAX_SPELL_IMMUNITY; ++i)
267 m_spellImmune[i].clear();
268
269 for (uint8 i = 0; i < UNIT_MOD_END; ++i)
270 {
275 }
276 // implement 50% base damage from offhand
278
279 for (uint8 i = 0; i < MAX_ATTACK; ++i)
280 {
283
284 m_weaponDamage[i][MINDAMAGE][1] = 0.f;
285 m_weaponDamage[i][MAXDAMAGE][1] = 0.f;
286 }
287
288 for (uint8 i = 0; i < MAX_STATS; ++i)
289 m_createStats[i] = 0.0f;
290
291 m_attacking = nullptr;
292 m_modMeleeHitChance = 0.0f;
294 m_modSpellHitChance = 0.0f;
296
297 m_CombatTimer = 0;
298 m_lastManaUse = 0;
299
300 for (uint8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
301 m_threatModifier[i] = 1.0f;
302
303 for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
304 m_speed_rate[i] = 1.0f;
305
306 m_charmInfo = nullptr;
307
309
310 // remove aurastates allowing special moves
311 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
312 m_reactiveTimer[i] = 0;
313
314 m_cleanupDone = false;
316
318
319 m_last_notify_position.Relocate(-5000.0f, -5000.0f, -5000.0f, 0.0f);
324
325 m_applyResilience = false;
326 _instantCast = false;
327
328 _lastLiquid = nullptr;
329
330 _oldFactionId = 0;
331
332 _isWalkingBeforeCharm = false;
333
335}
@ TYPEID_UNIT
Definition ObjectGuid.h:35
@ TYPEMASK_UNIT
Definition ObjectGuid.h:49
@ 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
@ UNIT_MASK_NONE
Definition UnitDefines.h:155
#define MAX_MOVE_TYPE
Definition UnitDefines.h:360
@ MINDAMAGE
Definition Unit.h:135
@ MAXDAMAGE
Definition Unit.h:136
@ UNIT_MOD_DAMAGE_OFFHAND
Definition Unit.h:166
@ UNIT_MOD_END
Definition Unit.h:168
#define MAX_SUMMON_SLOT
Definition Unit.h:607
@ OFF_ATTACK
Definition Unit.h:210
@ MAX_ATTACK
Definition Unit.h:212
@ BASE_ATTACK
Definition Unit.h:209
@ RANGED_ATTACK
Definition Unit.h:211
@ BASE_VALUE
Definition Unit.h:126
@ TOTAL_VALUE
Definition Unit.h:128
@ TOTAL_PCT
Definition Unit.h:129
@ BASE_PCT
Definition Unit.h:127
#define BASE_MAXDAMAGE
Definition Unit.h:40
@ MAX_REACTIVE
Definition Unit.h:599
#define MAX_GAMEOBJECT_SLOT
Definition Unit.h:609
#define BASE_MINDAMAGE
Definition Unit.h:39
@ UPDATEFLAG_LIVING
Definition UpdateData.h:44
@ UPDATEFLAG_STATIONARY_POSITION
Definition UpdateData.h:45
void SetValue(FLAG_TYPE flag, T_VALUES value)
Definition Object.h:378
Definition MotionMaster.h:112
Definition MoveSpline.h:40
uint16 m_objectType
Definition Object.h:246
uint16 m_updateFlag
Definition Object.h:249
TypeID m_objectTypeId
Definition Object.h:248
uint32 m_reactiveTimer[MAX_REACTIVE]
Definition Unit.h:2111
uint32 m_lastSanctuaryTime
Definition Unit.h:2013
LiquidTypeEntry const * _lastLiquid
Definition Unit.h:2122
uint32 m_transform
Definition Unit.h:2083
uint32 m_CombatTimer
Definition Unit.h:2156
bool m_canModifyStats
Definition Unit.h:2101
UnitAI * i_disabledAI
Definition Unit.h:2060
bool NeedChangeAI
Definition Unit.h:2020
uint32 m_state
Definition Unit.h:2155
float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END]
Definition Unit.h:2099
int32 m_attackTimer[MAX_ATTACK]
Definition Unit.h:2067
float m_modAttackSpeedPct[3]
Definition Unit.h:2010
uint8 m_realRace
Definition Unit.h:2062
Vehicle * m_vehicle
Definition Unit.h:2118
uint32 m_rootTimes
Definition Unit.h:2128
uint8 m_race
Definition Unit.h:2063
UnitAI * i_AI
Definition Unit.h:2059
uint32 _lastExtraAttackSpell
Definition Unit.h:2178
bool _instantCast
Definition Unit.h:2126
ObjectGuid m_ObjectSlot[MAX_GAMEOBJECT_SLOT]
Definition Unit.h:2002
RedirectThreatInfo _redirectThreatInfo
Definition Unit.h:2170
float m_createStats[MAX_STATS]
Definition Unit.h:2069
float m_modRangedHitChance
Definition Unit.h:2005
DeathState m_deathState
Definition Unit.h:2074
uint32 m_unitTypeMask
Definition Unit.h:2121
uint32 m_removedAurasCount
Definition Unit.h:2091
ThreatMgr m_ThreatMgr
Definition Unit.h:2114
Unit * m_comboTarget
Definition Unit.h:2166
AuraMap::iterator m_auraUpdateIterator
Definition Unit.h:2090
bool m_AutoRepeatFirstCast
Definition Unit.h:2065
uint16 m_delayed_unit_ai_notify_timer
Definition Unit.h:2032
int32 m_regenTimer
Definition Unit.h:2112
bool bRequestForcedVisibilityUpdate
Definition Unit.h:2033
bool m_ControlledByPlayer
Definition Unit.h:2022
uint32 m_last_notify_mstime
Definition Unit.h:2030
SpellImmuneList m_spellImmune[MAX_SPELL_IMMUNITY]
Definition Unit.h:2012
int8 m_comboPoints
Definition Unit.h:2167
uint32 _oldFactionId
faction before charm
Definition Unit.h:2175
int32 m_baseSpellCritChance
Definition Unit.h:2007
float m_modMeleeHitChance
Definition Unit.h:2004
float m_weaponDamage[MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
Definition Unit.h:2100
Position m_last_notify_position
Definition Unit.h:2029
Vehicle * m_vehicleKit
Definition Unit.h:2119
bool IsAIEnabled
Definition Unit.h:2019
HostileRefMgr m_HostileRefMgr
Definition Unit.h:2162
bool m_applyResilience
Definition Unit.h:2125
bool m_canDualWield
Definition Unit.h:1995
uint32 m_interruptMask
Definition Unit.h:2097
int32 m_procDeep
Definition Unit.h:2076
float m_speed_rate[MAX_MOVE_TYPE]
Definition Unit.h:2104
float m_modSpellHitChance
Definition Unit.h:2006
ObjectGuid m_SummonSlot[MAX_SUMMON_SLOT]
Definition Unit.h:2001
bool m_cleanupDone
Definition Unit.h:2172
bool _isWalkingBeforeCharm
Are we walking before we were charmed?
Definition Unit.h:2176
bool m_CreatedByPlayer
Definition Unit.h:2023
uint16 m_delayed_unit_relocation_timer
Definition Unit.h:2031
float m_threatModifier[MAX_SPELL_SCHOOL]
Definition Unit.h:2009
uint32 m_lastManaUse
Definition Unit.h:2157
Definition Object.h:411
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibility
Definition Object.h:529
void Relocate(float x, float y)
Definition Position.h:77
Definition ThreatMgr.h:293

References _instantCast, _isWalkingBeforeCharm, _lastExtraAttackSpell, _lastLiquid, _oldFactionId, _redirectThreatInfo, Alive, 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)
inlineprivate
2151{ m_attackers.insert(pAttacker); }

References m_attackers.

Referenced by Attack().

◆ _AddAura()

void Unit::_AddAura ( UnitAura aura,
Unit caster 
)
4448{
4450 m_ownedAuras.insert(AuraMap::value_type(aura->GetId(), aura));
4451
4453
4454 if (aura->IsRemoved())
4455 return;
4456
4458 if (aura->IsSingleTarget())
4459 {
4460 ASSERT((IsInWorld() && !IsDuringRemoveFromWorld()) || (aura->GetCasterGUID() == GetGUID()));
4461 /* @HACK: Player is not in world during loading auras.
4462 * Single target auras are not saved or loaded from database
4463 * but may be created as a result of aura links (player mounts with passengers)
4464 */
4465
4466 // register single target aura
4467 caster->GetSingleCastAuras().push_back(aura);
4468 // remove other single target auras
4469 Unit::AuraList& scAuras = caster->GetSingleCastAuras();
4470 for (Unit::AuraList::iterator itr = scAuras.begin(); itr != scAuras.end();)
4471 {
4472 if ((*itr) != aura &&
4473 (*itr)->IsSingleTargetWith(aura))
4474 {
4475 (*itr)->Remove();
4476 itr = scAuras.begin();
4477 }
4478 else
4479 ++itr;
4480 }
4481 }
4482}
@ SPELL_AURA_CONTROL_VEHICLE
Definition SpellAuraDefines.h:299
ObjectGuid GetCasterGUID() const
Definition SpellAuras.h:105
bool IsRemoved() const
Definition SpellAuras.h:161
bool IsSingleTargetWith(Aura const *aura) const
Definition SpellAuras.cpp:1142
uint32 GetId() const
Definition SpellAuras.cpp:466
bool HasEffectType(AuraType type) const
Definition SpellAuras.cpp:1222
SpellInfo const * GetSpellInfo() const
Definition SpellAuras.h:100
void SetIsSingleTarget(bool val)
Definition SpellAuras.h:166
bool IsSingleTarget() const
Definition SpellAuras.h:164
bool IsInWorld() const
Definition Object.h:108
ObjectGuid GetGUID() const
Definition Object.h:114
bool IsSingleTarget() const
Definition SpellInfo.cpp:1374
void _RemoveNoStackAurasDueToAura(Aura *aura)
Definition Unit.cpp:4700
std::list< Aura * > AuraList
Definition Unit.h:653
bool IsDuringRemoveFromWorld() const
Definition Unit.h:674
AuraList & GetSingleCastAuras()
Definition Unit.h:1366

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 ( )
5522{
5523 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5524 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, true);
5525}
@ 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 
)
4539{
4540 Aura* aura = aurApp->GetBase();
4541
4543
4544 if (aurApp->GetRemoveMode())
4545 return;
4546
4547 Unit* caster = aura->GetCaster();
4548
4549 // Update target aura state flag
4550 SpellInfo const* spellInfo = aura->GetSpellInfo();
4551 if (AuraStateType aState = spellInfo->GetAuraState())
4552 {
4553 uint32 aStateMask = (1 << (aState - 1));
4554 // force update so the new caster registers it
4555 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) && HasFlag(UNIT_FIELD_AURASTATE, aStateMask))
4557 else
4558 ModifyAuraState(aState, true);
4559 }
4560
4561 if (aurApp->GetRemoveMode())
4562 return;
4563
4564 // Sitdown on apply aura req seated
4567
4568 if (aurApp->GetRemoveMode())
4569 return;
4570
4571 aura->HandleAuraSpecificMods(aurApp, caster, true, false);
4572
4573 // apply effects of the aura
4574 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4575 {
4576 if (effMask & 1 << i && (!aurApp->GetRemoveMode()))
4577 aurApp->_HandleEffect(i, true);
4578 }
4579
4580 sScriptMgr->OnAuraApply(this, aura);
4581}
#define MAX_SPELL_EFFECTS
Definition DBCStructure.h:1638
std::uint32_t uint32
Definition Define.h:107
#define sScriptMgr
Definition ScriptMgr.h:727
#define PER_CASTER_AURA_STATE_MASK
Definition SharedDefines.h:1318
AuraStateType
Definition SharedDefines.h:1288
@ AURA_INTERRUPT_FLAG_NOT_SEATED
Definition SpellDefines.h:61
@ UNIT_STAND_STATE_SIT
Definition UnitDefines.h:33
@ UNIT_FIELD_AURASTATE
Definition UpdateFields.h:119
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:1265
bool HasFlag(uint16 index, uint32 flag) const
Definition Object.cpp:889
void ForceValuesUpdateAtIndex(uint32)
Definition Object.cpp:2078
Definition SpellInfo.h:316
AuraStateType GetAuraState() const
Definition SpellInfo.cpp:2060
uint32 AuraInterruptFlags
Definition SpellInfo.h:353
Definition Unit.h:636
void ModifyAuraState(AuraStateType flag, bool apply)
Definition Unit.cpp:10541
void SetStandState(uint8 state)
Definition Unit.cpp:16759
bool IsSitState() const
Definition Unit.cpp:16744

References AuraApplication::_HandleEffect(), _RemoveNoStackAurasDueToAura(), AURA_INTERRUPT_FLAG_NOT_SEATED, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), Aura::HandleAuraSpecificMods(), Object::HasFlag(), IsSitState(), MAX_SPELL_EFFECTS, ModifyAuraState(), PER_CASTER_AURA_STATE_MASK, SetStandState(), sScriptMgr, UNIT_FIELD_AURASTATE, and UNIT_STAND_STATE_SIT.

Referenced by _ApplyAuraEffect().

◆ _ApplyAuraEffect()

void Unit::_ApplyAuraEffect ( Aura aura,
uint8  effIndex 
)
4525{
4526 ASSERT(aura);
4527 ASSERT(aura->HasEffect(effIndex));
4529 ASSERT(aurApp);
4530 if (!aurApp->GetEffectMask())
4531 _ApplyAura(aurApp, 1 << effIndex);
4532 else
4533 aurApp->_HandleEffect(effIndex, true);
4534}
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
void _ApplyAura(AuraApplication *aurApp, uint8 effMask)
Definition Unit.cpp:4538

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

◆ _CreateAuraApplication()

AuraApplication * Unit::_CreateAuraApplication ( Aura aura,
uint8  effMask 
)
4487{
4488 // can't apply aura on unit which is going to be deleted - to not create a memory leak
4490 // aura musn't be removed
4491 ASSERT(!aura->IsRemoved());
4492
4493 // aura mustn't be already applied on target
4494 ASSERT (!aura->IsAppliedOnTarget(GetGUID()) && "Unit::_CreateAuraApplication: aura musn't be applied on target");
4495
4496 SpellInfo const* aurSpellInfo = aura->GetSpellInfo();
4497 uint32 aurId = aurSpellInfo->Id;
4498
4499 // ghost spell check, allow apply any auras at player loading in ghost mode (will be cleanup after load)
4500 // Xinef: Added IsAllowingDeadTarget check
4501 if (!IsAlive() && !aurSpellInfo->IsDeathPersistent() && !aurSpellInfo->IsAllowingDeadTarget() && (!IsPlayer() || !ToPlayer()->GetSession()->PlayerLoading()))
4502 return nullptr;
4503
4504 Unit* caster = aura->GetCaster();
4505
4506 AuraApplication* aurApp = new AuraApplication(this, caster, aura, effMask);
4507 m_appliedAuras.insert(AuraApplicationMap::value_type(aurId, aurApp));
4508
4509 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4510 // xinef: even if it gets removed, it will be reapplied in a second
4511 if (aurSpellInfo->AuraInterruptFlags && this == aura->GetOwner())
4512 {
4513 m_interruptableAuras.push_back(aurApp);
4514 AddInterruptMask(aurSpellInfo->AuraInterruptFlags);
4515 }
4516
4517 if (AuraStateType aState = aura->GetSpellInfo()->GetAuraState())
4518 m_auraStateAuras.insert(AuraStateAurasMap::value_type(aState, aurApp));
4519
4520 aura->_ApplyForTarget(this, caster, aurApp);
4521 return aurApp;
4522}
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 IsPlayer() const
Definition Object.h:201
Player * ToPlayer()
Definition Object.h:202
bool IsDeathPersistent() const
Definition SpellInfo.cpp:1217
uint32 Id
Definition SpellInfo.h:320
bool IsAllowingDeadTarget() const
Definition SpellInfo.cpp:1227
void AddInterruptMask(uint32 mask)
Definition Unit.h:1536
bool IsAlive() const
Definition Unit.h:1714
AuraApplicationList m_interruptableAuras
Definition Unit.h:2095
AuraStateAurasMap m_auraStateAuras
Definition Unit.h:2096

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

◆ _DeleteRemovedAuras()

void Unit::_DeleteRemovedAuras ( )
protected
3850{
3851 while (!m_removedAuras.empty())
3852 {
3853 delete m_removedAuras.front();
3854 m_removedAuras.pop_front();
3855 }
3856}

References m_removedAuras.

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

◆ _EnterVehicle()

void Unit::_EnterVehicle ( Vehicle vehicle,
int8  seatId,
AuraApplication const *  aurApp = nullptr 
)
19688{
19689 // Must be called only from aura handler
19690 if (!IsAlive() || GetVehicleKit() == vehicle || vehicle->GetBase()->IsOnVehicle(this))
19691 return;
19692
19693 if (m_vehicle)
19694 {
19695 if (m_vehicle == vehicle)
19696 {
19697 if (seatId >= 0 && seatId != GetTransSeat())
19698 {
19699 LOG_DEBUG("vehicles", "EnterVehicle: {} leave vehicle {} seat {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), GetTransSeat(), seatId);
19700 ChangeSeat(seatId);
19701 }
19702
19703 return;
19704 }
19705 else
19706 {
19707 LOG_DEBUG("vehicles", "EnterVehicle: {} exit {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), vehicle->GetBase()->GetEntry());
19708 ExitVehicle();
19709 }
19710 }
19711
19712 if (!aurApp || aurApp->GetRemoveMode())
19713 return;
19714
19715 if (Player* player = ToPlayer())
19716 {
19717 if (vehicle->GetBase()->IsPlayer() && player->IsInCombat())
19718 return;
19719
19720 sScriptMgr->AnticheatSetUnderACKmount(player);
19721
19723 player->StopCastingCharm();
19724 player->StopCastingBindSight();
19725 Dismount();
19727
19728 // drop flag at invisible in bg
19729 if (Battleground* bg = player->GetBattleground())
19730 bg->EventPlayerDroppedFlag(player);
19731
19733 player->GetSession()->SendPacket(&data);
19734 }
19735
19736 ASSERT(!m_vehicle);
19737 m_vehicle = vehicle;
19738
19739 if (!m_vehicle->AddPassenger(this, seatId))
19740 {
19741 m_vehicle = nullptr;
19742 return;
19743 }
19744
19745 // Xinef: remove movement auras when entering vehicle (food buffs etc)
19747}
#define LOG_DEBUG(filterType__,...)
Definition Log.h:169
@ SPELL_AURA_MOUNTED
Definition SpellAuraDefines.h:141
@ AURA_INTERRUPT_FLAG_MOVE
Definition SpellDefines.h:46
@ AURA_INTERRUPT_FLAG_TURNING
Definition SpellDefines.h:47
Definition Battleground.h:294
uint32 GetEntry() const
Definition Object.h:116
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
Definition Unit.cpp:4162
void Dismount()
Definition Unit.cpp:13568
bool IsOnVehicle(Unit const *vehicle) const
Definition Unit.h:1847
void RemoveAurasByType(AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
Definition Unit.cpp:5143
void ChangeSeat(int8 seatId, bool next=true)
Definition Unit.cpp:19749
Vehicle * GetVehicleKit() const
Definition Unit.h:1845
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except=0, bool isAutoshot=false)
Definition Unit.cpp:5214
void ExitVehicle(Position const *exitPosition=nullptr)
Definition Unit.cpp:19768
Unit * GetBase() const
May be called from scripts.
Definition Vehicle.h:37
bool AddPassenger(Unit *passenger, int8 seatId=-1)
Definition Vehicle.cpp:318
int8 GetTransSeat() const
Definition Object.h:604
Definition WorldPacket.h:26
@ SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA
Definition Opcodes.h:1211

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

Referenced by AuraEffect::HandleAuraControlVehicle().

◆ _ExitVehicle()

void Unit::_ExitVehicle ( Position const *  exitPosition = nullptr)
19806{
19807 if (!m_vehicle)
19808 return;
19809
19810 // This should be done before dismiss, because there may be some aura removal
19813
19814 Player* player = ToPlayer();
19815
19816 // If player is on mouted duel and exits the mount should immediatly lose the duel
19817 if (player && player->duel && player->duel->IsMounted)
19818 player->DuelComplete(DUEL_FLED);
19819
19820 Vehicle* vehicle = m_vehicle;
19821 Unit* vehicleBase = m_vehicle->GetBase();
19822 m_vehicle = nullptr;
19823
19824 if (!vehicleBase)
19825 return;
19826
19827 SetControlled(false, UNIT_STATE_ROOT); // SMSG_MOVE_FORCE_UNROOT, ~MOVEMENTFLAG_ROOT
19828
19829 Position pos;
19830 // If we ask for a specific exit position, use that one. Otherwise allow scripts to modify it
19831 if (exitPosition)
19832 pos = *exitPosition;
19833 else
19834 {
19835 // Set exit position to vehicle position and use the current orientation
19836 pos = vehicleBase->GetPosition(); // This should use passenger's current position, leaving it as it is now
19837 pos.SetOrientation(vehicleBase->GetOrientation());
19838
19839 // Change exit position based on seat entry addon data
19840 if (seatAddon)
19841 {
19843 pos.RelocateOffset({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
19845 pos.Relocate({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
19846 }
19847 }
19848
19850
19851 if (player)
19852 {
19854
19855 sScriptMgr->AnticheatSetUnderACKmount(player);
19856 }
19858 {
19860 data << GetPackGUID();
19861 SendMessageToSet(&data, false);
19862 }
19863
19864 // xinef: hack for flameleviathan seat vehicle
19865 VehicleEntry const* vehicleInfo = vehicle->GetVehicleInfo();
19866 if (!vehicleInfo || vehicleInfo->m_ID != 341)
19867 {
19868 Movement::MoveSplineInit init(this);
19869 init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
19870 init.SetFacing(vehicleBase->GetOrientation());
19871 init.SetTransportExit();
19872 init.Launch();
19873 }
19874 else
19875 {
19876 float o = pos.GetAngle(this);
19877 Movement::MoveSplineInit init(this);
19878 init.MoveTo(pos.GetPositionX() + 8 * cos(o), pos.GetPositionY() + 8 * std::sin(o), pos.GetPositionZ() + 16.0f);
19879 init.SetFacing(GetOrientation());
19880 init.SetTransportExit();
19881 init.Launch();
19882 DisableSpline();
19883 KnockbackFrom(pos.GetPositionX(), pos.GetPositionY(), 10.0f, 20.0f);
19885 }
19886
19887 // xinef: move fall, should we support all creatures that exited vehicle in air? Currently Quest Drag and Drop only, Air Assault quest
19888 if (IsCreature() && !CanFly() && vehicleInfo && (vehicleInfo->m_ID == 113 || vehicleInfo->m_ID == 8 || vehicleInfo->m_ID == 290 || vehicleInfo->m_ID == 298))
19889 {
19891 }
19892
19893 if ((!player || !(player->GetDelayedOperations() & DELAYED_VEHICLE_TELEPORT)) && vehicle->GetBase()->HasUnitTypeMask(UNIT_MASK_MINION))
19894 if (((Minion*)vehicleBase)->GetOwner() == this)
19895 {
19896 if (!vehicleInfo || vehicleInfo->m_ID != 349)
19897 {
19898 vehicle->Dismiss();
19899 }
19900 else if (vehicleBase->IsCreature())
19901 {
19902 vehicle->Uninstall();
19903 vehicleBase->m_Events.AddEvent(new VehicleDespawnEvent(*vehicleBase, 2000), vehicleBase->m_Events.CalculateTime(2000));
19904 }
19905
19906 // xinef: ugly hack, no appripriate hook later to cast spell
19907 if (player)
19908 {
19909 if (vehicleBase->GetEntry() == NPC_EIDOLON_WATCHER)
19910 player->CastSpell(player, VEHICLE_SPELL_SHADE_CONTROL_END, true);
19911 else if (vehicleBase->GetEntry() == NPC_LITHE_STALKER)
19912 player->CastSpell(player, VEHICLE_SPELL_GEIST_CONTROL_END, true);
19913 }
19914 }
19915
19917 {
19918 // Vehicle just died, we die too
19919 if (vehicleBase->getDeathState() == DeathState::JustDied)
19921 // If for other reason we as minion are exiting the vehicle (ejected, master dismounted) - unsummon
19922 else
19923 ToTempSummon()->UnSummon(2000); // Approximation
19924 }
19925
19926 if (player)
19927 {
19929 player->SetCanTeleport(true);
19930 }
19931}
@ DELAYED_VEHICLE_TELEPORT
Definition Player.h:915
@ DUEL_FLED
Definition SharedDefines.h:3614
@ MOVEMENTFLAG_ROOT
Definition UnitDefines.h:376
@ UNIT_MASK_ACCESSORY
Definition UnitDefines.h:165
@ UNIT_MASK_MINION
Definition UnitDefines.h:157
@ UNIT_STATE_ROOT
Definition UnitDefines.h:180
@ UNIT_STATE_MOVE
Definition UnitDefines.h:189
@ VEHICLE_SPELL_PARACHUTE
Definition VehicleDefines.h:53
@ VEHICLE_SPELL_SHADE_CONTROL_END
Definition VehicleDefines.h:56
@ VEHICLE_SPELL_GEIST_CONTROL_END
Definition VehicleDefines.h:55
@ NPC_EIDOLON_WATCHER
Definition VehicleDefines.h:69
@ NPC_LITHE_STALKER
Definition VehicleDefines.h:70
void AddEvent(BasicEvent *Event, uint64 e_time, bool set_addtime=true)
Definition EventProcessor.h:103
uint64 CalculateTime(uint64 t_offset) const
Definition EventProcessor.cpp:159
Definition TemporarySummon.h:77
void MoveFall(uint32 id=0, bool addFlagForNPC=false)
The unit will fall. Used when in the air. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:627
Definition MoveSplineInit.h:71
PackedGuid const & GetPackGUID() const
Definition Object.h:115
bool IsCreature() const
Definition Object.h:205
void SetCanTeleport(bool value)
Definition Player.h:2508
void DuelComplete(DuelCompleteType type)
Definition Player.cpp:6431
void SetFallInformation(uint32 time, float z)
Definition Player.h:2346
std::unique_ptr< DuelInfo > duel
Definition Player.h:1886
void ResummonPetTemporaryUnSummonedIfAny()
Definition Player.cpp:14204
uint32 GetDelayedOperations() const
Definition Player.h:2108
virtual void UnSummon(uint32 msTime=0)
Definition TemporarySummon.cpp:287
virtual void setDeathState(DeathState s, bool despawn=false)
Definition Unit.cpp:14604
Unit * GetOwner() const
Definition Unit.cpp:10644
DeathState getDeathState()
Definition Unit.h:1711
virtual bool CanFly() const =0
MotionMaster * GetMotionMaster()
Definition Unit.h:1680
TempSummon * ToTempSummon()
Definition Unit.h:702
void DisableSpline()
Definition Unit.cpp:637
void AddUnitState(uint32 f)
Definition Unit.h:706
void SetControlled(bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
Definition Unit.cpp:18067
bool HasUnitMovementFlag(uint32 f) const
Definition Unit.h:745
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:1179
uint32 HasUnitTypeMask(uint32 mask) const
Definition Unit.h:712
void KnockbackFrom(float x, float y, float speedXY, float speedZ)
Definition Unit.cpp:19176
Definition Vehicle.h:101
Definition Vehicle.h:28
void Dismiss()
Definition Vehicle.cpp:539
VehicleEntry const * GetVehicleInfo() const
Definition Vehicle.h:38
void RemovePassenger(Unit *passenger)
Definition Vehicle.cpp:460
void Uninstall()
Definition Vehicle.cpp:101
VehicleSeatAddon const * GetSeatAddonForSeatOfPassenger(Unit const *passenger) const
Definition Vehicle.cpp:237
virtual void SendMessageToSet(WorldPacket const *data, bool self) const
Definition Object.cpp:2091
EventProcessor m_Events
Definition Object.h:640
@ SMSG_SPLINE_MOVE_UNROOT
Definition Opcodes.h:802
Seconds GetGameTime()
Definition GameTime.cpp:38
Definition Position.h:27
void RelocateOffset(const Position &offset)
Definition Position.cpp:59
float GetPositionZ() const
Definition Position.h:123
float GetOrientation() const
Definition Position.h:124
void SetOrientation(float orientation)
Definition Position.h:116
float GetPositionX() const
Definition Position.h:121
void GetPosition(float &x, float &y) const
Definition Position.h:126
float GetPositionY() const
Definition Position.h:122
float GetAngle(const Position *pos) const
Definition Position.cpp:78
Definition DBCStructure.h:2028
uint32 m_ID
Definition DBCStructure.h:2029
Definition VehicleDefines.h:86
float ExitParameterO
Definition VehicleDefines.h:96
float ExitParameterX
Definition VehicleDefines.h:93
float ExitParameterY
Definition VehicleDefines.h:94
float ExitParameterZ
Definition VehicleDefines.h:95
VehicleExitParameters ExitParameter
Definition VehicleDefines.h:97

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

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
14052{
14053 ASSERT(target);
14054
14055 // can assist to self
14056 if (this == target)
14057 return true;
14058
14059 // can't assist unattackable units or GMs
14060 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
14061 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
14062 return false;
14063
14064 // can't assist own vehicle or passenger
14065 if (m_vehicle)
14066 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
14067 return false;
14068
14069 // can't assist invisible
14070 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()))
14071 return false;
14072
14073 // can't assist dead
14074 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
14075 return false;
14076
14077 // can't assist untargetable
14078 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
14079 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
14080 return false;
14081
14082 if (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14083 {
14084 // xinef: do not allow to assist non attackable units
14085 if (target->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE))
14086 return false;
14087
14089 {
14090 if (target->IsImmuneToPC())
14091 return false;
14092 }
14093 else
14094 {
14095 if (target->IsImmuneToNPC())
14096 return false;
14097 }
14098 }
14099
14100 // can't assist non-friendly targets
14101 if (GetReactionTo(target) < REP_NEUTRAL
14102 && target->GetReactionTo(this) < REP_NEUTRAL
14103 && (!ToCreature() || !(ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)))
14104 return false;
14105
14106 // PvP case
14107 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
14108 {
14109 Player const* targetPlayerOwner = target->GetAffectingPlayer();
14111 {
14112 Player const* selfPlayerOwner = GetAffectingPlayer();
14113 if (selfPlayerOwner && targetPlayerOwner)
14114 {
14115 // can't assist player which is dueling someone
14116 if (selfPlayerOwner != targetPlayerOwner
14117 && targetPlayerOwner->duel)
14118 return false;
14119 }
14120 // can't assist player in ffa_pvp zone from outside
14121 if (target->IsFFAPvP() && !IsFFAPvP())
14122 return false;
14123
14124 // can't assist player out of sanctuary from sanctuary if has pvp enabled
14125 if (target->IsPvP())
14126 if (IsInSanctuary() && !target->IsInSanctuary())
14127 return false;
14128 }
14129 }
14130 // PvC case - player can assist creature only if has specific type flags
14131 // !target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) &&
14133 && (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14134 && !target->IsPvP())
14135 {
14136 if (Creature const* creatureTarget = target->ToCreature())
14137 return creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT || creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST;
14138 }
14139 return true;
14140}
@ 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
@ UNIT_STATE_UNATTACKABLE
Definition UnitDefines.h:207
@ UNIT_FLAG_NON_ATTACKABLE
Definition UnitDefines.h:251
@ UNIT_FLAG_NOT_SELECTABLE
Definition UnitDefines.h:275
@ UNIT_FLAG_PLAYER_CONTROLLED
Definition UnitDefines.h:253
Definition Creature.h:43
Creature * ToCreature()
Definition Object.h:206
ReputationRank GetReactionTo(Unit const *target, bool checkOriginalFaction=false) const
Definition Unit.cpp:10104
bool HasUnitFlag(UnitFlags flags) const
Definition Unit.h:718
bool IsInSanctuary() const
Definition Unit.h:996
bool IsFFAPvP() const
Definition Unit.h:998
Player * GetAffectingPlayer() const
Definition Unit.cpp:10669
bool CanSeeOrDetect(WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
Definition Object.cpp:1737

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_CAN_ASSIST, CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, GetAffectingPlayer(), Vehicle::GetBase(), GetReactionTo(), SpellInfo::HasAttribute(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), IsFFAPvP(), Player::IsGameMaster(), IsImmuneToNPC(), IsImmuneToPC(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), 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(), 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
13929{
13930 ASSERT(target);
13931
13932 // can't attack self
13933 if (this == target)
13934 return false;
13935
13936 // can't attack unattackable units or GMs
13937 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
13938 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
13939 return false;
13940
13941 // can't attack own vehicle or passenger
13942 if (m_vehicle)
13943 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
13944 if (!IsHostileTo(target)) // pussywizard: actually can attack own vehicle or passenger if it's hostile to us - needed for snobold in Gormok encounter
13945 return false;
13946
13947 // 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.
13948 //Ignore stealth if target is player and unit in combat with same player
13949 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && (obj ? !obj->CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()) : !CanSeeOrDetect(target, (bySpell && bySpell->IsAffectingArea()) || (target->IsPlayer() && target->HasStealthAura() && target->IsInCombat() && IsInCombatWith(target)))))
13950 return false;
13951
13952 // can't attack dead
13953 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
13954 return false;
13955
13956 // can't attack untargetable
13957 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
13958 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
13959 return false;
13960
13961 if (Player const* playerAttacker = ToPlayer())
13962 {
13963 if (playerAttacker->HasPlayerFlag(PLAYER_FLAGS_UBER) || playerAttacker->IsSpectator())
13964 return false;
13965 }
13966 // check flags
13968 || (!HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToNPC())
13969 || (!target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToNPC())
13970 || (HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToPC())
13971 // 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
13972 || ((GetEntry() != WORLD_TRIGGER && (!obj || !obj->isType(TYPEMASK_GAMEOBJECT | TYPEMASK_DYNAMICOBJECT))) && target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToPC()))
13973 return false;
13974
13975 // CvC case - can attack each other only when one of them is hostile
13977 return GetReactionTo(target) <= REP_HOSTILE || target->GetReactionTo(this) <= REP_HOSTILE;
13978
13979 // PvP, PvC, CvP case
13980 // can't attack friendly targets
13981 ReputationRank repThisToTarget = GetReactionTo(target);
13982 ReputationRank repTargetToThis;
13983
13984 if (repThisToTarget > REP_NEUTRAL
13985 || (repTargetToThis = target->GetReactionTo(this)) > REP_NEUTRAL)
13986 return false;
13987
13988 // Not all neutral creatures can be attacked (even some unfriendly faction does not react aggresive to you, like Sporaggar)
13989 if (repThisToTarget == REP_NEUTRAL &&
13990 repTargetToThis <= REP_NEUTRAL)
13991 {
13992 Player* owner = GetAffectingPlayer();
13993 Unit const* const thisUnit = owner ? owner : this;
13994 if (!(target->IsPlayer() && thisUnit->IsPlayer()) &&
13995 !(target->IsCreature() && thisUnit->IsCreature()))
13996 {
13997 Player const* player = target->IsPlayer() ? target->ToPlayer() : thisUnit->ToPlayer();
13998 Unit const* creature = target->IsCreature() ? target : thisUnit;
13999
14000 if (FactionTemplateEntry const* factionTemplate = creature->GetFactionTemplateEntry())
14001 {
14002 if (!(player->GetReputationMgr().GetForcedRankIfAny(factionTemplate)))
14003 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplate->faction))
14004 if (FactionState const* repState = player->GetReputationMgr().GetState(factionEntry))
14005 if (!(repState->Flags & FACTION_FLAG_AT_WAR))
14006 return false;
14007 }
14008 }
14009 }
14010
14011 Creature const* creatureAttacker = ToCreature();
14012 if (creatureAttacker && creatureAttacker->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)
14013 return false;
14014
14015 Player const* playerAffectingAttacker = HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? GetAffectingPlayer() : nullptr;
14016 Player const* playerAffectingTarget = target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? target->GetAffectingPlayer() : nullptr;
14017
14018 // check duel - before sanctuary checks
14019 if (playerAffectingAttacker && playerAffectingTarget)
14020 if (playerAffectingAttacker->duel && playerAffectingAttacker->duel->Opponent == playerAffectingTarget && playerAffectingAttacker->duel->State == DUEL_STATE_IN_PROGRESS)
14021 return true;
14022
14023 // PvP case - can't attack when attacker or target are in sanctuary
14024 // however, 13850 client doesn't allow to attack when one of the unit's has sanctuary flag and is pvp
14025 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && (target->IsInSanctuary() || IsInSanctuary()))
14026 return false;
14027
14028 // additional checks - only PvP case
14029 if (playerAffectingAttacker && playerAffectingTarget)
14030 {
14031 if (!IsPvP() && bySpell && bySpell->IsAffectingArea() && !bySpell->HasAttribute(SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK))
14032 return false;
14033
14034 if (target->IsPvP())
14035 return true;
14036
14037 if (IsFFAPvP() && target->IsFFAPvP())
14038 return true;
14039
14041 }
14042 return true;
14043}
@ FACTION_FLAG_AT_WAR
Definition DBCEnums.h:308
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
@ TYPEMASK_DYNAMICOBJECT
Definition ObjectGuid.h:52
@ TYPEMASK_GAMEOBJECT
Definition ObjectGuid.h:51
@ DUEL_STATE_IN_PROGRESS
Definition Player.h:378
@ PLAYER_FLAGS_UBER
Definition Player.h:499
@ SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK
Definition SharedDefines.h:573
ReputationRank
Definition SharedDefines.h:179
@ REP_HOSTILE
Definition SharedDefines.h:181
@ UNIT_BYTE2_FLAG_UNK1
Definition UnitDefines.h:137
@ UNIT_FLAG_TAXI_FLIGHT
Definition UnitDefines.h:270
@ UNIT_FLAG_NON_ATTACKABLE_2
Definition UnitDefines.h:266
@ UNIT_FLAG_NOT_ATTACKABLE_1
Definition UnitDefines.h:257
#define WORLD_TRIGGER
Definition Unit.h:37
@ UNIT_FIELD_BYTES_2
Definition UpdateFields.h:161
CreatureTemplate const * GetCreatureTemplate() const
Definition Creature.h:209
bool HasByteFlag(uint16 index, uint8 offset, uint8 flag) const
Definition Object.cpp:949
ReputationMgr & GetReputationMgr()
Definition Player.h:2135
FactionState const * GetState(FactionEntry const *factionEntry) const
Definition ReputationMgr.h:81
ReputationRank const * GetForcedRankIfAny(FactionTemplateEntry const *factionTemplateEntry) const
Definition ReputationMgr.h:106
FactionTemplateEntry const * GetFactionTemplateEntry() const
Definition Unit.cpp:10074
bool IsPvP() const
Definition Unit.h:997
bool HasStealthAura() const
Definition Unit.h:1762
bool IsInCombatWith(Unit const *who) const
Definition Unit.cpp:21069
bool IsImmuneToNPC() const
Definition Unit.h:888
bool IsHostileTo(Unit const *unit) const
Definition Unit.cpp:10276
bool IsImmuneToPC() const
Definition Unit.h:886
bool IsInCombat() const
Definition Unit.h:893
uint32 type_flags
Definition CreatureData.h:223
Definition DBCStructure.h:907
Definition ReputationMgr.h:41
Definition DBCStructure.h:939

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(), SpellInfo::HasAttribute(), Object::HasByteFlag(), HasStealthAura(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), Object::IsCreature(), IsFFAPvP(), Player::IsGameMaster(), IsHostileTo(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsInCombatWith(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), 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, 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 
)
4730{
4731 if (apply)
4732 m_modAuras[aurEff->GetAuraType()].push_back(aurEff);
4733 else
4734 m_modAuras[aurEff->GetAuraType()].remove(aurEff);
4735}
AuraType GetAuraType() const
Definition SpellAuraEffects.cpp:448
AuraEffectList m_modAuras[TOTAL_AURAS]
Definition Unit.h:2093

References AuraEffect::GetAuraType(), and m_modAuras.

Referenced by AuraEffect::HandleEffect().

◆ _RegisterDynObject()

void Unit::_RegisterDynObject ( DynamicObject dynObj)
6175{
6176 m_dynObj.push_back(dynObj);
6177}

References m_dynObj.

Referenced by DynamicObject::BindToCaster().

◆ _RemoveAllAuraStatMods()

void Unit::_RemoveAllAuraStatMods ( )
5516{
5517 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5518 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, false);
5519}

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_RemoveAllStatBonuses().

◆ _removeAttacker()

void Unit::_removeAttacker ( Unit pAttacker)
inlineprivate
Note
: Call only in Unit::Attack()
2152{ m_attackers.erase(pAttacker); }

References m_attackers.

Referenced by Attack(), and AttackStop().

◆ _RemoveNoStackAuraApplicationsDueToAura()

void Unit::_RemoveNoStackAuraApplicationsDueToAura ( Aura aura)

◆ _RemoveNoStackAurasDueToAura()

void Unit::_RemoveNoStackAurasDueToAura ( Aura aura)
4701{
4702 //SpellInfo const* spellProto = aura->GetSpellInfo();
4703
4704 // passive spell special case (only non stackable with ranks)
4705
4706 // xinef: this check makes caster to have 2 area auras thanks to spec switch
4707 // if (spellProto->IsPassiveStackableWithRanks())
4708 // return;
4709
4710 bool remove = false;
4711 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
4712 {
4713 if (remove)
4714 {
4715 remove = false;
4716 i = m_appliedAuras.begin();
4717 }
4718
4719 if (aura->CanStackWith(i->second->GetBase(), true))
4720 continue;
4721
4723 if (i == m_appliedAuras.end())
4724 break;
4725 remove = true;
4726 }
4727}
@ AURA_REMOVE_BY_DEFAULT
Definition SpellAuraDefines.h:392
bool CanStackWith(Aura const *checkAura, bool remove) const
Definition SpellAuras.cpp:2021
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4809

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 
)
4388{
4389 ASSERT(casterGUID || caster);
4390 if (!casterGUID)
4391 casterGUID = caster->GetGUID();
4392
4393 // Xinef: Hax for mixology, best solution qq
4394 if (sSpellMgr->GetSpellGroup(newAura->Id) == 1)
4395 return nullptr;
4396
4397 // passive and Incanter's Absorption and auras with different type can stack with themselves any number of times
4398 if (!newAura->IsMultiSlotAura())
4399 {
4400 // check if cast item changed
4401 ObjectGuid castItemGUID;
4402 if (castItem)
4403 castItemGUID = castItem->GetGUID();
4404
4405 // find current aura from spell and change it's stackamount, or refresh it's duration
4406 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))
4407 {
4408 // effect masks do not match
4409 // extremely rare case
4410 // let's just recreate aura
4411 if (effMask != foundAura->GetEffectMask())
4412 return nullptr;
4413
4414 // update basepoints with new values - effect amount will be recalculated in ModStackAmount
4415 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4416 {
4417 if (!foundAura->HasEffect(i))
4418 continue;
4419
4420 int bp;
4421 if (baseAmount)
4422 bp = *(baseAmount + i);
4423 else
4424 bp = foundAura->GetSpellInfo()->Effects[i].BasePoints;
4425
4426 int32* oldBP = const_cast<int32*>(&(foundAura->GetEffect(i)->m_baseAmount));
4427 *oldBP = bp;
4428 }
4429
4430 // correct cast item guid if needed
4431 if (castItemGUID != foundAura->GetCastItemGUID())
4432 {
4433 ObjectGuid* oldGUID = const_cast<ObjectGuid*>(&foundAura->m_castItemGuid);
4434 *oldGUID = castItemGUID;
4435 }
4436
4437 // try to increase stack amount
4438 foundAura->ModStackAmount(1, AURA_REMOVE_BY_DEFAULT, periodicReset);
4439 sScriptMgr->OnAuraApply(this, foundAura);
4440 return foundAura;
4441 }
4442 }
4443
4444 return nullptr;
4445}
std::int32_t int32
Definition Define.h:103
@ 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:118
static ObjectGuid const Empty
Definition ObjectGuid.h:120
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:113
Aura * GetOwnedAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
Definition Unit.cpp:4793

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 
)
4680{
4681 // aura can be removed from unit only if it's applied on it, shouldn't happen
4682 ASSERT(aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) == aurApp);
4683
4684 uint32 spellId = aurApp->GetBase()->GetId();
4685 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4686
4687 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4688 {
4689 if (iter->second == aurApp)
4690 {
4691 _UnapplyAura(iter, removeMode);
4692 return;
4693 }
4694 else
4695 ++iter;
4696 }
4697 ABORT();
4698}
#define ABORT
Definition Errors.h:76
std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
Definition Unit.h:647
void _UnapplyAura(AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
Definition Unit.cpp:4584

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 
)
4585{
4586 AuraApplication* aurApp = i->second;
4587 ASSERT(aurApp);
4588 ASSERT(!aurApp->GetRemoveMode());
4589 ASSERT(aurApp->GetTarget() == this);
4590
4591 aurApp->SetRemoveMode(removeMode);
4592 Aura* aura = aurApp->GetBase();
4593 LOG_DEBUG("spells.aura", "Aura {} now is remove mode {}", aura->GetId(), removeMode);
4594
4595 // dead loop is killing the server probably
4596 ASSERT(m_removedAurasCount < 0xFFFFFFFF);
4597
4599
4600 Unit* caster = aura->GetCaster();
4601
4602 // Remove all pointers from lists here to prevent possible pointer invalidation on spellcast/auraapply/auraremove
4603 m_appliedAuras.erase(i);
4604
4605 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4606 // xinef: event if it gets removed, it will be reapplied in a second
4607 if (aura->GetSpellInfo()->AuraInterruptFlags && this == aura->GetOwner())
4608 {
4609 m_interruptableAuras.remove(aurApp);
4611 }
4612
4613 bool auraStateFound = false;
4614 AuraStateType auraState = aura->GetSpellInfo()->GetAuraState();
4615 if (auraState)
4616 {
4617 bool canBreak = false;
4618 // Get mask of all aurastates from remaining auras
4619 for (AuraStateAurasMap::iterator itr = m_auraStateAuras.lower_bound(auraState); itr != m_auraStateAuras.upper_bound(auraState) && !(auraStateFound && canBreak);)
4620 {
4621 if (itr->second == aurApp)
4622 {
4623 m_auraStateAuras.erase(itr);
4624 itr = m_auraStateAuras.lower_bound(auraState);
4625 canBreak = true;
4626 continue;
4627 }
4628 auraStateFound = true;
4629 ++itr;
4630 }
4631 }
4632
4633 aurApp->_Remove();
4634 aura->_UnapplyForTarget(this, caster, aurApp);
4635
4636 // remove effects of the spell - needs to be done after removing aura from lists
4637 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4638 {
4639 if (aurApp->HasEffect(itr))
4640 aurApp->_HandleEffect(itr, false);
4641 }
4642
4643 // all effect mustn't be applied
4644 ASSERT(!aurApp->GetEffectMask());
4645
4646 // Remove totem at next update if totem loses its aura
4647 if (aurApp->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE && IsTotem() && GetGUID() == aura->GetCasterGUID())
4648 {
4649 if (ToTotem()->GetSpell() == aura->GetId() && ToTotem()->GetTotemType() == TOTEM_PASSIVE)
4651 }
4652
4653 // Remove aurastates only if needed and were not found
4654 if (auraState)
4655 {
4656 if (!auraStateFound)
4657 ModifyAuraState(auraState, false);
4658 else
4659 {
4660 // update for casters, some shouldn't 'see' the aura state
4661 uint32 aStateMask = (1 << (auraState - 1));
4662 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) != 0)
4664 }
4665 }
4666
4667 aura->HandleAuraSpecificMods(aurApp, caster, false, false);
4668
4669 // only way correctly remove all auras from list
4670 //if (removedAuras != m_removedAurasCount) new aura may be added
4671 i = m_appliedAuras.begin();
4672
4673 sScriptMgr->OnAuraRemove(this, aurApp, removeMode);
4674
4675 if (this->ToCreature() && this->ToCreature()->IsAIEnabled)
4676 this->ToCreature()->AI()->OnAuraRemove(aurApp, removeMode);
4677}
@ AURA_REMOVE_BY_EXPIRE
Definition SpellAuraDefines.h:395
@ TOTEM_PASSIVE
Definition Totem.h:25
Unit * GetTarget() const
Definition SpellAuras.h:61
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
virtual void OnAuraRemove(AuraApplication *, AuraRemoveMode)
Definition CreatureAI.h:225
CreatureAI * AI() const
Definition Creature.h:141
void setDeathState(DeathState s, bool despawn=false) override
A creature can be in 4 different states: Alive, JustDied, Corpse, and JustRespawned....
Definition TemporarySummon.cpp:396
Totem * ToTotem()
Definition Unit.h:701
void UpdateInterruptMask()
Definition Unit.cpp:755
bool IsTotem() const
Definition Unit.h:765

References AuraApplication::_HandleEffect(), AuraApplication::_Remove(), Aura::_UnapplyForTarget(), Creature::AI(), ASSERT, AURA_REMOVE_BY_EXPIRE, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), 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(), IsAIEnabled, IsTotem(), JustDied, LOG_DEBUG, m_appliedAuras, m_auraStateAuras, m_interruptableAuras, m_removedAurasCount, MAX_SPELL_EFFECTS, ModifyAuraState(), CreatureAI::OnAuraRemove(), PER_CASTER_AURA_STATE_MASK, Minion::setDeathState(), AuraApplication::SetRemoveMode(), sScriptMgr, Object::ToCreature(), TOTEM_PASSIVE, ToTotem(), UNIT_FIELD_AURASTATE, and UpdateInterruptMask().

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

◆ _UnregisterDynObject()

void Unit::_UnregisterDynObject ( DynamicObject dynObj)
6180{
6181 m_dynObj.remove(dynObj);
6182}

References m_dynObj.

Referenced by DynamicObject::UnbindFromCaster().

◆ _UpdateAutoRepeatSpell()

void Unit::_UpdateAutoRepeatSpell ( )
protected
3917{
3918 SpellInfo const* spellProto = nullptr;
3920 {
3922 }
3923
3924 if (!spellProto)
3925 {
3926 return;
3927 }
3928
3929 static uint32 const HUNTER_AUTOSHOOT = 75;
3930
3931 // Check "realtime" interrupts
3932 if ((IsPlayer() && ToPlayer()->isMoving() && spellProto->Id != HUNTER_AUTOSHOOT) || IsNonMeleeSpellCast(false, false, true, spellProto->Id == HUNTER_AUTOSHOOT))
3933 {
3934 // cancel wand shoot
3935 if (spellProto->Id != HUNTER_AUTOSHOOT)
3937 m_AutoRepeatFirstCast = true;
3938 return;
3939 }
3940
3941 // Apply delay (Hunter's autoshoot not affected)
3942 if (m_AutoRepeatFirstCast && getAttackTimer(RANGED_ATTACK) < 500 && spellProto->Id != HUNTER_AUTOSHOOT)
3943 {
3945 }
3946
3947 m_AutoRepeatFirstCast = false;
3948
3949 // Check for ranged attack timer
3951 {
3953 if (result != SPELL_CAST_OK)
3954 {
3955 if (spellProto->Id != HUNTER_AUTOSHOOT)
3956 {
3958 }
3959
3960 return;
3961 }
3962
3963 // We want to shoot
3964 Spell* spell = new Spell(this, spellProto, TRIGGERED_FULL_MASK);
3965 spell->prepare(&(m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_targets));
3966
3967 // Reset attack
3969 }
3970}
SpellCastResult
Definition SharedDefines.h:948
@ SPELL_CAST_OK
Definition SharedDefines.h:1138
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
Definition SpellDefines.h:150
@ CURRENT_AUTOREPEAT_SPELL
Definition Unit.h:540
Definition Spell.h:287
SpellCastResult prepare(SpellCastTargets const *targets, AuraEffect const *triggeredByAura=nullptr)
Definition Spell.cpp:3485
SpellCastResult CheckCast(bool strict)
Definition Spell.cpp:5669
SpellInfo const *const m_spellInfo
Definition Spell.h:523
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
Definition Unit.cpp:4093
bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
Definition Unit.cpp:4132
void setAttackTimer(WeaponAttackType type, int32 time)
Definition Unit.h:844
bool isMoving() const
Definition Unit.h:1635
int32 getAttackTimer(WeaponAttackType type) const
Definition Unit.h:846
bool isAttackReady(WeaponAttackType type=BASE_ATTACK) const
Definition Unit.h:847
void resetAttackTimer(WeaponAttackType type=BASE_ATTACK)
Definition Unit.cpp:643

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

Referenced by _UpdateSpells().

◆ _UpdateSpells()

void Unit::_UpdateSpells ( uint32  time)
protected
3859{
3862
3863 // remove finished spells from current pointers
3864 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
3865 {
3866 if (m_currentSpells[i] && m_currentSpells[i]->getState() == SPELL_STATE_FINISHED)
3867 {
3869 m_currentSpells[i] = nullptr; // remove pointer
3870 }
3871 }
3872
3873 // m_auraUpdateIterator can be updated in indirect called code at aura remove to skip next planned to update but removed auras
3875 {
3876 Aura* i_aura = m_auraUpdateIterator->second;
3877 ++m_auraUpdateIterator; // need shift to next for allow update if need into aura update
3878 i_aura->UpdateOwner(time, this);
3879 }
3880
3881 // remove expired auras - do that after updates(used in scripts?)
3882 for (AuraMap::iterator i = m_ownedAuras.begin(); i != m_ownedAuras.end();)
3883 {
3884 if (i->second->IsExpired())
3886 else if (i->second->GetSpellInfo()->IsChanneled() && i->second->GetCasterGUID() != GetGUID() && !ObjectAccessor::GetWorldObject(*this, i->second->GetCasterGUID()))
3887 RemoveOwnedAura(i, AURA_REMOVE_BY_CANCEL); // remove channeled auras when caster is not on the same map
3888 else
3889 ++i;
3890 }
3891
3892 for (VisibleAuraMap::iterator itr = m_visibleAuras.begin(); itr != m_visibleAuras.end(); ++itr)
3893 if (itr->second->IsNeedClientUpdate())
3894 itr->second->ClientUpdate();
3895
3897
3898 if (!m_gameObj.empty())
3899 {
3900 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
3901 {
3902 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
3903 if (!go->isSpawned())
3904 {
3905 go->SetOwnerGUID(ObjectGuid::Empty);
3906 go->SetRespawnTime(0);
3907 go->Delete();
3908 m_gameObj.erase(itr++);
3909 continue;
3910 }
3911 ++itr;
3912 }
3913 }
3914}
@ AURA_REMOVE_BY_CANCEL
Definition SpellAuraDefines.h:393
@ SPELL_STATE_FINISHED
Definition Spell.h:229
void UpdateOwner(uint32 diff, WorldObject *owner)
Definition SpellAuras.cpp:756
Definition GameObject.h:120
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4738
void _UpdateAutoRepeatSpell()
Definition Unit.cpp:3916
VisibleAuraMap m_visibleAuras
Definition Unit.h:2102
GameObject * GetGameObject(WorldObject const &u, ObjectGuid const guid)
Definition ObjectAccessor.cpp:184
WorldObject * GetWorldObject(WorldObject const &, ObjectGuid const guid)
Definition ObjectAccessor.cpp:115

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 
)
18912{
18913 if (!spellInfo)
18914 return nullptr;
18915
18916 if (target->IsImmunedToSpell(spellInfo))
18917 return nullptr;
18918
18919 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
18920 {
18921 if (!(effMask & (1 << i)))
18922 continue;
18923 if (target->IsImmunedToSpellEffect(spellInfo, i))
18924 effMask &= ~(1 << i);
18925 }
18926
18927 if (Aura* aura = Aura::TryRefreshStackOrCreate(spellInfo, effMask, target, this))
18928 {
18929 aura->ApplyForTargets();
18930 return aura;
18931 }
18932 return nullptr;
18933}
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
virtual bool IsImmunedToSpellEffect(SpellInfo const *spellInfo, uint32 index) const
Definition Unit.cpp:13050
virtual bool IsImmunedToSpell(SpellInfo const *spellInfo, Spell const *spell=nullptr)
Definition Unit.cpp:12960

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

◆ AddAura() [2/2]

Aura * Unit::AddAura ( uint32  spellId,
Unit target 
)
18897{
18898 if (!target)
18899 return nullptr;
18900
18901 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
18902 if (!spellInfo)
18903 return nullptr;
18904
18905 if (!target->IsAlive() && !spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_DEAD_TARGET))
18906 return nullptr;
18907
18908 return AddAura(spellInfo, MAX_EFFECT_MASK, target);
18909}
#define MAX_EFFECT_MASK
Definition DBCStructure.h:1639
@ SPELL_ATTR2_ALLOW_DEAD_TARGET
Definition SharedDefines.h:456
@ SPELL_ATTR0_PASSIVE
Definition SharedDefines.h:388
bool HasAttribute(SpellAttr0 attribute) const
Definition SpellInfo.h:415
Aura * AddAura(uint32 spellId, Unit *target)
Definition Unit.cpp:18896

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::HandleOnEffectApply(), spell_transitus_shield_beam_aura::HandleOnEffectApply(), npc_pet_dk_dancing_rune_weapon::npc_pet_dk_dancing_rune_weaponAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), Guardian::InitStatsForLevel(), boss_gahzranka::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), npc_dalaran_warrior::npc_dalaran_warriorAI::JustEngagedWith(), boss_shirrak_the_dead_watcher::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_aura::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::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(), 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(), 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
976{ m_ComboPointHolders.insert(unit); }
std::unordered_set< Unit * > m_ComboPointHolders
Definition Unit.h:2168

References m_ComboPointHolders.

Referenced by AddComboPoints().

◆ AddComboPoints() [1/2]

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

References AddComboPoints().

Referenced by AddComboPoints().

◆ AddComboPoints() [2/2]

void Unit::AddComboPoints ( Unit target,
int8  count 
)
16872{
16873 if (!count)
16874 {
16875 return;
16876 }
16877
16878 if (target && target != m_comboTarget)
16879 {
16880 if (m_comboTarget)
16881 {
16883 }
16884
16885 m_comboTarget = target;
16886 m_comboPoints = count;
16887 target->AddComboPointHolder(this);
16888 }
16889 else
16890 {
16891 m_comboPoints = std::max<int8>(std::min<int8>(m_comboPoints + count, 5), 0);
16892 }
16893
16895}
void SendComboPoints()
Definition Unit.cpp:16914
void AddComboPointHolder(Unit *unit)
Definition Unit.h:976
void RemoveComboPointHolder(Unit *unit)
Definition Unit.h:977

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)
2782{
2784 if (!targetGUID)
2785 {
2786 if (ObjectGuid selection = GetTarget())
2787 {
2788 targetGUID = selection; // Spell was cast directly (not triggered by aura)
2789 }
2790 else
2791 return;
2792 }
2793
2794 extraAttacksTargets[targetGUID] += count;
2795}
std::unordered_map< ObjectGuid, uint32 > extraAttacksTargets
Definition Unit.h:2179
ObjectGuid _lastDamagedTargetGuid
Definition Unit.h:2180
ObjectGuid GetTarget() const
Definition Unit.h:827

References _lastDamagedTargetGuid, extraAttacksTargets, and GetTarget().

Referenced by Spell::EffectAddExtraAttacks().

◆ AddExtraUnitMovementFlag()

void Unit::AddExtraUnitMovementFlag ( uint16  f)
inline
749{ m_movementInfo.flags2 |= f; }
MovementInfo m_movementInfo
Definition Object.h:608
uint16 flags2
Definition Object.h:286

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:2164

References LinkedListHead::insertFirst(), and m_FollowingRefMgr.

Referenced by FollowerReference::targetObjectBuildLink().

◆ AddGameObject()

void Unit::AddGameObject ( GameObject gameObj)
6236{
6237 if (!gameObj || gameObj->GetOwnerGUID())
6238 return;
6239
6240 m_gameObj.push_back(gameObj->GetGUID());
6241 gameObj->SetOwnerGUID(GetGUID());
6242
6243 if (IsPlayer() && gameObj->GetSpellId())
6244 {
6245 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(gameObj->GetSpellId());
6246 // Need disable spell use for owner
6247 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6248 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6249 ToPlayer()->AddSpellAndCategoryCooldowns(createBySpell, 0, nullptr, true);
6250 }
6251}
uint32 GetSpellId() const
Definition GameObject.h:181
void SetOwnerGUID(ObjectGuid owner)
Definition GameObject.h:163
ObjectGuid GetOwnerGUID() const
Definition GameObject.h:173
void AddSpellAndCategoryCooldowns(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
Definition Player.cpp:10887
bool IsCooldownStartedOnEvent() const
Definition SpellInfo.cpp:1212

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

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

◆ addHatedBy()

void Unit::addHatedBy ( HostileReference pHostileReference)
inline

◆ AddInterruptMask()

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

References m_interruptMask.

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

◆ AddPetAura()

void Unit::AddPetAura ( PetAura const *  petSpell)
17331{
17332 if (!IsPlayer())
17333 return;
17334
17335 m_petAuras.insert(petSpell);
17336 if (Pet* pet = ToPlayer()->GetPet())
17337 pet->CastPetAura(petSpell);
17338 else if (Unit* charm = GetCharm())
17339 charm->CastPetAura(petSpell);
17340}
Definition Pet.h:41
Unit * GetCharm() const
Definition Unit.cpp:10715
PetAuraSet m_petAuras
Definition Unit.h:2017
Pet * GetPet(WorldObject const &, ObjectGuid const guid)
Definition ObjectAccessor.cpp:215

References GetCharm(), Object::IsPlayer(), m_petAuras, and Object::ToPlayer().

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

◆ AddPlayerToVision()

void Unit::AddPlayerToVision ( Player player)
11214{
11215 if (m_sharedVision.empty())
11216 {
11217 setActive(true);
11218 SetWorldObject(true);
11219 }
11220 m_sharedVision.push_back(player);
11221 player->m_isInSharedVisionOf.insert(this);
11222}
void SetWorldObject(bool apply)
Definition Object.cpp:1075
void setActive(bool isActiveObject)
Definition Object.cpp:1094

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

◆ AddPointedBy()

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

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 
)
14705{
14706 // Only mobs can manage threat lists
14708 {
14709 m_ThreatMgr.AddThreat(victim, fThreat, schoolMask, threatSpell);
14710 }
14711}
@ UNIT_STATE_EVADE
Definition UnitDefines.h:191
void AddThreat(Unit *victim, float threat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition ThreatMgr.cpp:436
bool HasUnitState(const uint32 f) const
Definition Unit.h:707
bool CanHaveThreatList(bool skipAliveCheck=false) const
Definition Unit.cpp:14665

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_alythess::AttackStart(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::AttackStart(), npc_capernian::AttackStart(), npc_zuljin_vortex::ChangeToNewPlayer(), 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_teron_gorefiend_shadowy_construct::HandleEffectApply(), AuraEffect::HandlePeriodicManaLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_the_lich_king_vile_spirit_move_target_search::HandleScript(), spell_pursue::HandleScript(), Spell::HandleThreatSpells(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), npc_tiger_matriarch::npc_tiger_matriarchAI::IsSummonedBy(), npc_little_ooze::npc_little_oozeAI::IsSummonedBy(), npc_malchezaar_axe::JustEngagedWith(), boss_kagani_nightstrike::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::JustSummoned(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustSummoned(), npc_akama_illidan::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(), boss_shade_of_akama::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_mage_mirror_image::MySelectNextTarget(), SmartScript::ProcessAction(), RemoveCharmedBy(), npc_dark_fiend::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), boss_skarvald_the_constructor::Reset(), boss_dalronn_the_controller::Reset(), npc_pet_hunter_snake_trap::Reset(), boss_warbringer_omrogg::ScheduleBurningPhase(), boss_romulo::ScheduleCombat(), npc_thaladred::ScheduleEvents(), boss_warbringer_omrogg::ScheduleNonBurningPhase(), boss_supremus::SchedulePhase(), 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::StartAttack(), brann_bronzebeard::brann_bronzebeardAI::SummonCreatures(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::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::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), and npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI().

◆ AddToWorld()

void Unit::AddToWorld ( )
overridevirtual

Reimplemented from Object.

15726{
15727 if (!IsInWorld())
15728 {
15730 }
15731}
void AddToWorld() override
Definition Object.cpp:1187

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

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

◆ AddUnitMovementFlag()

◆ AddUnitState()

void Unit::AddUnitState ( uint32  f)
inline
706{ 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(), boss_nightbane::DoAction(), WaypointMovementGenerator< Creature >::DoInitialize(), RandomMovementGenerator< T >::DoInitialize(), ChaseMovementGenerator< 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(), boss_lady_vashj::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::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
713{ m_unitTypeMask |= mask; }

References m_unitTypeMask.

◆ ApplyAttackTimePercentMod()

void Unit::ApplyAttackTimePercentMod ( WeaponAttackType  att,
float  val,
bool  apply 
)
17088{
17089 float remainingTimePct = std::max((float)m_attackTimer[att], 0.0f) / (GetAttackTime(att) * m_modAttackSpeedPct[att]);
17090 if (val > 0)
17091 {
17093 ApplyPercentModFloatValue(static_cast<uint16>(UNIT_FIELD_BASEATTACKTIME) + att, val, !apply);
17094 }
17095 else
17096 {
17098 ApplyPercentModFloatValue(static_cast<uint16>(UNIT_FIELD_BASEATTACKTIME) + att, -val, apply);
17099 }
17100 m_attackTimer[att] = uint32(GetAttackTime(att) * m_modAttackSpeedPct[att] * remainingTimePct);
17101}
std::uint16_t uint16
Definition Define.h:108
@ UNIT_FIELD_BASEATTACKTIME
Definition UpdateFields.h:120
void ApplyPercentModFloatVar(float &var, float val, bool apply)
Definition Util.h:50
void ApplyPercentModFloatValue(uint16 index, float val, bool apply)
Definition Object.cpp:829
uint32 GetAttackTime(WeaponAttackType att) const
Definition Unit.h:873

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 
)
17104{
17105 if (val > 0)
17107 else
17109}
@ 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 
)
15178{
15179 // Checking for existing in the table
15180 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15181 {
15182 if (i->DRGroup != group)
15183 continue;
15184
15185 if (apply)
15186 i->stack += 1;
15187 else if (i->stack)
15188 {
15189 i->stack -= 1;
15190 // Remember time after last aura from group removed
15191 if (i->stack == 0)
15192 i->hitTime = GameTime::GetGameTimeMS().count();
15193 }
15194 break;
15195 }
15196}
Diminishing m_Diminishing
Definition Unit.h:2160
Milliseconds GetGameTimeMS()
Definition GameTime.cpp:43

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 
)
15099{
15100 // xinef: dont apply diminish to self casts
15101 if (duration == -1 || group == DIMINISHING_NONE)
15102 return 1.0f;
15103
15104 // test pet/charm masters instead pets/charmeds
15105 Unit const* targetOwner = GetOwner();
15106 Unit const* casterOwner = caster->GetOwner();
15107
15108 // Duration of crowd control abilities on pvp target is limited by 10 sec. (2.2.0)
15109 if (limitduration > 0 && duration > limitduration)
15110 {
15111 Unit const* target = targetOwner ? targetOwner : this;
15112 Unit const* source = casterOwner ? casterOwner : caster;
15113
15114 if ((target->IsPlayer()
15116 && source->IsPlayer())
15117 duration = limitduration;
15118 }
15119
15120 float mod = 1.0f;
15121
15122 if (group == DIMINISHING_TAUNT)
15123 {
15125 {
15126 DiminishingLevels diminish = Level;
15127 switch (diminish)
15128 {
15130 break;
15132 mod = 0.65f;
15133 break;
15135 mod = 0.4225f;
15136 break;
15138 mod = 0.274625f;
15139 break;
15141 mod = 0.0f;
15142 break;
15143 default:
15144 break;
15145 }
15146 }
15147 }
15148 // Some diminishings applies to mobs too (for example, Stun)
15150 && ((targetOwner ? (targetOwner->IsPlayer()) : (IsPlayer()))
15151 || (IsCreature() && ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_ALL_DIMINISH))))
15153 {
15154 DiminishingLevels diminish = Level;
15155 switch (diminish)
15156 {
15158 break;
15160 mod = 0.5f;
15161 break;
15163 mod = 0.25f;
15164 break;
15166 mod = 0.0f;
15167 break;
15168 default:
15169 break;
15170 }
15171 }
15172
15173 duration = int32(duration * mod);
15174 return mod;
15175}
@ CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS
Definition CreatureData.h:64
@ CREATURE_FLAG_EXTRA_ALL_DIMINISH
Definition CreatureData.h:65
@ Level
Requires the player to be at least a specific level.
@ DIMINISHING_NONE
Definition SharedDefines.h:3258
@ DIMINISHING_TAUNT
Definition SharedDefines.h:3276
@ DRTYPE_PLAYER
Definition SharedDefines.h:3251
@ DRTYPE_ALL
Definition SharedDefines.h:3252
DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group)
Definition SpellMgr.cpp:245
DiminishingLevels
Definition Unit.h:262
@ DIMINISHING_LEVEL_3
Definition Unit.h:265
@ DIMINISHING_LEVEL_1
Definition Unit.h:263
@ DIMINISHING_LEVEL_4
Definition Unit.h:267
@ DIMINISHING_LEVEL_IMMUNE
Definition Unit.h:266
@ DIMINISHING_LEVEL_TAUNT_IMMUNE
Definition Unit.h:268
@ DIMINISHING_LEVEL_2
Definition Unit.h:264
bool HasFlagsExtra(uint32 flag) const
Definition Creature.h:73

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, GetDiminishingReturnsGroupType(), GetOwner(), Creature::HasFlagsExtra(), Object::IsCreature(), Object::IsPlayer(), Level, and Object::ToCreature().

Referenced by Spell::DoSpellHitOnUnit().

◆ ApplyEffectModifiers()

float Unit::ApplyEffectModifiers ( SpellInfo const *  spellProto,
uint8  effect_index,
float  value 
) const
14881{
14882 if (Player* modOwner = GetSpellModOwner())
14883 {
14884 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_ALL_EFFECTS, value);
14885 switch (effect_index)
14886 {
14887 case 0:
14888 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT1, value);
14889 break;
14890 case 1:
14891 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT2, value);
14892 break;
14893 case 2:
14894 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT3, value);
14895 break;
14896 }
14897 }
14898 return value;
14899}
@ SPELLMOD_EFFECT2
Definition SpellDefines.h:88
@ SPELLMOD_ALL_EFFECTS
Definition SpellDefines.h:84
@ SPELLMOD_EFFECT3
Definition SpellDefines.h:99
@ SPELLMOD_EFFECT1
Definition SpellDefines.h:79
Player * GetSpellModOwner() const
Definition Unit.cpp:16610

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
18961{
18962 // player mounted on multi-passenger mount is also classified as vehicle
18963 if (victim->IsVehicle() && !victim->IsPlayer())
18964 return;
18965
18966 Unit const* target = nullptr;
18967 if (victim->IsPlayer())
18968 target = victim;
18969 else if (victim->IsCreature())
18970 {
18971 if (Unit* owner = victim->GetOwner())
18972 if (owner->IsPlayer())
18973 target = owner;
18974 }
18975
18976 if (!target)
18977 return;
18978
18979 switch (type)
18980 {
18982 // Crit chance reduction works against nonpets
18983 if (crit)
18984 *crit -= target->GetMeleeCritChanceReduction();
18985 if (damage)
18986 {
18987 if (isCrit)
18988 *damage -= target->GetMeleeCritDamageReduction(*damage);
18989 *damage -= target->GetMeleeDamageReduction(*damage);
18990 }
18991 break;
18993 // Crit chance reduction works against nonpets
18994 if (crit)
18995 *crit -= target->GetRangedCritChanceReduction();
18996 if (damage)
18997 {
18998 if (isCrit)
18999 *damage -= target->GetRangedCritDamageReduction(*damage);
19000 *damage -= target->GetRangedDamageReduction(*damage);
19001 }
19002 break;
19004 // Crit chance reduction works against nonpets
19005 if (crit)
19006 *crit -= target->GetSpellCritChanceReduction();
19007 if (damage)
19008 {
19009 if (isCrit)
19010 *damage -= target->GetSpellCritDamageReduction(*damage);
19011 *damage -= target->GetSpellDamageReduction(*damage);
19012 }
19013 break;
19014 default:
19015 break;
19016 }
19017}
@ CR_CRIT_TAKEN_RANGED
Definition Unit.h:232
@ CR_CRIT_TAKEN_SPELL
Definition Unit.h:233
@ CR_CRIT_TAKEN_MELEE
Definition Unit.h:231
float GetSpellCritChanceReduction() const
Definition Unit.h:1213
float GetRangedCritChanceReduction() const
Definition Unit.h:1212
uint32 GetSpellCritDamageReduction(uint32 damage) const
Definition Unit.h:1217
float GetMeleeCritChanceReduction() const
Definition Unit.h:1211
uint32 GetRangedDamageReduction(uint32 damage) const
Definition Unit.h:1205
uint32 GetRangedCritDamageReduction(uint32 damage) const
Definition Unit.h:1216
uint32 GetMeleeCritDamageReduction(uint32 damage) const
Definition Unit.h:1215
uint32 GetSpellDamageReduction(uint32 damage) const
Definition Unit.h:1206
uint32 GetMeleeDamageReduction(uint32 damage) const
Definition Unit.h:1204

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

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), GetUnitCriticalChance(), spell_valkyr_touch_aura::HandleEffectPeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and SpellTakenCritChance().

◆ ApplyResistanceBuffModsMod()

void Unit::ApplyResistanceBuffModsMod ( SpellSchools  school,
bool  positive,
float  val,
bool  apply 
)
inline
1142{ 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
void apply(T *val)
Definition ByteConverter.h:40

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 
)
13461{
13462 ApplySpellImmune(spellProto->Id, IMMUNITY_DISPEL, type, apply);
13463
13464 if (apply && spellProto->HasAttribute(SPELL_ATTR1_IMMUNITY_PURGES_EFFECT))
13465 {
13466 // Create dispel mask by dispel type
13467 uint32 dispelMask = SpellInfo::GetDispelMask(type);
13468 // Dispel all existing auras vs current dispel type
13470 for (AuraApplicationMap::iterator itr = auras.begin(); itr != auras.end();)
13471 {
13472 SpellInfo const* spell = itr->second->GetBase()->GetSpellInfo();
13473 if (spell->GetDispelMask() & dispelMask)
13474 {
13475 // Dispel aura
13476 RemoveAura(itr);
13477 }
13478 else
13479 ++itr;
13480 }
13481 }
13482}
@ SPELL_ATTR1_IMMUNITY_PURGES_EFFECT
Definition SharedDefines.h:434
@ IMMUNITY_DISPEL
Definition SharedDefines.h:1398
uint32 GetDispelMask() const
Definition SpellInfo.cpp:2041
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
Definition Unit.cpp:13433
std::multimap< uint32, AuraApplication * > AuraApplicationMap
Definition Unit.h:645
AuraApplicationMap & GetAppliedAuras()
Definition Unit.h:1320

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 
)
13434{
13435 if (apply)
13436 {
13437 // xinef: immunities with spellId 0 are intended to be applied only once (script purposes mosty)
13438 if (spellId == 0 && std::find_if(m_spellImmune[op].begin(), m_spellImmune[op].end(), spellIdImmunityPredicate(type)) != m_spellImmune[op].end())
13439 return;
13440
13441 SpellImmune immune;
13442 immune.spellId = spellId;
13443 immune.type = type;
13444 immune.blockType = blockType;
13445 m_spellImmune[op].push_back(std::move(immune));
13446 }
13447 else
13448 {
13449 for (SpellImmuneList::iterator itr = m_spellImmune[op].begin(); itr != m_spellImmune[op].end(); ++itr)
13450 {
13451 if (itr->spellId == spellId && itr->type == type)
13452 {
13453 m_spellImmune[op].erase(itr);
13454 break;
13455 }
13456 }
13457 }
13458}
Definition Unit.cpp:13424
Definition SpellDefines.h:174
uint32 blockType
Definition SpellDefines.h:179
uint32 spellId
Definition SpellDefines.h:177
uint32 type
Definition SpellDefines.h:178

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_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDmgImmunity(), AuraEffect::HandleAuraModEffectImmunity(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleAuraModStateImmunity(), Aura::HandleAuraSpecificMods(), spell_q13007_iron_colossus::HandleDummy(), spell_love_in_air_perfume_immune::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_dk_anti_magic_shell_self::HandleEffectApply(), spell_dk_army_of_the_dead_passive::HandleEffectApply(), spell_dk_pet_scaling::HandleEffectApply(), spell_dru_treant_scaling::HandleEffectApply(), spell_pet_hit_expertise_scalling::HandleEffectApply(), spell_pet_spellhit_expertise_spellpen_scaling::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(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), spell_illidan_shadow_prison_aura::HandleOnEffectApply(), spell_illidan_shadow_prison_aura::HandleOnEffectRemove(), npc_hyjal_jaina::hyjalJainaAI::hyjalJainaAI(), boss_hydross_the_unstable::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_aura::OnApply(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), npc_chesspiece::Reset(), boss_curator::Reset(), boss_shade_of_aran::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_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_supremus::Reset(), boss_kaelthas::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), boss_supremus::SchedulePhase(), boss_hydross_the_unstable::SetForm(), 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
1036{ 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 
)
15389{
15390 if (val == -100.0f) // prevent set var to zero
15391 val = -99.99f;
15392 float var = GetStat(stat) * val / 100.0f;
15393 ApplyModSignedFloatValue((var > 0 ? static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat : static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat), var, apply);
15394}
float GetStat(Stats stat) const
Definition Unit.h:1011

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 
)
14693{
14694 if (!HasThreatAura() || fThreat < 0)
14695 return fThreat;
14696
14697 SpellSchools school = GetFirstSchoolInMask(schoolMask);
14698
14699 return fThreat * m_threatModifier[school];
14700}
SpellSchools
Definition SharedDefines.h:282
SpellSchools GetFirstSchoolInMask(SpellSchoolMask mask)
Definition SharedDefines.h:318
bool HasThreatAura() const
Definition Unit.h:1752

References GetFirstSchoolInMask(), HasThreatAura(), and m_threatModifier.

Referenced by ThreatCalcHelper::calcThreat().

◆ Attack()

bool Unit::Attack ( Unit victim,
bool  meleeAttack 
)
Todo:
: Implement aggro range, detection range and assistance range templates
10313{
10314 if (!victim || victim == this)
10315 return false;
10316
10317 // dead units can neither attack nor be attacked
10318 if (!IsAlive() || !victim->IsAlive())
10319 return false;
10320
10321 // pussywizard: check map, world, phase >_> multithreading crash fix
10322 if (!IsInMap(victim) || !InSamePhase(victim))
10323 return false;
10324
10325 // player cannot attack in mount state
10326 if (IsPlayer() && IsMounted())
10327 return false;
10328
10329 // creatures cannot attack while evading
10330 Creature* creature = ToCreature();
10331 if (creature && creature->IsInEvadeMode())
10332 {
10333 return false;
10334 }
10335
10336 // creatures should not try to attack the player during polymorph
10337 if (creature && creature->IsPolymorphed())
10338 {
10339 return false;
10340 }
10341
10342 //if (HasUnitFlag(UNIT_FLAG_PACIFIED)) // pussywizard: why having this flag prevents from entering combat? it should just prevent melee attack
10343 // return false;
10344
10345 // nobody can attack GM in GM-mode
10346 if (victim->IsPlayer())
10347 {
10348 if (victim->ToPlayer()->IsGameMaster())
10349 return false;
10350 }
10351 else
10352 {
10353 if (victim->ToCreature()->IsEvadingAttacks())
10354 return false;
10355 }
10356
10357 // Unit with SPELL_AURA_SPIRIT_OF_REDEMPTION can not attack
10359 return false;
10360
10361 // remove SPELL_AURA_MOD_UNATTACKABLE at attack (in case non-interruptible spells stun aura applied also that not let attack)
10362 if (HasUnattackableAura())
10364
10365 if (m_attacking)
10366 {
10367 if (m_attacking == victim)
10368 {
10369 // switch to melee attack from ranged/magic
10370 if (meleeAttack)
10371 {
10373 {
10375 SendMeleeAttackStart(victim);
10376 return true;
10377 }
10378 }
10380 {
10382 SendMeleeAttackStop(victim);
10383 return true;
10384 }
10385 return false;
10386 }
10387
10388 // switch target
10389 InterruptSpell(CURRENT_MELEE_SPELL, true, true, true);
10390 if (!meleeAttack)
10392 }
10393
10394 if (m_attacking)
10396
10397 m_attacking = victim;
10399
10400 // Set our target
10401 SetTarget(victim->GetGUID());
10402
10403 if (meleeAttack)
10405
10406 // Update leash timer when attacking creatures
10407 if (victim->IsCreature())
10409
10410 // set position before any AI calls/assistance
10411 //if (IsCreature())
10412 // ToCreature()->SetCombatStartPosition(GetPositionX(), GetPositionY(), GetPositionZ());
10413 if (creature && !(IsControllableGuardian() && IsControlledByPlayer()))
10414 {
10415 // should not let player enter combat by right clicking target - doesn't helps
10416 SetInCombatWith(victim);
10417 if (victim->IsPlayer())
10418 victim->SetInCombatWith(this);
10419
10420 AddThreat(victim, 0.0f);
10421
10423
10426 creature->CallAssistance();
10427
10429
10431 }
10432
10433 // delay offhand weapon attack by 50% of the base attack time
10436
10437 if (meleeAttack)
10438 SendMeleeAttackStart(victim);
10439
10440 return true;
10441}
@ CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE
Definition CreatureData.h:70
@ CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD
Definition IWorld.h:283
@ EMOTE_ONESHOT_NONE
Definition SharedDefines.h:1894
@ AI_REACTION_HOSTILE
Definition SharedDefines.h:3242
@ SPELL_AURA_MOD_UNATTACKABLE
Definition SpellAuraDefines.h:156
@ UNIT_STATE_MELEE_ATTACKING
Definition UnitDefines.h:171
@ CURRENT_MELEE_SPELL
Definition Unit.h:537
@ UNIT_NPC_EMOTESTATE
Definition UpdateFields.h:140
T CalculatePct(T base, U pct)
Definition Util.h:61
void CallAssistance(Unit *target=nullptr)
Definition Creature.cpp:2432
bool IsEvadingAttacks() const
Definition Creature.h:136
void UpdateLeashExtensionTime()
Definition Creature.cpp:3727
void SetAssistanceTimer(uint32 value)
Definition Creature.h:407
void SendAIReaction(AiReaction reactionType)
Definition Creature.cpp:2420
bool IsInEvadeMode() const
Definition Creature.h:135
float GetFloatValue(uint16 index) const
Definition Object.cpp:317
bool IsGameMaster() const
Definition Player.h:1176
bool HasOffhandWeaponForAttack() const
Definition Unit.h:943
void ClearUnitState(uint32 f)
Definition Unit.h:708
bool IsPolymorphed() const
Definition Unit.cpp:16774
void AddThreat(Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition Unit.cpp:14704
void _removeAttacker(Unit *pAttacker)
Definition Unit.h:2152
void _addAttacker(Unit *pAttacker)
Definition Unit.h:2151
void SetInCombatWith(Unit *enemy, uint32 duration=0)
Definition Unit.cpp:13625
bool HasUnattackableAura() const
Definition Unit.h:1754
bool IsMounted() const
Definition Unit.h:1807
void SendMeleeAttackStart(Unit *victim, Player *sendTo=nullptr)
Definition Unit.cpp:3075
bool IsControllableGuardian() const
Definition Unit.h:762
void SetUInt32Value(uint16 index, uint32 value)
Definition Unit.cpp:21353
void SendMeleeAttackStop(Unit *victim=nullptr)
Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or int...
Definition Unit.cpp:3091
bool IsControlledByPlayer() const
Definition Unit.h:1248
bool HasSpiritOfRedemptionAura() const
Definition Unit.h:1725
virtual void SetTarget(ObjectGuid=ObjectGuid::Empty)=0
bool InSamePhase(WorldObject const *obj) const
Definition Object.h:453
bool IsInMap(WorldObject const *obj) const
Definition Object.cpp:1296
#define sWorld
Definition World.h:357

References _addAttacker(), _removeAttacker(), AddThreat(), AddUnitState(), AI_REACTION_HOSTILE, BASE_ATTACK, CalculatePct(), Creature::CallAssistance(), ClearUnitState(), CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD, CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE, CURRENT_MELEE_SPELL, EMOTE_ONESHOT_NONE, getAttackTimer(), Object::GetFloatValue(), Object::GetGUID(), Creature::HasFlagsExtra(), HasOffhandWeaponForAttack(), HasSpiritOfRedemptionAura(), HasUnattackableAura(), HasUnitState(), WorldObject::InSamePhase(), InterruptSpell(), IsAlive(), isAttackReady(), IsControllableGuardian(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), Player::IsGameMaster(), Creature::IsInEvadeMode(), WorldObject::IsInMap(), IsMounted(), Object::IsPlayer(), IsPolymorphed(), m_attacking, OFF_ATTACK, RemoveAurasByType(), Creature::SendAIReaction(), SendMeleeAttackStart(), SendMeleeAttackStop(), Creature::SetAssistanceTimer(), setAttackTimer(), SetInCombatWith(), SetTarget(), SetUInt32Value(), SPELL_AURA_MOD_UNATTACKABLE, sWorld, Object::ToCreature(), Object::ToPlayer(), UNIT_FIELD_BASEATTACKTIME, UNIT_NPC_EMOTESTATE, UNIT_STATE_MELEE_ATTACKING, and Creature::UpdateLeashExtensionTime().

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_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), TurretAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), boss_alythess::AttackStart(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), boss_jormungarAI::AttackStart(), boss_four_horsemen::boss_four_horsemenAI::AttackStart(), boss_magus_telestra::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_lady_malande::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_capernian::AttackStart(), npc_pet_gen_gnomish_flame_turret::AttackStart(), UnitAI::AttackStartCaster(), ScriptedAI::AttackStartNoMove(), PetAI::DoAttack(), WorldSession::HandleAttackSwingOpcode(), spell_q12096_q12092_dummy::HandleDummy(), WorldSession::HandlePetActionHelper(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::IsSummonedBy(), boss_halazzi::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_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 
)
2578{
2580 {
2581 return;
2582 }
2583
2584 if (HasUnitState(UNIT_STATE_CANNOT_AUTOATTACK) && !extra && !ignoreCasting)
2585 {
2586 return;
2587 }
2588
2589 if (!victim->IsAlive())
2590 return;
2591
2592 if ((attType == BASE_ATTACK || attType == OFF_ATTACK) && !IsWithinLOSInMap(victim))
2593 return;
2594
2595 // CombatStart puts the target into stand state, so we need to cache sit state here to know if we should crit later
2596 const bool sittingVictim = victim->IsPlayer() && (victim->IsSitState() || victim->getStandState() == UNIT_STAND_STATE_SLEEP);
2597
2598 CombatStart(victim);
2600
2601 if (attType != BASE_ATTACK && attType != OFF_ATTACK)
2602 return; // ignore ranged case
2603
2604 if (!extra && _lastExtraAttackSpell)
2605 {
2607 }
2608
2609 bool meleeAttack = true;
2610
2611 // melee attack spell casted at main hand attack only - no normal melee dmg dealt
2612 if (attType == BASE_ATTACK && m_currentSpells[CURRENT_MELEE_SPELL] && !extra)
2613 {
2614 meleeAttack = false; // The melee attack is replaced by the melee spell
2615
2617 SpellCastResult castResult = meleeSpell->CheckCast(false);
2618 if (castResult != SPELL_CAST_OK)
2619 {
2620 meleeSpell->SendCastResult(castResult);
2621 meleeSpell->SendInterrupted(0);
2622
2623 meleeSpell->finish(false);
2624 meleeSpell->SetExecutedCurrently(false);
2625
2626 if (castResult == SPELL_FAILED_NO_POWER)
2627 {
2628 // Not enough rage, do a regular melee attack instead
2629 meleeAttack = true;
2630 }
2631 }
2632 else
2633 {
2634 meleeSpell->cast(true);
2635 }
2636 }
2637 if (meleeAttack)
2638 {
2639 // attack can be redirected to another target
2640 victim = GetMeleeHitRedirectTarget(victim);
2641 CalcDamageInfo damageInfo;
2642 CalculateMeleeDamage(victim, &damageInfo, attType, sittingVictim);
2643
2644 // Send log damage message to client
2645 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
2646 {
2647 Unit::DealDamageMods(victim, damageInfo.damages[i].damage, &damageInfo.damages[i].absorb);
2648 }
2649
2650 // Related to sparring system. Allow attack animations even if there are no damages
2651 if (victim->CanSparringWith(damageInfo.attacker))
2652 damageInfo.HitInfo |= HITINFO_FAKE_DAMAGE;
2653
2654 SendAttackStateUpdate(&damageInfo);
2655
2656 //TriggerAurasProcOnEvent(damageInfo);
2657
2658 _lastDamagedTargetGuid = victim->GetGUID();
2659
2660 DealMeleeDamage(&damageInfo, true);
2661
2662 DamageInfo dmgInfo(damageInfo);
2663 Unit::ProcDamageAndSpell(damageInfo.attacker, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, damageInfo.procEx, dmgInfo.GetDamage(),
2664 damageInfo.attackType, nullptr, nullptr, -1, nullptr, &dmgInfo);
2665
2666 if (IsPlayer())
2667 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (Player) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2668 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2669 else
2670 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (NPC) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2671 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2672
2673 // Let the pet know we've started attacking someting. Handles melee attacks only
2674 // Spells such as auto-shot and others handled in WorldSession::HandleCastSpellOpcode
2675 if (IsPlayer() && !m_Controlled.empty())
2676 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
2677 if (Unit* pet = *itr)
2678 if (pet->IsAlive() && pet->IsCreature())
2679 pet->ToCreature()->AI()->OwnerAttacked(victim);
2680 }
2681}
#define MAX_ITEM_PROTO_DAMAGES
Definition ItemTemplate.h:613
@ SPELL_FAILED_NO_POWER
Definition SharedDefines.h:1034
@ AURA_INTERRUPT_FLAG_MELEE_ATTACK
Definition SpellDefines.h:55
@ UNIT_STAND_STATE_SLEEP
Definition UnitDefines.h:35
@ UNIT_STATE_CANNOT_AUTOATTACK
Definition UnitDefines.h:214
@ UNIT_FLAG_PACIFIED
Definition UnitDefines.h:267
@ HITINFO_FAKE_DAMAGE
Definition Unit.h:121
Definition Unit.h:330
std::string ToString() const
Definition ObjectGuid.cpp:47
void cast(bool skipCheck=false)
Definition Spell.cpp:3803
void SetExecutedCurrently(bool yes)
Definition Spell.h:565
void SendInterrupted(uint8 result)
Definition Spell.cpp:5190
static void SendCastResult(Player *caster, SpellInfo const *spellInfo, uint8 castCount, SpellCastResult result, SpellCustomErrors customError=SPELL_CUSTOM_ERROR_NONE)
Definition Spell.cpp:4685
void finish(bool ok=true)
Definition Spell.cpp:4498
void SendAttackStateUpdate(CalcDamageInfo *damageInfo)
Definition Unit.cpp:6535
void CombatStart(Unit *target, bool initialAggro=true)
Definition Unit.cpp:13670
Unit * GetMeleeHitRedirectTarget(Unit *victim, SpellInfo const *spellInfo=nullptr)
Definition Unit.cpp:11101
void CalculateMeleeDamage(Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
Definition Unit.cpp:1476
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:6434
uint8 getStandState() const
Definition Unit.h:1702
void DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
Definition Unit.cpp:1841
bool CanSparringWith(Unit const *attacker) const
Definition Unit.cpp:3972
static void DealDamageMods(Unit const *victim, uint32 &damage, uint32 *absorb)
Definition Unit.cpp:801
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:1358
Definition Unit.h:463
uint32 procAttacker
Definition Unit.h:480
uint32 procVictim
Definition Unit.h:481
uint32 absorb
Definition Unit.h:471
struct CalcDamageInfo::@265 damages[MAX_ITEM_PROTO_DAMAGES]
uint32 damage
Definition Unit.h:470
uint32 procEx
Definition Unit.h:482
uint32 HitInfo
Definition Unit.h:476
Unit * attacker
Definition Unit.h:464
Unit * target
Definition Unit.h:465
WeaponAttackType attackType
Definition Unit.h:479
std::string ToString() const
Definition Position.cpp:52

References _lastDamagedTargetGuid, _lastExtraAttackSpell, CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::attackType, AURA_INTERRUPT_FLAG_MELEE_ATTACK, BASE_ATTACK, CalculateMeleeDamage(), CanSparringWith(), Spell::cast(), Spell::CheckCast(), CombatStart(), CURRENT_MELEE_SPELL, CalcDamageInfo::damage, CalcDamageInfo::damages, DealDamageMods(), DealMeleeDamage(), Spell::finish(), DamageInfo::GetAbsorb(), DamageInfo::GetBlock(), DamageInfo::GetDamage(), Object::GetGUID(), Object::GetGUID(), GetMeleeHitRedirectTarget(), DamageInfo::GetResist(), getStandState(), HasUnitFlag(), HasUnitState(), CalcDamageInfo::HitInfo, HITINFO_FAKE_DAMAGE, IsAlive(), Object::IsPlayer(), 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(), UNIT_FLAG_PACIFIED, UNIT_STAND_STATE_SLEEP, and UNIT_STATE_CANNOT_AUTOATTACK.

Referenced by UnitAI::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(), and boss_the_lurker_below::UpdateAI().

◆ AttackStop()

bool Unit::AttackStop ( )

Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client.

10448{
10449 if (!m_attacking)
10450 return false;
10451
10452 Unit* victim = m_attacking;
10453
10455 m_attacking = nullptr;
10456
10457 // Clear our target
10459
10461
10463
10464 // reset only at real combat stop
10465 if (Creature* creature = ToCreature())
10466 {
10467 creature->SetNoCallAssistance(false);
10468
10469 if (creature->HasSearchedAssistance())
10470 {
10471 creature->SetNoSearchAssistance(false);
10472 }
10473 }
10474
10475 SendMeleeAttackStop(victim);
10476
10477 return true;
10478}

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(), advisor_baseAI::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_aura::HandleEffectApply(), spell_q11065_wrangle_some_aether_rays_aura::HandleEffectApply(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetStopAttack(), RotateMovementGenerator::Initialize(), boss_janalai::JustEngagedWith(), PetAI::KilledUnit(), MotionMaster::MoveSeekAssistance(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), PetSpellFail(), RemoveCharmedBy(), boss_janalai::Reset(), boss_warbringer_omrogg::ScheduleBurningPhase(), boss_felmyst::ScheduleGroundAbilities(), boss_warbringer_omrogg::ScheduleNonBurningPhase(), 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_attumen::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_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
10581{
10583 for (AuraStateAurasMap::const_iterator itr = m_auraStateAuras.begin(); itr != m_auraStateAuras.end(); ++itr)
10584 if ((1 << (itr->first - 1)) & PER_CASTER_AURA_STATE_MASK)
10585 if (itr->second->GetBase()->GetCasterGUID() == target->GetGUID())
10586 auraStates |= (1 << (itr->first - 1));
10587
10588 return auraStates;
10589}
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 PatchValuesUpdate().

◆ BuildCooldownPacket() [1/2]

void Unit::BuildCooldownPacket ( WorldPacket data,
uint8  flags,
PacketCooldowns const &  cooldowns 
)
21026{
21027 data.Initialize(SMSG_SPELL_COOLDOWN, 8 + 1 + (4 + 4) * cooldowns.size());
21028 data << GetGUID();
21029 data << uint8(flags);
21030 for (std::unordered_map<uint32, uint32>::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
21031 {
21032 data << uint32(itr->first);
21033 data << uint32(itr->second);
21034 }
21035}
void Initialize(uint16 opcode, std::size_t newres=200)
Definition WorldPacket.h:68
@ SMSG_SPELL_COOLDOWN
Definition Opcodes.h:338

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

◆ BuildCooldownPacket() [2/2]

◆ BuildHeartBeatMsg()

void Unit::BuildHeartBeatMsg ( WorldPacket data) const
2085{
2086 data->Initialize(MSG_MOVE_HEARTBEAT, 32);
2087 *data << GetPackGUID();
2088 BuildMovementPacket(data);
2089}
void BuildMovementPacket(ByteBuffer *data) const
Definition Unit.cpp:19933
@ MSG_MOVE_HEARTBEAT
Definition Opcodes.h:268

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
19934{
19935 *data << uint32(GetUnitMovementFlags()); // movement flags
19936 *data << uint16(GetExtraUnitMovementFlags()); // 2.3.0
19937 *data << uint32(GameTime::GetGameTimeMS().count()); // time / counter
19938 *data << GetPositionX();
19939 *data << GetPositionY();
19940 *data << GetPositionZ();
19941 *data << GetOrientation();
19942
19943 // 0x00000200
19945 {
19946 if (m_vehicle)
19947 *data << m_vehicle->GetBase()->GetPackGUID();
19948 else if (GetTransport())
19949 *data << GetTransport()->GetPackGUID();
19950 else
19951 *data << (uint8)0;
19952
19953 *data << float (GetTransOffsetX());
19954 *data << float (GetTransOffsetY());
19955 *data << float (GetTransOffsetZ());
19956 *data << float (GetTransOffsetO());
19957 *data << uint32(GetTransTime());
19958 *data << uint8 (GetTransSeat());
19959
19962 }
19963
19964 // 0x02200000
19967 *data << (float)m_movementInfo.pitch;
19968
19969 *data << (uint32)m_movementInfo.fallTime;
19970
19971 // 0x00001000
19973 {
19974 *data << (float)m_movementInfo.jump.zspeed;
19975 *data << (float)m_movementInfo.jump.sinAngle;
19976 *data << (float)m_movementInfo.jump.cosAngle;
19977 *data << (float)m_movementInfo.jump.xyspeed;
19978 }
19979
19980 // 0x04000000
19982 *data << (float)m_movementInfo.splineElevation;
19983}
@ MOVEMENTFLAG_ONTRANSPORT
Definition UnitDefines.h:374
@ MOVEMENTFLAG_FLYING
Definition UnitDefines.h:390
@ MOVEMENTFLAG_FALLING
Definition UnitDefines.h:377
@ MOVEMENTFLAG_SWIMMING
Definition UnitDefines.h:386
@ MOVEMENTFLAG_SPLINE_ELEVATION
Definition UnitDefines.h:391
@ MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING
Definition UnitDefines.h:426
@ MOVEMENTFLAG2_INTERPOLATED_MOVEMENT
Definition UnitDefines.h:431
uint32 GetUnitMovementFlags() const
Definition Unit.h:746
uint16 GetExtraUnitMovementFlags() const
Definition Unit.h:752
float GetTransOffsetX() const
Definition Object.h:599
float GetTransOffsetY() const
Definition Object.h:600
float GetTransOffsetZ() const
Definition Object.h:601
uint32 GetTransTime() const
Definition Object.h:603
Transport * GetTransport() const
Definition Object.h:598
float GetTransOffsetO() const
Definition Object.h:602
float cosAngle
Definition Object.h:323
float xyspeed
Definition Object.h:323
float zspeed
Definition Object.h:323
float sinAngle
Definition Object.h:323
uint32 time2
Definition Object.h:306
struct MovementInfo::JumpInfo jump
uint32 fallTime
Definition Object.h:313
struct MovementInfo::TransportInfo transport
float splineElevation
Definition Object.h:327
float pitch
Definition Object.h:310

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 
)
overrideprotectedvirtual

Reimplemented from Object.

20746{
20747 if (!target)
20748 return;
20749
20751 uint32 visibleFlag = UF_FLAG_PUBLIC;
20752
20753 if (target == this)
20754 visibleFlag |= UF_FLAG_PRIVATE;
20755
20757 if (GetOwnerGUID() == target->GetGUID())
20758 visibleFlag |= UF_FLAG_OWNER;
20759
20762 visibleFlag |= UF_FLAG_SPECIAL_INFO;
20763
20764 if (plr && plr->IsInSameRaidWith(target))
20765 visibleFlag |= UF_FLAG_PARTY_MEMBER;
20766
20767 uint64 cacheKey = static_cast<uint64>(visibleFlag) << 8 | updateType;
20768
20769 auto cacheIt = _valuesUpdateCache.find(cacheKey);
20770 if (cacheIt != _valuesUpdateCache.end())
20771 {
20772 int32 cachePos = static_cast<int32>(data->wpos());
20773 data->append(cacheIt->second.buffer);
20774
20775 BuildValuesCachePosPointers dataAdjustedPos = cacheIt->second.posPointers;
20776 if (cachePos)
20777 dataAdjustedPos.ApplyOffset(cachePos);
20778
20779 PatchValuesUpdate(*data, dataAdjustedPos, target);
20780
20781 return;
20782 }
20783
20784 BuildValuesCachedBuffer cacheValue(500);
20785
20786 ByteBuffer fieldBuffer(400);
20787
20788 UpdateMask updateMask;
20789 updateMask.SetCount(m_valuesCount);
20790
20791 for (uint16 index = 0; index < m_valuesCount; ++index)
20792 {
20793 if (_fieldNotifyFlags & flags[index] ||
20794 ((flags[index] & visibleFlag) & UF_FLAG_SPECIAL_INFO) ||
20795 ((updateType == UPDATETYPE_VALUES ? _changesMask.GetBit(index) : m_uint32Values[index]) && (flags[index] & visibleFlag)) ||
20797 {
20798 updateMask.SetBit(index);
20799
20800 if (index == UNIT_NPC_FLAGS)
20801 {
20802 cacheValue.posPointers.UnitNPCFlagsPos = int32(fieldBuffer.wpos());
20803 fieldBuffer << m_uint32Values[UNIT_NPC_FLAGS];
20804 }
20805 else if (index == UNIT_FIELD_AURASTATE)
20806 {
20807 cacheValue.posPointers.UnitFieldAuraStatePos = int32(fieldBuffer.wpos());
20808 fieldBuffer << uint32(0); // Fill in later.
20809 }
20810 // FIXME: Some values at server stored in float format but must be sent to client in uint32 format
20811 else if (index >= UNIT_FIELD_BASEATTACKTIME && index <= UNIT_FIELD_RANGEDATTACKTIME)
20812 {
20813 // convert from float to uint32 and send
20814 fieldBuffer << uint32(m_floatValues[index] < 0 ? 0 : m_floatValues[index]);
20815 }
20816 // there are some float values which may be negative or can't get negative due to other checks
20817 else if ((index >= UNIT_FIELD_NEGSTAT0 && index <= UNIT_FIELD_NEGSTAT4) ||
20820 (index >= UNIT_FIELD_POSSTAT0 && index <= UNIT_FIELD_POSSTAT4))
20821 {
20822 fieldBuffer << uint32(m_floatValues[index]);
20823 }
20824 // Gamemasters should be always able to select units - remove not selectable flag
20825 else if (index == UNIT_FIELD_FLAGS)
20826 {
20827 cacheValue.posPointers.UnitFieldFlagsPos = int32(fieldBuffer.wpos());
20828 fieldBuffer << m_uint32Values[UNIT_FIELD_FLAGS];
20829 }
20830 // use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures
20831 else if (index == UNIT_FIELD_DISPLAYID)
20832 {
20833 cacheValue.posPointers.UnitFieldDisplayPos = int32(fieldBuffer.wpos());
20834 fieldBuffer << m_uint32Values[UNIT_FIELD_DISPLAYID];
20835 }
20836 else if (index == UNIT_DYNAMIC_FLAGS)
20837 {
20838 cacheValue.posPointers.UnitDynamicFlagsPos = int32(fieldBuffer.wpos());
20840 fieldBuffer << dynamicFlags;
20841 }
20842 else if (index == UNIT_FIELD_BYTES_2)
20843 {
20844 cacheValue.posPointers.UnitFieldBytes2Pos = int32(fieldBuffer.wpos());
20845 fieldBuffer << m_uint32Values[index];
20846 }
20847 else if (index == UNIT_FIELD_FACTIONTEMPLATE)
20848 {
20849 cacheValue.posPointers.UnitFieldFactionTemplatePos = int32(fieldBuffer.wpos());
20850 fieldBuffer << m_uint32Values[index];
20851 }
20852 else
20853 {
20854 if (sScriptMgr->ShouldTrackValuesUpdatePosByIndex(this, updateType, index))
20855 cacheValue.posPointers.other[index] = static_cast<uint32>(fieldBuffer.wpos());
20856
20857 // send in current format (float as float, uint32 as uint32)
20858 fieldBuffer << m_uint32Values[index];
20859 }
20860 }
20861 }
20862
20863 cacheValue.buffer << uint8(updateMask.GetBlockCount());
20864 updateMask.AppendToPacket(&cacheValue.buffer);
20865 int32 fieldBufferPos = static_cast<int32>(cacheValue.buffer.wpos());
20866 cacheValue.buffer.append(fieldBuffer);
20867 cacheValue.posPointers.ApplyOffset(fieldBufferPos);
20868
20869 int32 cachePos = static_cast<int32>(data->wpos());
20870 data->append(cacheValue.buffer);
20871
20872 BuildValuesCachePosPointers dataAdjustedPos = cacheValue.posPointers;
20873 if (cachePos)
20874 dataAdjustedPos.ApplyOffset(cachePos);
20875
20876 PatchValuesUpdate(*data, dataAdjustedPos, target);
20877
20878 _valuesUpdateCache.insert(std::pair<uint64, BuildValuesCachedBuffer>(cacheKey, std::move(cacheValue)));
20879}
std::uint64_t uint64
Definition Define.h:106
@ UNIT_DYNFLAG_SPECIALINFO
Definition SharedDefines.h:3125
@ UNIT_DYNFLAG_TAPPED_BY_PLAYER
Definition SharedDefines.h:3124
@ UNIT_DYNFLAG_TAPPED
Definition SharedDefines.h:3123
@ SPELL_AURA_EMPATHY
Definition SpellAuraDefines.h:184
@ 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
Definition ByteBuffer.h:70
void append(T value)
Definition ByteBuffer.h:129
std::size_t wpos() const
Definition ByteBuffer.h:330
uint16 _fieldNotifyFlags
Definition Object.h:262
bool HasDynamicFlag(uint32 flag) const
Definition Object.h:123
UpdateMask _changesMask
Definition Object.h:258
uint32 * m_uint32Values
Definition Object.h:254
uint16 m_valuesCount
Definition Object.h:260
float * m_floatValues
Definition Object.h:255
bool IsInSameRaidWith(Player const *p) const
Definition Player.h:1894
ValuesUpdateCache _valuesUpdateCache
Definition Unit.h:2183
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition Unit.cpp:10660
bool HasAuraTypeWithCaster(AuraType auratype, ObjectGuid caster) const
Definition Unit.cpp:5766
ObjectGuid GetOwnerGUID() const
Definition Unit.h:684
void PatchValuesUpdate(ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
Definition Unit.cpp:20881
Definition UpdateMask.h:25
uint32 GetBlockCount() const
Definition UpdateMask.h:62
bool GetBit(uint32 index) const
Definition UpdateMask.h:47
void SetCount(uint32 valuesCount)
Definition UpdateMask.h:65
void SetBit(uint32 index)
Definition UpdateMask.h:45
void AppendToPacket(ByteBuffer *data)
Definition UpdateMask.h:49
Definition UnitUtils.h:65
void ApplyOffset(uint32 offset)
Definition UnitUtils.h:70
Definition UnitUtils.h:110

References Object::_changesMask, Object::_fieldNotifyFlags, _valuesUpdateCache, ByteBuffer::append(), UpdateMask::AppendToPacket(), BuildValuesCachePosPointers::ApplyOffset(), BuildValuesCachedBuffer::buffer, UpdateMask::GetBit(), UpdateMask::GetBlockCount(), GetCharmerOrOwnerPlayerOrPlayerItself(), Object::GetGUID(), GetOwnerGUID(), HasAuraTypeWithCaster(), Object::HasDynamicFlag(), Object::HasFlag(), Player::IsInSameRaidWith(), Object::m_floatValues, Object::m_uint32Values, Object::m_valuesCount, BuildValuesCachePosPointers::other, PatchValuesUpdate(), PER_CASTER_AURA_STATE_MASK, BuildValuesCachedBuffer::posPointers, UpdateMask::SetBit(), UpdateMask::SetCount(), SPELL_AURA_EMPATHY, sScriptMgr, UF_FLAG_OWNER, UF_FLAG_PARTY_MEMBER, UF_FLAG_PRIVATE, UF_FLAG_PUBLIC, UF_FLAG_SPECIAL_INFO, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_SPECIALINFO, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, 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_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, BuildValuesCachePosPointers::UnitNPCFlagsPos, UnitUpdateFieldFlags, UPDATETYPE_VALUES, and ByteBuffer::wpos().

◆ CalcAbsorbResist()

void Unit::CalcAbsorbResist ( DamageInfo dmgInfo,
bool  Splited = false 
)
static
2160{
2161 Unit* victim = dmgInfo.GetVictim();
2162 Unit* attacker = dmgInfo.GetAttacker();
2163 uint32 damage = dmgInfo.GetDamage();
2164 SpellSchoolMask schoolMask = dmgInfo.GetSchoolMask();
2165 SpellInfo const* spellInfo = dmgInfo.GetSpellInfo();
2166
2167 if (!victim || !victim->IsAlive() || !damage)
2168 return;
2169
2170 // Magic damage, check for resists
2171 // Ignore spells that cant be resisted
2172 // Xinef: holy resistance exists for npcs
2173 if (!(schoolMask & SPELL_SCHOOL_MASK_NORMAL) && (!(schoolMask & SPELL_SCHOOL_MASK_HOLY) || victim->IsCreature()) && (!spellInfo || (!spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))))
2174 {
2175 float averageResist = Unit::GetEffectiveResistChance(attacker, schoolMask, victim);
2176
2177 float discreteResistProbability[11];
2178 for (uint32 i = 0; i < 11; ++i)
2179 {
2180 discreteResistProbability[i] = 0.5f - 2.5f * std::fabs(0.1f * i - averageResist);
2181 if (discreteResistProbability[i] < 0.0f)
2182 discreteResistProbability[i] = 0.0f;
2183 }
2184
2185 if (averageResist <= 0.1f)
2186 {
2187 discreteResistProbability[0] = 1.0f - 7.5f * averageResist;
2188 discreteResistProbability[1] = 5.0f * averageResist;
2189 discreteResistProbability[2] = 2.5f * averageResist;
2190 }
2191
2192 float r = float(rand_norm());
2193 uint32 i = 0;
2194 float probabilitySum = discreteResistProbability[0];
2195
2196 while (r >= probabilitySum && i < 10)
2197 probabilitySum += discreteResistProbability[++i];
2198
2199 float damageResisted = float(damage * i / 10);
2200
2201 if (damageResisted) // if equal to 0, checking these is pointless
2202 {
2203 if (attacker)
2204 {
2206 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2207 if (((*j)->GetMiscValue() & schoolMask) && (*j)->IsAffectedOnSpell(spellInfo))
2208 AddPct(damageResisted, -(*j)->GetAmount());
2209
2211 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2212 if ((*j)->GetMiscValue() & schoolMask)
2213 AddPct(damageResisted, -(*j)->GetAmount());
2214 }
2215
2216 // pussywizard:
2217 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC))
2218 {
2219 uint32 damageAfterArmor = Unit::CalcArmorReducedDamage(attacker, victim, damage, spellInfo, 0, BASE_ATTACK);
2220 uint32 armorReduction = damage - damageAfterArmor;
2221 if (armorReduction < damageResisted) // pick the lower one, the weakest resistance counts
2222 damageResisted = armorReduction;
2223 }
2224 }
2225
2226 dmgInfo.ResistDamage(uint32(damageResisted));
2227 }
2228
2229 // Ignore Absorption Auras
2230 float auraAbsorbMod = 0;
2231 if (attacker)
2232 {
2234 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasA.begin(); itr != AbsIgnoreAurasA.end(); ++itr)
2235 {
2236 if (!((*itr)->GetMiscValue() & schoolMask))
2237 continue;
2238
2239 if ((*itr)->GetAmount() > auraAbsorbMod)
2240 auraAbsorbMod = float((*itr)->GetAmount());
2241 }
2242
2244 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasB.begin(); itr != AbsIgnoreAurasB.end(); ++itr)
2245 {
2246 if (!((*itr)->GetMiscValue() & schoolMask))
2247 continue;
2248
2249 if (((*itr)->GetAmount() > auraAbsorbMod) && (*itr)->IsAffectedOnSpell(spellInfo))
2250 auraAbsorbMod = float((*itr)->GetAmount());
2251 }
2252 RoundToInterval(auraAbsorbMod, 0.0f, 100.0f);
2253 }
2254
2255 // We're going to call functions which can modify content of the list during iteration over it's elements
2256 // Let's copy the list so we can prevent iterator invalidation
2258 vSchoolAbsorbCopy.sort(Acore::AbsorbAuraOrderPred());
2259
2260 // absorb without mana cost
2261 for (AuraEffectList::iterator itr = vSchoolAbsorbCopy.begin(); (itr != vSchoolAbsorbCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2262 {
2263 AuraEffect* absorbAurEff = *itr;
2264 // Check if aura was removed during iteration - we don't need to work on such auras
2265 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2266 if (!aurApp)
2267 continue;
2268 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2269 continue;
2270
2271 // get amount which can be still absorbed by the aura
2272 int32 currentAbsorb = absorbAurEff->GetAmount();
2273 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2274 if (currentAbsorb < 0)
2275 currentAbsorb = 0;
2276
2277 uint32 tempAbsorb = uint32(currentAbsorb);
2278
2279 bool defaultPrevented = false;
2280
2281 absorbAurEff->GetBase()->CallScriptEffectAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2282 currentAbsorb = tempAbsorb;
2283
2284 if (defaultPrevented)
2285 continue;
2286
2287 // absorb must be smaller than the damage itself
2288 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2289
2290 // xinef: do this after absorb is rounded to damage...
2291 AddPct(currentAbsorb, -auraAbsorbMod);
2292
2293 dmgInfo.AbsorbDamage(currentAbsorb);
2294
2295 tempAbsorb = currentAbsorb;
2296 absorbAurEff->GetBase()->CallScriptEffectAfterAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2297
2298 // Check if our aura is using amount to count damage
2299 if (absorbAurEff->GetAmount() >= 0)
2300 {
2301 // Reduce shield amount
2302 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2303 // Aura cannot absorb anything more - remove it
2304 if (absorbAurEff->GetAmount() <= 0)
2305 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2306 }
2307 }
2308
2309 // absorb by mana cost
2311 for (AuraEffectList::const_iterator itr = vManaShieldCopy.begin(); (itr != vManaShieldCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2312 {
2313 AuraEffect* absorbAurEff = *itr;
2314 // Check if aura was removed during iteration - we don't need to work on such auras
2315 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2316 if (!aurApp)
2317 continue;
2318 // check damage school mask
2319 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2320 continue;
2321
2322 // get amount which can be still absorbed by the aura
2323 int32 currentAbsorb = absorbAurEff->GetAmount();
2324 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2325 if (currentAbsorb < 0)
2326 currentAbsorb = 0;
2327
2328 uint32 tempAbsorb = currentAbsorb;
2329
2330 bool defaultPrevented = false;
2331
2332 absorbAurEff->GetBase()->CallScriptEffectManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2333 currentAbsorb = tempAbsorb;
2334
2335 if (defaultPrevented)
2336 continue;
2337
2338 // absorb must be smaller than the damage itself
2339 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2340
2341 // xinef: do this after absorb is rounded to damage...
2342 AddPct(currentAbsorb, -auraAbsorbMod);
2343
2344 int32 manaReduction = currentAbsorb;
2345
2346 // lower absorb amount by talents
2347 if (float manaMultiplier = absorbAurEff->GetSpellInfo()->Effects[absorbAurEff->GetEffIndex()].CalcValueMultiplier(absorbAurEff->GetCaster()))
2348 manaReduction = int32(float(manaReduction) * manaMultiplier);
2349
2350 int32 manaTaken = -victim->ModifyPower(POWER_MANA, -manaReduction);
2351
2352 // take case when mana has ended up into account
2353 currentAbsorb = currentAbsorb ? int32(float(currentAbsorb) * (float(manaTaken) / float(manaReduction))) : 0;
2354
2355 dmgInfo.AbsorbDamage(currentAbsorb);
2356
2357 tempAbsorb = currentAbsorb;
2358 absorbAurEff->GetBase()->CallScriptEffectAfterManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2359
2360 // Check if our aura is using amount to count damage
2361 if (absorbAurEff->GetAmount() >= 0)
2362 {
2363 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2364 if ((absorbAurEff->GetAmount() <= 0))
2365 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2366 }
2367 }
2368
2369 // split damage auras - only when not damaging self
2370 // Xinef: not true - Warlock Hellfire
2371 if (/*victim != attacker &&*/ !Splited)
2372 {
2373 // We're going to call functions which can modify content of the list during iteration over it's elements
2374 // Let's copy the list so we can prevent iterator invalidation
2375 AuraEffectList vSplitDamageFlatCopy(victim->GetAuraEffectsByType(SPELL_AURA_SPLIT_DAMAGE_FLAT)); // Not used by any spell
2376 for (AuraEffectList::iterator itr = vSplitDamageFlatCopy.begin(); (itr != vSplitDamageFlatCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2377 {
2378 // Check if aura was removed during iteration - we don't need to work on such auras
2379 if (!((*itr)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
2380 continue;
2381 // check damage school mask
2382 if (!((*itr)->GetMiscValue() & schoolMask))
2383 continue;
2384
2385 // Damage can be splitted only if aura has an alive caster
2386 Unit* caster = (*itr)->GetCaster();
2387 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2388 continue;
2389
2390 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2391 // Ignore LOS attribute is only used for the cast portion of the spell
2392 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2393 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2394 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2395 continue;
2396
2397 int32 splitDamage = (*itr)->GetAmount();
2398
2399 // absorb must be smaller than the damage itself
2400 splitDamage = RoundToInterval(splitDamage, 0, int32(dmgInfo.GetDamage()));
2401
2402 dmgInfo.AbsorbDamage(splitDamage);
2403
2404 uint32 splitted = splitDamage;
2405 uint32 splitted_absorb = 0;
2406 uint32 splitted_resist = 0;
2407
2408 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2409 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, schoolMask, dmgInfo.GetDamageType());
2410 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2411 {
2412 procEx |= PROC_EX_IMMUNE;
2413 splittedDmgInfo.AbsorbDamage(splitted);
2414 }
2415 else
2416 {
2417 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2418 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2419 }
2420
2421 splitted_absorb = splittedDmgInfo.GetAbsorb();
2422 splitted_resist = splittedDmgInfo.GetResist();
2423 splitted = splittedDmgInfo.GetDamage();
2424
2425 // create procs
2426 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2427 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted, nullptr, -1, nullptr, &splittedDmgInfo);
2428
2429 if (attacker)
2430 {
2431 attacker->SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo(), splitted, schoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2432 }
2433
2434 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2435 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, schoolMask, (*itr)->GetSpellInfo(), false);
2436 }
2437
2438 // We're going to call functions which can modify content of the list during iteration over it's elements
2439 // Let's copy the list so we can prevent iterator invalidation
2441 for (AuraEffectList::iterator itr = vSplitDamagePctCopy.begin(), next; (itr != vSplitDamagePctCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2442 {
2443 // Check if aura was removed during iteration - we don't need to work on such auras
2444 AuraApplication const* aurApp = (*itr)->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2445 if (!aurApp)
2446 continue;
2447
2448 // check damage school mask
2449 if (!((*itr)->GetMiscValue() & schoolMask))
2450 continue;
2451
2452 // Damage can be splitted only if aura has an alive caster
2453 Unit* caster = (*itr)->GetCaster();
2454 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2455 continue;
2456
2457 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2458 // Ignore LOS attribute is only used for the cast portion of the spell
2459 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2460 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2461 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2462 continue;
2463
2464 uint32 splitDamage = CalculatePct(dmgInfo.GetDamage(), (*itr)->GetAmount());
2465 SpellSchoolMask splitSchoolMask = schoolMask;
2466
2467 (*itr)->GetBase()->CallScriptEffectSplitHandlers(*itr, aurApp, dmgInfo, splitDamage);
2468
2469 // absorb must be smaller than the damage itself
2470 splitDamage = RoundToInterval(splitDamage, uint32(0), uint32(dmgInfo.GetDamage()));
2471
2472 // Roar of Sacrifice, dont absorb it
2473 if (splitSpellInfo->Id != 53480)
2474 dmgInfo.AbsorbDamage(splitDamage);
2475 else
2476 splitSchoolMask = SPELL_SCHOOL_MASK_NATURE;
2477
2478 uint32 splitted = splitDamage;
2479 uint32 splitted_absorb = 0;
2480 uint32 splitted_resist = 0;
2481
2482 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2483 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, splitSchoolMask, dmgInfo.GetDamageType());
2484 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2485 {
2486 procEx |= PROC_EX_IMMUNE;
2487 splittedDmgInfo.AbsorbDamage(splitted);
2488 }
2489 else
2490 {
2491 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2492 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2493 }
2494
2495 splitted_absorb = splittedDmgInfo.GetAbsorb();
2496 splitted_resist = splittedDmgInfo.GetResist();
2497 splitted = splittedDmgInfo.GetDamage();
2498
2499 // create procs
2500 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2501 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted);
2502
2503 if (attacker)
2504 {
2505 attacker->SendSpellNonMeleeDamageLog(caster, splitSpellInfo, splitted, splitSchoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2506 }
2507
2508 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2509 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, splitSchoolMask, splitSpellInfo, false);
2510 }
2511 }
2512}
double rand_norm()
Definition Random.cpp:77
@ POWER_MANA
Definition SharedDefines.h:269
@ 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
@ 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
void createProcFlags(SpellInfo const *spellInfo, WeaponAttackType attackType, bool positive, uint32 &procAttacker, uint32 &procVictim)
Definition Unit.cpp:15957
@ DIRECT_DAMAGE
Definition Unit.h:248
@ MELEE_HIT_NORMAL
Definition Unit.h:286
T AddPct(T &base, U pct)
Definition Util.h:67
T RoundToInterval(T &num, T floor, T ceil)
Definition Util.h:79
Definition SpellAuraEffects.h:349
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:443
Aura * GetBase() const
Definition SpellAuraEffects.h:49
uint32 GetEffIndex() const
Definition SpellAuraEffects.h:56
int32 GetAmount() const
Definition SpellAuraEffects.h:64
void CallScriptEffectAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition SpellAuras.cpp:2559
void CallScriptEffectAfterAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition SpellAuras.cpp:2577
void CallScriptEffectManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition SpellAuras.cpp:2591
void CallScriptEffectAfterManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition SpellAuras.cpp:2605
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0
void ResistDamage(uint32 amount)
Definition Unit.cpp:159
void AbsorbDamage(uint32 amount)
Definition Unit.cpp:152
Unit * GetVictim() const
Definition Unit.h:359
Unit * GetAttacker() const
Definition Unit.h:358
SpellInfo const * GetSpellInfo() const
Definition Unit.h:360
DamageEffectType GetDamageType() const
Definition Unit.h:362
SpellSchoolMask GetSchoolMask() const
Definition Unit.h:361
uint32 GetDamage() const
Definition Unit.h:364
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition SpellInfo.h:393
float GetMaxRange(bool positive=false, Unit *caster=nullptr, Spell *spell=nullptr) const
Definition SpellInfo.cpp:2323
bool IsPositive() const
Definition SpellInfo.cpp:1237
int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition Unit.cpp:14200
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition Unit.h:1365
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:2043
static float GetEffectiveResistChance(Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
Definition Unit.cpp:2125
void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage *log)
Definition Unit.cpp:6366
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:16091
std::list< AuraEffect * > AuraEffectList
Definition Unit.h:652
bool IsImmunedToDamageOrSchool(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:12945
static void CalcAbsorbResist(DamageInfo &dmgInfo, bool Splited=false)
Definition Unit.cpp:2159
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:811
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition Object.cpp:1327
Definition Unit.h:315

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(), DamageInfo::GetVictim(), SpellInfo::HasAttribute(), SpellInfo::Id, IsAlive(), Object::IsCreature(), IsImmunedToDamageOrSchool(), Object::IsInWorld(), SpellInfo::IsPositive(), WorldObject::IsWithinDist(), 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_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, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), DealDamage(), DealMeleeDamage(), Player::EnvironmentalDamage(), spell_valkyr_touch_aura::HandleEffectPeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ CalcArmorReducedDamage()

uint32 Unit::CalcArmorReducedDamage ( Unit const *  attacker,
Unit const *  victim,
const uint32  damage,
SpellInfo const *  spellInfo,
uint8  attackerLevel = 0,
WeaponAttackType  attackType = MAX_ATTACK 
)
static
2044{
2045 float armor = float(victim->GetArmor());
2046
2047 // Ignore enemy armor by SPELL_AURA_MOD_TARGET_RESISTANCE aura
2048 if (attacker)
2049 {
2050 armor += attacker->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL);
2051
2052 if (spellInfo)
2053 if (Player* modOwner = attacker->GetSpellModOwner())
2054 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_IGNORE_ARMOR, armor);
2055
2056 AuraEffectList const& ResIgnoreAurasAb = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST);
2057 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2058 {
2059 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL
2060 && (*j)->IsAffectedOnSpell(spellInfo))
2061 armor = std::floor(AddPct(armor, -(*j)->GetAmount()));
2062 }
2063
2064 AuraEffectList const& ResIgnoreAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST);
2065 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2066 {
2067 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
2068 armor = std::floor(AddPct(armor, -(*j)->GetAmount()));
2069 }
2070
2071 // Apply Player CR_ARMOR_PENETRATION rating and buffs from stances\specializations etc.
2072 if (attacker->IsPlayer())
2073 {
2074 float bonusPct = 0;
2075 AuraEffectList const& armorPenAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ARMOR_PENETRATION_PCT);
2076 for (AuraEffectList::const_iterator itr = armorPenAuras.begin(); itr != armorPenAuras.end(); ++itr)
2077 {
2078 if ((*itr)->GetSpellInfo()->EquippedItemClass == -1)
2079 {
2080 if (!spellInfo || (*itr)->IsAffectedOnSpell(spellInfo) || (*itr)->GetMiscValue() & spellInfo->GetSchoolMask())
2081 bonusPct += (*itr)->GetAmount();
2082 else if (!(*itr)->GetMiscValue() && !(*itr)->HasSpellClassMask())
2083 bonusPct += (*itr)->GetAmount();
2084 }
2085 else
2086 {
2087 if (attacker->ToPlayer()->HasItemFitToSpellRequirements((*itr)->GetSpellInfo()))
2088 bonusPct += (*itr)->GetAmount();
2089 }
2090 }
2091
2092 float maxArmorPen = 0;
2093 if (victim->GetLevel() < 60)
2094 maxArmorPen = float(400 + 85 * victim->GetLevel());
2095 else
2096 maxArmorPen = 400 + 85 * victim->GetLevel() + 4.5f * 85 * (victim->GetLevel() - 59);
2097
2098 // Cap armor penetration to this number
2099 maxArmorPen = std::min((armor + maxArmorPen) / 3, armor);
2100 // Figure out how much armor do we ignore
2101 float armorPen = CalculatePct(maxArmorPen, bonusPct + attacker->ToPlayer()->GetRatingBonusValue(CR_ARMOR_PENETRATION));
2102 // Got the value, apply it
2103 armor -= std::min(armorPen, maxArmorPen);
2104 }
2105 }
2106
2107 if (armor < 0.0f)
2108 armor = 0.0f;
2109
2110 float levelModifier = attacker ? attacker->GetLevel() : attackerLevel;
2111 if (levelModifier > 59)
2112 levelModifier = levelModifier + (4.5f * (levelModifier - 59));
2113
2114 float tmpvalue = 0.1f * armor / (8.5f * levelModifier + 40);
2115 tmpvalue = tmpvalue / (1.0f + tmpvalue);
2116
2117 if (tmpvalue < 0.0f)
2118 tmpvalue = 0.0f;
2119 if (tmpvalue > 0.75f)
2120 tmpvalue = 0.75f;
2121
2122 return uint32(std::ceil(std::max(damage * (1.0f - tmpvalue), 0.0f)));
2123}
@ 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:89
@ CR_ARMOR_PENETRATION
Definition Unit.h:241

References AddPct(), CalculatePct(), CR_ARMOR_PENETRATION, GetArmor(), GetAuraEffectsByType(), GetLevel(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), Player::HasItemFitToSpellRequirements(), SpellInfo::Id, Object::IsPlayer(), 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, and Object::ToPlayer().

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
2515{
2516 if (!healInfo.GetHeal())
2517 return;
2518
2519 int32 const healing = static_cast<int32>(healInfo.GetHeal());
2520 int32 absorbAmount = 0;
2521
2522 // Need remove expired auras after
2523 bool existExpired = false;
2524
2525 // absorb without mana cost
2527 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end() && absorbAmount <= healing; ++i)
2528 {
2529 if (!((*i)->GetMiscValue() & healInfo.GetSpellInfo()->SchoolMask))
2530 continue;
2531
2532 // Max Amount can be absorbed by this aura
2533 int32 currentAbsorb = (*i)->GetAmount();
2534
2535 // Found empty aura (impossible but..)
2536 if (currentAbsorb <= 0)
2537 {
2538 existExpired = true;
2539 continue;
2540 }
2541
2542 // currentAbsorb - damage can be absorbed by shield
2543 // If need absorb less damage
2544 if (healing < currentAbsorb + absorbAmount)
2545 currentAbsorb = healing - absorbAmount;
2546
2547 absorbAmount += currentAbsorb;
2548
2549 // Reduce shield amount
2550 (*i)->SetAmount((*i)->GetAmount() - currentAbsorb);
2551 // Need remove it later
2552 if ((*i)->GetAmount() <= 0)
2553 existExpired = true;
2554 }
2555
2556 // Remove all expired absorb auras
2557 if (existExpired)
2558 {
2559 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end();)
2560 {
2561 AuraEffect* auraEff = *i;
2562 ++i;
2563 if (auraEff->GetAmount() <= 0)
2564 {
2565 uint32 removedAuras = healInfo.GetTarget()->m_removedAurasCount;
2567 if (removedAuras + 1 < healInfo.GetTarget()->m_removedAurasCount)
2568 i = vHealAbsorb.begin();
2569 }
2570 }
2571 }
2572
2573 if (absorbAmount > 0)
2574 healInfo.AbsorbHeal(absorbAmount);
2575}
@ SPELL_AURA_SCHOOL_HEAL_ABSORB
Definition SpellAuraDefines.h:364
SpellInfo const * GetSpellInfo() const
Definition Unit.h:415
void AbsorbHeal(uint32 amount)
Definition Unit.h:390
Unit * GetTarget() const
Definition Unit.h:411
uint32 GetHeal() const
Definition Unit.h:412
uint32 SchoolMask
Definition SpellInfo.h:392

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)
14908{
14909 uint8 comboPoints = GetComboPoints();
14910
14911 int32 minduration = spellProto->GetDuration();
14912 int32 maxduration = spellProto->GetMaxDuration();
14913
14914 int32 duration;
14915
14916 if (comboPoints && minduration != -1 && minduration != maxduration)
14917 duration = minduration + int32((maxduration - minduration) * comboPoints / 5);
14918 else
14919 duration = minduration;
14920
14921 return duration;
14922}
uint8 GetComboPoints(Unit const *who=nullptr) const
Definition Unit.h:967

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,
bool  npcCaster 
) const
20428{
20429 damage = int32(float(damage) * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, schoolMask));
20430 if (npcCaster)
20432
20433 return damage;
20434}
@ 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:6030

References GetTotalAuraMultiplierByMiscMask(), SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, and SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE.

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 
)
2999{
3000 float minDamage = 0.0f;
3001 float maxDamage = 0.0f;
3002
3003 if (normalized || !addTotalPct || itemDamagesMask)
3004 {
3005 // get both by default
3006 if (!itemDamagesMask)
3007 {
3008 itemDamagesMask = (1 << 0) | (1 << 1);
3009 }
3010
3011 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
3012 {
3013 if (itemDamagesMask & (1 << i))
3014 {
3015 float minTmp, maxTmp;
3016 CalculateMinMaxDamage(attType, normalized, addTotalPct, minTmp, maxTmp, i);
3017 minDamage += minTmp;
3018 maxDamage += maxTmp;
3019 }
3020 }
3021 }
3022 else
3023 {
3024 switch (attType)
3025 {
3026 case RANGED_ATTACK:
3029 break;
3030 case BASE_ATTACK:
3033 break;
3034 case OFF_ATTACK:
3037 break;
3038 default:
3039 break;
3040 }
3041 }
3042
3043 minDamage = std::max(0.f, minDamage);
3044 maxDamage = std::max(0.f, maxDamage);
3045
3046 if (minDamage > maxDamage)
3047 {
3048 std::swap(minDamage, maxDamage);
3049 }
3050
3051 return urand(uint32(minDamage), uint32(maxDamage));
3052}
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
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
17230{
17231 // Damage over Time spells bonus calculation
17232 float DotFactor = 1.0f;
17233 if (damagetype == DOT)
17234 {
17235 int32 DotDuration = spellInfo->GetDuration();
17236 if (!spellInfo->IsChanneled() && DotDuration > 0)
17237 DotFactor = DotDuration / 15000.0f;
17238
17239 if (uint32 DotTicks = spellInfo->GetMaxTicks())
17240 DotFactor /= DotTicks;
17241 }
17242
17243 int32 CastingTime = spellInfo->IsChanneled() ? spellInfo->GetDuration() : spellInfo->CalcCastTime();
17244 // Distribute Damage over multiple effects, reduce by AoE
17245 CastingTime = GetCastingTimeForBonus(spellInfo, damagetype, CastingTime);
17246
17247 // As wowwiki says: C = (Cast Time / 3.5)
17248 return (CastingTime / 3500.0f) * DotFactor;
17249}
@ DOT
Definition Unit.h:250
uint32 GetCastingTimeForBonus(SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
Definition Unit.cpp:17111

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

Referenced by SpellDamageBonusTaken(), and SpellHealingBonusTaken().

◆ CalculateLevelPenalty()

float Unit::CalculateLevelPenalty ( SpellInfo const *  spellProto) const
3055{
3056 if (!IsPlayer())
3057 return 1.0f;
3058
3059 if (spellProto->SpellLevel <= 0 || spellProto->SpellLevel >= spellProto->MaxLevel)
3060 return 1.0f;
3061
3062 float LvlPenalty = 0.0f;
3063
3064 // xinef: added brackets
3065 if (spellProto->SpellLevel < 20)
3066 LvlPenalty = (20.0f - spellProto->SpellLevel) * 3.75f;
3067
3068 float LvlFactor = (float(spellProto->SpellLevel) + 6.0f) / float(GetLevel());
3069 if (LvlFactor > 1.0f)
3070 LvlFactor = 1.0f;
3071
3072 return AddPct(LvlFactor, -LvlPenalty);
3073}
uint8 GetLevel() const
Definition Unit.h:1040

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

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

◆ CalculateMeleeDamage()

void Unit::CalculateMeleeDamage ( Unit victim,
CalcDamageInfo damageInfo,
WeaponAttackType  attackType = BASE_ATTACK,
const bool  sittingVictim = false 
)
1477{
1478 damageInfo->attacker = this;
1479 damageInfo->target = victim;
1480
1481 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1482 {
1483 damageInfo->damages[i].damageSchoolMask = GetMeleeDamageSchoolMask(attackType, i);
1484 damageInfo->damages[i].damage = 0;
1485 damageInfo->damages[i].absorb = 0;
1486 damageInfo->damages[i].resist = 0;
1487 }
1488
1489 damageInfo->attackType = attackType;
1490 damageInfo->cleanDamage = 0;
1491 damageInfo->blocked_amount = 0;
1492
1493 damageInfo->TargetState = 0;
1494 damageInfo->HitInfo = 0;
1495 damageInfo->procAttacker = PROC_FLAG_NONE;
1496 damageInfo->procVictim = PROC_FLAG_NONE;
1497 damageInfo->procEx = PROC_EX_NONE;
1498 damageInfo->hitOutCome = MELEE_HIT_EVADE;
1499
1500 if (!victim)
1501 return;
1502
1503 if (!IsAlive() || !victim->IsAlive())
1504 return;
1505
1506 // Select HitInfo/procAttacker/procVictim flag based on attack type
1507 switch (attackType)
1508 {
1509 case BASE_ATTACK:
1512 break;
1513 case OFF_ATTACK:
1516 damageInfo->HitInfo = HITINFO_OFFHAND;
1517 break;
1518 default:
1519 return;
1520 }
1521
1522 // School Immune check
1523 uint8 immunedMask = 0;
1524 bool hasNonPhysicalSchoolMask = false;
1525 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1526 {
1528 {
1529 immunedMask |= (1 << i);
1531 {
1532 hasNonPhysicalSchoolMask = true;
1533 }
1534 }
1535 }
1536
1537 // School Immune check
1538 if (immunedMask & ((1 << 0) | (1 << 1)))
1539 {
1540 if (hasNonPhysicalSchoolMask || immunedMask == ((1 << 0) | (1 << 1)))
1541 {
1542 damageInfo->HitInfo |= HITINFO_NORMALSWING;
1543 damageInfo->TargetState = VICTIMSTATE_IS_IMMUNE;
1544
1545 damageInfo->procEx |= PROC_EX_IMMUNE;
1546 return;
1547 }
1548 }
1549
1550 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1551 {
1552 // only players have secondary weapon damage
1553 if (i > 0 && !IsPlayer())
1554 {
1555 break;
1556 }
1557
1558 if (immunedMask & (1 << i))
1559 {
1560 continue;
1561 }
1562
1563 SpellSchoolMask schoolMask = SpellSchoolMask(damageInfo->damages[i].damageSchoolMask);
1564 bool const addPctMods = (schoolMask & SPELL_SCHOOL_MASK_NORMAL);
1565
1566 uint32 damage = 0;
1567 uint8 itemDamagesMask = (IsPlayer()) ? (1 << i) : 0;
1568
1569 damage += CalculateDamage(damageInfo->attackType, false, addPctMods, itemDamagesMask);
1570 // Add melee damage bonus
1571 damage = MeleeDamageBonusDone(damageInfo->target, damage, damageInfo->attackType, nullptr, schoolMask);
1572 damage = damageInfo->target->MeleeDamageBonusTaken(this, damage, damageInfo->attackType, nullptr, schoolMask);
1573
1574 // Script Hook For CalculateMeleeDamage -- Allow scripts to change the Damage pre class mitigation calculations
1575 sScriptMgr->ModifyMeleeDamage(damageInfo->target, damageInfo->attacker, damage);
1576
1577 if (victim->GetAI())
1578 {
1579 victim->GetAI()->OnCalculateMeleeDamageReceived(damage, this);
1580 }
1581
1582 // Calculate armor reduction
1584 {
1585 damageInfo->damages[i].damage = Unit::CalcArmorReducedDamage(this, damageInfo->target, damage, nullptr, 0, damageInfo->attackType);
1586 damageInfo->cleanDamage += damage - damageInfo->damages[i].damage;
1587 }
1588 else
1589 {
1590 damageInfo->damages[i].damage = damage;
1591 }
1592 }
1593
1594 damageInfo->hitOutCome = RollMeleeOutcomeAgainst(damageInfo->target, damageInfo->attackType);
1595
1596 // If the victim was a sitting player and we didn't roll a miss, then crit.
1597 if (sittingVictim && damageInfo->hitOutCome != MELEE_HIT_MISS)
1598 {
1599 damageInfo->hitOutCome = MELEE_HIT_CRIT;
1600 }
1601 switch (damageInfo->hitOutCome)
1602 {
1603 case MELEE_HIT_EVADE:
1605 damageInfo->TargetState = VICTIMSTATE_EVADES;
1606 damageInfo->procEx |= PROC_EX_EVADE;
1607
1608 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1609 {
1610 damageInfo->damages[i].damage = 0;
1611 }
1612
1613 damageInfo->cleanDamage = 0;
1614 return;
1615 case MELEE_HIT_MISS:
1616 damageInfo->HitInfo |= HITINFO_MISS;
1617 damageInfo->TargetState = VICTIMSTATE_INTACT;
1618 damageInfo->procEx |= PROC_EX_MISS;
1619
1620 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1621 {
1622 damageInfo->damages[i].damage = 0;
1623 }
1624 damageInfo->cleanDamage = 0;
1625 break;
1626 case MELEE_HIT_NORMAL:
1627 damageInfo->TargetState = VICTIMSTATE_HIT;
1628 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1629 break;
1630 case MELEE_HIT_CRIT:
1631 {
1632 damageInfo->HitInfo |= HITINFO_CRITICALHIT;
1633 damageInfo->TargetState = VICTIMSTATE_HIT;
1634
1635 damageInfo->procEx |= PROC_EX_CRITICAL_HIT;
1636 // Crit bonus calc
1637 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1638 {
1639 damageInfo->damages[i].damage *= 2;
1640
1641 float mod = 0.0f;
1642 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1643 if (damageInfo->attackType == RANGED_ATTACK)
1644 {
1646 }
1647 else
1648 {
1650
1651 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1653 }
1654
1655 uint32 crTypeMask = damageInfo->target->GetCreatureTypeMask();
1656
1657 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1659 if (mod != 0)
1660 {
1661 AddPct(damageInfo->damages[i].damage, mod);
1662 }
1663 }
1664 break;
1665 }
1666 case MELEE_HIT_PARRY:
1667 damageInfo->TargetState = VICTIMSTATE_PARRY;
1668 damageInfo->procEx |= PROC_EX_PARRY;
1669 damageInfo->cleanDamage = 0;
1670
1671 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1672 {
1673 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1674 damageInfo->damages[i].damage = 0;
1675 }
1676 break;
1677 case MELEE_HIT_DODGE:
1678 damageInfo->TargetState = VICTIMSTATE_DODGE;
1679 damageInfo->procEx |= PROC_EX_DODGE;
1680 damageInfo->cleanDamage = 0;
1681
1682 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1683 {
1684 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1685 damageInfo->damages[i].damage = 0;
1686 }
1687 break;
1688 case MELEE_HIT_BLOCK:
1689 {
1690 damageInfo->TargetState = VICTIMSTATE_HIT;
1691 damageInfo->HitInfo |= HITINFO_BLOCK;
1692 damageInfo->procEx |= PROC_EX_BLOCK;
1693 damageInfo->blocked_amount = damageInfo->target->GetShieldBlockValue();
1694 // double blocked amount if block is critical
1695 if (damageInfo->target->isBlockCritical())
1696 damageInfo->blocked_amount += damageInfo->blocked_amount;
1697
1698 uint32 remainingBlock = damageInfo->blocked_amount;
1699 uint8 fullBlockMask = 0;
1700 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1701 {
1702 if (remainingBlock && remainingBlock >= damageInfo->damages[i].damage)
1703 {
1704 fullBlockMask |= (1 << i);
1705
1706 remainingBlock -= damageInfo->damages[i].damage;
1707 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1708 damageInfo->damages[i].damage = 0;
1709 }
1710 else
1711 {
1712 damageInfo->cleanDamage += remainingBlock;
1713 damageInfo->damages[i].damage -= remainingBlock;
1714 remainingBlock = 0;
1715 }
1716 }
1717
1718 // full block
1719 if (fullBlockMask == ((1 << 0) | (1 << 1)))
1720 {
1721 damageInfo->TargetState = VICTIMSTATE_BLOCKS;
1722 damageInfo->procEx |= PROC_EX_FULL_BLOCK;
1723 damageInfo->blocked_amount -= remainingBlock;
1724 }
1725 break;
1726 }
1727 case MELEE_HIT_GLANCING:
1728 {
1729 damageInfo->HitInfo |= HITINFO_GLANCING;
1730 damageInfo->TargetState = VICTIMSTATE_HIT;
1731 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1732 int32 leveldif = int32(victim->GetLevel()) - int32(GetLevel());
1733 if (leveldif > 3)
1734 leveldif = 3;
1735 float reducePercent = 1 - leveldif * 0.1f;
1736
1737 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1738 {
1739 uint32 reducedDamage = uint32(reducePercent * damageInfo->damages[i].damage);
1740 damageInfo->cleanDamage += damageInfo->damages[i].damage - reducedDamage;
1741 damageInfo->damages[i].damage = reducedDamage;
1742 }
1743 break;
1744 }
1745 case MELEE_HIT_CRUSHING:
1746 damageInfo->HitInfo |= HITINFO_CRUSHING;
1747 damageInfo->TargetState = VICTIMSTATE_HIT;
1748 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1749
1750 // 150% normal damage
1751 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1752 {
1753 damageInfo->damages[i].damage += (damageInfo->damages[i].damage / 2);
1754 }
1755 break;
1756 default:
1757 break;
1758 }
1759
1760 // Always apply HITINFO_AFFECTS_VICTIM in case its not a miss
1761 if (!(damageInfo->HitInfo & HITINFO_MISS))
1762 damageInfo->HitInfo |= HITINFO_AFFECTS_VICTIM;
1763
1764 uint32 tmpHitInfo[MAX_ITEM_PROTO_DAMAGES] = { };
1765
1766 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1767 {
1768 int32 dmg = damageInfo->damages[i].damage;
1769 int32 cleanDamage = damageInfo->cleanDamage;
1770 // attackType is checked already for BASE_ATTACK or OFF_ATTACK so it can't be RANGED_ATTACK here
1771 if (CanApplyResilience())
1772 {
1773 int32 resilienceReduction = damageInfo->damages[i].damage;
1774 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, (damageInfo->hitOutCome == MELEE_HIT_CRIT), CR_CRIT_TAKEN_MELEE);
1775
1776 resilienceReduction = damageInfo->damages[i].damage - resilienceReduction;
1777 dmg -= resilienceReduction;
1778 cleanDamage += resilienceReduction;
1779 }
1780
1781 damageInfo->damages[i].damage = std::max(0, dmg);
1782 damageInfo->cleanDamage = std::max(0, cleanDamage);
1783
1784 // Calculate absorb resist
1785 if (damageInfo->damages[i].damage > 0)
1786 {
1787 damageInfo->procVictim |= PROC_FLAG_TAKEN_DAMAGE;
1788
1789 // Calculate absorb & resists
1790 DamageInfo dmgInfo(*damageInfo, i);
1791 Unit::CalcAbsorbResist(dmgInfo);
1792 damageInfo->damages[i].absorb = dmgInfo.GetAbsorb();
1793 damageInfo->damages[i].resist = dmgInfo.GetResist();
1794
1795 if (damageInfo->damages[i].absorb)
1796 {
1797 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].absorb == 0 ? HITINFO_FULL_ABSORB : HITINFO_PARTIAL_ABSORB);
1798 }
1799
1800 if (damageInfo->damages[i].resist)
1801 {
1802 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].resist == 0 ? HITINFO_FULL_RESIST : HITINFO_PARTIAL_RESIST);
1803 }
1804
1805 damageInfo->damages[i].damage = dmgInfo.GetDamage();
1806 }
1807 }
1808
1809 // set proper HitInfo flags
1810 if ((tmpHitInfo[0] & HITINFO_FULL_ABSORB) != 0)
1811 {
1812 // set partial absorb when secondary damage isn't full absorbed
1813 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_ABSORB) != 0) ? HITINFO_PARTIAL_ABSORB : HITINFO_FULL_ABSORB;
1814 }
1815 else
1816 {
1817 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_ABSORB);
1818 }
1819
1820 if ((tmpHitInfo[0] & HITINFO_FULL_RESIST) != 0)
1821 {
1822 // set partial resist when secondary damage isn't full resisted
1823 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_RESIST) != 0) ? HITINFO_PARTIAL_RESIST : HITINFO_FULL_RESIST;
1824 }
1825 else
1826 {
1827 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_RESIST);
1828 }
1829
1831 {
1832 damageInfo->procEx |= PROC_EX_ABSORB;
1833 }
1834
1835 if (damageInfo->HitInfo & HITINFO_FULL_RESIST)
1836 {
1837 damageInfo->procEx |= PROC_EX_RESIST;
1838 }
1839}
@ 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
@ VICTIMSTATE_INTACT
Definition Unit.h:83
@ VICTIMSTATE_HIT
Definition Unit.h:84
@ VICTIMSTATE_DODGE
Definition Unit.h:85
@ VICTIMSTATE_IS_IMMUNE
Definition Unit.h:90
@ VICTIMSTATE_PARRY
Definition Unit.h:86
@ VICTIMSTATE_BLOCKS
Definition Unit.h:88
@ VICTIMSTATE_EVADES
Definition Unit.h:89
@ HITINFO_PARTIAL_ABSORB
Definition Unit.h:103
@ HITINFO_FULL_RESIST
Definition Unit.h:104
@ HITINFO_NORMALSWING
Definition Unit.h:96
@ HITINFO_BLOCK
Definition Unit.h:110
@ HITINFO_CRUSHING
Definition Unit.h:114
@ HITINFO_SWINGNOHITSOUND
Definition Unit.h:118
@ HITINFO_MISS
Definition Unit.h:101
@ HITINFO_FULL_ABSORB
Definition Unit.h:102
@ HITINFO_OFFHAND
Definition Unit.h:99
@ HITINFO_GLANCING
Definition Unit.h:113
@ HITINFO_CRITICALHIT
Definition Unit.h:106
@ HITINFO_PARTIAL_RESIST
Definition Unit.h:105
@ HITINFO_AFFECTS_VICTIM
Definition Unit.h:98
@ MELEE_HIT_CRUSHING
Definition Unit.h:286
@ MELEE_HIT_BLOCK
Definition Unit.h:285
@ MELEE_HIT_CRIT
Definition Unit.h:286
@ MELEE_HIT_EVADE
Definition Unit.h:285
@ MELEE_HIT_DODGE
Definition Unit.h:285
@ MELEE_HIT_MISS
Definition Unit.h:285
@ MELEE_HIT_PARRY
Definition Unit.h:285
@ MELEE_HIT_GLANCING
Definition Unit.h:286
virtual void OnCalculateMeleeDamageReceived(uint32 &, Unit *)
Called during damage calculations.
Definition UnitAI.h:379
bool isBlockCritical()
Definition Unit.cpp:3140
uint32 MeleeDamageBonusTaken(Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition Unit.cpp:13320
virtual SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition Unit.cpp:6017
bool CanApplyResilience() const
Definition Unit.h:1109
uint32 CalculateDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
Definition Unit.cpp:2998
virtual uint32 GetShieldBlockValue() const =0
static void ApplyResilience(Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
Definition Unit.cpp:18960
UnitAI * GetAI()
Definition Unit.h:664
static bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
Definition Unit.cpp:2020
int32 GetTotalAuraModifier(AuraType auratype) const
Definition Unit.cpp:5966
MeleeHitOutcome RollMeleeOutcomeAgainst(Unit const *victim, WeaponAttackType attType) const
Definition Unit.cpp:2797
uint32 GetCreatureTypeMask() const
Definition Unit.h:794
uint32 MeleeDamageBonusDone(Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition Unit.cpp:13118
uint32 damageSchoolMask
Definition Unit.h:469
uint32 blocked_amount
Definition Unit.h:475
MeleeHitOutcome hitOutCome
Definition Unit.h:484
uint32 cleanDamage
Definition Unit.h:483
uint32 TargetState
Definition Unit.h:477
uint32 resist
Definition Unit.h:472

References CalcDamageInfo::absorb, AddPct(), ApplyResilience(), CalcDamageInfo::attacker, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, CalcAbsorbResist(), CalcArmorReducedDamage(), CalculateDamage(), CanApplyResilience(), CalcDamageInfo::cleanDamage, CR_CRIT_TAKEN_MELEE, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, DamageInfo::GetAbsorb(), GetAI(), GetCreatureTypeMask(), DamageInfo::GetDamage(), GetLevel(), GetMeleeDamageSchoolMask(), DamageInfo::GetResist(), GetShieldBlockValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), GetTotalAuraMultiplierByMiscMask(), CalcDamageInfo::HitInfo, HITINFO_AFFECTS_VICTIM, HITINFO_BLOCK, HITINFO_CRITICALHIT, HITINFO_CRUSHING, HITINFO_FULL_ABSORB, HITINFO_FULL_RESIST, HITINFO_GLANCING, HITINFO_MISS, HITINFO_NORMALSWING, HITINFO_OFFHAND, HITINFO_PARTIAL_ABSORB, HITINFO_PARTIAL_RESIST, HITINFO_SWINGNOHITSOUND, CalcDamageInfo::hitOutCome, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), IsImmunedToDamageOrSchool(), Object::IsPlayer(), 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_ABSORB, 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_EX_RESIST, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_MELEE_AUTO_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_NONE, PROC_FLAG_TAKEN_DAMAGE, 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, 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 
)
1308{
1309 if (damage < 0)
1310 return;
1311
1312 Unit* victim = damageInfo->target;
1313 if (!victim || !victim->IsAlive())
1314 return;
1315
1316 SpellSchoolMask damageSchoolMask = SpellSchoolMask(damageInfo->schoolMask);
1317 uint32 crTypeMask = victim->GetCreatureTypeMask();
1318
1319 // Script Hook For CalculateSpellDamageTaken -- Allow scripts to change the Damage post class mitigation calculations
1320 sScriptMgr->ModifySpellDamageTaken(damageInfo->target, damageInfo->attacker, damage, spellInfo);
1321
1322 if (victim->GetAI())
1323 {
1324 victim->GetAI()->OnCalculateSpellDamageReceived(damage, this);
1325 }
1326
1327 int32 cleanDamage = 0;
1328 if (Unit::IsDamageReducedByArmor(damageSchoolMask, spellInfo))
1329 {
1330 int32 oldDamage = damage;
1331 damage = Unit::CalcArmorReducedDamage(this, victim, damage, spellInfo, 0, attackType);
1332 cleanDamage = oldDamage - damage;
1333 }
1334
1335 bool blocked = false;
1336 // Per-school calc
1337 switch (spellInfo->DmgClass)
1338 {
1339 // Melee and Ranged Spells
1342 {
1343 // Physical Damage
1344 if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL)
1345 {
1346 // Get blocked status
1347 blocked = isSpellBlocked(victim, spellInfo, attackType);
1348 }
1349
1350 if (crit)
1351 {
1352 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1353
1354 // Calculate crit bonus
1355 uint32 crit_bonus = damage;
1356 // Apply crit_damage bonus for melee spells
1357 if (Player* modOwner = GetSpellModOwner())
1358 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
1359 damage += crit_bonus;
1360
1361 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1362 float critPctDamageMod = 0.0f;
1363 if (attackType == RANGED_ATTACK)
1365 else
1367
1368 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1369 critPctDamageMod += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellInfo->GetSchoolMask());
1370
1371 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1373
1374 if (critPctDamageMod != 0)
1375 AddPct(damage, critPctDamageMod);
1376 }
1377
1378 // Spell weapon based damage CAN BE crit & blocked at same time
1379 if (blocked)
1380 {
1381 damageInfo->blocked = victim->GetShieldBlockValue();
1382 // double blocked amount if block is critical
1383 if (victim->isBlockCritical())
1384 damageInfo->blocked *= 2;
1385 if (damage < int32(damageInfo->blocked))
1386 damageInfo->blocked = uint32(damage);
1387
1388 damage -= damageInfo->blocked;
1389 cleanDamage += damageInfo->blocked;
1390 }
1391
1392 int32 resilienceReduction = damage;
1393 if (CanApplyResilience())
1394 {
1395 if (attackType != RANGED_ATTACK)
1396 {
1397 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_MELEE);
1398 }
1399 else
1400 {
1401 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_RANGED);
1402 }
1403 }
1404
1405 resilienceReduction = damage - resilienceReduction;
1406 damage -= resilienceReduction;
1407 cleanDamage += resilienceReduction;
1408 break;
1409 }
1410 // Magical Attacks
1413 {
1414 // If crit add critical bonus
1415 if (crit)
1416 {
1417 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1418 damage = Unit::SpellCriticalDamageBonus(this, spellInfo, damage, victim);
1419 }
1420
1421 int32 resilienceReduction = damage;
1422 if (CanApplyResilience())
1423 {
1424 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_SPELL);
1425 }
1426
1427 resilienceReduction = damage - resilienceReduction;
1428 damage -= resilienceReduction;
1429 cleanDamage += resilienceReduction;
1430 break;
1431 }
1432 default:
1433 break;
1434 }
1435
1436 damageInfo->cleanDamage = std::max(0, cleanDamage);
1437 damageInfo->damage = std::max(0, damage);
1438
1439 // Calculate absorb resist
1440 if (damageInfo->damage > 0)
1441 {
1442 DamageInfo dmgInfo(*damageInfo, SPELL_DIRECT_DAMAGE);
1443 Unit::CalcAbsorbResist(dmgInfo);
1444 damageInfo->absorb = dmgInfo.GetAbsorb();
1445 damageInfo->resist = dmgInfo.GetResist();
1446 damageInfo->damage = dmgInfo.GetDamage();
1447 }
1448}
@ 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
@ SPELLMOD_CRIT_DAMAGE_BONUS
Definition SpellDefines.h:91
@ SPELL_DIRECT_DAMAGE
Definition Unit.h:249
virtual void OnCalculateSpellDamageReceived(int32 &, Unit *)
Definition UnitAI.h:380
bool isSpellBlocked(Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
Definition Unit.cpp:3114
static uint32 SpellCriticalDamageBonus(Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
Definition Unit.cpp:12325
Unit * target
Definition Unit.h:495
uint32 HitInfo
Definition Unit.h:506
uint32 damage
Definition Unit.h:498
uint32 absorb
Definition Unit.h:501
Unit * attacker
Definition Unit.h:496
uint32 schoolMask
Definition Unit.h:500
uint32 cleanDamage
Definition Unit.h:508
uint32 resist
Definition Unit.h:502
uint32 blocked
Definition Unit.h:505

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()

bool Unit::CanApplyResilience ( ) const
inline

◆ CanDualWield()

◆ CanEnterWater()

virtual bool Unit::CanEnterWater ( ) const
pure virtual

Implemented in Creature, and Player.

◆ CanFly()

◆ CanFreeMove()

bool Unit::CanFreeMove ( ) const
inline
1650 {
1653 }
@ UNIT_STATE_DISTRACTED
Definition UnitDefines.h:182
@ UNIT_STATE_CONFUSED
Definition UnitDefines.h:181
@ UNIT_STATE_FLEEING
Definition UnitDefines.h:177
@ UNIT_STATE_IN_FLIGHT
Definition UnitDefines.h:178
@ UNIT_STATE_STUNNED
Definition UnitDefines.h:173

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 Creature::IsFreeToMove().

◆ CanHaveThreatList()

bool Unit::CanHaveThreatList ( bool  skipAliveCheck = false) const
14666{
14667 // only creatures can have threat list
14668 if (!IsCreature())
14669 return false;
14670
14671 // only alive units can have threat list
14672 if (!skipAliveCheck && !IsAlive())
14673 return false;
14674
14675 // totems can not have threat list
14676 if (ToCreature()->IsTotem())
14677 return false;
14678
14679 // vehicles can not have threat list
14680 if (ToCreature()->IsVehicle() && GetMap()->IsBattlegroundOrArena())
14681 return false;
14682
14683 // summons can not have a threat list, unless they are controlled by a creature
14685 return false;
14686
14687 return true;
14688}
@ UNIT_MASK_CONTROLABLE_GUARDIAN
Definition UnitDefines.h:164
@ UNIT_MASK_GUARDIAN
Definition UnitDefines.h:158
bool IsVehicle() const
Definition Unit.h:766
Map * GetMap() const
Definition Object.h:537

References WorldObject::GetMap(), GetOwnerGUID(), HasUnitTypeMask(), IsAlive(), Object::IsCreature(), Object::IsPlayer(), IsTotem(), IsVehicle(), Object::ToCreature(), 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
1519{ return _instantCast; }

References _instantCast.

Referenced by ModSpellCastTime().

◆ CanModifyStats()

◆ CanProc()

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

References m_procDeep.

Referenced by Spell::DoAllEffectOnTarget().

◆ CanRestoreMana()

bool Unit::CanRestoreMana ( SpellInfo const *  spellInfo) const
21264{
21265 // Aura of Despair exceptions
21266 switch (spellInfo->Id)
21267 {
21268 case 16666: // Demonic Rune
21269 case 27869: // Dark Rune
21270 case 30824: // Shamanistic Rage
21271 case 31786: // Spiritual Attunement
21272 case 31930: // Judgements of the Wise
21273 case 34075: // Aspect of the Viper
21274 case 34720: // Thrill of the hunt
21275 case 47755: // Rapture
21276 case 54425: // Improved Felhunter
21277 case 57319: // Blessing of Sanctuary
21278 case 63337: // Saronite Vapors (regenerate mana)
21279 case 63375: // Improved stormstrike
21280 case 64372: // Lifebloom
21281 case 68285: // Improved Leader of the Pack
21282 return true;
21283 case 54428: // Divine Plea - only with talent Guarded by the Light
21284 return HasSpell(53583);
21285 default:
21286 break;
21287 }
21288
21289 return false;
21290}
virtual bool HasSpell(uint32) const
Definition Unit.h:1514

References HasSpell(), and SpellInfo::Id.

Referenced by IsImmunedToSpellEffect().

◆ CanSparringWith()

bool Unit::CanSparringWith ( Unit const *  attacker) const
protected
3973{
3975 return false;
3976
3977 if (!attacker)
3978 return false;
3979
3980 if (!attacker->IsCreature() || attacker->IsCharmedOwnedByPlayerOrPlayer())
3981 return false;
3982
3983 if (Creature const* creature = ToCreature())
3984 if (!creature->GetSparringPct())
3985 return false;
3986
3987 return true;
3988}
bool IsCharmedOwnedByPlayerOrPlayer() const
Definition Unit.h:1250

References IsCharmedOwnedByPlayerOrPlayer(), Object::IsCreature(), and Object::ToCreature().

Referenced by AttackerStateUpdate(), and DealDamage().

◆ 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.

19999{
20000 // 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
20002 return false;
20004 return true;
20006 return false;
20008 return true;
20010}
@ UNIT_FLAG2_UNUSED_6
Definition UnitDefines.h:307
@ UNIT_FLAG_CANNOT_SWIM
Definition UnitDefines.h:264
@ UNIT_FLAG_POSSESSED
Definition UnitDefines.h:274
@ UNIT_FLAG_SWIMMING
Definition UnitDefines.h:265
@ UNIT_FLAG_RENAME
Definition UnitDefines.h:254
@ UNIT_FLAG_PET_IN_COMBAT
Definition UnitDefines.h:261
bool HasUnitFlag2(UnitFlags2 flags) const
Definition Unit.h:724

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 PathGenerator::BuildPolyPath(), and 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 
)
1263{
1264 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1265 if (!spellInfo)
1266 {
1267 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1269 }
1270
1271 SpellCastTargets targets;
1272 targets.SetUnitTarget(victim);
1273
1274 return CastSpell(targets, spellInfo, &value, triggerFlags, castItem, triggeredByAura, originalCaster);
1275}
#define LOG_ERROR(filterType__,...)
Definition Log.h:157
@ SPELL_FAILED_SPELL_UNAVAILABLE
Definition SharedDefines.h:1056
Definition Spell.h:111
void SetUnitTarget(Unit *target)
Definition Spell.cpp:239

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 
)
1249{
1250 CustomSpellValues values;
1251 values.AddSpellMod(mod, value);
1252 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1253}
@ TRIGGERED_NONE
Definition SpellDefines.h:133
Definition SpellDefines.h:165
void AddSpellMod(SpellValueMod mod, int32 value)
Definition SpellDefines.h:167
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:1236

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 
)
1256{
1257 CustomSpellValues values;
1258 values.AddSpellMod(mod, value);
1259 return CastCustomSpell(spellId, values, target, triggerFlags, castItem, triggeredByAura, originalCaster);
1260}

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 
)
1237{
1238 CustomSpellValues values;
1239 if (bp0)
1240 values.AddSpellMod(SPELLVALUE_BASE_POINT0, *bp0);
1241 if (bp1)
1242 values.AddSpellMod(SPELLVALUE_BASE_POINT1, *bp1);
1243 if (bp2)
1244 values.AddSpellMod(SPELLVALUE_BASE_POINT2, *bp2);
1245 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1246}
@ SPELLVALUE_BASE_POINT1
Definition SpellDefines.h:114
@ SPELLVALUE_BASE_POINT2
Definition SpellDefines.h:115
@ SPELLVALUE_BASE_POINT0
Definition SpellDefines.h:113

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_aura::AfterDispel(), spell_dru_lifebloom::AfterRemove(), Player::ApplyEnchantment(), Player::ApplyEquipSpell(), CastCustomSpell(), CastCustomSpell(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), npc_gas_cloud::npc_gas_cloudAI::CastMainSpell(), CastPetAura(), spell_ruby_sanctum_rallying_shout::CountAllies(), spell_igb_rocket_artillery_explosion::DamageGunship(), boss_illidari_council_memberAI::DamageTaken(), boss_leotheras_the_blind::DemonTime(), spell_warl_seed_of_corruption_generic_aura::Detonate(), 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_reflective_shield_aura::HandleAfterEffectAbsorb(), 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::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_deathbringer_blood_link::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_deathbringer_blood_link_aura::HandleProc(), spell_deathbringer_blood_link_blood_beast_aura::HandleProc(), spell_reliquary_of_souls_aura_of_desire_aura::HandleProc(), spell_black_temple_consuming_strikes_aura::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_aura::HandleProc(), spell_yogg_saron_grim_reprisal_aura::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_aura::HandleRemove(), spell_warl_haunt_aura::HandleRemove(), spell_pal_lay_on_hands::HandleScript(), spell_kelthuzad_detonate_mana_aura::HandleScript(), spell_q12919_gymers_grab::HandleScript(), spell_gluth_decimate::HandleScriptEffect(), spell_hun_chimera_shot::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), spell_illidari_council_circle_of_healing::HandleSharedRule(), HandleSpellClick(), spell_halion_damage_aoe_summon::HandleSummon(), spell_putricide_mutated_transformation::HandleSummon(), spell_putricide_mutated_plague_aura::HandleTriggerSpell(), boss_sathrovarr::JustEngagedWith(), boss_essence_of_suffering::boss_essence_of_sufferingAI::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_felblood_kaelthas::JustEngagedWith(), boss_kalecgos::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_najentus::JustEngagedWith(), boss_morogrim_tidewalker::JustEngagedWith(), boss_felmyst::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_janalai_hatcher::MovementInform(), npc_frost_tomb::npc_frost_tomb(), spell_dru_tiger_s_fury::OnHit(), spell_gen_flurry_of_claws::OnPeriodic(), spell_blood_queen_essence_of_the_blood_queen_aura::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_aura::OnRemove(), spell_halion_marks_aura::OnRemove(), spell_putricide_mutated_plague_aura::OnRemove(), spell_the_lich_king_necrotic_plague_aura::OnRemove(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), spell_sindragosa_instability_aura::OnRemove(), spell_the_lich_king_necrotic_plague_jump_aura::OnRemove(), spell_karazhan_overload_aura::PeriodicTick(), spell_entropius_negative_energy_periodic::PeriodicTick(), spell_doomfire::PeriodicTick(), spell_blood_queen_pact_of_the_darkfallen_dmg_aura::PeriodicTick(), spell_broggok_poison_cloud::PeriodicTick(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11198_take_down_tethyr::PrepareSpellScript(), SmartScript::ProcessAction(), spell_illidari_council_reflective_shield_aura::ReflectDamage(), spell_pri_power_word_shield_aura::ReflectDamage(), boss_kiljaeden::Reset(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), boss_kiljaeden::ScheduleBasicAbilities(), 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::TriggerHeal(), spell_pal_divine_storm::TriggerHeal(), spell_black_temple_shadow_inferno_aura::Update(), spell_black_temple_spell_absorption_aura::Update(), npc_coren_direbrew::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_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(), and boss_toravon::boss_toravonAI::UpdateAI().

◆ CastDelayedSpellWithPeriodicAmount()

void Unit::CastDelayedSpellWithPeriodicAmount ( Unit caster,
uint32  spellId,
AuraType  auraType,
int32  addAmount,
uint8  effectIndex = 0 
)
20340{
20341 AuraEffect* aurEff = nullptr;
20342 for (AuraEffectList::iterator i = m_modAuras[auraType].begin(); i != m_modAuras[auraType].end(); ++i)
20343 {
20344 aurEff = *i;
20345 if (aurEff->GetCasterGUID() != caster->GetGUID() || aurEff->GetId() != spellId || aurEff->GetEffIndex() != effectIndex || !aurEff->GetTotalTicks())
20346 continue;
20347
20348 addAmount += ((aurEff->GetOldAmount() * std::max<int32>(aurEff->GetTotalTicks() - int32(aurEff->GetTickNumber()), 0)) / aurEff->GetTotalTicks());
20349 break;
20350 }
20351
20352 // xinef: delay only for casting on different unit
20353 if (this == caster || !sWorld->getBoolConfig(CONFIG_MUNCHING_BLIZZLIKE))
20354 caster->CastCustomSpell(spellId, SPELLVALUE_BASE_POINT0, addAmount, this, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_NO_PERIODIC_RESET), nullptr, aurEff, caster->GetGUID());
20355 else
20356 caster->m_Events.AddEvent(new AuraMunchingQueue(*caster, GetGUID(), addAmount, spellId, aurEff, auraType), caster->m_Events.CalculateQueueTime(400));
20357}
@ CONFIG_MUNCHING_BLIZZLIKE
Definition IWorld.h:181
TriggerCastFlags
Definition SpellDefines.h:132
@ TRIGGERED_NO_PERIODIC_RESET
Will ignore equipped item requirements.
Definition SpellDefines.h:152
uint32 GetTickNumber() const
Definition SpellAuraEffects.h:87
int32 GetOldAmount() const
Definition SpellAuraEffects.h:116
uint32 GetId() const
Definition SpellAuraEffects.cpp:433
int32 GetTotalTicks() const
Definition SpellAuraEffects.cpp:7382
ObjectGuid GetCasterGUID() const
Definition SpellAuraEffects.h:48
Definition Unit.cpp:20306
uint64 CalculateQueueTime(uint64 delay) const
Definition EventProcessor.cpp:164

References EventProcessor::AddEvent(), EventProcessor::CalculateQueueTime(), CastCustomSpell(), CONFIG_MUNCHING_BLIZZLIKE, AuraEffect::GetCasterGUID(), AuraEffect::GetEffIndex(), Object::GetGUID(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetOldAmount(), AuraEffect::GetTickNumber(), AuraEffect::GetTotalTicks(), WorldObject::m_Events, m_modAuras, SPELLVALUE_BASE_POINT0, sWorld, 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)
17355{
17356 uint32 auraId = aura->GetAura(GetEntry());
17357 if (!auraId)
17358 return;
17359
17360 if (auraId == 35696) // Demonic Knowledge
17361 {
17362 int32 basePoints = aura->GetDamage();
17363 CastCustomSpell(this, auraId, &basePoints, nullptr, nullptr, true);
17364 }
17365 else
17366 CastSpell(this, auraId, true);
17367}

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 
)
1278{
1279 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1280 if (!spellInfo)
1281 {
1282 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1284 }
1285
1286 SpellCastTargets targets;
1287 targets.SetDst(x, y, z, GetOrientation());
1288
1289 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1290}
void SetDst(float x, float y, float z, float orientation, uint32 mapId=MAPID_INVALID)
Definition Spell.cpp:406

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 
)
1293{
1294 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1295 if (!spellInfo)
1296 {
1297 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1299 }
1300
1301 SpellCastTargets targets;
1302 targets.SetGOTarget(go);
1303
1304 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1305}
void SetGOTarget(GameObject *target)
Definition Spell.cpp:271

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 :(
1180{
1181 if (!spellInfo)
1182 {
1183 LOG_ERROR("entities.unit", "CastSpell: unknown spell by caster {}", GetGUID().ToString());
1185 }
1186
1188 if (!originalCaster && triggeredByAura)
1189 {
1190 originalCaster = triggeredByAura->GetCasterGUID();
1191 }
1192
1193 Spell* spell = new Spell(this, spellInfo, triggerFlags, originalCaster);
1194
1195 if (value)
1196 {
1197 for (CustomSpellValues::const_iterator itr = value->begin(); itr != value->end(); ++itr)
1198 {
1199 spell->SetSpellValue(itr->first, itr->second);
1200 }
1201 }
1202
1203 spell->m_CastItem = castItem;
1204 return spell->prepare(&targets, triggeredByAura);
1205}
void SetSpellValue(SpellValueMod mod, int32 value)
Definition Spell.cpp:8464
Item * m_CastItem
Definition Spell.h:524

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_aura::Absorb(), spell_rog_cheat_death::Absorb(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Activate(), Player::ActivateSpec(), spell_halion_combustion_consumption_aura::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::AfterRemove(), spell_gen_lifebloom::AfterRemove(), spell_oculus_stop_time_aura::Apply(), spell_sha_earthbind_totem::Apply(), spell_warl_health_funnel::ApplyEffect(), Player::ApplyEnchantment(), spell_hun_lock_and_load::ApplyMarker(), 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(), WorldState::BuffAdalsSongOfBattle(), WorldState::BuffMagtheridonTeam(), Player::BuildPlayerRepop(), spell_igb_incinerating_blast::CalculateDamage(), spell_igb_cannon_blast::CalculatePower(), 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(), CastSpell(), CastSpell(), GameObject::CastSpell(), CastSpell(), CastSpell(), CastSpell(), CastSpell(), spell_the_lich_king_defile::ChangeDamageAndGrow(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), spell_eredar_twins_handle_touch::CheckCast(), Spell::CheckCast(), Spell::CheckItems(), spell_botanica_shift_form_aura::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), spell_the_lich_king_shadow_trap_periodic::CheckTargetCount(), spell_dk_raise_dead::ConsumeReagents(), spell_frost_giant_death_plague::CountTargets(), instance_blackrock_spire::instance_blackrock_spireMapScript::CreatureLooted(), violet_hold_trashAI::CreatureStartAttackDoor(), boss_garfrost::boss_garfrostAI::DamageTaken(), npc_jenny::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::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::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(), 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(), spell_warl_seed_of_corruption_aura::Detonate(), spell_warl_seed_of_corruption_generic_aura::Detonate(), 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_magtheridon::DoAction(), boss_sacrolash::DoAction(), boss_alythess::DoAction(), npc_kalecgos_kj::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::DoAction(), Spell::DoAllEffectOnTarget(), UnitAI::DoCast(), UnitAI::DoCast(), UnitAI::DoCastAOE(), ScriptedAI::DoCastSpell(), InstanceScript::DoCastSpellOnPlayer(), InstanceScript::DoCastSpellOnPlayers(), UnitAI::DoCastToAllHostilePlayers(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), 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::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(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), BattlegroundEY::EventTeamCapturedPoint(), BattleExperienceEvent::Execute(), OrcDeathEvent::Execute(), CorruptTriggers::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_kaelthas::ExecuteMiddleEvent(), boss_salramm::boss_salrammAI::ExplodeGhoul(), spell_festergut_blighted_spores_aura::ExtraEffect(), spell_rotface_mutated_infection_aura::ExtraRemoveEffect(), npc_dark_iron_attack_generator::FinishAttackDueToWin(), npc_azure_saboteur::npc_azure_saboteurAI::FinishPointReached(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::FlyAway(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::GoSiphon(), go_soulwell::go_soulwellAI::GossipHello(), spell_cataclysm_breath::HandleAfterCast(), spell_dk_chains_of_ice::HandleAfterCast(), spell_mage_arcane_blast::HandleAfterCast(), spell_q13086_last_line_of_defence::HandleAfterCast(), spell_infected_worgen_bite_aura::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_aura::HandleApply(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleApply(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), spell_dru_enrage::HandleApply(), spell_rog_killing_spree_aura::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::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::HandleDummy(), spell_corrupted_totems::HandleDummy(), spell_moroes_vanish::HandleDummy(), spell_karazhan_blink::HandleDummy(), spell_ooze_zap::HandleDummy(), spell_saviana_conflagration_init::HandleDummy(), spell_igb_burning_pitch_selector::HandleDummy(), spell_igb_burning_pitch::HandleDummy(), spell_charge_shield_bomber::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_anti_air_rocket_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_illidan_found_target::HandleDummy(), spell_leotheras_chaos_blast::HandleDummy(), spell_morogrim_tidewalker_watery_grave::HandleDummy(), spell_q10935_the_exorcism_of_colonel_jules::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::HandleDummy(), spell_voodoo::HandleDummy(), spell_sartharion_lava_strike::HandleDummy(), spell_halion_meteor_strike_targeting::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_drakkari_colossus_emerge::HandleDummy(), spell_drakkari_colossus_surge::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_voa_flaming_cinder::HandleDummy(), spell_q12096_q12092_dummy::HandleDummy(), spell_vehicle_warhead_fuse::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_najentus_needle_spine::HandleDummy(), spell_ice_spear_target_picker::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::HandleDummyEffect(), spell_yogg_saron_insane_periodic_trigger::HandleDummyEffect(), spell_image_of_drakuru_reagent_check::HandleDummyEffect(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_talon_king_ikiss_blink::HandleDummyHitTarget(), spell_shadowfang_keep_forsaken_skills_aura::HandleDummyTick(), spell_item_rocket_chicken::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_shadowfang_keep_haunting_spirits_aura::HandleDummyTick(), spell_blood_council_shadow_prison_aura::HandleDummyTick(), spell_mark_of_nature::HandleEffect(), spell_call_of_the_beast::HandleEffect(), spell_target_fissures::HandleEffect(), spell_rog_vanish::HandleEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_lich_king_vo_blocker::HandleEffectApply(), spell_midsummer_ribbon_pole::HandleEffectApply(), spell_tharon_ja_dummy_aura::HandleEffectApply(), spell_reliquary_of_souls_aura_of_suffering_aura::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_aura::HandleEffectPeriodic(), spell_gen_whisper_gulch_yogg_saron_whisper::HandleEffectPeriodic(), spell_rog_killing_spree_aura::HandleEffectPeriodic(), spell_sha_earthbind_totem::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_warr_retaliation::HandleEffectProc(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_trigger_aura::HandleEffectRemove(), spell_teron_gorefiend_shadow_of_death::HandleEffectRemove(), spell_black_temple_skeleton_shot_aura::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_aura::HandleEffectRemove(), spell_q10929_fumping_aura::HandleEffectRemove(), spell_flamewreath::HandleFinish(), spell_midsummer_fling_torch::HandleFinish(), spell_midsummer_juggling_torch::HandleFinish(), spell_wintergrasp_rp_gg::HandleFinish(), spell_dreamwalker_summoner::HandleForceCast(), spell_dreamwalker_summon_suppresser_effect::HandleForceCast(), spell_ioc_bomb_blast_criteria::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::HandleInfusion(), OutdoorPvPHP::HandleKillImpl(), OutdoorPvPNA::HandleKillImpl(), OutdoorPvPZM::HandleKillImpl(), BattlegroundIC::HandleKillUnit(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_ticking_time_bomb_aura::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_aura::HandlePeriodic(), spell_halion_meteor_strike_spread_aura::HandlePeriodic(), spell_sladran_grip_of_sladran_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_close_rift_aura::HandlePeriodic(), spell_serpentshrine_cavern_coilfang_water::HandlePeriodic(), spell_rancid_spore_cloud::HandlePeriodic(), spell_kaelthas_remote_toy::HandlePeriodic(), spell_q10923_evil_draws_near_periodic_aura::HandlePeriodic(), spell_sha_totemic_mastery::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::HandlePeriodic(), spell_kiljaeden_shadow_spike_aura::HandlePeriodic(), spell_kiljaeden_armageddon_periodic_aura::HandlePeriodic(), spell_halion_twilight_cutter_periodic_aura::HandlePeriodic(), spell_oculus_ride_ruby_emerald_amber_drake_que_aura::HandlePeriodic(), spell_hun_sniper_training::HandlePeriodic(), spell_shadow_bolt_whirl::HandlePeriodic(), spell_voa_overcharge_aura::HandlePeriodicDummy(), AuraEffect::HandlePeriodicDummyAuraTick(), spell_magtheridon_shadow_grasp::HandlePeriodicRemove(), spell_igb_periodic_trigger_with_power_cost_aura::HandlePeriodicTick(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), spell_bronjahm_soulstorm_channel_ooc_aura::HandlePeriodicTick(), spell_bronjahm_soulstorm_visual_aura::HandlePeriodicTick(), spell_item_direbrew_remote_aura::HandlePeriodicTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceMoveByAI(), WorldState::HandlePlayerEnterZone(), OutdoorPvPEP::HandlePlayerEnterZone(), OutdoorPvPHP::HandlePlayerEnterZone(), OutdoorPvPNA::HandlePlayerEnterZone(), OutdoorPvPSI::HandlePlayerEnterZone(), OutdoorPvPTF::HandlePlayerEnterZone(), OutdoorPvPZM::HandlePlayerEnterZone(), WorldSession::HandlePlayerLoginFromDB(), BattlegroundIC::HandlePlayerResurrect(), misc_commandscript::HandlePossessCommand(), spell_blood_queen_vampiric_bite::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_ahune_spanky_hands::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_warr_vigilance::HandleProc(), spell_karazhan_temptation::HandleProc(), spell_dk_blood_caked_blade::HandleProc(), spell_dk_dancing_rune_weapon::HandleProc(), spell_gen_moss_covered_feet::HandleProc(), spell_item_unsated_craving::HandleProc(), spell_item_shadowmourne::HandleProc(), spell_sha_item_lightning_shield::HandleProc(), spell_sha_item_lightning_shield_trigger::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_aura::HandleRemove(), spell_entropius_void_zone_visual_aura::HandleRemove(), spell_igb_rocket_pack_aura::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_gen_mine_sweeper::HandleSchoolDMG(), spell_warl_shadowflame::HandleSchoolDMG(), spell_gen_bandage::HandleScript(), spell_gen_translocate::HandleScript(), spell_pal_lay_on_hands::HandleScript(), spell_kormok_summon_bone_mages::HandleScript(), spell_kormok_summon_bone_minions::HandleScript(), spell_energize_aoe::HandleScript(), spell_saviana_conflagration_throwback::HandleScript(), spell_taldaram_glittering_sparks::HandleScript(), spell_blood_queen_bloodbolt::HandleScript(), spell_blood_queen_presence_of_the_darkfallen::HandleScript(), spell_igb_rocket_artillery::HandleScript(), spell_putricide_unstable_experiment::HandleScript(), spell_sindragosa_icy_grip::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_summon_spirit_bomb::HandleScript(), spell_dreamwalker_summon_portal::HandleScript(), spell_dreamwalker_twisted_nightmares::HandleScript(), spell_archavon_rock_shards::HandleScript(), spell_wintergrasp_portal::HandleScript(), spell_gen_create_lance::HandleScript(), spell_item_defibrillate::HandleScript(), spell_item_scroll_of_recall::HandleScript(), spell_shazzrah_gate_dummy::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_moam_summon_mana_fiends::HandleScript(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), spell_mistress_kiss_area::HandleScript(), spell_novos_summon_minions::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_choking_gas_bomb::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_the_lich_king_cast_back_to_caster::HandleScript(), spell_frost_giant_death_plague::HandleScript(), spell_yogg_saron_target_selectors::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::HandleScriptEffect(), spell_kalecgos_spectral_realm_dummy::HandleScriptEffect(), spell_marrowgar_coldflame_bonestorm::HandleScriptEffect(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_black_temple_bloodbolt::HandleScriptEffect(), spell_lady_vashj_summon_sporebat::HandleScriptEffect(), spell_kaelthas_summon_weapons::HandleScriptEffect(), spell_kaelthas_gravity_lapse::HandleScriptEffect(), spell_kaelthas_nether_beam::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::HandleScriptEffect(), spell_death_knight_initiate_visual::HandleScriptEffect(), spell_q12779_an_end_to_all_things::HandleScriptEffect(), spell_summon_amanishi_sentries::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::HandleScriptEffect(), spell_marrowgar_coldflame::HandleScriptEffect(), spell_arcane_chains_character_force_cast::HandleScriptEffect(), spell_q12611_deathbolt::HandleScriptEffect(), spell_illidari_council_judgement::HandleScriptEffect(), spell_black_temple_summon_shadowfiends::HandleScriptEffect(), spell_ice_bombardment_dest_picker::HandleScriptEffect(), spell_kaelthas_remove_enchanted_weapons::HandleScriptEffect(), spell_kaelthas_kael_explodes::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::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::HandleSpikes(), AuraEffect::HandleSpiritOfRedemption(), spell_gen_paralytic_poison::HandleStun(), spell_putricide_mutated_transformation::HandleSummon(), spell_item_draenic_pale_ale::HandleSummon(), WorldSession::HandleTalentWipeConfirmOpcode(), spell_mother_shahraz_fatal_attraction::HandleTeleportUnits(), spell_warl_drain_soul::HandleTick(), WorldSession::HandleTrainerBuySpellOpcode(), spell_trigger_spell_from_caster::HandleTrigger(), spell_magic_eater_food::HandleTriggerSpell(), spell_alert_drums::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(), npc_jenny::Initialize(), 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(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::IsSummonedBy(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_pet_gen_fetch_ball::IsSummonedBy(), 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(), 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::JustDied(), boss_dalronn_the_controller::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(), 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_sapphiron::boss_sapphironAI::JustDied(), boss_anomalus::JustDied(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), boss_shade_of_akama::JustDied(), CasterAI::JustEngagedWith(), boss_servant_quarters::JustEngagedWith(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::JustEngagedWith(), boss_akilzon::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(), boss_yoggsaron_keeper::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_shirrak_the_dead_watcher::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_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::JustEngagedWith(), boss_steelbreaker::boss_steelbreakerAI::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_fathomlord_karathress::JustEngagedWith(), boss_fathomguard_sharkkis::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_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::JustSummoned(), npc_kalecgos_kj::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::JustSummoned(), boss_veras_darkshadow::JustSummoned(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::JustSummoned(), boss_supremus::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::JustSummoned(), boss_archimonde::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::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::Load(), npc_dkc1_gothik::npc_dkc1_gothikAI::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_jenny::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_spirit_shade::npc_spirit_shadeAI::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(), npc_ashtongue_sorcerer::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_tomb(), 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_aura::OnApply(), spell_direbrew_disarm::OnApply(), spell_love_is_in_the_air_romantic_picnic::OnApply(), spell_halion_combustion_consumption_aura::OnApply(), spell_load_into_catapult_aura::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::OnCast(), npc_chesspiece::OnCharmed(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), BattlefieldWG::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_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_fel_crystalforge::OnGossipSelect(), go_bashir_crystalforge::OnGossipSelect(), go_apexis_relic::OnGossipSelect(), Player::OnGossipSelect(), spell_summon_all_players_dummy::OnHit(), spell_apothecary_perfume_spill::OnPeriodic(), spell_apothecary_cologne_spill::OnPeriodic(), spell_muru_summon_blood_elves_periodic_aura::OnPeriodic(), spell_claw_rage_aura::OnPeriodic(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_anubisath_mortal_strike::OnPeriodic(), spell_the_lich_king_soul_reaper_aura::OnPeriodic(), spell_yogg_saron_brain_link_aura::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_illidan_tear_of_azzinoth_summon_channel_aura::OnPeriodic(), spell_illidan_demon_transform1_aura::OnPeriodic(), spell_illidan_cage_trap_stun_aura::OnPeriodic(), spell_black_temple_dementia_aura::OnPeriodic(), spell_npc22275_crystal_prison_aura::OnPeriodic(), spell_item_eye_of_grillok_aura::OnPeriodic(), spell_kalecgos_curse_of_boundless_agony_aura::OnPeriodic(), spell_muru_darkness_aura::OnPeriodic(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_the_lich_king_vile_spirits_aura::OnPeriodic(), spell_web_wrap_damage::OnPeriodic(), spell_assembly_rune_of_summoning_aura::OnPeriodic(), spell_thorim_lightning_pillar_P2_aura::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), spell_mark_of_kazzak_aura::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(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::OnPlayerInWaterStateUpdate(), BattlefieldWG::OnPlayerJoinWar(), lfg::LFGPlayerScript::OnPlayerMapChanged(), MidsummerPlayerScript::OnPlayerUpdateZone(), spell_gen_proc_on_victim::OnProc(), npc_steward_of_time::OnQuestAccept(), npc_mikhail::OnQuestAccept(), npc_rocknot::OnQuestReward(), npc_thrall_bfu::OnQuestReward(), spell_kalecgos_spectral_realm_aura::OnRemove(), spell_azgalor_doom_aura::OnRemove(), spell_boss_salramm_steal_flesh_aura::OnRemove(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_putricide_mutation_init_aura::OnRemove(), spell_the_lich_king_shadow_trap_visual_aura::OnRemove(), spell_the_lich_king_harvest_soul_aura::OnRemove(), spell_icc_web_wrap_aura::OnRemove(), spell_ioc_repair_turret_aura::OnRemove(), spell_kaelthas_flame_strike::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(), 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_aura::PeriodicTick(), spell_summon_ice_spear_delayer::PeriodicTick(), spell_summoning_rhyme_aura::PeriodicTick(), spell_halion_twilight_phasing::Phase(), BattlegroundAV::PopulateNode(), spell_azjol_nerub_carrion_beetels::PrepareAuraScript(), 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::RemovePassengers(), boss_keristrasza::RemovePrison(), Player::ReportedAfkBy(), GuardAI::Reset(), npc_demonic_vapor::Reset(), npc_demonic_vapor_trail::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::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(), npc_ashtongue_channeler::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_nightbane::ScheduleFly(), 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_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::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(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_felmyst::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(), Player::StoreItem(), spell_dk_ghoul_explode::Suicide(), boss_anzu::SummonBroods(), 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::TeleportPlayer(), BattlegroundSA::TeleportToEntrancePosition(), spell_midsummer_fling_torch::ThrowNextTorch(), TriggerBurningPitch(), npc_orb_carrier::npc_orb_carrierAI::TriggerCutter(), spell_koralon_meteor_fists_aura::TriggerFists(), spell_flame_warder_meteor_fists_aura::TriggerFists(), spell_gen_holiday_buff_food::TriggerFoodBuff(), spell_karazhan_brittle_bones_aura::Update(), spell_black_temple_curse_of_the_bleakheart_aura::Update(), spell_illidari_council_deadly_strike_aura::Update(), spell_mother_shahraz_random_periodic_aura::Update(), spell_mother_shahraz_beam_periodic_aura::Update(), spell_mother_shahraz_saber_lash_aura::Update(), spell_black_temple_charge_rage_aura::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(), 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(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_demonic_vapor::UpdateAI(), npc_demonic_vapor_trail::UpdateAI(), npc_kalecgos_kj::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_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(), 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_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_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::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::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), npc_crystal_spike::UpdateAI(), npc_crystalline_frayer::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_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::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_dalronn_the_controller::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_gathios_the_shatterer::UpdateAI(), boss_lady_malande::UpdateAI(), boss_the_lurker_below::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::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(), boss_maexxna_webwrap::boss_maexxna_webwrapAI::UpdateAI(), npc_living_poison::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(), 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_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 
)
1225{
1226 return CastSpell(victim, spellInfo, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1227}

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 
)
1230{
1231 SpellCastTargets targets;
1232 targets.SetUnitTarget(victim);
1233 return CastSpell(targets, spellInfo, nullptr, triggerFlags, castItem, triggeredByAura, originalCaster);
1234}

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 
)
1208{
1209 return CastSpell(victim, spellId, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1210}

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 
)
1213{
1214 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1215 if (!spellInfo)
1216 {
1217 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1219 }
1220
1221 return CastSpell(victim, spellInfo, triggerFlags, castItem, triggeredByAura, originalCaster);
1222}

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

◆ CastStop()

◆ ChangeSeat()

void Unit::ChangeSeat ( int8  seatId,
bool  next = true 
)
19750{
19751 if (!m_vehicle)
19752 return;
19753
19754 if (seatId < 0)
19755 {
19756 seatId = m_vehicle->GetNextEmptySeat(GetTransSeat(), next);
19757 if (seatId < 0)
19758 return;
19759 }
19760 else if (seatId == GetTransSeat() || !m_vehicle->HasEmptySeat(seatId))
19761 return;
19762
19764 if (!m_vehicle->AddPassenger(this, seatId))
19765 ABORT();
19766}
int8 GetNextEmptySeat(int8 seatId, bool next) const
Definition Vehicle.cpp:246
bool HasEmptySeat(int8 seatId) const
Definition Vehicle.cpp:220

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)
15780{
15782 return;
15783
15784 // This needs to be before RemoveFromWorld to make GetCaster() return a valid pointer on aura removal
15786
15787 if (IsInWorld()) // not in world and not being removed atm
15789
15790 ASSERT(GetGUID());
15791
15792 // A unit may be in removelist and not in world, but it is still in grid
15793 // and may have some references during delete
15796
15797 if (finalCleanup)
15798 m_cleanupDone = true;
15799
15800 CombatStop();
15805 GetMotionMaster()->Clear(false); // remove different non-standard movement generators.
15806}
void deleteReferences(bool removeFromMap=false)
Definition HostileRefMgr.cpp:125
void Clear(bool reset=true)
Definition MotionMaster.h:167
void ClearAllThreat()
Definition ThreatMgr.cpp:417
void CombatStop(bool includingCast=false)
Definition Unit.cpp:10480
void RemoveAllGameObjects()
Definition Unit.cpp:6319
void ClearComboPoints()
Definition Unit.cpp:16897
void ClearComboPointHolders()
Definition Unit.cpp:16952
HostileRefMgr & getHostileRefMgr()
Definition Unit.h:916
void RemoveFromWorld() override
Definition Unit.cpp:15733
void RemoveAllAuras()
Definition Unit.cpp:5352
ThreatMgr & GetThreatMgr()
Definition Unit.h:912

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

Referenced by CleanupsBeforeDelete().

◆ CleanupsBeforeDelete()

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

Reimplemented from WorldObject.

15809{
15810 if (GetTransport())
15811 {
15813 SetTransport(nullptr);
15816 }
15817
15818 CleanupBeforeRemoveFromMap(finalCleanup);
15819}
virtual void RemovePassenger(WorldObject *passenger, bool withAll=false)=0
void CleanupBeforeRemoveFromMap(bool finalCleanup)
Definition Unit.cpp:15779
void SetTransport(Transport *t)
Definition Object.h:606
void Reset()
Definition Object.h:293
void RemoveMovementFlag(uint32 flag)
Definition Object.h:339

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 ( )
16961{
16962 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
16963 m_reactiveTimer[i] = 0;
16964
16971}
@ 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
@ CLASS_CONTEXT_ABILITY_REACTIVE
Definition UnitDefines.h:235
virtual bool IsClass(Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
Definition Unit.h:810
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition Unit.cpp:10591

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), Object::IsPlayer(), m_reactiveTimer, MAX_REACTIVE, and ModifyAuraState().

Referenced by Player::ActivateSpec(), and setDeathState().

◆ ClearComboPointHolders()

void Unit::ClearComboPointHolders ( )
16953{
16954 while (!m_ComboPointHolders.empty())
16955 {
16956 (*m_ComboPointHolders.begin())->ClearComboPoints(); // this also removes it from m_comboPointHolders
16957 }
16958}

References ClearComboPoints(), and m_ComboPointHolders.

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

◆ ClearComboPoints()

void Unit::ClearComboPoints ( )
16898{
16899 if (!m_comboTarget)
16900 {
16901 return;
16902 }
16903
16904 // remove Premed-like effects
16905 // (NB: this Aura retains the CP while it's active - now that CP have reset, it shouldn't be there anymore)
16907
16908 m_comboPoints = 0;
16911 m_comboTarget = nullptr;
16912}
@ 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
1783{ m_Diminishing.clear(); }

References m_Diminishing.

Referenced by setDeathState().

◆ ClearEmoteState()

void Unit::ClearEmoteState ( )
inline

Sets emote state (looping emote). Emotes available in SharedDefines.h.

void SetEmoteState(Emote emoteState)
Definition Unit.h:729

References EMOTE_ONESHOT_NONE, and SetEmoteState().

Referenced by boss_felblood_kaelthas::DoAction().

◆ ClearInCombat()

void Unit::ClearInCombat ( )
13861{
13862 m_CombatTimer = 0;
13864
13865 // Player's state will be cleared in Player::UpdateContestedPvP
13866 if (Creature* creature = ToCreature())
13867 {
13868 if (creature->GetCreatureTemplate() && creature->GetCreatureTemplate()->unit_flags & UNIT_FLAG_IMMUNE_TO_PC)
13869 SetImmuneToPC(true); // set immunity state to the one from db on evade
13870
13873 ReplaceAllDynamicFlags(creature->GetCreatureTemplate()->dynamicflags);
13874
13875 creature->SetAssistanceTimer(0);
13876
13877 // Xinef: will be recalculated at follow movement generator initialization
13878 if (!IsPet() && !IsCharmed())
13879 return;
13880 }
13881 else if (Player* player = ToPlayer())
13882 {
13883 player->UpdatePotionCooldown();
13884 if (player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
13885 for (uint8 i = 0; i < MAX_RUNES; ++i)
13886 player->SetGracePeriod(i, 0);
13887 }
13888
13889 if (Player* player = this->ToPlayer())
13890 {
13891 sScriptMgr->OnPlayerLeaveCombat(player);
13892 }
13893}
#define MAX_RUNES
Definition Player.h:404
@ CLASS_DEATH_KNIGHT
Definition SharedDefines.h:146
@ CLASS_CONTEXT_ABILITY
Definition UnitDefines.h:234
@ UNIT_STATE_ATTACK_PLAYER
Definition UnitDefines.h:184
@ UNIT_FLAG_IN_COMBAT
Definition UnitDefines.h:269
@ UNIT_FLAG_IMMUNE_TO_PC
Definition UnitDefines.h:258
void ReplaceAllDynamicFlags(uint32 flag) override
Definition Unit.h:740
bool IsCharmed() const
Definition Unit.h:1251
bool IsPet() const
Definition Unit.h:763
void SetImmuneToPC(bool apply, bool keepCombat=false)
Definition Unit.cpp:13652
void RemoveUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:720

References CLASS_CONTEXT_ABILITY, 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
708{ 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(), ConfusedMovementGenerator< 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_lady_vashj::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), MotionMaster::MoveTargetedHome(), WaypointMovementGenerator< Creature >::OnArrived(), boss_nightbane::PathEndReached(), 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::StartAttack(), StopMoving(), StopMovingOnCurrentPos(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), and boss_the_lich_king::boss_the_lich_kingAI::UpdateAI().

◆ CombatStart()

void Unit::CombatStart ( Unit target,
bool  initialAggro = true 
)
13671{
13672 // Xinef: Dont allow to start combat with triggers
13673 if (victim->IsCreature() && victim->ToCreature()->IsTrigger())
13674 return;
13675
13676 if (initialAggro)
13677 {
13678 // Make player victim stand up automatically
13679 if (victim->getStandState() && victim->IsPlayer())
13680 {
13681 victim->SetStandState(UNIT_STAND_STATE_STAND);
13682 }
13683
13684 if (!victim->IsInCombat() && !victim->IsPlayer() && !victim->ToCreature()->HasReactState(REACT_PASSIVE) && victim->ToCreature()->IsAIEnabled)
13685 {
13686 if (victim->IsPet())
13687 victim->ToCreature()->AI()->AttackedBy(this); // PetAI has special handler before AttackStart()
13688 else
13689 {
13690 victim->ToCreature()->AI()->AttackStart(this);
13691 // if the target is an NPC with a pet or minion, pet should react.
13692 if (Unit* victimControlledUnit = victim->GetFirstControlled())
13693 {
13694 victimControlledUnit->SetInCombatWith(this);
13695 SetInCombatWith(victimControlledUnit);
13696 victimControlledUnit->AddThreat(this, 0.0f);
13697 }
13698 }
13699
13700 // if unit has an owner, put owner in combat.
13701 if (Unit* victimOwner = victim->GetOwner())
13702 {
13703 if (!(victimOwner->IsInCombatWith(this)))
13704 {
13705 /* warding off to not take over aggro for no reason
13706 Using only AddThreat causes delay in attack */
13707 if (!victimOwner->IsInCombat() && victimOwner->IsAIEnabled)
13708 {
13709 victimOwner->ToCreature()->AI()->AttackStart(this);
13710 }
13711 victimOwner->SetInCombatWith(this);
13712 SetInCombatWith(victimOwner);
13713 victimOwner->AddThreat(this, 0.0f);
13714 }
13715 }
13716 }
13717
13718 bool alreadyInCombat = IsInCombat();
13719
13720 SetInCombatWith(victim);
13721 victim->SetInCombatWith(this);
13722
13723 // Update leash timer when attacking creatures
13724 if (victim->IsCreature())
13725 victim->ToCreature()->UpdateLeashExtensionTime();
13726
13727 // Xinef: If pet started combat - put owner in combat
13728 if (!alreadyInCombat && IsInCombat())
13729 {
13730 if (Unit* owner = GetOwner())
13731 {
13732 owner->SetInCombatWith(victim);
13733 victim->SetInCombatWith(owner);
13734 }
13735 }
13736 }
13737
13738 Unit* who = victim->GetCharmerOrOwnerOrSelf();
13739 if (who->IsPlayer())
13740 SetContestedPvP(who->ToPlayer());
13741
13743 if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who))
13744 {
13745 player->UpdatePvP(true);
13747 }
13748}
@ AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT
Definition SpellDefines.h:66
@ UNIT_STAND_STATE_STAND
Definition UnitDefines.h:32
@ REACT_PASSIVE
Definition Unit.h:548
void UpdatePvP(bool state, bool _override=false)
Definition PlayerUpdates.cpp:1530
Unit * GetCharmerOrOwnerOrSelf() const
Definition Unit.h:1228
void SetContestedPvP(Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
Definition Unit.cpp:17281
Unit * GetFirstControlled() const
Definition Unit.cpp:11119

References Creature::AI(), CreatureAI::AttackedBy(), UnitAI::AttackStart(), AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetFirstControlled(), GetOwner(), getStandState(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), IsInCombat(), IsPet(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), REACT_PASSIVE, RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), SetStandState(), Object::ToCreature(), Object::ToPlayer(), UNIT_STAND_STATE_STAND, Creature::UpdateLeashExtensionTime(), 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 
)
13751{
13752 // Xinef: Dont allow to start combat with triggers
13753 if (target->IsCreature() && target->ToCreature()->IsTrigger())
13754 return;
13755
13756 if (initialAggro)
13757 {
13758 SetInCombatWith(target, duration);
13759
13760 // Xinef: If pet started combat - put owner in combat
13761 if (Unit* owner = GetOwner())
13762 owner->SetInCombatWith(target, duration);
13763
13764 // Update leash timer when attacking creatures
13765 if (target->IsCreature())
13767 else if (ToCreature()) // Reset leash if it is a spell caster, else it may evade inbetween casts
13769 }
13770
13771 Unit* who = target->GetCharmerOrOwnerOrSelf();
13772 if (who->IsPlayer())
13773 SetContestedPvP(who->ToPlayer());
13774
13776 if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who))
13777 {
13778 player->UpdatePvP(true);
13780 }
13781}
bool IsTrigger() const
Definition Creature.h:76

References AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetOwner(), Object::IsCreature(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), Object::ToCreature(), Object::ToPlayer(), Creature::UpdateLeashExtensionTime(), and Player::UpdatePvP().

Referenced by Spell::_cast().

◆ CombatStop()

void Unit::CombatStop ( bool  includingCast = false)
10481{
10482 if (includingCast && IsNonMeleeSpellCast(false))
10484
10485 AttackStop();
10487 if (IsPlayer())
10488 ToPlayer()->SendAttackSwingCancelAttack(); // melee and ranged forced attack cancel
10489 if (Creature* pCreature = ToCreature())
10490 pCreature->ClearLastLeashExtensionTimePtr();
10491 ClearInCombat();
10492
10493 // xinef: just in case
10494 if (IsPetInCombat() && !IsPlayer())
10496}
void SendAttackSwingCancelAttack()
Definition PlayerMisc.cpp:140
bool IsPetInCombat() const
Definition Unit.h:896
void ClearInPetCombat()
Definition Unit.cpp:13895
void RemoveAllAttackers()
Remove all units in m_attackers list and send them AttackStop()
Definition Unit.cpp:10528
void ClearInCombat()
Definition Unit.cpp:13860
bool AttackStop()
Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell...
Definition Unit.cpp:10447

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

Referenced by CreatureAI::_EnterEvadeMode(), PetAI::_stopAttack(), Player::ActivateTaxiPathTo(), CleanupBeforeRemoveFromMap(), CombatStopWithPets(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::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(), boss_felblood_kaelthas::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_kalecgos::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_maiev_illidan::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(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::FlyAway(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleCombatStopCommand(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), npc_commandscript::HandleNpcDeleteCommand(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), 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(), 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)
10499{
10500 CombatStop(includingCast);
10501
10502 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10503 (*itr)->CombatStop(includingCast);
10504}

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
1059{ return CalculatePct(GetHealth(), pct); }
uint32 GetHealth() const
Definition Unit.h:1045

References CalculatePct(), and GetHealth().

Referenced by spell_gen_leeching_swarm_aura::HandleEffectPeriodic().

◆ CountPctFromMaxHealth()

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

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_alar_ember_blast::HandleCast(), misc_commandscript::HandleDamageCommand(), spell_dk_death_strike::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_warr_last_stand::HandleDummy(), HandleDummyAuraProc(), 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(), 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(), and npc_injured_patient::npc_injured_patientAI::UpdateAI().

◆ CreateTamedPetFrom() [1/2]

Pet * Unit::CreateTamedPetFrom ( Creature creatureTarget,
uint32  spell_id = 0 
)
17385{
17386 if (!IsPlayer())
17387 return nullptr;
17388
17389 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17390
17391 if (!pet->CreateBaseAtCreature(creatureTarget))
17392 {
17393 delete pet;
17394 return nullptr;
17395 }
17396
17397 uint8 level = creatureTarget->GetLevel() + 5 < GetLevel() ? (GetLevel() - 5) : creatureTarget->GetLevel();
17398
17399 if (!InitTamedPet(pet, level, spell_id))
17400 {
17401 delete pet;
17402 return nullptr;
17403 }
17404
17405 return pet;
17406}
@ HUNTER_PET
Definition PetDefines.h:32
bool CreateBaseAtCreature(Creature *creature)
Definition Pet.cpp:941
bool InitTamedPet(Pet *pet, uint8 level, uint32 spell_id)
Definition Unit.cpp:17428

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

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

◆ CreateTamedPetFrom() [2/2]

Pet * Unit::CreateTamedPetFrom ( uint32  creatureEntry,
uint32  spell_id = 0 
)
17409{
17410 if (!IsPlayer())
17411 return nullptr;
17412
17413 CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(creatureEntry);
17414 if (!creatureInfo)
17415 return nullptr;
17416
17417 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17418
17419 if (!pet->CreateBaseAtCreatureInfo(creatureInfo, this) || !InitTamedPet(pet, GetLevel(), spell_id))
17420 {
17421 delete pet;
17422 return nullptr;
17423 }
17424
17425 return pet;
17426}
#define sObjectMgr
Definition ObjectMgr.h:1636
bool CreateBaseAtCreatureInfo(CreatureTemplate const *cinfo, Unit *owner)
Definition Pet.cpp:976
Definition CreatureData.h:186

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

◆ CreateVehicleKit()

bool Unit::CreateVehicleKit ( uint32  id,
uint32  creatureEntry 
)

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

18749{
18750 VehicleEntry const* vehInfo = sVehicleStore.LookupEntry(id);
18751 if (!vehInfo)
18752 return false;
18753
18754 m_vehicleKit = new Vehicle(this, vehInfo, creatureEntry);
18757 return true;
18758}
DBCStorage< VehicleEntry > sVehicleStore(VehicleEntryfmt)
@ UNIT_MASK_VEHICLE
Definition UnitDefines.h:161
@ UPDATEFLAG_VEHICLE
Definition UpdateData.h:46

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

@fix: Hack to avoid premature leashing

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

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(), CanSparringWith(), 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(), Object::GetGUID(), GetHealth(), GetOwnerGUID(), Player::GetPet(), DamageInfo::GetResist(), Creature::GetSparringPct(), HasActivePowerType(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellCastTargets::HasDstChannel(), Creature::hasLootRecipient(), HasUnitState(), CleanDamage::hitOutCome, SpellInfo::Id, InterruptNonMeleeSpells(), IsAIEnabled, IsAlive(), IsControlledByPlayer(), IsCreatedByPlayer(), Object::IsCreature(), IsImmunedToDamageOrSchool(), IsInCombatWith(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), IsVehicle(), Kill(), LOG_DEBUG, Creature::LowerPlayerDamageReq(), m_currentSpells, m_movedByPlayer, Spell::m_targets, 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::SetLootRecipient(), SPELL_ATTR3_SUPPRESS_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(), UNIT_STATE_EVADE, Player::UpdateAchievementCriteria(), Creature::UpdateLeashExtensionTime(), 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(), spell_alar_ember_blast::HandleCast(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), spell_svala_ritual_strike::HandleDummyEffect(), spell_valkyr_touch_aura::HandleEffectPeriodic(), spell_lady_vashj_magic_barrier::HandleEffectRemove(), spell_algalon_collapse_aura::HandlePeriodic(), spell_kaelthas_burn::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_gluth_decimate::HandleScriptEffect(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ DealDamageMods()

void Unit::DealDamageMods ( Unit const *  victim,
uint32 damage,
uint32 absorb 
)
static

◆ DealHeal()

int32 Unit::DealHeal ( Unit healer,
Unit victim,
uint32  addhealth 
)
static
10996{
10997 int32 gain = 0;
10998
10999 if (healer)
11000 {
11001 if (victim->IsAIEnabled)
11002 victim->GetAI()->HealReceived(healer, addhealth);
11003
11004 if (healer->IsAIEnabled)
11005 healer->GetAI()->HealDone(victim, addhealth);
11006 }
11007
11008 if (addhealth)
11009 gain = victim->ModifyHealth(int32(addhealth));
11010
11011 // Hook for OnHeal Event
11012 sScriptMgr->OnHeal(healer, victim, (uint32&)gain);
11013
11014 Unit* unit = healer;
11015
11016 if (healer && healer->IsCreature() && healer->ToCreature()->IsTotem())
11017 unit = healer->GetOwner();
11018
11019 if (!unit)
11020 return gain;
11021
11022 if (Player* player = unit->ToPlayer())
11023 {
11024 if (Battleground* bg = player->GetBattleground())
11025 bg->UpdatePlayerScore(player, SCORE_HEALING_DONE, gain);
11026
11027 // use the actual gain, as the overheal shall not be counted, skip gain 0 (it ignored anyway in to criteria)
11028 if (gain && player->InBattleground()) // pussywizard: InBattleground() optimization
11029 player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, gain, 0, victim);
11030
11031 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED, addhealth); // pussywizard: optimization
11032 }
11033
11034 /*if (Player* player = victim->ToPlayer())
11035 {
11036 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED, gain); // pussywizard: optimization
11037 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED, addhealth); // pussywizard: optimization
11038 }*/
11039
11040 return gain;
11041}
@ SCORE_HEALING_DONE
Definition BattlegroundScore.h:33
@ ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE
Definition DBCEnums.h:169
virtual void HealReceived(Unit *, uint32 &)
Called when the creature receives heal.
Definition UnitAI.h:370
virtual void HealDone(Unit *, uint32 &)
Called when the unit heals.
Definition UnitAI.h:376

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

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
1842{
1843 Unit* victim = damageInfo->target;
1844
1845 auto canTakeMeleeDamage = [&]()
1846 {
1847 return victim->IsAlive() && !victim->HasUnitState(UNIT_STATE_IN_FLIGHT) && (!victim->IsCreature() || !victim->ToCreature()->IsEvadingAttacks());
1848 };
1849
1850 if (!canTakeMeleeDamage())
1851 {
1852 return;
1853 }
1854
1855 // Hmmmm dont like this emotes client must by self do all animations
1856 if (damageInfo->HitInfo & HITINFO_CRITICALHIT)
1858 if (damageInfo->blocked_amount && damageInfo->TargetState != VICTIMSTATE_BLOCKS)
1860
1861 // Parry haste is enabled if it's not a creature or if the creature doesn't have the NO_PARRY_HASTEN flag.
1862 bool isParryHasteEnabled = !victim->IsCreature() ||
1864 if (damageInfo->TargetState == VICTIMSTATE_PARRY && isParryHasteEnabled)
1865 {
1866 // Get attack timers
1867 float offtime = float(victim->getAttackTimer(OFF_ATTACK));
1868 float basetime = float(victim->getAttackTimer(BASE_ATTACK));
1869 // Reduce attack time
1870 if (victim->HasOffhandWeaponForAttack() && offtime < basetime)
1871 {
1872 float percent20 = victim->GetAttackTime(OFF_ATTACK) * 0.20f;
1873 float percent60 = 3.0f * percent20;
1874 if (offtime > percent20 && offtime <= percent60)
1875 victim->setAttackTimer(OFF_ATTACK, uint32(percent20));
1876 else if (offtime > percent60)
1877 {
1878 offtime -= 2.0f * percent20;
1879 victim->setAttackTimer(OFF_ATTACK, uint32(offtime));
1880 }
1881 }
1882 else
1883 {
1884 float percent20 = victim->GetAttackTime(BASE_ATTACK) * 0.20f;
1885 float percent60 = 3.0f * percent20;
1886 if (basetime > percent20 && basetime <= percent60)
1887 victim->setAttackTimer(BASE_ATTACK, uint32(percent20));
1888 else if (basetime > percent60)
1889 {
1890 basetime -= 2.0f * percent20;
1891 victim->setAttackTimer(BASE_ATTACK, uint32(basetime));
1892 }
1893 }
1894 }
1895
1896 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1897 {
1898 if (!canTakeMeleeDamage() || (!damageInfo->damages[i].damage && !damageInfo->damages[i].absorb && !damageInfo->damages[i].resist))
1899 {
1900 continue;
1901 }
1902
1903 // Call default DealDamage
1904 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->damages[i].absorb, damageInfo->attackType, damageInfo->hitOutCome);
1905 Unit::DealDamage(this, victim, damageInfo->damages[i].damage, &cleanDamage, DIRECT_DAMAGE, SpellSchoolMask(damageInfo->damages[i].damageSchoolMask), nullptr, durabilityLoss);
1906 }
1907
1908 // gain rage if attack is fully blocked, dodged or parried
1910 {
1911 switch (damageInfo->attackType)
1912 {
1913 case BASE_ATTACK:
1914 case OFF_ATTACK:
1915 {
1916 uint32 weaponSpeedHitFactor = uint32(GetAttackTime(damageInfo->attackType) / 1000.0f * (damageInfo->attackType == BASE_ATTACK ? 3.5f : 1.75f));
1917 RewardRage(damageInfo->cleanDamage, weaponSpeedHitFactor, true);
1918 break;
1919 }
1920 default:
1921 break;
1922 }
1923 }
1924
1925 // If this is a creature and it attacks from behind it has a probability to daze it's victim
1926 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) &&
1927 !IsPlayer() && !ToCreature()->IsControlledByPlayer() && !victim->HasInArc(M_PI, this)
1928 && (victim->IsPlayer() || !victim->ToCreature()->isWorldBoss()) && !victim->IsVehicle()))
1929 {
1930 // -probability is between 0% and 40%
1931 // 20% base chance
1932 float Probability = 20.0f;
1933
1934 // there is a newbie protection, at level 10 just 7% base chance; assuming linear function
1935 if (victim->GetLevel() < 30)
1936 Probability = 0.65f * victim->GetLevel() + 0.5f;
1937
1938 uint32 VictimDefense = victim->GetDefenseSkillValue();
1939 uint32 AttackerMeleeSkill = GetUnitMeleeSkill();
1940
1941 // xinef: fix daze mechanics
1942 Probability -= ((float)VictimDefense - AttackerMeleeSkill) * 0.1428f;
1943
1944 if (Probability > 40.0f)
1945 Probability = 40.0f;
1946
1947 // Daze application
1948 if (sWorld->getBoolConfig(CONFIG_ENABLE_DAZE))
1949 if (roll_chance_f(std::max(0.0f, Probability)))
1950 CastSpell(victim, 1604, true);
1951 }
1952
1953 if (IsPlayer())
1954 ToPlayer()->CastItemCombatSpell(victim, damageInfo->attackType, damageInfo->procVictim, damageInfo->procEx);
1955
1956 // Do effect if any damage done to target
1957 if (damageInfo->damages[0].damage + damageInfo->damages[1].damage)
1958 {
1959 // We're going to call functions which can modify content of the list during iteration over it's elements
1960 // Let's copy the list so we can prevent iterator invalidation
1962 for (AuraEffectList::const_iterator dmgShieldItr = vDamageShieldsCopy.begin(); dmgShieldItr != vDamageShieldsCopy.end(); ++dmgShieldItr)
1963 {
1964 SpellInfo const* i_spellProto = (*dmgShieldItr)->GetSpellInfo();
1965 // Damage shield can be resisted...
1966 if (SpellMissInfo missInfo = victim->SpellHitResult(this, i_spellProto, false))
1967 {
1968 victim->SendSpellMiss(this, i_spellProto->Id, missInfo);
1969 continue;
1970 }
1971
1972 // ...or immuned
1973 if (IsImmunedToDamageOrSchool(i_spellProto))
1974 {
1975 victim->SendSpellDamageImmune(this, i_spellProto->Id);
1976 continue;
1977 }
1978
1979 uint32 damage = uint32(std::max(0, (*dmgShieldItr)->GetAmount())); // xinef: done calculated at amount calculation
1980
1981 if (Unit* caster = (*dmgShieldItr)->GetCaster())
1982 {
1983 damage = caster->SpellDamageBonusDone(this, i_spellProto, damage, SPELL_DIRECT_DAMAGE, (*dmgShieldItr)->GetEffIndex());
1984 damage = this->SpellDamageBonusTaken(caster, i_spellProto, damage, SPELL_DIRECT_DAMAGE);
1985 }
1986
1987 uint32 absorb = 0;
1988
1989 DamageInfo dmgInfo(victim, this, damage, i_spellProto, i_spellProto->GetSchoolMask(), SPELL_DIRECT_DAMAGE);
1990 Unit::CalcAbsorbResist(dmgInfo);
1991 absorb = dmgInfo.GetAbsorb();
1992 damage = dmgInfo.GetDamage();
1993
1994 Unit::DealDamageMods(this, damage, &absorb);
1995
1997 WorldPacket data(SMSG_SPELLDAMAGESHIELD, (8 + 8 + 4 + 4 + 4 + 4));
1998 data << victim->GetGUID();
1999 data << GetGUID();
2000 data << uint32(i_spellProto->Id);
2001 data << uint32(damage); // Damage
2002 int32 overkill = int32(damage) - int32(GetHealth());
2003 data << uint32(overkill > 0 ? overkill : 0); // Overkill
2004 data << uint32(i_spellProto->GetSchoolMask());
2005 victim->SendMessageToSet(&data, true);
2006
2007 Unit::DealDamage(victim, this, damage, 0, SPELL_DIRECT_DAMAGE, i_spellProto->GetSchoolMask(), i_spellProto, true);
2008 }
2009 }
2010}
@ CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN
Definition CreatureData.h:48
@ CONFIG_ENABLE_DAZE
Definition IWorld.h:182
@ EMOTE_ONESHOT_WOUND_CRITICAL
Definition SharedDefines.h:1924
@ EMOTE_ONESHOT_PARRY_SHIELD
Definition SharedDefines.h:1930
SpellMissInfo
Definition SharedDefines.h:1518
bool isWorldBoss() const
Definition Creature.h:121
void CastItemCombatSpell(Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
Definition Player.cpp:7222
SpellSchoolMask GetSchoolMask() const
Definition SpellInfo.cpp:1987
uint32 GetUnitMeleeSkill(Unit const *target=nullptr) const
Definition Unit.h:1128
void SendSpellMiss(Unit *target, uint32 spellID, SpellMissInfo missInfo)
Definition Unit.cpp:6501
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition Unit.cpp:3639
void SendSpellDamageImmune(Unit *target, uint32 spellId)
Definition Unit.cpp:6525
SpellMissInfo SpellHitResult(Unit *victim, SpellInfo const *spell, bool canReflect=false)
Definition Unit.cpp:3484
uint32 SpellDamageBonusTaken(Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
Definition Unit.cpp:11835
void HandleEmoteCommand(uint32 emoteId)
Definition Unit.cpp:2012
@ SMSG_SPELLDAMAGESHIELD
Definition Opcodes.h:621
bool HasFlagsExtra(uint32 flag) const
Definition CreatureData.h:283
bool HasInArc(float arcangle, const Position *pos, float targetRadius=0.0f) const
Definition Position.cpp:141

References CalcDamageInfo::absorb, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, CalcAbsorbResist(), Player::CastItemCombatSpell(), CastSpell(), CalcDamageInfo::cleanDamage, CONFIG_ENABLE_DAZE, CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, DealDamage(), DealDamageMods(), DIRECT_DAMAGE, EMOTE_ONESHOT_PARRY_SHIELD, EMOTE_ONESHOT_WOUND_CRITICAL, DamageInfo::GetAbsorb(), GetAttackTime(), getAttackTimer(), GetAuraEffectsByType(), Creature::GetCreatureTemplate(), DamageInfo::GetDamage(), GetDefenseSkillValue(), Object::GetGUID(), Object::GetGUID(), GetHealth(), GetLevel(), SpellInfo::GetSchoolMask(), GetUnitMeleeSkill(), HandleEmoteCommand(), HasActivePowerType(), CreatureTemplate::HasFlagsExtra(), Position::HasInArc(), HasOffhandWeaponForAttack(), HasUnitState(), CalcDamageInfo::HitInfo, HITINFO_CRITICALHIT, CalcDamageInfo::hitOutCome, SpellInfo::Id, IsAlive(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsImmunedToDamageOrSchool(), Object::IsPlayer(), IsVehicle(), Creature::isWorldBoss(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_GLANCING, MELEE_HIT_NORMAL, OFF_ATTACK, POWER_RAGE, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::resist, RewardRage(), roll_chance_f(), WorldObject::SendMessageToSet(), SendSpellDamageImmune(), SendSpellMiss(), setAttackTimer(), SMSG_SPELLDAMAGESHIELD, SPELL_AURA_DAMAGE_SHIELD, SPELL_DIRECT_DAMAGE, SpellDamageBonusTaken(), SpellHitResult(), sWorld, CalcDamageInfo::target, CalcDamageInfo::TargetState, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_IN_FLIGHT, VICTIMSTATE_BLOCKS, VICTIMSTATE_DODGE, 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 
)
1451{
1452 if (damageInfo == 0)
1453 return;
1454
1455 Unit* victim = damageInfo->target;
1456
1457 if (!victim)
1458 return;
1459
1460 if (!victim->IsAlive() || victim->IsInFlight() || (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks()))
1461 return;
1462
1463 SpellInfo const* spellProto = damageInfo->spellInfo;
1464 if (!spellProto)
1465 {
1466 LOG_DEBUG("entities.unit", "Unit::DealSpellDamage has wrong damageInfo");
1467 return;
1468 }
1469
1470 // Call default DealDamage
1471 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->absorb, BASE_ATTACK, MELEE_HIT_NORMAL);
1472 Unit::DealDamage(this, victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss, false, spell);
1473}
bool IsInFlight() const
Definition Unit.h:1632
SpellInfo const * spellInfo
Definition Unit.h:497

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

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

◆ DelayOwnedAuras()

void Unit::DelayOwnedAuras ( uint32  spellId,
ObjectGuid  caster,
int32  delaytime 
)
5496{
5497 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5498 for (; range.first != range.second; ++range.first)
5499 {
5500 Aura* aura = range.first->second;
5501 if (!caster || aura->GetCasterGUID() == caster)
5502 {
5503 if (aura->GetDuration() < delaytime)
5504 aura->SetDuration(0);
5505 else
5506 aura->SetDuration(aura->GetDuration() - delaytime);
5507
5508 // update for out of range group members (on 1 slot use)
5510 LOG_DEBUG("spells.aura", "Aura {} partially interrupted on unit {}, new duration: {} ms", aura->GetId(), GetGUID().ToString(), aura->GetDuration());
5511 }
5512 }
5513}
int32 GetDuration() const
Definition SpellAuras.h:133
void SetNeedClientUpdateForTargets() const
Definition SpellAuras.cpp:1258
void SetDuration(int32 duration, bool withMods=false)
Definition SpellAuras.cpp:868
std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
Definition Unit.h:643

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

◆ DeleteCharmInfo()

void Unit::DeleteCharmInfo ( )
15857{
15858 if (!m_charmInfo)
15859 return;
15860
15862 delete m_charmInfo;
15863 m_charmInfo = nullptr;
15864}
void RestoreState()
Definition CharmInfo.cpp:46

References m_charmInfo, and CharmInfo::RestoreState().

Referenced by RemoveCharmedBy().

◆ DeMorph()

void Unit::DeMorph ( )
4383{
4385}
virtual void SetDisplayId(uint32 modelId, float displayScale=1.f)
Definition Unit.cpp:16795
uint32 GetNativeDisplayId() const
Definition Unit.h:1896

References GetNativeDisplayId(), and SetDisplayId().

Referenced by modify_commandscript::HandleMorphResetCommand().

◆ DisableRotate()

void Unit::DisableRotate ( bool  apply)
18309{
18310 if (!IsCreature())
18311 return;
18312
18313 if (apply)
18317}
@ UNIT_STATE_POSSESSED
Definition UnitDefines.h:186
void SetUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:719

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

Referenced by boss_ingvar_the_plunderer::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::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::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::UpdateAI(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ DisableSpline()

◆ Dismount()

void Unit::Dismount ( )
13569{
13570 if (!IsMounted())
13571 return;
13572
13575
13576 if (Player* thisPlayer = ToPlayer())
13577 {
13578 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13579 data << GetPackGUID();
13580 data << uint32(GameTime::GetGameTime().count()); // Packet counter
13581 data << thisPlayer->GetCollisionHeight();
13582 thisPlayer->GetSession()->SendPacket(&data);
13583 }
13584
13585 WorldPacket data(SMSG_DISMOUNT, 8);
13586 data << GetPackGUID();
13587 SendMessageToSet(&data, true);
13588
13589 // dismount as a vehicle
13590 if (IsPlayer() && GetVehicleKit())
13591 {
13592 // Send other players that we are no longer a vehicle
13593 data.Initialize(SMSG_PLAYER_VEHICLE_DATA, 8 + 4);
13594 data << GetPackGUID();
13595 data << uint32(0);
13596 ToPlayer()->SendMessageToSet(&data, true);
13597 // Remove vehicle from player
13599 }
13600
13602
13603 // only resummon old pet if the player is already added to a map
13604 // this prevents adding a pet to a not created map which would otherwise cause a crash
13605 // (it could probably happen when logging in after a previous crash)
13606 if (Player* player = ToPlayer())
13607 {
13608 sScriptMgr->AnticheatSetUnderACKmount(player);
13609
13610 if (Pet* pPet = player->GetPet())
13611 {
13612 if (pPet->HasUnitFlag(UNIT_FLAG_STUNNED) && !pPet->HasUnitState(UNIT_STATE_STUNNED))
13613 pPet->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13614 }
13615 else
13616 player->ResummonPetTemporaryUnSummonedIfAny();
13617
13618 // xinef: if we have charmed npc, remove stun also
13619 if (Unit* charm = player->GetCharm())
13620 if (charm->IsCreature() && !charm->HasUnitState(UNIT_STATE_STUNNED))
13621 charm->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13622 }
13623}
@ AURA_INTERRUPT_FLAG_NOT_MOUNTED
Definition SpellDefines.h:49
@ UNIT_FLAG_STUNNED
Definition UnitDefines.h:268
@ UNIT_FLAG_MOUNT
Definition UnitDefines.h:277
@ UNIT_FIELD_MOUNTDISPLAYID
Definition UpdateFields.h:126
void SendMessageToSet(WorldPacket const *data, bool self) const override
Definition Player.cpp:5677
void RemoveVehicleKit()
Definition Unit.cpp:18760
@ SMSG_PLAYER_VEHICLE_DATA
Definition Opcodes.h:1221
@ SMSG_MOVE_SET_COLLISION_HGT
Definition Opcodes.h:1332
@ SMSG_DISMOUNT
Definition Opcodes.h:970

References AURA_INTERRUPT_FLAG_NOT_MOUNTED, GetCharm(), GameTime::GetGameTime(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), IsMounted(), Object::IsPlayer(), RemoveAurasWithInterruptFlags(), RemoveUnitFlag(), RemoveVehicleKit(), WorldObject::SendMessageToSet(), Player::SendMessageToSet(), SetUInt32Value(), SMSG_DISMOUNT, SMSG_MOVE_SET_COLLISION_HGT, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), 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_aura::HandleEffectPeriodic(), npc_scarlet_courier::npc_scarlet_courierAI::JustEngagedWith(), boss_mandokir::boss_mandokirAI::JustEngagedWith(), boss_captain_skarloc::MovementInform(), spell_chapter5_light_of_dawn_aura::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 
)
11316{
11317 int32 gainedPower = victim->ModifyPower(powerType, damage, false);
11318
11319 if (powerType != POWER_HAPPINESS && gainedPower)
11320 {
11321 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID);
11322 victim->getHostileRefMgr().threatAssist(this, float(gainedPower) * 0.5f, spellInfo);
11323 }
11324
11325 SendEnergizeSpellLog(victim, spellID, damage, powerType);
11326}
@ 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:11304

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 
)
19673{
19675
19676 if (Player* player = ToPlayer())
19677 {
19678 sScriptMgr->AnticheatSetUnderACKmount(player);
19679 }
19680}
@ TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE
Will ignore caster aura states including combat requirements and death state.
Definition SpellDefines.h:146
@ VEHICLE_SPELL_RIDE_HARDCODED
Definition VehicleDefines.h:52

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 ( )
20546{
20548 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20549 return;
20550
20551 Acore::AIRelocationNotifier notifier(*this);
20552 float radius = 60.0f;
20553 Cell::VisitAllObjects(this, notifier, radius);
20554}
@ NOTIFY_AI_RELOCATION
Definition Object.h:68
void RemoveFromNotify(uint16 f)
Definition Object.h:574
Definition GridNotifiers.h:91
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:185

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

Referenced by Update().

◆ ExecuteDelayedUnitRelocationEvent()

void Unit::ExecuteDelayedUnitRelocationEvent ( )
20437{
20439 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20440 return;
20441
20442 if (this->HasSharedVision())
20443 for (SharedVisionList::const_iterator itr = this->GetSharedVisionList().begin(); itr != this->GetSharedVisionList().end(); ++itr)
20444 if (Player* player = (*itr))
20445 {
20446 if (player->IsOnVehicle(this) || !player->IsInWorld() || player->IsDuringRemoveFromWorld()) // players on vehicles have their own event executed (due to passenger relocation)
20447 continue;
20448 WorldObject* viewPoint = player;
20449 if (player->m_seer && player->m_seer->IsInWorld())
20450 viewPoint = player->m_seer;
20451 if (!viewPoint->IsPositionValid() || !player->IsPositionValid())
20452 continue;
20453
20454 if (Unit* active = viewPoint->ToUnit())
20455 {
20456 //if (active->IsVehicle()) // always check original unit here, last notify position is not relocated
20457 // active = player;
20458
20459 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20460 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20461 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20462 float distsq = dx * dx + dy * dy + dz * dz;
20463 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20464 if (distsq < mindistsq)
20465 continue;
20466
20467 // this will be relocated below sharedvision!
20468 //active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20469 }
20470
20471 Acore::PlayerRelocationNotifier relocateNoLarge(*player, false); // visit only objects which are not large; default distance
20472 Cell::VisitAllObjects(viewPoint, relocateNoLarge, player->GetSightRange() + VISIBILITY_INC_FOR_GOBJECTS);
20473 relocateNoLarge.SendToSelf();
20474 Acore::PlayerRelocationNotifier relocateLarge(*player, true); // visit only large objects; maximum distance
20475 Cell::VisitAllObjects(viewPoint, relocateLarge, MAX_VISIBILITY_DISTANCE);
20476 relocateLarge.SendToSelf();
20477 }
20478
20479 if (Player* player = this->ToPlayer())
20480 {
20481 WorldObject* viewPoint = player;
20482 if (player->m_seer && player->m_seer->IsInWorld())
20483 viewPoint = player->m_seer;
20484
20485 if (viewPoint->GetMapId() != player->GetMapId() || !viewPoint->IsPositionValid() || !player->IsPositionValid())
20486 return;
20487
20488 if (Unit* active = viewPoint->ToUnit())
20489 {
20490 if (active->IsVehicle())
20491 active = player;
20492
20493 if (!player->GetFarSightDistance())
20494 {
20495 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20496 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20497 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20498 float distsq = dx * dx + dy * dy + dz * dz;
20499
20500 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20501 if (distsq < mindistsq)
20502 return;
20503
20504 active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20505 }
20506 }
20507
20509
20510 Acore::PlayerRelocationNotifier relocateNoLarge(*player, false); // visit only objects which are not large; default distance
20511 Cell::VisitAllObjects(viewPoint, relocateNoLarge, player->GetSightRange() + VISIBILITY_INC_FOR_GOBJECTS);
20512 relocateNoLarge.SendToSelf();
20513
20514 if (!player->GetFarSightDistance())
20515 {
20516 Acore::PlayerRelocationNotifier relocateLarge(*player, true); // visit only large objects; maximum distance
20517 Cell::VisitAllObjects(viewPoint, relocateLarge, MAX_VISIBILITY_DISTANCE);
20518 relocateLarge.SendToSelf();
20519 }
20520
20522 }
20523 else if (Creature* unit = this->ToCreature())
20524 {
20525 if (!unit->IsPositionValid())
20526 return;
20527
20528 float dx = unit->m_last_notify_position.GetPositionX() - unit->GetPositionX();
20529 float dy = unit->m_last_notify_position.GetPositionY() - unit->GetPositionY();
20530 float dz = unit->m_last_notify_position.GetPositionZ() - unit->GetPositionZ();
20531 float distsq = dx * dx + dy * dy + dz * dz;
20532 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(unit->FindMap()->GetEntry()->map_type);
20533 if (distsq < mindistsq)
20534 return;
20535
20536 unit->m_last_notify_position.Relocate(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ());
20537
20538 Acore::CreatureRelocationNotifier relocate(*unit);
20539 Cell::VisitAllObjects(unit, relocate, unit->GetVisibilityRange() + VISIBILITY_COMPENSATION);
20540
20542 }
20543}
#define MAX_VISIBILITY_DISTANCE
Definition ObjectDefines.h:31
#define VISIBILITY_INC_FOR_GOBJECTS
Definition ObjectDefines.h:28
#define VISIBILITY_COMPENSATION
Definition ObjectDefines.h:26
@ NOTIFY_VISIBILITY_CHANGED
Definition Object.h:69
static float GetReqMoveDistSq(uint32 map_type)
Definition DynamicVisibility.h:53
void LoadGridsInRange(Position const &center, float radius)
Definition Map.cpp:313
Unit * ToUnit()
Definition Object.h:210
SharedVisionList const & GetSharedVisionList()
Definition Unit.h:1797
bool HasSharedVision() const
Definition Unit.h:1800
uint32 GetMapId() const
Definition Position.h:280
void AddToNotify(uint16 f)
Definition Object.cpp:2989
Definition GridNotifiers.h:83
Definition GridNotifiers.h:75
bool IsPositionValid() const
Definition Position.cpp:176

References WorldObject::AddToNotify(), WorldObject::GetMap(), WorldLocation::GetMapId(), Position::GetPositionX(), DynamicVisibilityMgr::GetReqMoveDistSq(), GetSharedVisionList(), HasSharedVision(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Position::IsPositionValid(), Map::LoadGridsInRange(), 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)

19769{
19771 if (!m_vehicle)
19772 return;
19773
19775 if (Player* player = ToPlayer())
19776 {
19777 player->SetCanTeleport(true);
19778 }
19782 /*_ExitVehicle(exitPosition);*/
19789
19790 if (Player* player = ToPlayer())
19791 {
19792 sScriptMgr->AnticheatSetUnderACKmount(player);
19793 }
19794}
Unit * GetVehicleBase() const
Definition Unit.cpp:18775

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

Referenced by _EnterVehicle(), Player::ActivateTaxiPathTo(), MotionTransport::DelayedTeleportTransport(), 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::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_ulduar_squeezed_lifeless::HandleInstaKill(), WorldSession::HandleRequestVehicleExit(), spell_vehicle_throw_passenger::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 
)
4121{
4122 Spell* spell = m_currentSpells[spellType];
4123 if (!spell)
4124 return;
4125
4126 if (spellType == CURRENT_CHANNELED_SPELL)
4127 spell->SendChannelUpdate(0);
4128
4129 spell->finish(ok);
4130}
void SendChannelUpdate(uint32 time)
Definition Spell.cpp:5207

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
10670{
10671 if (!GetCharmerOrOwnerGUID())
10672 return const_cast<Unit*>(this)->ToPlayer();
10673
10674 if (Unit* owner = GetCharmerOrOwner())
10676
10677 return nullptr;
10678}
Unit * GetCharmerOrOwner() const
Definition Unit.h:1227
ObjectGuid GetCharmerOrOwnerGUID() const
Definition Unit.h:1236

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

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

◆ GetAI()

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

References i_AI.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), spell_algalon_big_bang::CheckTargets(), DealDamage(), DealHeal(), spell_send_mug_target_picker::FilterTargets(), spell_blood_queen_bloodbolt::FilterTargets(), spell_kologarn_focused_eyebeam::FilterTargetsInitial(), npc_dream_fog::npc_dream_fogAI::GetRandomUnitFromDragonThreatList(), BattlegroundIC::HandleCapturedNodes(), spell_send_mug_target_picker::HandleDummy(), spell_magtheridon_shadow_grasp_visual::HandleDummyApply(), spell_mount_check_aura::HandleEffectPeriodic(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_random_aggro::HandleOnHit(), spell_kiljaeden_armageddon_periodic_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_ayamiss_swarmer_start_loop::HandleScript(), spell_pursue::HandleScript(), spell_xt002_gravity_bomb_damage::HandleScript(), spell_the_lich_king_quake::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::OnPeriodic(), spell_marrowgar_coldflame::SelectTarget(), and boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::SpellHit().

◆ GetAllMinionsByEntry()

void Unit::GetAllMinionsByEntry ( std::list< Creature * > &  Minions,
uint32  entry 
)
10896{
10897 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
10898 {
10899 Unit* unit = *itr;
10900 ++itr;
10901 if (unit->GetEntry() == entry && unit->IsCreature()
10902 && unit->ToCreature()->IsSummon()) // minion, actually
10903 Minions.push_back(unit->ToCreature());
10904 }
10905}
bool IsSummon() const
Definition Unit.h:760

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

Referenced by spell_item_gift_of_the_harvester::CheckRequirement().

◆ GetAPMultiplier()

float Unit::GetAPMultiplier ( WeaponAttackType  attType,
bool  normalized 
)
17252{
17253 if (!normalized || !IsPlayer())
17254 return float(GetAttackTime(attType)) / 1000.0f;
17255
17256 Item* Weapon = ToPlayer()->GetWeaponForAttack(attType, true);
17257 if (!Weapon)
17258 return 2.4f; // fist attack
17259
17260 switch (Weapon->GetTemplate()->InventoryType)
17261 {
17262 case INVTYPE_2HWEAPON:
17263 return 3.3f;
17264 case INVTYPE_RANGED:
17266 case INVTYPE_THROWN:
17267 return 2.8f;
17268 case INVTYPE_WEAPON:
17271 default:
17272 return Weapon->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER ? 1.7f : 2.4f;
17273 }
17274}
@ ITEM_SUBCLASS_WEAPON_DAGGER
Definition ItemTemplate.h:359
@ INVTYPE_RANGED
Definition ItemTemplate.h:271
@ INVTYPE_THROWN
Definition ItemTemplate.h:281
@ INVTYPE_RANGEDRIGHT
Definition ItemTemplate.h:282
@ INVTYPE_WEAPON
Definition ItemTemplate.h:269
@ INVTYPE_WEAPONMAINHAND
Definition ItemTemplate.h:277
@ INVTYPE_WEAPONOFFHAND
Definition ItemTemplate.h:278
@ INVTYPE_2HWEAPON
Definition ItemTemplate.h:273
Weapon
Definition boss_arlokk.cpp:76
Definition Item.h:220
ItemTemplate const * GetTemplate() const
Definition Item.cpp:544
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
Definition PlayerStorage.cpp:488
uint32 SubClass
Definition ItemTemplate.h:622

References GetAttackTime(), Item::GetTemplate(), Player::GetWeaponForAttack(), INVTYPE_2HWEAPON, INVTYPE_RANGED, INVTYPE_RANGEDRIGHT, INVTYPE_THROWN, INVTYPE_WEAPON, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, Object::IsPlayer(), ITEM_SUBCLASS_WEAPON_DAGGER, ItemTemplate::SubClass, and Object::ToPlayer().

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

◆ GetAppliedAuras() [1/2]

◆ GetAppliedAuras() [2/2]

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

References m_appliedAuras.

◆ GetArmor()

◆ getAttackerForHelper()

Unit * Unit::getAttackerForHelper ( ) const
742{
743 if (GetVictim() != nullptr)
744 return GetVictim();
745
746 if (!IsEngaged())
747 return nullptr;
748
749 if (!m_attackers.empty())
750 return *(m_attackers.begin());
751
752 return nullptr;
753}
bool IsEngaged() const
Definition Unit.h:890
Unit * GetVictim() const
Definition Unit.h:862

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

Referenced by Creature::_IsTargetAcceptable(), 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
5615{
5616 AuraApplication* aurApp = GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask);
5617 return aurApp ? aurApp->GetBase() : nullptr;
5618}
AuraApplication * GetAuraApplication(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition Unit.cpp:5595

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(), misc_commandscript::HandleAuraStacksCommand(), deserter_commandscript::HandleDeserterAdd(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_charge_shield_bomber::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), HandleDummyAuraProc(), spell_yogg_saron_sanity_well_aura::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_sindragosa_frost_breath::HandleInfusion(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_putricide_unstable_experiment::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_pal_seal_of_vengeance::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(), boss_high_nethermancer_zerevor::JustEngagedWith(), npc_brew_bubble::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), spell_summoning_rhyme_aura::PeriodicTick(), Player::ProcessDelayedOperations(), BattlefieldWG::PromotePlayer(), RemoveAurasDueToSpellBySteal(), Player::ResurrectPlayer(), SetAuraStack(), boss_anomalus::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
5596{
5597 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5598 for (; range.first != range.second; ++range.first)
5599 {
5600 AuraApplication* app = range.first->second;
5601 Aura const* aura = app->GetBase();
5602
5603 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
5604 && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5605 && (!itemCasterGUID || aura->GetCastItemGUID() == itemCasterGUID)
5606 && (!except || except != app))
5607 {
5608 return app;
5609 }
5610 }
5611 return nullptr;
5612}
uint8 GetEffectMask() const
Definition SpellAuras.h:176
ObjectGuid GetCastItemGUID() const
Definition SpellAuras.h:103
std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
Definition Unit.h:646

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
5621{
5622 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5623 while (rankSpell)
5624 {
5625 if (AuraApplication* aurApp = GetAuraApplication(rankSpell, casterGUID, itemCasterGUID, reqEffMask, except))
5626 return aurApp;
5627 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5628 }
5629 return nullptr;
5630}

References GetAuraApplication(), and sSpellMgr.

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

◆ GetAuraCount()

uint32 Unit::GetAuraCount ( uint32  spellId) const
5716{
5717 uint32 count = 0;
5718 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5719
5720 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5721 {
5722 if (itr->second->GetBase()->GetStackAmount() == 0)
5723 ++count;
5724 else
5725 count += (uint32)itr->second->GetBase()->GetStackAmount();
5726 }
5727
5728 return count;
5729}

References m_appliedAuras.

Referenced by npc_brew_bubble::MoveInLineOfSight(), spell_valithria_suppression_aura::OnApply(), achievement_consumption_junction::OnCheck(), achievement_assembly_of_iron::OnCheck(), achievement_cant_do_that_while_stunned::OnCheck(), spell_valithria_suppression_aura::OnRemove(), SmartScript::ProcessEvent(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), spell_black_temple_spell_absorption_aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ GetAuraEffect() [1/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5568{
5569 AuraEffectList const& auras = GetAuraEffectsByType(type);
5570 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5571 {
5572 SpellInfo const* spell = (*i)->GetSpellInfo();
5573 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5574 {
5575 if (casterGUID && (*i)->GetCasterGUID() != casterGUID)
5576 continue;
5577 return (*i);
5578 }
5579 }
5580 return nullptr;
5581}
flag96 SpellFamilyFlags
Definition SpellInfo.h:388
uint32 SpellFamilyName
Definition SpellInfo.h:387
bool HasFlag(uint32 p1=0, uint32 p2=0, uint32 p3=0) const
Definition Util.h:468

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

◆ GetAuraEffect() [2/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  name,
uint32  iconId,
uint8  effIndex 
) const
5554{
5555 AuraEffectList const& auras = GetAuraEffectsByType(type);
5556 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5557 {
5558 if (effIndex != (*itr)->GetEffIndex())
5559 continue;
5560 SpellInfo const* spell = (*itr)->GetSpellInfo();
5561 if (spell->SpellIconID == iconId && spell->SpellFamilyName == name)
5562 return *itr;
5563 }
5564 return nullptr;
5565}
uint32 SpellIconID
Definition SpellInfo.h:380

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

◆ GetAuraEffect() [3/3]

AuraEffect * Unit::GetAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5528{
5529 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5530 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5531 {
5532 if (itr->second->HasEffect(effIndex)
5533 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5534 {
5535 return itr->second->GetBase()->GetEffect(effIndex);
5536 }
5537 }
5538 return nullptr;
5539}

References AuraEffect::GetBase(), Aura::GetEffect(), and 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(), 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
5584{
5586 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5587 {
5588 if ((*itr)->GetId() == spellid)
5589 return *itr;
5590 }
5591
5592 return nullptr;
5593}
@ 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
5542{
5543 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5544 while (rankSpell)
5545 {
5546 if (AuraEffect* aurEff = GetAuraEffect(rankSpell, effIndex, caster))
5547 return aurEff;
5548 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5549 }
5550 return nullptr;
5551}
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:5527

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
1365{ return m_modAuras[type]; }

References m_modAuras.

Referenced by Player::_ApplyWeaponDependentAuraMods(), Spell::_cast(), AuraApplication::_HandleEffect(), KillRewarder::_RewardXP(), CalcAbsorbResist(), CalcArmorReducedDamage(), CalcHealAbsorb(), AuraEffect::CalculateAmount(), Player::CalculateQuestRewardXP(), Spell::CheckCast(), Spell::CheckCasterAuras(), DealDamage(), DealMeleeDamage(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), RedirectSpellEvent::Execute(), spell_dk_wandering_plague::FilterTargets(), GetAuraEffect(), 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(), modify_commandscript::HandleMorphMountCommand(), AuraEffect::HandleNoReagentUseAura(), spell_warr_heroic_strike::HandleOnHit(), spell_illidari_council_judgement::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(), Spell::SelectImplicitAreaTargets(), Spell::SelectImplicitConeTargets(), PetAI::SelectNextTarget(), Creature::SelectVictim(), Player::SendInitialPacketsAfterAddToMap(), SetControlled(), Player::SetEntryPoint(), Player::SetSkill(), SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SpellBaseHealingBonusDone(), SpellBaseHealingBonusTaken(), SpellDamageBonusDone(), SpellDamageBonusTaken(), SpellHealingBonusDone(), SpellHealingBonusTaken(), SpellHitResult(), 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
5633{
5634 AuraApplication* aurApp = GetAuraApplicationOfRankedSpell(spellId, casterGUID, itemCasterGUID, reqEffMask);
5635 return aurApp ? aurApp->GetBase() : nullptr;
5636}
AuraApplication * GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition Unit.cpp:5620

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

Referenced by Aura::HandleAuraSpecificMods().

◆ GetCastingTimeForBonus()

uint32 Unit::GetCastingTimeForBonus ( SpellInfo const *  spellProto,
DamageEffectType  damagetype,
uint32  CastingTime 
) const
17112{
17113 // Not apply this to creature casted spells with casttime == 0
17114 if (CastingTime == 0 && IsCreature() && !IsPet())
17115 return 3500;
17116
17117 if (CastingTime > 7000) CastingTime = 7000;
17118 if (CastingTime < 1500) CastingTime = 1500;
17119
17120 if (damagetype == DOT && !spellProto->IsChanneled())
17121 CastingTime = 3500;
17122
17123 int32 overTime = 0;
17124 uint8 effects = 0;
17125 bool DirectDamage = false;
17126 bool AreaEffect = false;
17127
17128 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; i++)
17129 {
17130 switch (spellProto->Effects[i].Effect)
17131 {
17137 case SPELL_EFFECT_HEAL:
17138 DirectDamage = true;
17139 break;
17141 switch (spellProto->Effects[i].ApplyAuraName)
17142 {
17146 if (spellProto->GetDuration())
17147 overTime = spellProto->GetDuration();
17148 break;
17149 default:
17150 // -5% per additional effect
17151 ++effects;
17152 break;
17153 }
17154 default:
17155 break;
17156 }
17157
17158 if (spellProto->Effects[i].IsTargetingArea())
17159 AreaEffect = true;
17160 }
17161
17162 // Combined Spells with Both Over Time and Direct Damage
17163 if (overTime > 0 && DirectDamage)
17164 {
17165 // mainly for DoTs which are 3500 here otherwise
17166 uint32 OriginalCastTime = spellProto->CalcCastTime();
17167 if (OriginalCastTime > 7000) OriginalCastTime = 7000;
17168 if (OriginalCastTime < 1500) OriginalCastTime = 1500;
17169 // Portion to Over Time
17170 float PtOT = (overTime / 15000.0f) / ((overTime / 15000.0f) + (OriginalCastTime / 3500.0f));
17171
17172 if (damagetype == DOT)
17173 CastingTime = uint32(CastingTime * PtOT);
17174 else if (PtOT < 1.0f)
17175 CastingTime = uint32(CastingTime * (1 - PtOT));
17176 else
17177 CastingTime = 0;
17178 }
17179
17180 // Area Effect Spells receive only half of bonus
17181 if (AreaEffect)
17182 CastingTime /= 2;
17183
17184 // 50% for damage and healing spells for leech spells from damage bonus and 0% from healing
17185 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
17186 {
17187 if (spellProto->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH ||
17188 (spellProto->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && spellProto->Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_LEECH))
17189 {
17190 CastingTime /= 2;
17191 break;
17192 }
17193 }
17194
17195 // -5% of total per any additional effect
17196 for (uint8 i = 0; i < effects; ++i)
17197 CastingTime *= 0.95f;
17198
17199 return CastingTime;
17200}
@ 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
@ SPELL_AURA_PERIODIC_DAMAGE
Definition SpellAuraDefines.h:66
@ SPELL_AURA_PERIODIC_HEAL
Definition SpellAuraDefines.h:71
@ SPELL_AURA_PERIODIC_LEECH
Definition SpellAuraDefines.h:116

References SpellInfo::CalcCastTime(), DOT, SpellInfo::Effects, SpellInfo::GetDuration(), SpellInfo::IsChanneled(), Object::IsCreature(), 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, and SPELL_EFFECT_SCHOOL_DAMAGE.

Referenced by CalculateDefaultCoefficient().

◆ GetCharm()

Unit * Unit::GetCharm ( ) const
10716{
10717 if (ObjectGuid charm_guid = GetCharmGUID())
10718 {
10719 if (Unit* pet = ObjectAccessor::GetUnit(*this, charm_guid))
10720 return pet;
10721
10722 LOG_ERROR("entities.unit", "Unit::GetCharm: Charmed creature {} not exist.", charm_guid.ToString());
10724 }
10725
10726 return nullptr;
10727}
@ UNIT_FIELD_CHARM
Definition UpdateFields.h:86
void SetGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:723
ObjectGuid GetCharmGUID() const
Definition Unit.h:692
Unit * GetUnit(WorldObject const &, ObjectGuid const guid)
Definition ObjectAccessor.cpp:199

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
1229 {
1230 if (Unit* u = GetCharmerOrOwner())
1231 return u;
1232
1233 return (Unit*)this;
1234 }

References GetCharmerOrOwner().

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

◆ GetCharmerOrOwnerPlayerOrPlayerItself()

Player * Unit::GetCharmerOrOwnerPlayerOrPlayerItself ( ) const
10661{
10663 if (guid.IsPlayer())
10664 return ObjectAccessor::GetPlayer(*this, guid);
10665
10666 return const_cast<Unit*>(this)->ToPlayer();
10667}
Player * GetPlayer(Map const *, ObjectGuid const guid)
Definition ObjectAccessor.cpp:220

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::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::HandleHealPct(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::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_amanishi_lookout::MoveInLineOfSight(), npc_eagle_trash_aggro_trigger::MoveInLineOfSight(), 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
809{ 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::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), ArenaTeam::AddMember(), SpellEffectInfo::CalcValue(), spell_class_call_handler::FilterTargets(), getClassMask(), GetDebugInfo(), Player::GetDodgeFromAgility(), SocialMgr::GetFriendInfo(), Player::GetMeleeCritFromAgility(), Player::GetMissPercentageFromDefence(), Player::GetPlayerName(), Player::GetRatingMultiplier(), Player::GetSpec(), Player::GetSpellCritFromIntellect(), Player::GetStartPosition(), Player::GiveLevel(), spell_item_flask_of_the_north::HandleDummy(), HandleDummyAuraProc(), learn_commandscript::HandleLearnAllMySpellsCommand(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), HandleProcTriggerSpell(), ArenaSpectator::HandleResetCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDataForForm(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Player::IsClass(), IsClass(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), ClassCallSelector::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), Player::RewardHonor(), Guild::Member::SetStats(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Player::StoreNewItemInBestSlots(), Player::UpdateDodgePercentage(), Player::UpdateParryPercentage(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getClassMask()

◆ GetCollisionHeight()

float Unit::GetCollisionHeight ( ) const
overridevirtual

Return collision height sent to client.

Reimplemented from WorldObject.

21138{
21139 float scaleMod = GetObjectScale(); // 99% sure about this
21140 float defaultHeight = DEFAULT_COLLISION_HEIGHT * scaleMod;
21141
21142 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
21143 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
21144 float collisionHeight = 0.0f;
21145
21146 if (IsMounted())
21147 {
21149 {
21150 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
21151 {
21152 collisionHeight = scaleMod * (mountModelData->MountHeight + modelData->CollisionHeight * modelData->Scale * displayInfo->scale * 0.5f);
21153 }
21154 }
21155 }
21156 else
21157 collisionHeight = scaleMod * modelData->CollisionHeight * modelData->Scale * displayInfo->scale;
21158
21159 return collisionHeight == 0.0f ? defaultHeight : collisionHeight;
21160}
DBCStorage< CreatureDisplayInfoEntry > sCreatureDisplayInfoStore(CreatureDisplayInfofmt)
DBCStorage< CreatureModelDataEntry > sCreatureModelDataStore(CreatureModelDatafmt)
#define DEFAULT_COLLISION_HEIGHT
Definition ObjectDefines.h:50
float GetObjectScale() const
Definition Object.h:119
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:779
float CollisionHeight
Definition DBCStructure.h:790

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.

21132{
21133 return GetCollisionWidth() / 2;
21134}
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:21094

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.

21095{
21096 if (IsPlayer())
21097 return GetObjectSize();
21098
21099 float scaleMod = GetObjectScale(); // 99% sure about this
21100 float objectSize = GetObjectSize();
21101 float defaultSize = DEFAULT_WORLD_OBJECT_SIZE * scaleMod;
21102
21104 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
21105 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
21106
21107 if (IsMounted())
21108 {
21110 {
21111 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
21112 {
21113 if (G3D::fuzzyGt(mountModelData->CollisionWidth, modelData->CollisionWidth))
21114 modelData = mountModelData;
21115 }
21116 }
21117 }
21118
21119 float collisionWidth = scaleMod * modelData->CollisionWidth * modelData->Scale * displayInfo->scale * 2;
21120 // 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
21121 return G3D::fuzzyGt(collisionWidth, 0.0f) && (G3D::fuzzyEq(objectSize,defaultSize) || IsMounted()) ? collisionWidth : objectSize;
21122}
#define DEFAULT_WORLD_OBJECT_SIZE
Definition ObjectDefines.h:45
float GetObjectSize() const
Definition Object.cpp:2784
float CollisionWidth
Definition DBCStructure.h:789

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

Referenced by GetCollisionRadius().

◆ GetCombatRatingDamageReduction()

uint32 Unit::GetCombatRatingDamageReduction ( CombatRating  cr,
float  rate,
float  cap,
uint32  damage 
) const
private
19228{
19229 float percent = std::min(GetCombatRatingReduction(cr) * rate, cap);
19230 return CalculatePct(damage, percent);
19231}
float GetCombatRatingReduction(CombatRating cr) const
Definition Unit.cpp:19215

References CalculatePct(), and GetCombatRatingReduction().

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

◆ GetCombatRatingReduction()

float Unit::GetCombatRatingReduction ( CombatRating  cr) const
private
19216{
19217 if (Player const* player = ToPlayer())
19218 return player->GetRatingBonusValue(cr);
19219 // Player's pet get resilience from owner
19220 else if (IsPet() && GetOwner())
19221 if (Player* owner = GetOwner()->ToPlayer())
19222 return owner->GetRatingBonusValue(cr);
19223
19224 return 0.0f;
19225}

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

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

◆ GetCombatReach()

◆ GetCombatTimer()

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

References m_CombatTimer.

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

◆ GetComboPoints() [1/2]

uint8 Unit::GetComboPoints ( ObjectGuid const &  guid) const
inline
968{ 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

◆ GetComboTarget()

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

References m_comboTarget.

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

◆ GetComboTargetGUID()

ObjectGuid const Unit::GetComboTargetGUID ( ) const
inline

◆ GetCompanionPet()

Creature * Unit::GetCompanionPet ( ) const
10711{
10713}
#define SUMMON_SLOT_MINIPET
Definition Unit.h:605
Creature * GetCreature(WorldObject const &u, ObjectGuid const guid)
Definition ObjectAccessor.cpp:210

References ObjectAccessor::GetCreature(), m_SummonSlot, and SUMMON_SLOT_MINIPET.

Referenced by HandleProcTriggerSpell().

◆ GetCreateHealth()

◆ GetCreateMana()

◆ GetCreatePowers()

uint32 Unit::GetCreatePowers ( Powers  power) const
15698{
15699 // Only hunter pets have POWER_FOCUS and POWER_HAPPINESS
15700 switch (power)
15701 {
15702 case POWER_MANA:
15703 return GetCreateMana();
15704 case POWER_RAGE:
15705 return 1000;
15706 case POWER_FOCUS:
15707 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 100);
15708 case POWER_ENERGY:
15709 return 100;
15710 case POWER_HAPPINESS:
15711 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 1050000);
15712 case POWER_RUNIC_POWER:
15713 return 1000;
15714 case POWER_RUNE:
15715 return 0;
15716 case POWER_HEALTH:
15717 return 0;
15718 default:
15719 break;
15720 }
15721
15722 return 0;
15723}
@ 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:1086

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

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
15234{
15235 if (IsPlayer())
15236 {
15238 SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(form);
15239 if (ssEntry && ssEntry->creatureType > 0)
15240 return ssEntry->creatureType;
15241 else
15243 }
15244 else
15245 return ToCreature()->GetCreatureTemplate()->type;
15246}
DBCStorage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore(SpellShapeshiftFormEntryfmt)
@ CREATURE_TYPE_HUMANOID
Definition SharedDefines.h:2634
ShapeshiftForm
Definition UnitDefines.h:68
ShapeshiftForm GetShapeshiftForm() const
Definition Unit.h:1877
uint32 type
Definition CreatureData.h:222
Definition DBCStructure.h:1818
int32 creatureType
Definition DBCStructure.h:1824

References CREATURE_TYPE_HUMANOID, SpellShapeshiftFormEntry::creatureType, Creature::GetCreatureTemplate(), GetShapeshiftForm(), Object::IsPlayer(), sSpellShapeshiftFormStore, Object::ToCreature(), and CreatureTemplate::type.

Referenced by Creature::CanStartAttack(), spell_utgarde_pinnacle_beast_mark::CheckProc(), Spell::EffectKnockBack(), 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
795 {
796 uint32 creatureType = GetCreatureType();
797 return (creatureType >= 1) ? (1 << (creatureType - 1)) : 0;
798 }
uint32 GetCreatureType() const
Definition Unit.cpp:15233

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
1510{ return m_currentSpells[spellType]; }

References m_currentSpells.

◆ GetCurrentSpellCastTime()

int32 Unit::GetCurrentSpellCastTime ( uint32  spell_id) const
4186{
4187 if (Spell const* spell = FindCurrentSpellBySpellId(spell_id))
4188 return spell->GetCastTime();
4189 return 0;
4190}
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition Unit.cpp:4177

References FindCurrentSpellBySpellId(), and Spell::GetCastTime().

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

◆ getDeathState()

◆ GetDebugInfo()

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

Reimplemented from Object.

21368{
21369 std::stringstream sstr;
21370 sstr << WorldObject::GetDebugInfo() << "\n"
21371 << std::boolalpha
21372 << "AliveState: " << IsAlive()
21373 << " UnitMovementFlags: " << GetUnitMovementFlags() << " ExtraUnitMovementFlags: " << GetExtraUnitMovementFlags()
21374 << " Class: " << std::to_string(getClass());
21375 return sstr.str();
21376}
std::string GetDebugInfo() const override
Definition Object.cpp:2497

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.

16679{
16680 return IDLE_MOTION_TYPE;
16681}
@ IDLE_MOTION_TYPE
Definition MotionMaster.h:39

References IDLE_MOTION_TYPE.

◆ GetDefenseSkillValue()

uint32 Unit::GetDefenseSkillValue ( Unit const *  target = nullptr) const
3640{
3641 if (IsPlayer())
3642 {
3643 // in PvP use full skill instead current skill value
3644 uint32 value = (target && target->IsPlayer())
3647 value += uint32(ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL));
3648 return value;
3649 }
3650 else
3651 return GetUnitMeleeSkill(target);
3652}
@ SKILL_DEFENSE
Definition SharedDefines.h:2881
@ CR_DEFENSE_SKILL
Definition Unit.h:218
uint16 GetSkillValue(uint32 skill) const
Definition Player.cpp:5458
uint16 GetMaxSkillValue(uint32 skill) const
Definition Player.cpp:5475

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

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

◆ GetDiminishing()

DiminishingLevels Unit::GetDiminishing ( DiminishingGroup  group)
15059{
15060 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15061 {
15062 if (i->DRGroup != group)
15063 continue;
15064
15065 if (!i->hitCount)
15066 return DIMINISHING_LEVEL_1;
15067
15068 if (!i->hitTime)
15069 return DIMINISHING_LEVEL_1;
15070
15071 // If last spell was casted more than 15 seconds ago - reset the count.
15072 if (i->stack == 0 && getMSTimeDiff(i->hitTime, GameTime::GetGameTimeMS().count()) > 15000)
15073 {
15074 i->hitCount = DIMINISHING_LEVEL_1;
15075 return DIMINISHING_LEVEL_1;
15076 }
15077 // or else increase the count.
15078 else
15079 return DiminishingLevels(i->hitCount);
15080 }
15081 return DIMINISHING_LEVEL_1;
15082}
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

◆ GetDiseasesByCaster()

uint32 Unit::GetDiseasesByCaster ( ObjectGuid  casterGUID,
uint8  mode = 0 
)
5878{
5879 static const AuraType diseaseAuraTypes[] =
5880 {
5881 SPELL_AURA_PERIODIC_DAMAGE, // Frost Fever and Blood Plague
5882 SPELL_AURA_LINKED, // Crypt Fever and Ebon Plague
5884 };
5885
5886 ObjectGuid drwGUID;
5887
5888 if (Player* playerCaster = ObjectAccessor::GetPlayer(*this, casterGUID))
5889 drwGUID = playerCaster->getRuneWeaponGUID();
5890
5891 uint32 diseases = 0;
5892 for (uint8 index = 0; diseaseAuraTypes[index] != SPELL_AURA_NONE; ++index)
5893 {
5894 for (AuraEffectList::iterator i = m_modAuras[diseaseAuraTypes[index]].begin(); i != m_modAuras[diseaseAuraTypes[index]].end();)
5895 {
5896 // Get auras with disease dispel type by caster
5897 if ((*i)->GetSpellInfo()->Dispel == DISPEL_DISEASE
5898 && ((*i)->GetCasterGUID() == casterGUID || (*i)->GetCasterGUID() == drwGUID)) // if its caster or his dancing rune weapon
5899 {
5900 ++diseases;
5901
5902 if (mode == 1)
5903 {
5904 RemoveAura((*i)->GetId(), (*i)->GetCasterGUID());
5905 i = m_modAuras[diseaseAuraTypes[index]].begin();
5906 continue;
5907 }
5908 // used for glyph of scourge strike
5909 else if (mode == 2)
5910 {
5911 Aura* aura = (*i)->GetBase();
5912 if (aura && !aura->IsRemoved() && aura->GetDuration() > 0)
5913 if ((aura->GetApplyTime() + aura->GetMaxDuration() / 1000 + 8) > (GameTime::GetGameTime().count() + aura->GetDuration() / 1000))
5914 aura->SetDuration(aura->GetDuration() + 3000);
5915 }
5916 }
5917 ++i;
5918 }
5919 }
5920 return diseases;
5921}
@ DISPEL_DISEASE
Definition SharedDefines.h:1375
AuraType
Definition SpellAuraDefines.h:62
@ SPELL_AURA_LINKED
Definition SpellAuraDefines.h:347
@ SPELL_AURA_NONE
Definition SpellAuraDefines.h:63
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 
)
5639{
5640 // we should not be able to dispel diseases if the target is affected by unholy blight
5641 if (dispelMask & (1 << DISPEL_DISEASE) && HasAura(50536))
5642 dispelMask &= ~(1 << DISPEL_DISEASE);
5643
5644 ReputationRank rank = GetReactionTo(caster, IsCharmed());
5645 bool positive = rank >= REP_FRIENDLY;
5646
5647 // Neutral unit not at war with caster should be treated as a friendly unit
5648 if (rank == REP_NEUTRAL)
5649 {
5650 if (Player* casterPlayer = caster->GetAffectingPlayer())
5651 {
5652 if (FactionTemplateEntry const* factionTemplateEntry = GetFactionTemplateEntry())
5653 {
5654 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
5655 {
5656 if (factionEntry->CanBeSetAtWar())
5657 {
5658 positive = !casterPlayer->GetReputationMgr().IsAtWar(factionEntry);
5659 }
5660 }
5661 }
5662 }
5663 }
5664
5665 Unit::VisibleAuraMap const* visibleAuras = GetVisibleAuras();
5666 for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
5667 {
5668 Aura* aura = itr->second->GetBase();
5669
5670 // don't try to remove passive auras
5671 if (aura->IsPassive())
5672 continue;
5673
5674 if (aura->GetSpellInfo()->GetDispelMask() & dispelMask)
5675 {
5676 if (aura->GetSpellInfo()->Dispel == DISPEL_MAGIC)
5677 {
5678 // do not remove positive auras if friendly target
5679 // negative auras if non-friendly target
5680 if (itr->second->IsPositive() == positive)
5681 continue;
5682 }
5683
5684 // Banish should only be dispelled by Mass Dispel
5685 if (aura->GetSpellInfo()->Mechanic == MECHANIC_BANISH && !dispelSpell->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
5686 {
5687 continue;
5688 }
5689
5690 // The charges / stack amounts don't count towards the total number of auras that can be dispelled.
5691 // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell
5692 // Polymorph instead of 1 / (5 + 1) -> 16%.
5693 bool dispel_charges = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_REMOVES_CHARGES);
5694 uint8 charges = dispel_charges ? aura->GetCharges() : aura->GetStackAmount();
5695 if (charges > 0)
5696 dispelList.push_back(std::make_pair(aura, charges));
5697 }
5698 }
5699}
@ 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
uint8 GetStackAmount() const
Definition SpellAuras.h:148
uint8 GetCharges() const
Definition SpellAuras.h:141
bool IsPassive() const
Definition SpellAuras.cpp:1082
uint32 Mechanic
Definition SpellInfo.h:323
uint32 Dispel
Definition SpellInfo.h:322
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5754
std::map< uint8, AuraApplication * > VisibleAuraMap
Definition Unit.h:658
VisibleAuraMap const * GetVisibleAuras()
Definition Unit.h:1472

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::CheckCast(), and Spell::EffectDispel().

◆ GetDisplayId()

◆ GetDisplayRace()

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

References GetDisplayId(), and GetDisplayRaceFromModelId().

Referenced by AuraEffect::HandleAuraTransform().

◆ GetDisplayRaceFromModelId()

DisplayRace Unit::GetDisplayRaceFromModelId ( uint32  modelId) const
21057{
21058 if (CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(modelId))
21059 {
21060 if (CreatureDisplayInfoExtraEntry const* displayExtra = sCreatureDisplayInfoExtraStore.LookupEntry(display->ExtendedDisplayInfoID))
21061 {
21062 return DisplayRace(displayExtra->DisplayRaceID);
21063 }
21064 }
21065 return DisplayRace::None;
21066}
DBCStorage< CreatureDisplayInfoExtraEntry > sCreatureDisplayInfoExtraStore(CreatureDisplayInfoExtrafmt)
DisplayRace
Definition SharedDefines.h:111
Definition DBCStructure.h:739

References None, sCreatureDisplayInfoExtraStore, and sCreatureDisplayInfoStore.

Referenced by GetDisplayRace().

◆ GetDoTsByCaster()

uint32 Unit::GetDoTsByCaster ( ObjectGuid  casterGUID) const
5924{
5925 static const AuraType diseaseAuraTypes[] =
5926 {
5930 };
5931
5932 uint32 dots = 0;
5933 for (AuraType const* itr = &diseaseAuraTypes[0]; itr && itr[0] != SPELL_AURA_NONE; ++itr)
5934 {
5935 Unit::AuraEffectList const& auras = GetAuraEffectsByType(*itr);
5936 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5937 {
5938 // Get auras by caster
5939 if ((*i)->GetCasterGUID() == casterGUID)
5940 ++dots;
5941 }
5942 }
5943 return dots;
5944}
@ 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)
6185{
6186 if (m_dynObj.empty())
6187 return nullptr;
6188 for (DynObjectList::const_iterator i = m_dynObj.begin(); i != m_dynObj.end(); ++i)
6189 {
6190 DynamicObject* dynObj = *i;
6191 if (dynObj->GetSpellId() == spellId)
6192 return dynObj;
6193 }
6194 return nullptr;
6195}
Definition DynamicObject.h:35
uint32 GetSpellId() const
Definition DynamicObject.h:58

References DynamicObject::GetSpellId(), and m_dynObj.

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

◆ GetEffectiveResistChance()

float Unit::GetEffectiveResistChance ( Unit const *  owner,
SpellSchoolMask  schoolMask,
Unit const *  victim 
)
static
2126{
2127 float victimResistance = float(victim->GetResistance(schoolMask));
2128 if (owner)
2129 {
2130 // Xinef: pets inherit 100% of masters penetration
2131 // Xinef: excluding traps
2132 Player const* player = owner->GetSpellModOwner();
2133 if (player && owner->GetEntry() != WORLD_TRIGGER)
2134 {
2135 victimResistance += float(player->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2136 victimResistance -= float(player->GetSpellPenetrationItemMod());
2137 }
2138 else
2139 victimResistance += float(owner->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2140 }
2141
2142 victimResistance = std::max(victimResistance, 0.0f);
2143 if (owner)
2144 victimResistance += std::max((float(victim->GetLevel()) - float(owner->GetLevel())) * 5.0f, 0.0f);
2145
2146 static uint32 const BOSS_LEVEL = 83;
2147 static float const BOSS_RESISTANCE_CONSTANT = 510.0f;
2148 uint32 level = victim->GetLevel();
2149 float resistanceConstant = 0.0f;
2150
2151 if (level == BOSS_LEVEL)
2152 resistanceConstant = BOSS_RESISTANCE_CONSTANT;
2153 else
2154 resistanceConstant = level * 5.0f;
2155
2156 return victimResistance / (victimResistance + resistanceConstant);
2157}
int32 GetSpellPenetrationItemMod() const
Definition Player.h:1980

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(), 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(), npc_chesspiece::GetDefaultOrientationForTeam(), GetFactionTemplateEntry(), GetReactionTo(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItems(), 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(), boss_shade_of_aran::JustEngagedWith(), npc_escortAI::JustRespawned(), FollowerAI::JustRespawned(), SmartAI::JustRespawned(), boss_volkhan::boss_volkhanAI::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(), PatchValuesUpdate(), 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(), 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
10225{
10226 // always neutral when no template entry found
10227 if (!factionTemplateEntry)
10228 return REP_NEUTRAL;
10229
10230 FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry();
10231 if (!targetFactionTemplateEntry)
10232 return REP_NEUTRAL;
10233
10234 // xinef: check forced reputation for self also
10235 if (Player const* selfPlayerOwner = GetAffectingPlayer())
10236 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(target->GetFactionTemplateEntry()))
10237 return *repRank;
10238
10239 if (Player const* targetPlayerOwner = target->GetAffectingPlayer())
10240 {
10241 // check contested flags
10242 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10243 && targetPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10244 return REP_HOSTILE;
10245 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(factionTemplateEntry))
10246 return *repRank;
10247 if (!target->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10248 {
10249 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
10250 {
10251 if (factionEntry->CanHaveReputation())
10252 {
10253 // CvP case - check reputation, don't allow state higher than neutral when at war
10254 ReputationRank repRank = targetPlayerOwner->GetReputationMgr().GetRank(factionEntry);
10255 if (targetPlayerOwner->GetReputationMgr().IsAtWar(factionEntry))
10256 repRank = std::min(REP_NEUTRAL, repRank);
10257 return repRank;
10258 }
10259 }
10260 }
10261 }
10262
10263 // common faction based check
10264 if (factionTemplateEntry->IsHostileTo(*targetFactionTemplateEntry))
10265 return REP_HOSTILE;
10266 if (factionTemplateEntry->IsFriendlyTo(*targetFactionTemplateEntry))
10267 return REP_FRIENDLY;
10268 if (targetFactionTemplateEntry->IsFriendlyTo(*factionTemplateEntry))
10269 return REP_FRIENDLY;
10270 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS)
10271 return REP_HOSTILE;
10272 // neutral by default
10273 return REP_NEUTRAL;
10274}
@ FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS
Definition DBCEnums.h:332
@ FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
Definition DBCEnums.h:331
@ PLAYER_FLAGS_CONTESTED_PVP
Definition Player.h:488
@ UNIT_FLAG2_IGNORE_REPUTATION
Definition UnitDefines.h:291
bool IsFriendlyTo(FactionTemplateEntry const &entry) const
Definition DBCStructure.h:951

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
10075{
10076 FactionTemplateEntry const* entry = sFactionTemplateStore.LookupEntry(GetFaction());
10077 if (!entry)
10078 {
10079 static ObjectGuid guid; // prevent repeating spam same faction problem
10080
10081 if (GetGUID() != guid)
10082 {
10083 if (Player const* player = ToPlayer())
10084 LOG_ERROR("entities.unit", "Player {} has invalid faction (faction template id) #{}", player->GetName(), GetFaction());
10085 else if (Creature const* creature = ToCreature())
10086 LOG_ERROR("entities.unit", "Creature (template id: {}) has invalid faction (faction template id) #{}", creature->GetCreatureTemplate()->Entry, GetFaction());
10087 else
10088 LOG_ERROR("entities.unit", "Unit (name={}, type={}) has invalid faction (faction template id) #{}", GetName(), uint32(GetTypeId()), GetFaction());
10089
10090 guid = GetGUID();
10091 }
10092 }
10093 return entry;
10094}
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
TypeID GetTypeId() const
Definition Object.h:128
uint32 GetFaction() const
Definition Unit.h:817
std::string const & GetName() const
Definition Object.h:464

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

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

◆ GetFirstControlled()

Unit * Unit::GetFirstControlled ( ) const
11120{
11121 // Sequence: charmed, pet, other guardians
11122 Unit* unit = GetCharm();
11123 if (!unit)
11124 if (ObjectGuid guid = GetMinionGUID())
11125 unit = ObjectAccessor::GetUnit(*this, guid);
11126
11127 return unit;
11128}
ObjectGuid GetMinionGUID() const
Definition Unit.h:688

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

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

◆ GetFirstMinion()

Minion * Unit::GetFirstMinion ( ) const
10681{
10682 if (ObjectGuid pet_guid = GetMinionGUID())
10683 {
10684 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10685 if (pet->HasUnitTypeMask(UNIT_MASK_MINION))
10686 return (Minion*)pet;
10687
10688 LOG_ERROR("entities.unit", "Unit::GetFirstMinion: Minion {} not exist.", pet_guid.ToString());
10689 const_cast<Unit*>(this)->SetMinionGUID(ObjectGuid::Empty);
10690 }
10691
10692 return nullptr;
10693}
void SetMinionGUID(ObjectGuid guid)
Definition Unit.h:689
Creature * GetCreatureOrPetOrVehicle(WorldObject const &, ObjectGuid const)
Definition ObjectAccessor.cpp:234

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

◆ GetFollowAngle()

◆ GetGameObject()

GameObject * Unit::GetGameObject ( uint32  spellId) const
6226{
6227 for (GameObjectList::const_iterator itr = m_gameObj.begin(); itr != m_gameObj.end(); ++itr)
6228 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6229 if (go->GetSpellId() == spellId)
6230 return go;
6231
6232 return nullptr;
6233}

References ObjectAccessor::GetGameObject(), and m_gameObj.

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

◆ getGender()

◆ GetGuardianPet()

Guardian * Unit::GetGuardianPet ( ) const
10696{
10697 if (ObjectGuid pet_guid = GetPetGUID())
10698 {
10699 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10700 if (pet->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10701 return (Guardian*)pet;
10702
10703 LOG_FATAL("entities.unit", "Unit::GetGuardianPet: Guardian {} not exist.", pet_guid.ToString());
10704 const_cast<Unit*>(this)->SetPetGUID(ObjectGuid::Empty);
10705 }
10706
10707 return nullptr;
10708}
#define LOG_FATAL(filterType__,...)
Definition Log.h:153
Definition TemporarySummon.h:96
void SetPetGUID(ObjectGuid guid)
Definition Unit.h:693
ObjectGuid GetPetGUID() const
Definition Unit.h:694

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_aura::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(), ScriptedAI::DamageTaken(), boss_eregos::boss_eregosAI::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_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_muru::DamageTaken(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::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::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::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_akama_illidan::DamageTaken(), npc_maiev_illidan::DamageTaken(), boss_illidari_council::DamageTaken(), boss_illidari_council_memberAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_akama_shade::DamageTaken(), boss_the_lurker_below::DamageTaken(), npc_shattered_hand_scout::DamageTaken(), boss_alar::DamageTaken(), advisor_baseAI::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_nightbane::DamageTaken(), boss_thekal::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), boss_illidan_stormrage::DamageTaken(), npc_garr_firesworn::npc_garr_fireswornAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), SmartAI::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(), Spell::EffectHealMaxHealth(), Spell::EffectInstaKill(), Pet::FillPetInfo(), boss_supremus::FindHatefulStrikeTarget(), GetHealthGain(), GetHealthPct(), spell_illidari_council_empyreal_balance::HandleAfterCast(), spell_illidari_council_empyreal_equivalency::HandleAfterCast(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_rajaxx_thundercrash::HandleDamageCalc(), misc_commandscript::HandleDieCommand(), spell_oculus_soar_aura::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(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), IsFullHealth(), npc_dirt_mound::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), Kill(), ModifyHealth(), spell_xt002_gravity_bomb_aura::OnPeriodic(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::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(), Aura::Update(), boss_headless_horseman::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(), 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)
14175{
14176 int32 gain = 0;
14177
14178 if (dVal == 0)
14179 return 0;
14180
14181 int32 curHealth = (int32)GetHealth();
14182
14183 int32 val = dVal + curHealth;
14184 if (val <= 0)
14185 {
14186 return -curHealth;
14187 }
14188
14189 int32 maxHealth = (int32)GetMaxHealth();
14190
14191 if (val < maxHealth)
14192 gain = dVal;
14193 else if (curHealth != maxHealth)
14194 gain = maxHealth - curHealth;
14195
14196 return gain;
14197}

References GetHealth(), and GetMaxHealth().

Referenced by Spell::DoAllEffectOnTarget().

◆ GetHealthPct()

◆ getHostileRefMgr()

◆ GetHoverHeight()

float Unit::GetHoverHeight ( ) const
inline

◆ GetInterruptMask()

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

References m_interruptMask.

◆ GetLastDamagedTargetGuid()

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

References _lastDamagedTargetGuid.

◆ GetLastExtraAttackSpell()

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

References _lastExtraAttackSpell.

Referenced by HandleProcTriggerSpell().

◆ GetLevel()

uint8 Unit::GetLevel ( ) const
inline
@ UNIT_FIELD_LEVEL
Definition UpdateFields.h:114

References Object::GetUInt32Value(), and UNIT_FIELD_LEVEL.

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(), AuraEffect::CalculateAmount(), CalculateLevelPenalty(), CalculateMeleeDamage(), Player::CalculateMinMaxDamage(), Player::CalculateQuestRewardXP(), Player::CalculateReputationGain(), Player::CalculateTalentsPoints(), SpellEffectInfo::CalcValue(), Player::CanEquipItem(), Group::CanJoinBattlegroundQueue(), Player::CanSeeStartQuest(), Player::CanUseItem(), Player::CheckAreaExploreAndOutdoor(), spell_hun_tame_beast::CheckCast(), Spell::CheckCast(), ServerMailCondition::CheckCondition(), 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(), Player::CreatePet(), CreateTamedPetFrom(), 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(), Pet::GetNativeObjectScale(), 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(), WorldSession::HandleAuctionListItems(), 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::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::IsMaxLevel(), Player::LearnDefaultSkill(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), AchievementCriteriaData::Meets(), MeleeSpellHitResult(), npc_eagle_trash_aggro_trigger::MoveInLineOfSight(), 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(), 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 
)
11064{
11065 // Patch 1.2 notes: Spell Reflection no longer reflects abilities
11066 if (spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR1_NO_REDIRECTION) || spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
11067 return victim;
11068
11070 for (Unit::AuraEffectList::const_iterator itr = magnetAuras.begin(); itr != magnetAuras.end(); ++itr)
11071 {
11072 if (Unit* magnet = (*itr)->GetBase()->GetUnitOwner())
11073 if (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11074 //&& spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK
11075 && _IsValidAttackTarget(magnet, spellInfo)
11076 /*&& IsWithinLOSInMap(magnet)*/)
11077 {
11078 // 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
11079 magnet->m_Events.AddEvent(new RedirectSpellEvent(*magnet, victim->GetGUID(), *itr), magnet->m_Events.CalculateQueueTime(100));
11080
11081 if (magnet->IsTotem())
11082 {
11083 uint64 queueTime = magnet->m_Events.CalculateQueueTime(100);
11084 if (spellInfo->Speed > 0.0f)
11085 {
11086 float dist = GetDistance(magnet->GetPositionX(), magnet->GetPositionY(), magnet->GetPositionZ());
11087 if (dist < 5.0f)
11088 dist = 5.0f;
11089 queueTime = magnet->m_Events.CalculateTime((uint64)std::floor(dist / spellInfo->Speed * 1000.0f));
11090 }
11091
11092 magnet->m_Events.AddEvent(new KillMagnetEvent(*magnet), queueTime);
11093 }
11094
11095 return magnet;
11096 }
11097 }
11098 return victim;
11099}
@ SPELL_ATTR1_NO_REDIRECTION
Definition SharedDefines.h:422
@ SPELL_ATTR0_IS_ABILITY
Definition SharedDefines.h:386
@ SPELL_AURA_SPELL_MAGNET
Definition SpellAuraDefines.h:159
Definition TotemAI.h:47
Definition Unit.h:2243
bool _IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
Definition Unit.cpp:13928
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:1256

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::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(), spell_illidari_council_empyreal_balance::HandleAfterCast(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), HandleAuraProc(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), spell_oculus_soar_aura::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::HandleScript(), IsFullHealth(), boss_twin_valkyrAI::JustEngagedWith(), boss_sister_svalna::boss_sister_svalnaAI::JustEngagedWith(), boss_ingvar_the_plunderer::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()(), Acore::HealthPctOrderPred::operator()(), Player::outDebugValues(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), 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(), npc_giant_claw_tentacle::Submerge(), 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_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxNegativeAuraModifier()

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

References GetAuraEffectsByType().

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

◆ GetMaxNegativeAuraModifierByAffectMask()

int32 Unit::GetMaxNegativeAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6161{
6162 int32 modifier = 0;
6163
6164 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6165 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6166 {
6167 if ((*i)->IsAffectedOnSpell(affectedSpell) && (*i)->GetAmount() < modifier)
6168 modifier = (*i)->GetAmount();
6169 }
6170
6171 return modifier;
6172}

References GetAuraEffectsByType().

◆ GetMaxNegativeAuraModifierByMiscMask()

int32 Unit::GetMaxNegativeAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
6057{
6058 int32 modifier = 0;
6059
6060 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6061 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6062 {
6063 if ((*i)->GetMiscValue()& misc_mask && (*i)->GetAmount() < modifier)
6064 modifier = (*i)->GetAmount();
6065 }
6066
6067 return modifier;
6068}

References GetAuraEffectsByType().

Referenced by SpellTakenCritChance().

◆ GetMaxNegativeAuraModifierByMiscValue()

int32 Unit::GetMaxNegativeAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6109{
6110 int32 modifier = 0;
6111
6112 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6113 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6114 {
6115 if ((*i)->GetMiscValue() == misc_value && (*i)->GetAmount() < modifier)
6116 modifier = (*i)->GetAmount();
6117 }
6118
6119 return modifier;
6120}

References GetAuraEffectsByType().

Referenced by MagicSpellHitResult(), and ModSpellDuration().

◆ GetMaxPositiveAuraModifier()

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

References GetAuraEffectsByType().

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

◆ GetMaxPositiveAuraModifierByAffectMask()

int32 Unit::GetMaxPositiveAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6147{
6148 int32 modifier = 0;
6149
6150 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6151 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6152 {
6153 if ((*i)->IsAffectedOnSpell(affectedSpell) && (*i)->GetAmount() > modifier)
6154 modifier = (*i)->GetAmount();
6155 }
6156
6157 return modifier;
6158}

References GetAuraEffectsByType().

◆ GetMaxPositiveAuraModifierByMiscMask()

int32 Unit::GetMaxPositiveAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask,
const AuraEffect except = nullptr 
) 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 (except != (*i) && (*i)->GetMiscValue()& misc_mask && (*i)->GetAmount() > modifier)
6050 modifier = (*i)->GetAmount();
6051 }
6052
6053 return modifier;
6054}

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

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

◆ GetMaxPositiveAuraModifierByMiscValue()

int32 Unit::GetMaxPositiveAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6095{
6096 int32 modifier = 0;
6097
6098 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6099 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6100 {
6101 if ((*i)->GetMiscValue() == misc_value && (*i)->GetAmount() > modifier)
6102 modifier = (*i)->GetAmount();
6103 }
6104
6105 return modifier;
6106}

References GetAuraEffectsByType().

Referenced by MagicSpellHitResult().

◆ GetMaxPower()

uint32 Unit::GetMaxPower ( Powers  power) const
inline
1073{ 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_aura::HandleScript(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), boss_curator::JustEngagedWith(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), ModifyPowerPct(), boss_shade_of_aran::OnPowerUpdate(), boss_selin_fireheart::OnPowerUpdate(), Acore::PowerPctOrderPred::operator()(), Acore::PowerPctOrderPred::operator()(), Player::outDebugValues(), spell_item_oracle_ablutions::PrepareSpellScript(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), spell_bronjahm_magic_bane::RecalculateDamage(), Creature::Regenerate(), Player::Regenerate(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetPower(), setPowerType(), Player::SummonPet(), 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
1146{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }
uint8 getLevelForTarget(WorldObject const *) const override
Definition Unit.h:1041

References GetLevel(), and getLevelForTarget().

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

◆ GetMechanicResistChance()

int32 Unit::GetMechanicResistChance ( SpellInfo const *  spell)
3148{
3149 if (!spell)
3150 return 0;
3151 int32 resist_mech = 0;
3152 for (uint8 eff = 0; eff < MAX_SPELL_EFFECTS; ++eff)
3153 {
3154 if (!spell->Effects[eff].IsEffect())
3155 break;
3156 int32 effect_mech = spell->GetEffectMechanic(eff);
3157 if (effect_mech)
3158 {
3160 if (resist_mech < temp)
3161 resist_mech = temp;
3162 }
3163 }
3164 return resist_mech;
3165}
@ SPELL_AURA_MOD_MECHANIC_RESISTANCE
Definition SpellAuraDefines.h:180
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6070

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 
)
2684{
2685 if (!attacker)
2686 {
2687 return false;
2688 }
2689
2690 AttackerSet attackers = getAttackers();
2691
2692 if (attackers.size() <= 1) // if the attackers are not more than one
2693 {
2694 return false;
2695 }
2696
2697 float meleeReach = GetExactDist2d(attacker);
2698 if (meleeReach <= 0)
2699 {
2700 return false;
2701 }
2702
2703 float minAngle = 0;
2704 Unit *refUnit = nullptr;
2705 uint32 validAttackers = 0;
2706
2707 double attackerSize = attacker->GetCollisionRadius();
2708
2709 for (auto const& otherAttacker: attackers)
2710 {
2711 // if the otherAttacker is not valid, skip
2712 if (!otherAttacker || otherAttacker->GetGUID() == attacker->GetGUID() ||
2713 !otherAttacker->IsWithinMeleeRange(this) || otherAttacker->isMoving())
2714 {
2715 continue;
2716 }
2717
2718 float curretAngle = atan(attacker->GetExactDist2d(otherAttacker) / meleeReach);
2719 if (minAngle == 0 || curretAngle < minAngle)
2720 {
2721 minAngle = curretAngle;
2722 refUnit = otherAttacker;
2723 }
2724
2725 validAttackers++;
2726 }
2727
2728 if (!validAttackers || !refUnit)
2729 {
2730 return false;
2731 }
2732
2733 float contactDist = attackerSize + refUnit->GetCollisionRadius();
2734 float requiredAngle = atan(contactDist / meleeReach);
2735 float attackersAngle = atan(attacker->GetExactDist2d(refUnit) / meleeReach);
2736
2737 // in instance: the more attacker there are, the higher will be the tollerance
2738 // outside: creatures should not intersecate
2739 float angleTollerance = attacker->GetMap()->IsDungeon() ? requiredAngle - requiredAngle * tanh(validAttackers / 5.0f) : requiredAngle;
2740
2741 if (attackersAngle > angleTollerance)
2742 {
2743 return false;
2744 }
2745
2746 double angle = atan(contactDist / meleeReach);
2747
2748 float angularRadius = frand(0.1f, 0.3f) + angle;
2749 int8 direction = (urand(0, 1) ? -1 : 1);
2750 float currentAngle = GetAngle(refUnit);
2751 float absAngle = currentAngle + angularRadius * direction;
2752
2753 float x, y, z;
2754 float distance = meleeReach - GetObjectSize();
2755 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle);
2756
2757 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2758 {
2759 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle * -1); // try the other side
2760
2761 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2762 {
2763 return false;
2764 }
2765 }
2766
2767 pos.Relocate(x, y, z);
2768
2769 return true;
2770}
std::int8_t int8
Definition Define.h:105
float frand(float min, float max)
Definition Random.cpp:57
bool IsDungeon() const
Definition Map.h:295
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:21131
std::unordered_set< Unit * > AttackerSet
Definition Unit.h:638
AttackerSet const & getAttackers() const
Definition Unit.h:859
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:2639
float GetExactDist2d(const float x, const float y) const
Definition Position.h:170

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
1215{ 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:19227

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 
)
11102{
11104 for (AuraEffectList::const_iterator i = hitTriggerAuras.begin(); i != hitTriggerAuras.end(); ++i)
11105 {
11106 if (Unit* magnet = (*i)->GetBase()->GetCaster())
11107 if (_IsValidAttackTarget(magnet, spellInfo) && magnet->IsWithinLOSInMap(this)
11108 && (!spellInfo || (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11109 && spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK)))
11110 if (roll_chance_i((*i)->GetAmount()))
11111 {
11112 (*i)->GetBase()->DropCharge(AURA_REMOVE_BY_EXPIRE);
11113 return magnet;
11114 }
11115 }
11116 return victim;
11117}
bool roll_chance_i(int chance)
Definition Random.h:60
@ 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
681{
682 float range = GetCombatReach() + target->GetCombatReach() + 4.0f / 3.0f;
683 return std::max(range, NOMINAL_MELEE_RANGE);
684}
#define NOMINAL_MELEE_RANGE
Definition ObjectDefines.h:48
float GetCombatReach() const override
Definition Unit.h:837

References GetCombatReach(), and NOMINAL_MELEE_RANGE.

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

◆ GetMeleeReach()

float Unit::GetMeleeReach ( ) const
inline
838{ 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
19234{
19235 // Hardcoded cases
19236 switch (spellId)
19237 {
19238 case 7090: // Bear form
19239 return 29414;
19240 case 35200: // Roc form
19241 return 4877;
19242 default:
19243 break;
19244 }
19245
19246 if (IsPlayer())
19247 {
19248 switch (form)
19249 {
19250 case FORM_CAT:
19251 // Based on Hair color
19252 if (getRace() == RACE_NIGHTELF)
19253 {
19254 uint8 hairColor = GetByteValue(PLAYER_BYTES, 3);
19255 switch (hairColor)
19256 {
19257 case 7: // Violet
19258 case 8:
19259 return 29405;
19260 case 3: // Light Blue
19261 return 29406;
19262 case 0: // Green
19263 case 1: // Light Green
19264 case 2: // Dark Green
19265 return 29407;
19266 case 4: // White
19267 return 29408;
19268 default: // original - Dark Blue
19269 return 892;
19270 }
19271 }
19272 // Based on Skin color
19273 else if (getRace() == RACE_TAUREN)
19274 {
19275 uint8 skinColor = GetByteValue(PLAYER_BYTES, 0);
19276 // Male
19277 if (getGender() == GENDER_MALE)
19278 {
19279 switch (skinColor)
19280 {
19281 case 12: // White
19282 case 13:
19283 case 14:
19284 case 18: // Completly White
19285 return 29409;
19286 case 9: // Light Brown
19287 case 10:
19288 case 11:
19289 return 29410;
19290 case 6: // Brown
19291 case 7:
19292 case 8:
19293 return 29411;
19294 case 0: // Dark
19295 case 1:
19296 case 2:
19297 case 3: // Dark Grey
19298 case 4:
19299 case 5:
19300 return 29412;
19301 default: // original - Grey
19302 return 8571;
19303 }
19304 }
19305 // Female
19306 else switch (skinColor)
19307 {
19308 case 10: // White
19309 return 29409;
19310 case 6: // Light Brown
19311 case 7:
19312 return 29410;
19313 case 4: // Brown
19314 case 5:
19315 return 29411;
19316 case 0: // Dark
19317 case 1:
19318 case 2:
19319 case 3:
19320 return 29412;
19321 default: // original - Grey
19322 return 8571;
19323 }
19324 }
19326 return 892;
19327 else
19328 return 8571;
19329 case FORM_DIREBEAR:
19330 case FORM_BEAR:
19331 // Based on Hair color
19332 if (getRace() == RACE_NIGHTELF)
19333 {
19334 uint8 hairColor = GetByteValue(PLAYER_BYTES, 3);
19335 switch (hairColor)
19336 {
19337 case 0: // Green
19338 case 1: // Light Green
19339 case 2: // Dark Green
19340 return 29413; // 29415?
19341 case 6: // Dark Blue
19342 return 29414;
19343 case 4: // White
19344 return 29416;
19345 case 3: // Light Blue
19346 return 29417;
19347 default: // original - Violet
19348 return 2281;
19349 }
19350 }
19351 // Based on Skin color
19352 else if (getRace() == RACE_TAUREN)
19353 {
19354 uint8 skinColor = GetByteValue(PLAYER_BYTES, 0);
19355 // Male
19356 if (getGender() == GENDER_MALE)
19357 {
19358 switch (skinColor)
19359 {
19360 case 0: // Dark (Black)
19361 case 1:
19362 case 2:
19363 return 29418;
19364 case 3: // White
19365 case 4:
19366 case 5:
19367 case 12:
19368 case 13:
19369 case 14:
19370 return 29419;
19371 case 9: // Light Brown/Grey
19372 case 10:
19373 case 11:
19374 case 15:
19375 case 16:
19376 case 17:
19377 return 29420;
19378 case 18: // Completly White
19379 return 29421;
19380 default: // original - Brown
19381 return 2289;
19382 }
19383 }
19384 // Female
19385 else switch (skinColor)
19386 {
19387 case 0: // Dark (Black)
19388 case 1:
19389 return 29418;
19390 case 2: // White
19391 case 3:
19392 return 29419;
19393 case 6: // Light Brown/Grey
19394 case 7:
19395 case 8:
19396 case 9:
19397 return 29420;
19398 case 10: // Completly White
19399 return 29421;
19400 default: // original - Brown
19401 return 2289;
19402 }
19403 }
19405 return 2281;
19406 else
19407 return 2289;
19408 case FORM_FLIGHT:
19410 return 20857;
19411 return 20872;
19412 case FORM_FLIGHT_EPIC:
19414 return 21243;
19415 return 21244;
19416 default:
19417 break;
19418 }
19419 }
19420
19421 uint32 modelid = 0;
19422 SpellShapeshiftFormEntry const* formEntry = sSpellShapeshiftFormStore.LookupEntry(form);
19423 if (formEntry && formEntry->modelID_A)
19424 {
19425 // Take the alliance modelid as default
19426 if (!IsPlayer())
19427 return formEntry->modelID_A;
19428 else
19429 {
19431 modelid = formEntry->modelID_A;
19432 else
19433 modelid = formEntry->modelID_H;
19434
19435 // If the player is horde but there are no values for the horde modelid - take the alliance modelid
19436 if (!modelid && Player::TeamIdForRace(getRace()) == TEAM_HORDE)
19437 modelid = formEntry->modelID_A;
19438 }
19439 }
19440
19441 return modelid;
19442}
@ 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
@ FORM_DIREBEAR
Definition UnitDefines.h:77
@ FORM_FLIGHT_EPIC
Definition UnitDefines.h:94
@ FORM_CAT
Definition UnitDefines.h:70
@ FORM_FLIGHT
Definition UnitDefines.h:96
@ FORM_BEAR
Definition UnitDefines.h:74
@ PLAYER_BYTES
Definition UpdateFields.h:181
static TeamId TeamIdForRace(uint8 race)
Definition Player.cpp:5851
uint8 getGender() const
Definition Unit.h:814
uint8 getRace(bool original=false) const
Definition Unit.cpp:21037
uint32 modelID_H
Definition DBCStructure.h:1828
uint32 modelID_A
Definition DBCStructure.h:1827

References FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_FLIGHT, FORM_FLIGHT_EPIC, GENDER_MALE, Object::GetByteValue(), getGender(), getRace(), Object::IsPlayer(), SpellShapeshiftFormEntry::modelID_A, SpellShapeshiftFormEntry::modelID_H, PLAYER_BYTES, RACE_NIGHTELF, RACE_TAUREN, sSpellShapeshiftFormStore, TEAM_ALLIANCE, TEAM_HORDE, and Player::TeamIdForRace().

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

◆ GetModelForTotem()

uint32 Unit::GetModelForTotem ( PlayerTotemType  totemType)
19445{
19446 switch (getRace())
19447 {
19448 case RACE_ORC:
19449 {
19450 switch (totemType)
19451 {
19452 case SUMMON_TYPE_TOTEM_FIRE: // fire
19453 return 30758;
19454 case SUMMON_TYPE_TOTEM_EARTH: // earth
19455 return 30757;
19456 case SUMMON_TYPE_TOTEM_WATER: // water
19457 return 30759;
19458 case SUMMON_TYPE_TOTEM_AIR: // air
19459 return 30756;
19460 }
19461 break;
19462 }
19463 case RACE_DWARF:
19464 {
19465 switch (totemType)
19466 {
19467 case SUMMON_TYPE_TOTEM_FIRE: // fire
19468 return 30754;
19469 case SUMMON_TYPE_TOTEM_EARTH: // earth
19470 return 30753;
19471 case SUMMON_TYPE_TOTEM_WATER: // water
19472 return 30755;
19473 case SUMMON_TYPE_TOTEM_AIR: // air
19474 return 30736;
19475 }
19476 break;
19477 }
19478 case RACE_TROLL:
19479 {
19480 switch (totemType)
19481 {
19482 case SUMMON_TYPE_TOTEM_FIRE: // fire
19483 return 30762;
19484 case SUMMON_TYPE_TOTEM_EARTH: // earth
19485 return 30761;
19486 case SUMMON_TYPE_TOTEM_WATER: // water
19487 return 30763;
19488 case SUMMON_TYPE_TOTEM_AIR: // air
19489 return 30760;
19490 }
19491 break;
19492 }
19493 case RACE_TAUREN:
19494 {
19495 switch (totemType)
19496 {
19497 case SUMMON_TYPE_TOTEM_FIRE: // fire
19498 return 4589;
19499 case SUMMON_TYPE_TOTEM_EARTH: // earth
19500 return 4588;
19501 case SUMMON_TYPE_TOTEM_WATER: // water
19502 return 4587;
19503 case SUMMON_TYPE_TOTEM_AIR: // air
19504 return 4590;
19505 }
19506 break;
19507 }
19508 case RACE_DRAENEI:
19509 {
19510 switch (totemType)
19511 {
19512 case SUMMON_TYPE_TOTEM_FIRE: // fire
19513 return 19074;
19514 case SUMMON_TYPE_TOTEM_EARTH: // earth
19515 return 19073;
19516 case SUMMON_TYPE_TOTEM_WATER: // water
19517 return 19075;
19518 case SUMMON_TYPE_TOTEM_AIR: // air
19519 return 19071;
19520 }
19521 break;
19522 }
19523 default: // One standard for other races.
19524 {
19525 switch (totemType)
19526 {
19527 case SUMMON_TYPE_TOTEM_FIRE: // fire
19528 return 4589;
19529 case SUMMON_TYPE_TOTEM_EARTH: // earth
19530 return 4588;
19531 case SUMMON_TYPE_TOTEM_WATER: // water
19532 return 4587;
19533 case SUMMON_TYPE_TOTEM_AIR: // air
19534 return 4590;
19535 }
19536 break;
19537 }
19538 }
19539 return 0;
19540}
@ RACE_TROLL
Definition SharedDefines.h:78
@ RACE_ORC
Definition SharedDefines.h:72
@ RACE_DRAENEI
Definition SharedDefines.h:81
@ RACE_DWARF
Definition SharedDefines.h:73
@ SUMMON_TYPE_TOTEM_EARTH
Definition Unit.h:614
@ SUMMON_TYPE_TOTEM_WATER
Definition Unit.h:615
@ SUMMON_TYPE_TOTEM_FIRE
Definition Unit.h:613
@ SUMMON_TYPE_TOTEM_AIR
Definition Unit.h:616

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
15340{
15341 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
15342 {
15343 LOG_ERROR("entities.unit", "attempt to access non-existing modifier value from UnitMods!");
15344 return 0.0f;
15345 }
15346
15347 if (modifierType == TOTAL_PCT && m_auraModifiersGroup[unitMod][modifierType] <= 0.0f)
15348 return 0.0f;
15349
15350 return m_auraModifiersGroup[unitMod][modifierType];
15351}
@ MODIFIER_TYPE_END
Definition Unit.h:130

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
1680{ return i_motionMaster; }

References i_motionMaster.

Referenced by _ExitVehicle(), HomeMovementGenerator< Creature >::_setTargetLocation(), PetAI::_stopAttack(), BattlegroundAV::AddAVCreature(), 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_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::AttackStart(), boss_magus_telestra::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_lady_malande::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(), npc_capernian::AttackStart(), UnitAI::AttackStartCaster(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CleanupBeforeRemoveFromMap(), boss_alar::ConstructWaypointsAndMove(), boss_isalien::DamageTaken(), boss_julianne::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::DamageTaken(), npc_vrykul_skeleton::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(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_nightbane::DoAction(), npc_apothecary_genericAI::DoAction(), npc_harrison_jones::DoAction(), npc_amanishi_lookout::DoAction(), npc_chained_spirit::DoAction(), boss_anetheron::DoAction(), boss_azgalor::DoAction(), boss_kazrogal::DoAction(), boss_rage_winterchill::DoAction(), npc_hyjal_ground_trash::DoAction(), npc_hyjal_gargoyle::DoAction(), npc_hyjal_frost_wyrm::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_ahune_bunny::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(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_maiev_illidan::DoAction(), npc_akama_shade::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(), 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(), boss_halazzi::EnterPhase(), boss_zuljin::EnterPhase(), VehicleDespawnEvent::Execute(), RestoreAttack::Execute(), OrcMoveEvent::Execute(), NpcRunToHome::Execute(), UtherBatteredHiltEvent::Execute(), SlaveRunEvent::Execute(), DelayedMovementEvent::Execute(), DaranavanMoveEvent::Execute(), FrostwyrmLandEvent::Execute(), SACActivateEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), AssistanceMovementGenerator::Finalize(), npc_singularity::FindAndFollowTarget(), 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(), boss_nightbane::FlyToClosestPreFlyWayPoint(), 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::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_q6124_6129_apply_salve::HandleDummy(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_icc_geist_alarm::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::HandlePull(), spell_boss_magus_telestra_gravity_well::HandlePull(), PetAI::HandleReturnMovement(), spell_the_lich_king_valkyr_target_search::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_gen_ayamiss_swarmer_loop::HandleScript(), WorldSession::HandleSetRaidDifficultyOpcode(), spell_sindragosa_icy_grip_jump::HandleSpecial(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::HandleSpeedChangeIfNeeded(), spell_item_draenic_pale_ale::HandleSummon(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), wp_commandscript::HandleWpLoadCommand(), wp_commandscript::HandleWpUnLoadCommand(), boss_felmyst::InitializeAI(), 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::IsSummonedBy(), boss_aeonus::IsSummonedBy(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::IsSummonedBy(), npc_burning_spirit::npc_burning_spiritAI::IsSummonedBy(), npc_demonic_vapor::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::IsSummonedBy(), npc_spirit_shade::npc_spirit_shadeAI::IsSummonedBy(), JumpTo(), JumpTo(), 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(), boss_ayamiss::JustDied(), boss_shade_of_aran::JustEngagedWith(), npc_cyclone::JustEngagedWith(), npc_sunblade_scout::JustEngagedWith(), boss_akilzon::JustEngagedWith(), npc_amanishi_scout::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_felmyst::JustEngagedWith(), boss_janalai::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_alar::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), SmartAI::JustReachedHome(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::JustReachedHome(), npc_akama_illidan::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::JustSummoned(), boss_vexallus::JustSummoned(), npc_kalecgos_kj::JustSummoned(), boss_janalai::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_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), boss_mennu_the_betrayer::JustSummoned(), boss_kaelthas::JustSummoned(), boss_mechano_lord_capacitus::JustSummoned(), npc_rinji::npc_rinjiAI::JustSummoned(), npc_maghar_captive::npc_maghar_captiveAI::JustSummoned(), boss_ayamiss::JustSummoned(), Player::KillPlayer(), KnockbackFrom(), spell_svalna_revive_champion::Land(), CreatureGroup::LeaderMoveTo(), Player::LeaveBattleground(), Creature::Motion_Initialize(), SmartAI::MoveAway(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), boss_nalorakk::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_nightbane::MovementInform(), npc_harrison_jones::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(), npc_akama_illidan::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), boss_felmyst::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_cameron::MoveTheChildren(), boss_four_horsemen::boss_four_horsemenAI::MoveToCorner(), npc_janalai_hatcher::MoveToNewWaypoint(), npc_concentrated_ball::npc_concentrated_ballAI::MoveToNextPoint(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), 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_aura::OnApply(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_hyjal_jaina::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_kernobee::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), spell_chapter5_light_of_dawn_aura::OnRemove(), spell_halion_twilight_phasing_aura::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_nightbane::PathEndReached(), boss_anetheron::PathEndReached(), boss_rage_winterchill::PathEndReached(), npc_hyjal_ground_trash::PathEndReached(), npc_hyjal_frost_wyrm::PathEndReached(), boss_ambassador_hellmaw::PathEndReached(), npc_akama_illidan::PathEndReached(), boss_nefarian::PathEndReached(), npc_hyjal_gargoyle::PathEndReached(), PauseMovement(), SmartAI::PausePath(), PetSpellFail(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::PickNewLocation(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::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(), boss_felblood_kaelthas::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_janalai::Reset(), npc_janalai_hatcher::Reset(), boss_arlokk::boss_arlokkAI::Reset(), npc_zulian_prowler::npc_zulian_prowlerAI::Reset(), npc_batrider::Reset(), npc_brew_bubble::Reset(), boss_archimonde::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(), boss_kologarn::boss_kologarnAI::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_alar::ScheduleAbilities(), boss_illidan_stormrage::ScheduleAbilities(), boss_magtheridon::ScheduleCombatEvents(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), boss_felmyst::ScheduleGroundAbilities(), boss_nightbane::ScheduleLand(), boss_laj::ScheduleTasks(), 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::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(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::SetGUID(), SetInCombatState(), Player::SetMover(), SetSpeed(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_harrison_jones::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_akama_illidan::sGossipSelect(), npc_akama_shade::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(), boss_attumen::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_crusade_persuaded::npc_crusade_persuadedAI::SpellHit(), npc_forest_frog::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_enslaved_netherwing_drake::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(), boss_felmyst::StartIntro(), 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(), 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(), 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(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::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::UpdateAI(), npc_forest_frog::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_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::UpdateAI(), npc_vrykul_skeleton::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::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_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::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_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_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_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_jenny::UpdateFollowerAI(), npc_emily::npc_emilyAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ GetMotionMaster() [2/2]

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

References i_motionMaster.

◆ GetMountID()

◆ GetNativeDisplayId()

◆ GetNativeObjectScale()

virtual float Unit::GetNativeObjectScale ( ) const
inlinevirtual

Reimplemented in Creature, and Pet.

1892{ return 1.0f; }

Referenced by RecalculateObjectScale().

◆ GetNegStat()

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

References Object::GetFloatValue(), and UNIT_FIELD_NEGSTAT0.

◆ GetNextRandomRaidMemberOrPet()

Unit * Unit::GetNextRandomRaidMemberOrPet ( float  radius)
11159{
11160 Player* player = nullptr;
11161 if (IsPlayer())
11162 player = ToPlayer();
11163 // Should we enable this also for charmed units?
11164 else if (IsCreature() && IsPet())
11165 player = GetOwner()->ToPlayer();
11166
11167 if (!player)
11168 return nullptr;
11169 Group* group = player->GetGroup();
11170 // When there is no group check pet presence
11171 if (!group)
11172 {
11173 // We are pet now, return owner
11174 if (player != this)
11175 return IsWithinDistInMap(player, radius) ? player : nullptr;
11176 Unit* pet = GetGuardianPet();
11177 // No pet, no group, nothing to return
11178 if (!pet)
11179 return nullptr;
11180 // We are owner now, return pet
11181 return IsWithinDistInMap(pet, radius) ? pet : nullptr;
11182 }
11183
11184 std::vector<Unit*> nearMembers;
11185 // reserve place for players and pets because resizing vector every unit push is unefficient (vector is reallocated then)
11186 nearMembers.reserve(group->GetMembersCount() * 2);
11187
11188 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
11189 if (Player* Target = itr->GetSource())
11190 {
11191 if (Target != this && !IsWithinDistInMap(Target, radius))
11192 continue;
11193
11194 // IsHostileTo check duel and controlled by enemy
11195 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
11196 nearMembers.push_back(Target);
11197
11198 // Push player's pet to vector
11199 if (Unit* pet = Target->GetGuardianPet())
11200 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
11201 nearMembers.push_back(pet);
11202 }
11203
11204 if (nearMembers.empty())
11205 return nullptr;
11206
11207 uint32 randTarget = urand(0, nearMembers.size() - 1);
11208 return nearMembers[randTarget];
11209}
Definition GroupReference.h:27
Definition Group.h:169
uint32 GetMembersCount() const
Definition Group.h:245
GroupReference * GetFirstMember()
Definition Group.h:243
Group * GetGroup()
Definition Player.h:2478
Guardian * GetGuardianPet() const
Definition Unit.cpp:10695
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition Object.cpp:1332

References Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), Group::GetMembersCount(), GetOwner(), Object::IsCreature(), IsHostileTo(), IsPet(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), Object::ToPlayer(), and urand().

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

◆ GetNpcFlags()

◆ GetOldFactionId()

uint32 Unit::GetOldFactionId ( ) const
inline
821{ 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
4794{
4795 AuraMapBounds range = m_ownedAuras.equal_range(spellId);
4796 for (AuraMap::const_iterator itr = range.first; itr != range.second; ++itr)
4797 {
4798 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask)
4799 && (!casterGUID || itr->second->GetCasterGUID() == casterGUID)
4800 && (!itemCasterGUID || itr->second->GetCastItemGUID() == itemCasterGUID)
4801 && (!except || except != itr->second))
4802 {
4803 return itr->second;
4804 }
4805 }
4806 return nullptr;
4807}
std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
Definition Unit.h:642

References m_ownedAuras.

Referenced by _TryStackingOrRefreshingExistingAura().

◆ GetOwnedAuras() [1/2]

◆ GetOwnedAuras() [2/2]

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

References m_ownedAuras.

◆ GetOwner()

Unit * Unit::GetOwner ( ) const
Todo:
: move this in Object class or move GetUInt32value here but keep consistency
10645{
10646 if (ObjectGuid ownerGUID = GetOwnerGUID())
10647 return ObjectAccessor::GetUnit(*this, ownerGUID);
10648
10649 return nullptr;
10650}

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(), DealHeal(), HostileRefMgr::deleteReferences(), npc_spring_rabbit::npc_spring_rabbitAI::DoAction(), Spell::DoAllEffectOnLaunchTarget(), Spell::DoAllEffectOnTarget(), PetAI::DoAttack(), Spell::EffectDispel(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), boss_illidari_council_memberAI::EnterEvadeMode(), 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_aura::HandleEffectPeriodic(), spell_gen_gryphon_wyvern_mount_check::HandleEffectPeriodic(), spell_ioc_bomb_blast_criteria::HandleGameObjectDamage(), modify_commandscript::HandleModifyTalentCommand(), WorldSession::HandlePetActionHelper(), spell_warl_demonic_pact_aura::HandleProc(), 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_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(), spell_item_fetch_ball::SelectTarget(), 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)
18853{
18854 Unit* owner = GetCharmerOrOwnerOrSelf();
18855 Group* group = nullptr;
18856 if (owner->IsPlayer())
18857 group = owner->ToPlayer()->GetGroup();
18858
18859 if (group)
18860 {
18861 uint8 subgroup = owner->ToPlayer()->GetSubGroup();
18862
18863 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
18864 {
18865 Player* Target = itr->GetSource();
18866
18867 // IsHostileTo check duel and controlled by enemy
18868 if (Target && Target->IsInMap(owner) && Target->GetSubGroup() == subgroup && !IsHostileTo(Target))
18869 {
18870 if (Target->IsAlive())
18871 TagUnitMap.push_back(Target);
18872
18873 for (Unit::ControlSet::iterator iterator = Target->m_Controlled.begin(); iterator != Target->m_Controlled.end(); ++iterator)
18874 {
18875 if (Unit* pet = *iterator)
18876 if (pet->IsGuardian() && pet->IsAlive())
18877 TagUnitMap.push_back(pet);
18878 }
18879 }
18880 }
18881 }
18882 else
18883 {
18884 if (owner->IsAlive())
18885 TagUnitMap.push_back(owner);
18886
18887 for (Unit::ControlSet::iterator itr = owner->m_Controlled.begin(); itr != owner->m_Controlled.end(); ++itr)
18888 {
18889 if (Unit* pet = *itr)
18890 if (pet->IsGuardian() && pet->IsAlive())
18891 TagUnitMap.push_back(pet);
18892 }
18893 }
18894}
uint8 GetSubGroup() const
Definition Player.h:2482

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

Referenced by spell_warr_improved_spell_reflection_trigger_aura::HandleRemove().

◆ GetPetGUID()

◆ GetPhaseByAuras()

uint32 Unit::GetPhaseByAuras ( ) const
19072{
19073 uint32 currentPhase = 0;
19075 if (!phases.empty())
19076 for (AuraEffectList::const_iterator itr = phases.begin(); itr != phases.end(); ++itr)
19077 currentPhase |= (*itr)->GetMiscValue();
19078
19079 return currentPhase;
19080}
@ 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
1019{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_POSSTAT0.

◆ GetPower()

uint32 Unit::GetPower ( Powers  power) const
inline
1072{ 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(), spell_igb_cannon_blast::CalculatePower(), 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(), boss_shade_of_aran::JustEngagedWith(), npc_obsidian_destroyer::JustEngagedWith(), spell_gen_replenishment_aura::Load(), Pet::LoseHappiness(), ModifyPower(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_mark_of_kazzak_aura::OnPeriodic(), Acore::PowerPctOrderPred::operator()(), 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::StoreEnergy(), Aura::Update(), 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
1074{ return GetMaxPower(power) ? 100.f * GetPower(power) / GetMaxPower(power) : 0.0f; }
uint32 GetMaxPower(Powers power) const
Definition Unit.h:1073
uint32 GetPower(Powers power) const
Definition Unit.h:1072

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()

◆ GetPowerTypeByAuraGroup()

Powers Unit::GetPowerTypeByAuraGroup ( UnitMods  unitMod) const
15458{
15459 switch (unitMod)
15460 {
15461 case UNIT_MOD_RAGE:
15462 return POWER_RAGE;
15463 case UNIT_MOD_FOCUS:
15464 return POWER_FOCUS;
15465 case UNIT_MOD_ENERGY:
15466 return POWER_ENERGY;
15467 case UNIT_MOD_HAPPINESS:
15468 return POWER_HAPPINESS;
15469 case UNIT_MOD_RUNE:
15470 return POWER_RUNE;
15472 return POWER_RUNIC_POWER;
15473 default:
15474 case UNIT_MOD_MANA:
15475 return POWER_MANA;
15476 }
15477}
@ UNIT_MOD_RUNE
Definition Unit.h:154
@ UNIT_MOD_ENERGY
Definition Unit.h:152
@ UNIT_MOD_FOCUS
Definition Unit.h:151
@ UNIT_MOD_HAPPINESS
Definition Unit.h:153
@ UNIT_MOD_MANA
Definition Unit.h:149
@ UNIT_MOD_RAGE
Definition Unit.h:150
@ UNIT_MOD_RUNIC_POWER
Definition Unit.h:155

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
13496{
13497 // proc per minute chance calculation
13498 if (PPM <= 0)
13499 return 0.0f;
13500
13501 // Apply chance modifer aura
13502 if (spellProto)
13503 if (Player* modOwner = GetSpellModOwner())
13504 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_PROC_PER_MINUTE, PPM);
13505
13506 return std::floor((WeaponSpeed * PPM) / 600.0f); // result is chance in percents (probability = Speed_in_sec * (PPM / 60))
13507}
@ SPELLMOD_PROC_PER_MINUTE
Definition SpellDefines.h:102

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 
)
16547{
16548 // use provided list of auras which can proc
16549 if (procAuras)
16550 {
16551 for (std::list<AuraApplication*>::iterator itr = procAuras->begin(); itr != procAuras->end(); ++itr)
16552 {
16553 ASSERT((*itr)->GetTarget() == this);
16554 if (!(*itr)->GetRemoveMode())
16555 if ((*itr)->GetBase()->IsProcTriggeredOnEvent(*itr, eventInfo))
16556 {
16557 (*itr)->GetBase()->PrepareProcToTrigger(*itr, eventInfo);
16558 aurasTriggeringProc.push_back(*itr);
16559 }
16560 }
16561 }
16562 // or generate one on our own
16563 else
16564 {
16565 for (AuraApplicationMap::iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16566 {
16567 if (itr->second->GetBase()->IsProcTriggeredOnEvent(itr->second, eventInfo))
16568 {
16569 itr->second->GetBase()->PrepareProcToTrigger(itr->second, eventInfo);
16570 aurasTriggeringProc.push_back(itr->second);
16571 }
16572 }
16573 }
16574}

References ASSERT, and GetAppliedAuras().

Referenced by TriggerAurasProcOnEvent().

◆ getRace()

uint8 Unit::getRace ( bool  original = false) const
21038{
21039 if (IsPlayer())
21040 {
21041 if (original)
21042 return m_realRace;
21043 else
21044 return m_race;
21045 }
21046
21048}

References Object::GetByteValue(), Object::IsPlayer(), m_race, m_realRace, 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(), InstanceScript::OnPlayerLeave(), 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
702{
703 float combat_reach = GetCombatReach();
704 if (combat_reach < 0.1f) // sometimes bugged for players
705 combat_reach = DEFAULT_COMBAT_REACH;
706
707 uint32 attacker_number = getAttackers().size();
708 if (attacker_number > 0)
709 --attacker_number;
710 Creature const* c = obj->ToCreature();
711 if (c)
712 if (c->isWorldBoss() || c->IsDungeonBoss() || (obj->IsPet() && const_cast<Unit*>(obj)->ToPet()->isControlled()))
713 attacker_number = 0; // pussywizard: pets and bosses just come to target from their angle
714
715 GetNearPoint(obj, x, y, z, isMoving() ? (obj->GetCombatReach() > 7.75f ? obj->GetCombatReach() - 7.5f : 0.25f) : obj->GetCombatReach(), 0.0f,
716 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));
717
718 // pussywizard
719 if (std::fabs(this->GetPositionZ() - z) > this->GetCollisionHeight() || !IsWithinLOS(x, y, z))
720 {
721 x = this->GetPositionX();
722 y = this->GetPositionY();
723 z = this->GetPositionZ();
724 obj->UpdateAllowedPositionZ(x, y, z);
725 }
726 float maxDist = GetMeleeRange(obj);
727 if (GetExactDistSq(x, y, z) >= maxDist * maxDist)
728 {
729 if (force)
730 {
731 x = this->GetPositionX();
732 y = this->GetPositionY();
733 z = this->GetPositionZ();
734 return true;
735 }
736 return false;
737 }
738 return true;
739}
#define DEFAULT_COMBAT_REACH
Definition ObjectDefines.h:46
bool IsDungeonBoss() const
Definition Creature.cpp:3176
bool isControlled() const
Definition Pet.h:54
float GetCollisionHeight() const override
Return collision height sent to client.
Definition Unit.cpp:21137
float GetMeleeRange(Unit const *target) const
Definition Unit.cpp:680
bool IsWithinLOS(float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
Definition Object.cpp:1337
float GetExactDistSq(float x, float y, float z) const
Definition Position.h:174

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
10105{
10106 // always friendly to self
10107 if (this == target)
10108 return REP_FRIENDLY;
10109
10110 // always friendly to charmer or owner
10112 return REP_FRIENDLY;
10113
10114 Player const* selfPlayerOwner = GetAffectingPlayer();
10115 Player const* targetPlayerOwner = target->GetAffectingPlayer();
10116
10117 // check forced reputation to support SPELL_AURA_FORCE_REACTION
10118 if (selfPlayerOwner)
10119 {
10120 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10121 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10122 return *repRank;
10123 }
10124 else if (targetPlayerOwner)
10125 {
10126 if (FactionTemplateEntry const* selfFactionTemplateEntry = GetFactionTemplateEntry())
10127 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(selfFactionTemplateEntry))
10128 return *repRank;
10129 }
10130
10132 {
10133 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
10134 {
10135 if (selfPlayerOwner && targetPlayerOwner)
10136 {
10137 // always friendly to other unit controlled by player, or to the player himself
10138 if (selfPlayerOwner == targetPlayerOwner)
10139 return REP_FRIENDLY;
10140
10141 // duel - always hostile to opponent
10142 if (selfPlayerOwner->duel && selfPlayerOwner->duel->Opponent == targetPlayerOwner && selfPlayerOwner->duel->State == DUEL_STATE_IN_PROGRESS)
10143 return REP_HOSTILE;
10144
10145 // same group - checks dependant only on our faction - skip FFA_PVP for example
10146 if (selfPlayerOwner->IsInRaidWith(targetPlayerOwner))
10147 return REP_FRIENDLY; // return true to allow config option AllowTwoSide.Interaction.Group to work
10148 // however client seems to allow mixed group parties, because in 13850 client it works like:
10149 // return GetFactionReactionTo(GetFactionTemplateEntry(), target);
10150 }
10151
10152 // check FFA_PVP
10153 if (IsFFAPvP() && target->IsFFAPvP())
10154 return REP_HOSTILE;
10155
10156 if (selfPlayerOwner)
10157 {
10158 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10159 {
10160 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10161 return *repRank;
10162 if (!selfPlayerOwner->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10163 {
10164 if (FactionEntry const* targetFactionEntry = sFactionStore.LookupEntry(targetFactionTemplateEntry->faction))
10165 {
10166 if (targetFactionEntry->CanHaveReputation())
10167 {
10168 // check contested flags
10169 if (targetFactionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10170 && selfPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10171 return REP_HOSTILE;
10172
10173 // if faction has reputation, hostile state depends only from AtWar state
10174 if (selfPlayerOwner->GetReputationMgr().IsAtWar(targetFactionEntry))
10175 return REP_HOSTILE;
10176 return REP_FRIENDLY;
10177 }
10178 }
10179 }
10180 }
10181 }
10182 }
10183 }
10184
10185 ReputationRank repRank = REP_HATED;
10186 if (!sScriptMgr->IfNormalReaction(this, target, repRank))
10187 {
10188 return ReputationRank(repRank);
10189 }
10190
10191 FactionTemplateEntry const* factionTemplateEntry = nullptr;
10192 if (checkOriginalFaction)
10193 {
10194 if (IsPlayer())
10195 {
10196 if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(getRace()))
10197 {
10198 factionTemplateEntry = sFactionTemplateStore.LookupEntry(rEntry->FactionID);
10199 }
10200 }
10201 else
10202 {
10203 Unit* owner = GetOwner();
10204 if (HasUnitTypeMask(UNIT_MASK_MINION) && owner)
10205 {
10206 factionTemplateEntry = sFactionTemplateStore.LookupEntry(owner->GetFaction());
10207 }
10208 else if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate())
10209 {
10210 factionTemplateEntry = sFactionTemplateStore.LookupEntry(cinfo->faction);
10211 }
10212 }
10213 }
10214
10215 if (!factionTemplateEntry)
10216 {
10217 factionTemplateEntry = GetFactionTemplateEntry();
10218 }
10219
10220 // do checks dependant only on our faction
10221 return GetFactionReactionTo(factionTemplateEntry, target);
10222}
DBCStorage< ChrRacesEntry > sChrRacesStore(ChrRacesEntryfmt)
@ REP_HATED
Definition SharedDefines.h:180
bool HasPlayerFlag(PlayerFlags flags) const
Definition Player.h:1126
bool IsAtWar(uint32 faction_id) const
Definition ReputationMgr.cpp:55
ReputationRank GetFactionReactionTo(FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
Definition Unit.cpp:10224
bool IsInRaidWith(Unit const *unit) const
Definition Unit.cpp:18830
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(), Player::HasPlayerFlag(), HasUnitFlag(), HasUnitFlag2(), HasUnitTypeMask(), ReputationMgr::IsAtWar(), IsFFAPvP(), IsInRaidWith(), Object::IsPlayer(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HATED, REP_HOSTILE, sChrRacesStore, sFactionStore, sFactionTemplateStore, sScriptMgr, Object::ToCreature(), 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 ThreatMgr.h:299

References _redirectThreatInfo, and RedirectThreatInfo::GetThreatPct().

Referenced by ThreatMgr::DoAddThreat().

◆ GetRedirectThreatTarget()

Unit * Unit::GetRedirectThreatTarget ( ) const

◆ GetResistance() [1/2]

uint32 Unit::GetResistance ( SpellSchoolMask  mask) const
20367{
20368 int32 resist = -1;
20369 for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
20370 if (mask & (1 << i) && (resist < 0 || resist > int32(GetResistance(SpellSchools(i)))))
20371 resist = int32(GetResistance(SpellSchools(i)));
20372
20373 // resist value will never be negative here
20374 return uint32(resist);
20375}

References GetResistance(), MAX_SPELL_SCHOOL, and SPELL_SCHOOL_NORMAL.

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

◆ GetResistance() [2/2]

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

References Object::GetUInt32Value(), and UNIT_FIELD_RESISTANCES.

◆ GetResistanceBuffMods()

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

◆ GetShapeshiftForm()

◆ GetSharedVisionList()

◆ GetSheath()

SheathState Unit::GetSheath ( ) const
inline
SheathState
Definition UnitDefines.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
1114 {
1115 uint32 value = GetShieldBlockValue();
1116 if (value >= hard_cap)
1117 {
1118 value = (soft_cap + hard_cap) / 2;
1119 }
1120 else if (value > soft_cap)
1121 {
1122 value = soft_cap + ((value - soft_cap) / 2);
1123 }
1124
1125 return value;
1126 }

References GetShieldBlockValue().

◆ GetSingleCastAuras() [1/2]

AuraList & Unit::GetSingleCastAuras ( )
inline

◆ GetSingleCastAuras() [2/2]

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

References m_scAuras.

◆ GetSpeed()

float Unit::GetSpeed ( UnitMoveType  mtype) const

◆ 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
15199{
15200 if (!spellInfo->RangeEntry)
15201 {
15202 return 0;
15203 }
15204
15205 if (spellInfo->RangeEntry->RangeMax[1] == spellInfo->RangeEntry->RangeMax[0])
15206 {
15207 return spellInfo->GetMaxRange();
15208 }
15209
15210 if (!target)
15211 {
15212 return spellInfo->GetMaxRange(true);
15213 }
15214
15215 return spellInfo->GetMaxRange(!IsHostileTo(target));
15216}

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

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

◆ GetSpellMinRangeForTarget()

float Unit::GetSpellMinRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15219{
15220 if (!spellInfo->RangeEntry)
15221 {
15222 return 0;
15223 }
15224
15225 if (spellInfo->RangeEntry->RangeMin[1] == spellInfo->RangeEntry->RangeMin[0])
15226 {
15227 return spellInfo->GetMinRange();
15228 }
15229
15230 return spellInfo->GetMinRange(!IsHostileTo(target));
15231}

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

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

◆ GetSpellModOwner()

Player * Unit::GetSpellModOwner ( ) const
16611{
16612 if (Player* player = const_cast<Unit*>(this)->ToPlayer())
16613 {
16614 return player;
16615 }
16616
16617 if (Unit* owner = GetOwner())
16618 {
16619 if (Player* player = owner->ToPlayer())
16620 {
16621 return player;
16622 }
16623 }
16624
16625 // Special handling for Eye of Kilrogg
16627 {
16628 if (TempSummon const* tempSummon = ToTempSummon())
16629 {
16630 if (Unit* summoner = tempSummon->GetSummonerUnit())
16631 {
16632 return summoner->ToPlayer();
16633 }
16634 }
16635 }
16636
16637 return nullptr;
16638}
@ 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(), SpellHealingBonusTaken(), Spell::SummonGuardian(), Spell::TakePower(), Spell::TakeRunePower(), Spell::UpdateChanneledTargetList(), and Aura::UpdateOwner().

◆ GetSpellSchoolByAuraGroup()

SpellSchools Unit::GetSpellSchoolByAuraGroup ( UnitMods  unitMod) const
15397{
15399
15400 switch (unitMod)
15401 {
15403 school = SPELL_SCHOOL_HOLY;
15404 break;
15406 school = SPELL_SCHOOL_FIRE;
15407 break;
15409 school = SPELL_SCHOOL_NATURE;
15410 break;
15412 school = SPELL_SCHOOL_FROST;
15413 break;
15415 school = SPELL_SCHOOL_SHADOW;
15416 break;
15418 school = SPELL_SCHOOL_ARCANE;
15419 break;
15420
15421 default:
15422 break;
15423 }
15424
15425 return school;
15426}
@ 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
@ UNIT_MOD_RESISTANCE_SHADOW
Definition Unit.h:161
@ UNIT_MOD_RESISTANCE_FROST
Definition Unit.h:160
@ UNIT_MOD_RESISTANCE_HOLY
Definition Unit.h:157
@ UNIT_MOD_RESISTANCE_ARCANE
Definition Unit.h:162
@ UNIT_MOD_RESISTANCE_FIRE
Definition Unit.h:158
@ UNIT_MOD_RESISTANCE_NATURE
Definition Unit.h:159

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
15429{
15430 Stats stat = STAT_STRENGTH;
15431
15432 switch (unitMod)
15433 {
15435 stat = STAT_STRENGTH;
15436 break;
15438 stat = STAT_AGILITY;
15439 break;
15441 stat = STAT_STAMINA;
15442 break;
15444 stat = STAT_INTELLECT;
15445 break;
15447 stat = STAT_SPIRIT;
15448 break;
15449
15450 default:
15451 break;
15452 }
15453
15454 return stat;
15455}
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
@ UNIT_MOD_STAT_INTELLECT
Definition Unit.h:146
@ UNIT_MOD_STAT_SPIRIT
Definition Unit.h:147
@ UNIT_MOD_STAT_STRENGTH
Definition Unit.h:143
@ UNIT_MOD_STAT_AGILITY
Definition Unit.h:144
@ UNIT_MOD_STAT_STAMINA
Definition Unit.h:145

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
912{ return m_ThreatMgr; }

References m_ThreatMgr.

Referenced by CreatureAI::_EnterEvadeMode(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_hazzarah::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_mor_grayhoof::CastRandomSpell(), CleanupBeforeRemoveFromMap(), 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::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(), 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(), boss_alar::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(), TemporaryThreatModifierEvent::Execute(), StartMovementEvent::Execute(), boss_supremus::FindHatefulStrikeTarget(), npc_raging_flames::FixateRandomTarget(), SmartScript::GetTargets(), UnitAI::GetThreatMgr(), debug_commandscript::HandleDebugThreatListCommand(), spell_karazhan_blink::HandleDummy(), spell_kaelthas_mind_control::HandleEffect(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_enveloping_webs::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), HandleProcTriggerSpell(), PetAI::HandleReturnMovement(), spell_pursue::HandleScript(), spell_gurtogg_eject::HandleScriptEffect(), spell_leotheras_whirlwind::HandleScriptEffect(), boss_attumen::IsSummonedBy(), boss_talon_king_ikiss::JustEngagedWith(), boss_blackheart_the_inciter::JustEngagedWith(), boss_teron_gorefiend::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_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), NonTankTargetSelector::operator()(), PowerUsersSelector::operator()(), MalleableGooSelector::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::StartAttack(), BossAI::TeleportCheaters(), Creature::Update(), Update(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_nefarian::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(), 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_the_lurker_below::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), boss_netherspite::UpdatePortals(), and CreatureAI::UpdateVictim().

◆ GetThreatMgr() [2/2]

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

References m_ThreatMgr.

◆ GetTotalAttackPowerValue()

float Unit::GetTotalAttackPowerValue ( WeaponAttackType  attType,
Unit pVictim = nullptr 
) const
15480{
15481 if (attType == RANGED_ATTACK)
15482 {
15484 if (victim)
15485 ap += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
15486
15487 if (ap < 0)
15488 return 0.0f;
15490 }
15491 else
15492 {
15494 if (victim)
15495 ap += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
15496
15497 if (ap < 0)
15498 return 0.0f;
15500 }
15501}
@ SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS
Definition SpellAuraDefines.h:190
@ SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS
Definition SpellAuraDefines.h:228
@ 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
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
5947{
5948 int32 modifier = 0;
5949 int32 areaModifier = 0;
5950
5951 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5952 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5953 {
5954 if ((*i)->GetSpellInfo()->HasAreaAuraEffect())
5955 {
5956 if (areaModifier < (*i)->GetAmount())
5957 areaModifier = (*i)->GetAmount();
5958 }
5959 else
5960 modifier += (*i)->GetAmount();
5961 }
5962
5963 return modifier + areaModifier;
5964}

References GetAuraEffectsByType().

Referenced by Player::UpdateSpellCritChance().

◆ GetTotalAuraModifierByAffectMask()

int32 Unit::GetTotalAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6123{
6124 int32 modifier = 0;
6125
6126 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6127 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6128 if ((*i)->IsAffectedOnSpell(affectedSpell))
6129 modifier += (*i)->GetAmount();
6130
6131 return modifier;
6132}

References GetAuraEffectsByType().

◆ GetTotalAuraModifierByMiscMask()

int32 Unit::GetTotalAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
6018{
6019 int32 modifier = 0;
6020
6021 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6022 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6023 {
6024 if ((*i)->GetMiscValue()& misc_mask)
6025 modifier += (*i)->GetAmount();
6026 }
6027 return modifier;
6028}

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
6071{
6072 int32 modifier = 0;
6073
6074 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6075 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6076 if ((*i)->GetMiscValue() == misc_value)
6077 modifier += (*i)->GetAmount();
6078
6079 return modifier;
6080}

References GetAuraEffectsByType().

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

◆ GetTotalAuraModValue()

float Unit::GetTotalAuraModValue ( UnitMods  unitMod) const
15370{
15371 if (unitMod >= UNIT_MOD_END)
15372 {
15373 LOG_ERROR("entities.unit", "attempt to access non-existing UnitMods in GetTotalAuraModValue()!");
15374 return 0.0f;
15375 }
15376
15377 if (m_auraModifiersGroup[unitMod][TOTAL_PCT] <= 0.0f)
15378 return 0.0f;
15379
15380 float value = m_auraModifiersGroup[unitMod][BASE_VALUE];
15381 value *= m_auraModifiersGroup[unitMod][BASE_PCT];
15382 value += m_auraModifiersGroup[unitMod][TOTAL_VALUE];
15383 value *= m_auraModifiersGroup[unitMod][TOTAL_PCT];
15384
15385 return value;
15386}

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
5981{
5982 float multiplier = 1.0f;
5983
5984 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5985 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5986 AddPct(multiplier, (*i)->GetAmount());
5987
5988 return multiplier;
5989}

References AddPct(), and GetAuraEffectsByType().

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

◆ GetTotalAuraMultiplierByAffectMask()

float Unit::GetTotalAuraMultiplierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6135{
6136 float multiplier = 1.0f;
6137
6138 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6139 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6140 if ((*i)->IsAffectedOnSpell(affectedSpell))
6141 AddPct(multiplier, (*i)->GetAmount());
6142
6143 return multiplier;
6144}

References AddPct(), and GetAuraEffectsByType().

◆ GetTotalAuraMultiplierByMiscMask()

float Unit::GetTotalAuraMultiplierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
6031{
6032 float multiplier = 1.0f;
6033
6034 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6035 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6036 if (((*i)->GetMiscValue() & misc_mask))
6037 AddPct(multiplier, (*i)->GetAmount());
6038
6039 return multiplier;
6040}

References AddPct(), and GetAuraEffectsByType().

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

◆ GetTotalAuraMultiplierByMiscValue()

float Unit::GetTotalAuraMultiplierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6083{
6084 float multiplier = 1.0f;
6085
6086 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6087 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6088 if ((*i)->GetMiscValue() == misc_value)
6089 AddPct(multiplier, (*i)->GetAmount());
6090
6091 return multiplier;
6092}

References AddPct(), and GetAuraEffectsByType().

Referenced by Player::UpdateEnergyRegen(), and Player::UpdateManaRegen().

◆ GetTotalStatValue()

float Unit::GetTotalStatValue ( Stats  stat,
float  additionalValue = 0.0f 
) const
15354{
15355 UnitMods unitMod = UnitMods(static_cast<uint16>(UNIT_MOD_STAT_START) + stat);
15356
15357 if (m_auraModifiersGroup[unitMod][TOTAL_PCT] <= 0.0f)
15358 return 0.0f;
15359
15360 // value = ((base_value * base_pct) + total_value) * total_pct
15361 float value = m_auraModifiersGroup[unitMod][BASE_VALUE] + GetCreateStat(stat);
15362 value *= m_auraModifiersGroup[unitMod][BASE_PCT];
15363 value += m_auraModifiersGroup[unitMod][TOTAL_VALUE] + additionalValue;
15364 value *= m_auraModifiersGroup[unitMod][TOTAL_PCT];
15365
15366 return value;
15367}
UnitMods
Definition Unit.h:142
@ UNIT_MOD_STAT_START
Definition Unit.h:170
float GetCreateStat(Stats stat) const
Definition Unit.h:1016

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
3717{
3718 if (Player const* player = ToPlayer())
3719 {
3720 if (player->CanBlock())
3721 {
3722 Item* tmpitem = player->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
3723 if (tmpitem && !tmpitem->IsBroken() && tmpitem->GetTemplate()->Block)
3725 }
3726 // is player but has no block ability or no not broken shield equipped
3727 return 0.0f;
3728 }
3729 else
3730 {
3731 if (ToCreature()->IsTotem())
3732 return 0.0f;
3733 else
3734 {
3735 float block = 5.0f;
3737 return block > 0.0f ? block : 0.0f;
3738 }
3739 }
3740}
@ EQUIPMENT_SLOT_OFFHAND
Definition Player.h:697
#define INVENTORY_SLOT_BAG_0
Definition Player.h:676
@ SPELL_AURA_MOD_BLOCK_PERCENT
Definition SpellAuraDefines.h:114
@ PLAYER_BLOCK_PERCENTAGE
Definition UpdateFields.h:346
bool IsBroken() const
Definition Item.h:257
uint32 Block
Definition ItemTemplate.h:674

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
3743{
3744 float crit;
3745
3746 if (IsPlayer())
3747 {
3748 switch (attackType)
3749 {
3750 case BASE_ATTACK:
3752 break;
3753 case OFF_ATTACK:
3755 break;
3756 case RANGED_ATTACK:
3758 break;
3759 // Just for good manner
3760 default:
3761 crit = 0.0f;
3762 break;
3763 }
3764 }
3765 else
3766 {
3767 crit = 5.0f;
3770 }
3771
3772 // flat aura mods
3773 if (attackType == RANGED_ATTACK)
3774 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE);
3775 else
3776 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE);
3777
3778 AuraEffectList const& mTotalAuraList = victim->GetAuraEffectsByType(SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER);
3779 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
3780 {
3781 if (GetGUID() != (*i)->GetCasterGUID())
3782 continue;
3783
3784 crit += (*i)->GetAmount();
3785 }
3786
3787 // reduce crit chance from Rating for players
3788 if (attackType != RANGED_ATTACK)
3789 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_MELEE);
3790 else
3791 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_RANGED);
3792
3793 // Apply crit chance from defence skill
3794 crit += (int32(GetMaxSkillValueForLevel(victim)) - int32(victim->GetDefenseSkillValue(this))) * 0.04f;
3795
3796 // xinef: SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE should be calculated at the end
3797 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE);
3798
3799 if (crit < 0.0f)
3800 crit = 0.0f;
3801 return crit;
3802}
@ 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
@ PLAYER_RANGED_CRIT_PERCENTAGE
Definition UpdateFields.h:352
@ PLAYER_CRIT_PERCENTAGE
Definition UpdateFields.h:351
@ PLAYER_OFFHAND_CRIT_PERCENTAGE
Definition UpdateFields.h:353
uint16 GetMaxSkillValueForLevel(Unit const *target=nullptr) const
Definition Unit.h:1146

References ApplyResilience(), BASE_ATTACK, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, GetAuraEffectsByType(), GetDefenseSkillValue(), Object::GetFloatValue(), Object::GetGUID(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), Object::IsPlayer(), 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, and SPELL_AURA_MOD_WEAPON_CRIT_PERCENT.

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

◆ GetUnitDodgeChance()

float Unit::GetUnitDodgeChance ( ) const
3655{
3656 if (IsPlayer())
3657 return ToPlayer()->GetRealDodge(); //GetFloatValue(PLAYER_DODGE_PERCENTAGE);
3658 else
3659 {
3660 if (ToCreature()->IsTotem())
3661 return 0.0f;
3662 else
3663 {
3664 float dodge = ToCreature()->isWorldBoss() ? 5.85f : 5.0f; // Xinef: bosses should have 6.5% dodge (5.9 + 0.6 from defense skill difference)
3666 return dodge > 0.0f ? dodge : 0.0f;
3667 }
3668 }
3669}
@ SPELL_AURA_MOD_DODGE_PERCENT
Definition SpellAuraDefines.h:112
float GetRealDodge() const
Definition Player.h:2618

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

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitFlags()

◆ GetUnitFlags2()

UnitFlags2 Unit::GetUnitFlags2 ( ) const
inline

Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h.

UnitFlags2
Definition UnitDefines.h:287
@ UNIT_FIELD_FLAGS_2
Definition UpdateFields.h:118

References Object::GetUInt32Value(), and UNIT_FIELD_FLAGS_2.

Referenced by npc_commandscript::HandleNpcInfoCommand().

◆ GetUnitMeleeSkill()

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

References GetLevel(), and getLevelForTarget().

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

◆ GetUnitMissChance()

float Unit::GetUnitMissChance ( WeaponAttackType  attType) const
3702{
3703 float miss_chance = 5.00f;
3704
3705 if (Player const* player = ToPlayer())
3706 miss_chance += player->GetMissPercentageFromDefence();
3707
3708 if (attType == RANGED_ATTACK)
3710 else
3712
3713 return miss_chance;
3714}
@ 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
3672{
3673 float chance = 0.0f;
3674
3675 if (Player const* player = ToPlayer())
3676 {
3677 if (player->CanParry())
3678 {
3679 Item* tmpitem = player->GetWeaponForAttack(BASE_ATTACK, true);
3680 if (!tmpitem)
3681 tmpitem = player->GetWeaponForAttack(OFF_ATTACK, true);
3682
3683 if (tmpitem)
3684 chance = player->GetRealParry(); //GetFloatValue(PLAYER_PARRY_PERCENTAGE);
3685 }
3686 }
3687 else if (IsCreature())
3688 {
3689 if (ToCreature()->isWorldBoss())
3690 chance = 13.4f; // + 0.6 by skill diff
3692 chance = 5.0f;
3693
3694 // Xinef: if aura is present, type should not matter
3696 }
3697
3698 return chance > 0.0f ? chance : 0.0f;
3699}
@ SPELL_AURA_MOD_PARRY_PERCENT
Definition SpellAuraDefines.h:110

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

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

◆ GetUnitState()

uint32 Unit::GetUnitState ( ) const
inline

◆ GetUnitTypeMask()

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

References m_unitTypeMask.

◆ GetVehicle()

Vehicle * Unit::GetVehicle ( ) const
inline
1846{ 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::HandleDummy(), spell_fight_fire_bomber::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(), 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_gunship::npc_gunshipAI::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()

◆ GetVehicleCreatureBase()

◆ GetVehicleKit()

Vehicle * Unit::GetVehicleKit ( ) const
inline
1845{ 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(), Object::BuildMovementUpdate(), spell_igb_cannon_blast::CalculatePower(), Aura::CanStackWith(), spell_demolisher_ride_vehicle::CheckCast(), SmartAI::CheckConditions(), VehicleAI::CheckConditions(), Map::CreatureRelocation(), MotionTransport::DelayedTeleportTransport(), 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::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_aura::OnApply(), VehicleAI::OnCharmed(), spell_blood_queen_frenzied_bloodthirst_aura::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(), 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
862{ return m_attacking; }

References m_attacking.

Referenced by boss_marli::_chargePlayer(), PetAI::_needToStop(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), SmartAI::AssistPlayerInCombatAgainst(), PetAI::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(), Spell::CheckCast(), boss_mandokir::boss_mandokirAI::DamageDealt(), boss_isalien::DamageTaken(), 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_sacrolash::DoAction(), boss_alythess::DoAction(), boss_skadi::boss_skadiAI::DoAction(), UnitAI::DoCast(), UnitAI::DoCastVictim(), ConfusedMovementGenerator< T >::DoFinalize(), Creature::DoFleeToGetAssistance(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), ScriptedAI::DoStopAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectTaunt(), boss_ouro::Emerge(), AssistDelayEvent::Execute(), 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::FilterTargets(), spell_malchezaar_enfeeble::FilterTargets(), spell_chain_burn::FilterTargets(), spell_morogrim_tidewalker_watery_grave::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_attumen::IsSummonedBy(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), npc_malchezaar_axe::JustEngagedWith(), boss_shade_of_aran::JustEngagedWith(), boss_akilzon::JustEngagedWith(), boss_zuljin::JustEngagedWith(), npc_zealot_zath::JustEngagedWith(), npc_yor::JustEngagedWith(), npc_flame_of_azzinoth::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_nethermancer_sepethrea::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), boss_sacrolash::JustEngagedWith(), boss_alythess::JustEngagedWith(), boss_nalorakk::JustEngagedWith(), boss_vem::JustEngagedWith(), boss_veklor::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_midnight::JustSummoned(), boss_nightbane::JustSummoned(), boss_halazzi::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::Land(), CreatureGroup::LeaderMoveTo(), CreatureGroup::MemberEngagingTarget(), SmartAI::MoveAway(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::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_nightbane::MovementInform(), boss_bug_trio::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), boss_felmyst::MovementInform(), boss_kaelthas::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()(), VampiricBiteTargetSelector::operator()(), BoneStormMoveTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), WebTargetSelector::operator()(), UnboundPlagueTargetSelector::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), boss_nefarian::PathEndReached(), SmartScript::ProcessEvent(), SmartScript::ProcessEventsFor(), SmartScript::ProcessTimedAction(), 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_kiljaeden::ScheduleBasicAbilities(), npc_sunblade_scout::ScheduleCombat(), npc_amanishi_scout::ScheduleCombat(), boss_magtheridon::ScheduleCombatEvents(), npc_thaladred::ScheduleEvents(), boss_nightbane::ScheduleFly(), boss_the_lurker_below::SchedulerPhaseOne(), npc_giant_claw_tentacle::ScheduleTasks(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), PetAI::SelectNextTarget(), SmartAI::SetCombatMove(), SetConfused(), SetFeared(), 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(), SummonCroneIfReady(), boss_akilzon::SummonEagles(), 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(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::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_arlokk::boss_arlokkAI::UpdateAI(), boss_hazzarah::UpdateAI(), boss_headless_horseman::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_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::UpdateAI(), boss_keristrasza::UpdateAI(), npc_crystalline_frayer::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::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::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_gathios_the_shatterer::UpdateAI(), boss_lady_malande::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::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(), 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_dark_fiend::UpdateAI(), npc_zuljin_vortex::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_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), Player::UpdateFFAPvPFlag(), Player::UpdateFFAPvPState(), SmartAI::UpdatePath(), boss_netherspite::UpdatePortals(), CreatureAI::UpdateVictim(), CreatureAI::UpdateVictimWithGaze(), and boss_hexlord_malacrass::UseAbility().

◆ GetVirtualItemId()

uint32 Unit::GetVirtualItemId ( uint32  slot) const
21199{
21200 if (slot >= MAX_EQUIPMENT_ITEMS)
21201 return 0;
21202
21204}
#define MAX_EQUIPMENT_ITEMS
Definition CreatureData.h:35
@ UNIT_VIRTUAL_ITEM_SLOT_ID
Definition UpdateFields.h:116

References Object::GetUInt32Value(), MAX_EQUIPMENT_ITEMS, and UNIT_VIRTUAL_ITEM_SLOT_ID.

◆ GetVisibleAura()

AuraApplication * Unit::GetVisibleAura ( uint8  slot)
inline
1474 {
1475 VisibleAuraMap::iterator itr = m_visibleAuras.find(slot);
1476 if (itr != m_visibleAuras.end())
1477 return itr->second;
1478 return nullptr;
1479 }

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
15504{
15505 if (attType == OFF_ATTACK && !HasOffhandWeaponForAttack())
15506 return 0.0f;
15507
15508 return m_weaponDamage[attType][type][damageIndex];
15509}

References HasOffhandWeaponForAttack(), m_weaponDamage, and OFF_ATTACK.

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

◆ GetWeaponProcChance()

float Unit::GetWeaponProcChance ( ) const
13485{
13486 // normalized proc chance for weapon attack speed
13487 // (odd formula...)
13489 return (GetAttackTime(BASE_ATTACK) * 1.8f / 1000.0f);
13491 return (GetAttackTime(OFF_ATTACK) * 1.6f / 1000.0f);
13492 return 0;
13493}

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

Referenced by Player::CastItemCombatSpell().

◆ GetWeaponSkillValue()

uint32 Unit::GetWeaponSkillValue ( WeaponAttackType  attType,
Unit const *  target = nullptr 
) const
3805{
3806 uint32 value = 0;
3807 if (Player const* player = ToPlayer())
3808 {
3809 Item* item = player->GetWeaponForAttack(attType, true);
3810
3811 // feral or unarmed skill only for base attack
3812 if (attType != BASE_ATTACK && !item)
3813 return 0;
3814
3815 if (IsInFeralForm())
3816 return GetMaxSkillValueForLevel(); // always maximized SKILL_FERAL_COMBAT in fact
3817
3818 // weapon skill or (unarmed for base attack)
3819 uint32 skill = SKILL_UNARMED;
3820 if (item)
3821 skill = item->GetSkill();
3822
3823 // in PvP use full skill instead current skill value
3824 value = (target && target->IsControlledByPlayer())
3825 ? player->GetMaxSkillValue(skill)
3826 : player->GetSkillValue(skill);
3827 // Modify value from ratings
3828 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL));
3829 switch (attType)
3830 {
3831 case BASE_ATTACK:
3832 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_MAINHAND));
3833 break;
3834 case OFF_ATTACK:
3835 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_OFFHAND));
3836 break;
3837 case RANGED_ATTACK:
3838 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_RANGED));
3839 break;
3840 default:
3841 break;
3842 }
3843 }
3844 else
3845 value = GetUnitMeleeSkill(target);
3846 return value;
3847}
@ SKILL_UNARMED
Definition SharedDefines.h:2907
@ CR_WEAPON_SKILL_RANGED
Definition Unit.h:239
@ CR_WEAPON_SKILL
Definition Unit.h:217
@ CR_WEAPON_SKILL_OFFHAND
Definition Unit.h:238
@ CR_WEAPON_SKILL_MAINHAND
Definition Unit.h:237
uint32 GetSkill()
Definition Item.cpp:555
bool IsInFeralForm() const
Definition Unit.h:1880

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(), 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
8782{
8783 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
8784
8785 switch (dummySpell->SpellFamilyName)
8786 {
8788 switch (dummySpell->Id)
8789 {
8790 // Nevermelting Ice Crystal
8791 case 71564:
8792 RemoveAuraFromStack(71564);
8793 *handled = true;
8794 break;
8795 // Gaseous Bloat
8796 case 70672:
8797 case 72455:
8798 case 72832:
8799 case 72833:
8800 {
8801 if (Unit* caster = triggeredByAura->GetCaster())
8802 if (victim && caster->GetGUID() == victim->GetGUID())
8803 {
8804 *handled = true;
8805 uint32 stack = triggeredByAura->GetStackAmount();
8806 int32 const mod = (GetMap()->GetSpawnMode() & 1) ? 1500 : 1250;
8807 int32 dmg = 0;
8808 for (uint8 i = 1; i <= stack; ++i)
8809 dmg += mod * i;
8810 caster->CastCustomSpell(70701, SPELLVALUE_BASE_POINT0, dmg);
8811 }
8812 break;
8813 }
8814 // Ball of Flames Proc
8815 case 71756:
8816 case 72782:
8817 case 72783:
8818 case 72784:
8819 RemoveAuraFromStack(dummySpell->Id);
8820 *handled = true;
8821 break;
8822 // Discerning Eye of the Beast
8823 case 59915:
8824 {
8825 CastSpell(this, 59914, true); // 59914 already has correct basepoints in DBC, no need for custom bp
8826 *handled = true;
8827 break;
8828 }
8829 // Swift Hand of Justice
8830 case 59906:
8831 {
8832 int32 bp0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_0]. CalcValue());
8833 CastCustomSpell(this, 59913, &bp0, nullptr, nullptr, true);
8834 *handled = true;
8835 break;
8836 }
8837 }
8838
8839 break;
8840 case SPELLFAMILY_MAGE:
8841 {
8842 // Combustion
8843 switch (dummySpell->Id)
8844 {
8845 case 11129:
8846 {
8847 *handled = true;
8848 Unit* caster = triggeredByAura->GetCaster();
8849 if (!caster || !damage)
8850 return false;
8851
8852 // last charge and crit
8853 if (triggeredByAura->GetCharges() <= 1 && (procEx & PROC_EX_CRITICAL_HIT))
8854 return true; // charge counting (will removed)
8855
8856 CastSpell(this, 28682, true);
8857
8858 return procEx & PROC_EX_CRITICAL_HIT;
8859 }
8860 // Empowered Fire
8861 case 31656:
8862 case 31657:
8863 case 31658:
8864 {
8865 *handled = true;
8866
8867 SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(67545);
8868 if (!spInfo)
8869 return false;
8870
8871 int32 bp0 = int32(CalculatePct(GetMaxPower(POWER_MANA), spInfo->Effects[0].CalcValue()));
8872 CastCustomSpell(this, 67545, &bp0, nullptr, nullptr, true, nullptr, triggeredByAura->GetEffect(EFFECT_0), GetGUID());
8873 return true;
8874 }
8875 }
8876 break;
8877 }
8879 {
8880 // Blood of the North
8881 // Reaping
8882 // Death Rune Mastery
8883 // xinef: Icon 22 is used for item bonus, skip
8884 if (dummySpell->SpellIconID == 3041 || (dummySpell->SpellIconID == 22 && dummySpell->Id != 62459) || dummySpell->SpellIconID == 2622)
8885 {
8886 *handled = true;
8887 // Convert recently used Blood Rune to Death Rune
8888 if (Player* player = ToPlayer())
8889 {
8890 if (!player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
8891 return false;
8892
8893 // xinef: not true
8894 //RuneType rune = ToPlayer()->GetLastUsedRune();
8895 // can't proc from death rune use
8896 //if (rune == RUNE_DEATH)
8897 // return false;
8898 AuraEffect* aurEff = triggeredByAura->GetEffect(EFFECT_0);
8899 if (!aurEff)
8900 return false;
8901
8902 // Reset amplitude - set death rune remove timer to 30s
8903 aurEff->ResetPeriodic(true);
8904 uint32 runesLeft;
8905
8906 if (dummySpell->SpellIconID == 2622)
8907 runesLeft = 2;
8908 else
8909 runesLeft = 1;
8910
8911 for (uint8 i = 0; i < MAX_RUNES && runesLeft; ++i)
8912 {
8913 if (dummySpell->SpellIconID == 2622)
8914 {
8915 if (player->GetCurrentRune(i) == RUNE_DEATH ||
8916 player->GetBaseRune(i) == RUNE_BLOOD)
8917 continue;
8918 }
8919 else
8920 {
8921 if (player->GetCurrentRune(i) == RUNE_DEATH ||
8922 player->GetBaseRune(i) != RUNE_BLOOD)
8923 continue;
8924 }
8925 if (player->GetRuneCooldown(i) != player->GetRuneBaseCooldown(i, false))
8926 continue;
8927
8928 --runesLeft;
8929 // Mark aura as used
8930 player->AddRuneByAuraEffect(i, RUNE_DEATH, aurEff);
8931 }
8932 return true;
8933 }
8934 return false;
8935 }
8936 break;
8937 }
8939 {
8940 switch (dummySpell->Id)
8941 {
8942 // Item - Warrior T10 Protection 4P Bonus
8943 case 70844:
8944 {
8945 int32 basepoints0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_1]. CalcValue());
8946 CastCustomSpell(this, 70845, &basepoints0, nullptr, nullptr, true);
8947 break;
8948 }
8949 default:
8950 break;
8951 }
8952 break;
8953 }
8954 case SPELLFAMILY_SHAMAN:
8955 {
8956 // Flurry
8957 if ((dummySpell->SpellFamilyFlags[1] & 0x00000200) != 0)
8958 {
8959 if (cooldown)
8960 {
8961 if (HasSpellCooldown(dummySpell->Id))
8962 {
8963 *handled = true;
8964 break;
8965 }
8966
8967 AddSpellCooldown(dummySpell->Id, 0, cooldown);
8968 }
8969 }
8970 break;
8971 }
8972 }
8973 return false;
8974}
@ RUNE_DEATH
Definition Player.h:418
@ RUNE_BLOOD
Definition Player.h:415
@ 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
void ResetPeriodic(bool resetPeriodicTimer=false)
Definition SpellAuraEffects.h:89
AuraEffect * GetEffect(uint8 effIndex) const
Definition SpellAuras.h:175
uint8 GetSpawnMode() const
Definition Map.h:267
virtual bool HasSpellCooldown(uint32) const
Definition Unit.h:1276
virtual void AddSpellCooldown(uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
Definition Unit.h:1278
void RemoveAuraFromStack(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4958

References AddSpellCooldown(), CalculatePct(), CastCustomSpell(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, EFFECT_0, EFFECT_1, SpellInfo::Effects, Aura::GetCaster(), Aura::GetCharges(), Aura::GetEffect(), Object::GetGUID(), 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
17685{
17686 // aura can be deleted at casts
17687 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17688
17689 uint32 damageSpellId;
17690 switch (spellProto->Id)
17691 {
17692 case 57949: // shiver
17693 damageSpellId = 57952;
17694 //animationSpellId = 57951; dummy effects for jump spell have unknown use (see also 41637)
17695 break;
17696 case 59978: // shiver
17697 damageSpellId = 59979;
17698 break;
17699 case 43593: // Cold Stare
17700 damageSpellId = 43594;
17701 break;
17702 default:
17703 LOG_ERROR("entities.unit", "Unit::HandleAuraRaidProcFromCharge, received unhandled spell: {}", spellProto->Id);
17704 return false;
17705 }
17706
17707 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17708
17709 // jumps
17710 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17711
17712 // current aura expire
17713 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17714
17715 // next target selection
17716 if (jumps > 0)
17717 {
17718 if (Unit* caster = triggeredByAura->GetCaster())
17719 {
17720 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17721 if (Unit* target = GetNextRandomRaidMemberOrPet(radius))
17722 {
17723 CastSpell(target, spellProto, true, nullptr, triggeredByAura, caster_guid);
17724 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17725 aura->SetCharges(jumps);
17726 }
17727 }
17728 }
17729
17730 CastSpell(this, damageSpellId, true, nullptr, triggeredByAura, caster_guid);
17731
17732 return true;
17733}
void SetCharges(uint8 charges)
Definition SpellAuras.cpp:952
Unit * GetNextRandomRaidMemberOrPet(float radius)
Definition Unit.cpp:11158

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
17596{
17597 // aura can be deleted at casts
17598 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17599 int32 heal = triggeredByAura->GetAmount();
17600 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17601
17602 // Currently only Prayer of Mending
17603 if (!(spellProto->SpellFamilyName == SPELLFAMILY_PRIEST && spellProto->SpellFamilyFlags[1] & 0x20))
17604 {
17605 LOG_DEBUG("spells.aura", "Unit::HandleAuraRaidProcFromChargeWithValue, received not handled spell: {}", spellProto->Id);
17606 return false;
17607 }
17608
17609 // jumps
17610 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17611
17612 // current aura expire
17613 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17614
17615 // next target selection
17616 if (jumps > 0)
17617 {
17618 if (Unit* caster = triggeredByAura->GetCaster())
17619 {
17620 // smart healing
17621 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17622 std::list<Unit*> nearMembers;
17623
17624 Player* player = nullptr;
17625 if (IsPlayer())
17626 player = ToPlayer();
17627 else if (GetOwner())
17628 player = GetOwner()->ToPlayer();
17629
17630 if (player)
17631 {
17632 Group* group = player->GetGroup();
17633 if (!group)
17634 {
17635 if (player != this)
17636 {
17637 if (IsWithinDistInMap(player, radius))
17638 nearMembers.push_back(player);
17639 }
17640 else if (Unit* pet = GetGuardianPet())
17641 {
17642 if (IsWithinDistInMap(pet, radius))
17643 nearMembers.push_back(pet);
17644 }
17645 }
17646 else
17647 {
17648 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
17649 if (Player* Target = itr->GetSource())
17650 {
17651 if (Target != this && !IsWithinDistInMap(Target, radius))
17652 continue;
17653
17654 // IsHostileTo check duel and controlled by enemy
17655 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
17656 nearMembers.push_back(Target);
17657
17658 // Push player's pet to vector
17659 if (Unit* pet = Target->GetGuardianPet())
17660 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
17661 nearMembers.push_back(pet);
17662 }
17663 }
17664
17665 if (!nearMembers.empty())
17666 {
17667 nearMembers.sort(Acore::HealthPctOrderPred());
17668 if (Unit* target = nearMembers.front())
17669 {
17670 CastSpell(target, 41637 /*Dummy visual effect triggered by main spell cast*/, true);
17671 CastCustomSpell(target, spellProto->Id, &heal, nullptr, nullptr, true, nullptr, triggeredByAura, caster_guid);
17672 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17673 aura->SetCharges(jumps);
17674 }
17675 }
17676 }
17677 }
17678 }
17679
17680 // heal
17681 CastCustomSpell(this, 33110, &heal, nullptr, nullptr, true, nullptr, nullptr, caster_guid);
17682 return true;
17683}
@ SPELLFAMILY_PRIEST
Definition SharedDefines.h:3534
Definition Unit.h:2217

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(), SpellInfo::Id, IsHostileTo(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), LOG_DEBUG, Aura::SetCharges(), SPELLFAMILY_PRIEST, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and Object::ToPlayer().

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

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, SpellChainNode::first, 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(), Object::GetGUID(), ProcEventInfo::GetHealInfo(), Player::GetItemByGuid(), Aura::GetMaxDuration(), SpellInfo::GetMaxDuration(), GetMaxPower(), GetOwner(), Spell::GetPowerCost(), getPowerType(), ProcEventInfo::GetProcSpell(), Player::GetReputationRank(), SpellInfo::GetSchoolMask(), Player::GetSelectedUnit(), Item::GetSlot(), Player::GetSpellCooldowns(), AuraEffect::GetSpellInfo(), Player::GetSpellMap(), Aura::GetStackAmount(), GetVictim(), HasActivePowerType(), HasAura(), Position::HasInArc(), HasOffhandWeaponForAttack(), Player::HasSpellCooldown(), HasSpellCooldown(), HealthBelowPct(), SpellInfo::Id, IN_MILLISECONDS, irand(), IsAlive(), Object::IsCreature(), Item::IsEquipped(), IsFriendlyTo(), Object::IsPlayer(), 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(), and urand().

Referenced by ProcDamageAndSpellFor().

◆ HandleEmoteCommand()

void Unit::HandleEmoteCommand ( uint32  emoteId)
2013{
2015 packet.EmoteID = emoteId;
2016 packet.Guid = GetGUID();
2017 SendMessageToSet(packet.Write(), true);
2018}
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_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), boss_viscidus::DamageTaken(), DealMeleeDamage(), boss_twinemperorsAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), boss_felblood_kaelthas::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::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_maiev_illidan::IsSummonedBy(), npc_akama_illidan::JustReachedHome(), 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(), boss_illidan_stormrage::MovementInform(), npc_akama_illidan::MovementInform(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::MovementInform(), boss_felmyst::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), boss_nightbane::PathEndReached(), 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(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_felmyst::ScheduleGroundAbilities(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), CreatureTextMgr::SendEmote(), boss_grand_warlock_nethekurse::SetData(), npc_harrison_jones::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_felmyst::StartIntro(), boss_ahune::Submerge(), boss_nightbane::TriggerHealthTakeOff(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::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::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(), npc_minigob_manabonk::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
9902{
9903 int32 scriptId = triggeredByAura->GetMiscValue();
9904
9905 if (!victim || !victim->IsAlive())
9906 return false;
9907
9908 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
9909 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
9910
9911 uint32 triggered_spell_id = 0;
9912
9913 switch (scriptId)
9914 {
9915 case 836: // Improved Blizzard (Rank 1)
9916 {
9917 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9918 return false;
9919 triggered_spell_id = 12484;
9920 break;
9921 }
9922 case 988: // Improved Blizzard (Rank 2)
9923 {
9924 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9925 return false;
9926 triggered_spell_id = 12485;
9927 break;
9928 }
9929 case 989: // Improved Blizzard (Rank 3)
9930 {
9931 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9932 return false;
9933 triggered_spell_id = 12486;
9934 break;
9935 }
9936 case 4533: // Dreamwalker Raiment 2 pieces bonus
9937 {
9938 // Chance 50%
9939 if (!roll_chance_i(50))
9940 return false;
9941
9942 switch (victim->getPowerType())
9943 {
9944 case POWER_MANA:
9945 triggered_spell_id = 28722;
9946 break;
9947 case POWER_RAGE:
9948 triggered_spell_id = 28723;
9949 break;
9950 case POWER_ENERGY:
9951 triggered_spell_id = 28724;
9952 break;
9953 default:
9954 return false;
9955 }
9956 break;
9957 }
9958 case 4537: // Dreamwalker Raiment 6 pieces bonus
9959 triggered_spell_id = 28750; // Blessing of the Claw
9960 break;
9961 case 5497: // Improved Mana Gems
9962 triggered_spell_id = 37445; // Mana Surge
9963 break;
9964 case 7010: // Revitalize - can proc on full hp target
9965 case 7011:
9966 case 7012:
9967 {
9968 if (!roll_chance_i(triggeredByAura->GetAmount()))
9969 return false;
9970 switch (victim->getPowerType())
9971 {
9972 case POWER_MANA:
9973 triggered_spell_id = 48542;
9974 break;
9975 case POWER_RAGE:
9976 triggered_spell_id = 48541;
9977 break;
9978 case POWER_ENERGY:
9979 triggered_spell_id = 48540;
9980 break;
9981 case POWER_RUNIC_POWER:
9982 triggered_spell_id = 48543;
9983 break;
9984 default:
9985 break;
9986 }
9987 break;
9988 }
9989 default:
9990 break;
9991 }
9992
9993 // not processed
9994 if (!triggered_spell_id)
9995 return false;
9996
9997 // standard non-dummy case
9998 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
9999
10000 if (!triggerEntry)
10001 {
10002 LOG_ERROR("entities.unit", "Unit::HandleOverrideClassScriptAuraProc: Spell {} triggering for class script id {}", triggered_spell_id, scriptId);
10003 return false;
10004 }
10005
10006 if (cooldown)
10007 {
10008 if (HasSpellCooldown(triggered_spell_id))
10009 return false;
10010
10011 AddSpellCooldown(triggered_spell_id, 0, cooldown);
10012 }
10013
10014 CastSpell(victim, triggered_spell_id, true, castItem, triggeredByAura);
10015
10016 return true;
10017}

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

Referenced by ProcDamageAndSpellFor().

◆ HandleProcExtraAttackFor()

void Unit::HandleProcExtraAttackFor ( Unit victim,
uint32  count 
)
2773{
2774 while (count)
2775 {
2776 --count;
2777 AttackerStateUpdate(victim, BASE_ATTACK, true);
2778 }
2779}
void AttackerStateUpdate(Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
Definition Unit.cpp:2577

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

References Player::AddSpellCooldown(), AddSpellCooldown(), AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, CalculatePct(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_CONTEXT_ABILITY, 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(), GetCompanionPet(), GetCreateHealth(), GetCreateMana(), AuraEffect::GetEffIndex(), Object::GetEntry(), GetFirstSchoolInMask(), Object::GetFloatValue(), Object::GetGUID(), Object::GetGUID(), AuraEffect::GetId(), Player::GetItemByGuid(), GetLastExtraAttackSpell(), SpellInfo::GetMaxDuration(), Player::GetPet(), ProcEventInfo::GetProcSpell(), SpellInfo::GetRank(), SpellInfo::GetSchoolMask(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), Aura::GetStackAmount(), GetStat(), GetThreatMgr(), GetTotalAttackPowerValue(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), SpellInfo::HasEffect(), Creature::HasMechanicTemplateImmunity(), HasSpellCooldown(), HealthAbovePct(), HealthBelowPct(), HealthBelowPctDamaged(), SpellInfo::Id, IsAlive(), Player::IsBaseRuneSlotsOnCooldown(), Player::IsClass(), IsClass(), Object::IsPlayer(), SpellInfo::IsPositive(), LOG_ERROR, 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_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, Object::ToCreature(), Object::ToPlayer(), UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MINDAMAGE, and UNIT_FIELD_MINOFFHANDDAMAGE.

Referenced by ProcDamageAndSpellFor().

◆ HandleSafeUnitPointersOnDelete()

void Unit::HandleSafeUnitPointersOnDelete ( Unit thisUnit)
static
4363{
4364 if (thisUnit->SafeUnitPointerSet.empty())
4365 return;
4366 for (std::set<SafeUnitPointer*>::iterator itr = thisUnit->SafeUnitPointerSet.begin(); itr != thisUnit->SafeUnitPointerSet.end(); ++itr)
4367 (*itr)->UnitDeleted();
4368
4369 thisUnit->SafeUnitPointerSet.clear();
4370}

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

19588{
19589 Creature* creature = ToCreature();
19590 if (creature && creature->IsAIEnabled)
19591 {
19592 if (!creature->AI()->BeforeSpellClick(clicker))
19593 {
19594 return false;
19595 }
19596 }
19597
19598 bool result = false;
19599 uint32 spellClickEntry = GetVehicleKit() ? GetVehicleKit()->GetCreatureEntry() : GetEntry();
19600 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(spellClickEntry);
19601 for (SpellClickInfoContainer::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr)
19602 {
19604 if (!itr->second.IsFitToRequirements(clicker, this))
19605 continue;
19606
19608 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(spellClickEntry, itr->second.spellId);
19609 ConditionSourceInfo info = ConditionSourceInfo(clicker, this);
19610 if (!sConditionMgr->IsObjectMeetToConditions(info, conds))
19611 continue;
19612
19613 Unit* caster = (itr->second.castFlags & NPC_CLICK_CAST_CASTER_CLICKER) ? clicker : this;
19614 Unit* target = (itr->second.castFlags & NPC_CLICK_CAST_TARGET_CLICKER) ? clicker : this;
19615 ObjectGuid origCasterGUID = (itr->second.castFlags & NPC_CLICK_CAST_ORIG_CASTER_OWNER) ? GetOwnerGUID() : clicker->GetGUID();
19616
19617 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->second.spellId);
19618
19619 // xinef: dont allow players to enter vehicles on arena
19620 if (spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) && caster->IsPlayer() && caster->FindMap() && caster->FindMap()->IsBattleArena())
19621 continue;
19622
19623 if (seatId > -1)
19624 {
19625 uint8 i = 0;
19626 bool valid = false;
19627 while (i < MAX_SPELL_EFFECTS)
19628 {
19629 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_CONTROL_VEHICLE)
19630 {
19631 valid = true;
19632 break;
19633 }
19634 ++i;
19635 }
19636
19637 if (!valid)
19638 {
19639 LOG_ERROR("sql.sql", "Spell {} specified in npc_spellclick_spells is not a valid vehicle enter aura!", itr->second.spellId);
19640 continue;
19641 }
19642
19643 if (IsInMap(caster))
19644 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);
19645 else // This can happen during Player::_LoadAuras
19646 {
19648 for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j)
19649 bp0[j] = spellInfo->Effects[j].BasePoints;
19650
19651 bp0[i] = seatId;
19652 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, bp0, nullptr, origCasterGUID);
19653 }
19654 }
19655 else
19656 {
19657 if (IsInMap(caster))
19658 caster->CastSpell(target, spellInfo, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19659 else
19660 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, nullptr, nullptr, origCasterGUID);
19661 }
19662
19663 result = true;
19664 }
19665
19666 if (creature && creature->IsAIEnabled)
19667 creature->AI()->OnSpellClick(clicker, result);
19668
19669 return result;
19670}
#define sConditionMgr
Definition ConditionMgr.h:290
std::list< Condition * > ConditionList
Definition ConditionMgr.h:237
std::pair< SpellClickInfoContainer::const_iterator, SpellClickInfoContainer::const_iterator > SpellClickInfoMapBounds
Definition ObjectMgr.h:408
@ 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
SpellValueMod
Definition SpellDefines.h:112
virtual void OnSpellClick(Unit *, bool &)
Definition CreatureAI.h:203
virtual bool BeforeSpellClick(Unit *)
Definition CreatureAI.h:201
bool IsBattleArena() const
Definition Map.h:302
bool HasAura(AuraType aura) const
Definition SpellInfo.cpp:893
uint32 GetCreatureEntry() const
Definition Vehicle.h:39
Map * FindMap() const
Definition Object.h:538
Definition ConditionMgr.h:182

References Creature::AI(), CreatureAI::BeforeSpellClick(), CastCustomSpell(), CastSpell(), SpellInfo::Effects, WorldObject::FindMap(), Vehicle::GetCreatureEntry(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), GetVehicleKit(), SpellInfo::HasAura(), IsAIEnabled, Map::IsBattleArena(), WorldObject::IsInMap(), Object::IsPlayer(), 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, and Aura::TryRefreshStackOrCreate().

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 
)
15255{
15256 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
15257 {
15258 LOG_ERROR("entities.unit", "ERROR in HandleStatModifier(): non-existing UnitMods or wrong UnitModifierType!");
15259 return false;
15260 }
15261
15262 switch (modifierType)
15263 {
15264 case BASE_VALUE:
15265 case TOTAL_VALUE:
15266 m_auraModifiersGroup[unitMod][modifierType] += apply ? amount : -amount;
15267 break;
15268 case BASE_PCT:
15269 case TOTAL_PCT:
15270 ApplyPercentModFloatVar(m_auraModifiersGroup[unitMod][modifierType], amount, apply);
15271 break;
15272 default:
15273 break;
15274 }
15275
15276 if (!CanModifyStats())
15277 return false;
15278
15279 switch (unitMod)
15280 {
15287 break;
15288
15289 case UNIT_MOD_ARMOR:
15290 UpdateArmor();
15291 break;
15292 case UNIT_MOD_HEALTH:
15294 break;
15295
15296 case UNIT_MOD_MANA:
15297 case UNIT_MOD_RAGE:
15298 case UNIT_MOD_FOCUS:
15299 case UNIT_MOD_ENERGY:
15300 case UNIT_MOD_HAPPINESS:
15301 case UNIT_MOD_RUNE:
15304 break;
15305
15313 break;
15314
15317 break;
15320 break;
15321
15324 break;
15327 break;
15330 break;
15331
15332 default:
15333 break;
15334 }
15335
15336 return true;
15337}
@ UNIT_MOD_ARMOR
Definition Unit.h:156
@ UNIT_MOD_ATTACK_POWER
Definition Unit.h:163
@ UNIT_MOD_HEALTH
Definition Unit.h:148
@ UNIT_MOD_DAMAGE_RANGED
Definition Unit.h:167
@ UNIT_MOD_DAMAGE_MAINHAND
Definition Unit.h:165
@ UNIT_MOD_ATTACK_POWER_RANGED
Definition Unit.h:164
SpellSchools GetSpellSchoolByAuraGroup(UnitMods unitMod) const
Definition Unit.cpp:15396
Stats GetStatByAuraGroup(UnitMods unitMod) const
Definition Unit.cpp:15428
virtual void UpdateAttackPowerAndDamage(bool ranged=false)=0
virtual void UpdateResistances(uint32 school)=0
Powers GetPowerTypeByAuraGroup(UnitMods unitMod) const
Definition Unit.cpp:15457
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:1034
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::OnApply(), spell_astromancer_solarian_transform::OnRemove(), boss_arlokk::boss_arlokkAI::Reset(), boss_marli::Reset(), and boss_arlokk::boss_arlokkAI::UpdateAI().

◆ HasActivePowerType()

◆ HasAllAuras()

template<typename... Auras>
bool Unit::HasAllAuras ( Auras...  spellIds) const
inline

Checks if the unit has ALL specified auras.

Template Parameters
AurasCan be any type convertible to uint32.
Parameters
spellIdsList of spell id's to check for on the unit.
Returns
Returns true if the unit has ALL of the specified auras. Otherwise false.
1425 {
1426 std::vector<uint32> spellList = { static_cast<uint32>(spellIds)... };
1427 return HasAuras(SearchMethod::MatchAll, spellList);
1428 }
bool HasAuras(SearchMethod sm, std::vector< uint32 > &spellIds) const
Check if unit has ANY or ALL specified auras.
Definition Unit.cpp:5731

References HasAuras(), and MatchAll.

Referenced by achievement_staying_buffed_all_winter_10::OnCheck(), achievement_staying_buffed_all_winter_25::OnCheck(), npc_alchemist_adrianna::OnGossipHello(), and npc_nelson::npc_nelsonAI::SpellHit().

◆ HasAllowOnlyAbilityAura()

bool Unit::HasAllowOnlyAbilityAura ( ) const
inline
@ SPELL_AURA_ALLOW_ONLY_ABILITY
Definition SpellAuraDefines.h:326
bool HasAuraType(AuraType auraType) const
Definition Unit.cpp:5761

References HasAuraType(), and SPELL_AURA_ALLOW_ONLY_ABILITY.

Referenced by AuraEffect::HandleAuraAllowOnlyAbility().

◆ HasAnyAuras()

template<typename... Auras>
bool Unit::HasAnyAuras ( Auras...  spellIds) const
inline

Checks if the unit has ANY specified auras.

Template Parameters
AurasCan be any type convertible to uint32.
Parameters
spellIdsList of spell id's to check for on the unit.
Returns
Returns true if the unit has ANY of the specified auras. Otherwise false.
1410 {
1411 std::vector<uint32> spellList = { static_cast<uint32>(spellIds)... };
1412 return HasAuras(SearchMethod::MatchAny, spellList);
1413 }

References HasAuras(), and MatchAny.

Referenced by Player::GiveXP(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), IsVampire(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), achievement_flirt_with_disaster_perf_check::OnCheck(), go_manticron_cube::OnGossipHello(), NecroticPlagueTargetCheck::operator()(), LastPhaseIceTombTargetSelector::operator()(), DefileTargetSelector::operator()(), and boss_eregos::boss_eregosAI::UpdateAI().

◆ HasAOECharmAura()

bool Unit::HasAOECharmAura ( ) const
inline
@ SPELL_AURA_AOE_CHARM
Definition SpellAuraDefines.h:240

References HasAuraType(), and SPELL_AURA_AOE_CHARM.

◆ HasAttackerSpellCritChanceAura()

bool Unit::HasAttackerSpellCritChanceAura ( ) const
inline
@ SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
Definition SpellAuraDefines.h:242

References HasAuraType(), and SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE.

Referenced by SpellTakenCritChance().

◆ HasAura()

bool Unit::HasAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5755{
5756 if (GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask))
5757 return true;
5758 return false;
5759}

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_leotheras_the_blind::AttackStart(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), boss_hodir::boss_hodirAI::CanAIAttack(), boss_hazzarah::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_chromaggus::boss_chromaggusAI::CanAIAttack(), npc_parasitic_shadowfiend::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_jenny::DamageTaken(), 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::DoAction(), boss_illidan_stormrage::DoAction(), npc_midsummer_ribbon_pole_target::DoCleanupChecks(), Spell::DoCreateItem(), Spell::EffectDummy(), Spell::EffectHeal(), Spell::EffectInstaKill(), 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(), Player::GetResurrectionSpellId(), 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::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_aura::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::HandleInfusion(), BattlefieldWG::HandleKill(), lookup_commandscript::HandleLookupSpellCommand(), lookup_commandscript::HandleLookupSpellIdCommand(), WorldSession::HandleMessagechatOpcode(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_mark_of_frost_freeze::HandleOnHit(), OPvPCapturePointZM_Graveyard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::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(), HasAuras(), 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(), 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::JustDied(), npc_sunblade_scout::JustEngagedWith(), boss_zuljin::JustEngagedWith(), 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(), boss_nalorakk::JustEngagedWith(), npc_hivezara_stinger::JustEngagedWith(), boss_vem::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_faerlina::boss_faerlinaAI::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_hydross_the_unstable::JustEngagedWith(), npc_akama_illidan::JustReachedHome(), 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_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_daranelle::npc_daranelleAI::MoveInLineOfSight(), boss_lady_vashj::MovementInform(), boss_felmyst::MovementInform(), boss_kagani_nightstrike::MovementInform(), 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_wg_demolisher_engineer::OnGossipHello(), npc_innkeeper::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_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerEnter(), MidsummerPlayerScript::OnPlayerUpdateZone(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_icc_web_wrap_aura::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(), Acore::FriendlyMissingBuffInRange::operator()(), NotInStomachSelector::operator()(), SindragosaIceTombCheck::operator()(), DefaultTargetSelector::operator()(), VampiricBiteTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), WebTargetSelector::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(), boss_janalai::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), boss_magus_telestra::Reset(), boss_illidan_stormrage::Reset(), boss_fathomlord_karathress::Reset(), Player::RewardHonor(), RewardRage(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_jormungarAI::ScheduleEvents(), boss_supremus::SchedulePhase(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), boss_anomalus::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_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(), 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_hakkar::boss_hakkarAI::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_kelthuzad::boss_kelthuzadAI::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(), 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
5702{
5703 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5704 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5705 {
5706 if (itr->second->HasEffect(effIndex)
5707 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5708 {
5709 return true;
5710 }
5711 }
5712 return false;
5713}

References m_appliedAuras.

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

◆ HasAuras()

bool Unit::HasAuras ( SearchMethod  sm,
std::vector< uint32 > &  spellIds 
) const

Check if unit has ANY or ALL specified auras.

Parameters
smThe search method to use
spellIdsList of spell id's to check for on the unit.
Returns
Returns true if the search method condition is met. Otherwise false.
5732{
5733 if (sm == SearchMethod::MatchAll)
5734 {
5735 for (auto const& spellId : spellIds)
5736 if (!HasAura(spellId))
5737 return false;
5738 return true;
5739 }
5740 else if (sm == SearchMethod::MatchAny)
5741 {
5742 for (auto const& spellId : spellIds)
5743 if (HasAura(spellId))
5744 return true;
5745 return false;
5746 }
5747 else
5748 {
5749 LOG_ERROR("entities.unit", "Unit::HasAuras using non-supported SearchMethod {}", sm);
5750 return false;
5751 }
5752}

References HasAura(), LOG_ERROR, MatchAll, and MatchAny.

Referenced by HasAllAuras(), and HasAnyAuras().

◆ HasAuraState()

bool Unit::HasAuraState ( AuraStateType  flag,
SpellInfo const *  spellProto = nullptr,
Unit const *  Caster = nullptr 
) const
10592{
10593 if (Caster)
10594 {
10595 if (spellProto)
10596 {
10597 AuraEffectList const& stateAuras = Caster->GetAuraEffectsByType(SPELL_AURA_ABILITY_IGNORE_AURASTATE);
10598 for (AuraEffectList::const_iterator j = stateAuras.begin(); j != stateAuras.end(); ++j)
10599 if ((*j)->IsAffectedOnSpell(spellProto))
10600 return true;
10601 }
10602 // Check per caster aura state
10603 // If aura with aurastate by caster not found return false
10604 if ((1 << (flag - 1)) & PER_CASTER_AURA_STATE_MASK)
10605 {
10606 AuraStateAurasMapBounds range = m_auraStateAuras.equal_range(flag);
10607 for (AuraStateAurasMap::const_iterator itr = range.first; itr != range.second; ++itr)
10608 if (itr->second->GetBase()->GetCasterGUID() == Caster->GetGUID())
10609 return true;
10610 return false;
10611 }
10612 }
10613
10614 return HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10615}
@ SPELL_AURA_ABILITY_IGNORE_AURASTATE
Definition SpellAuraDefines.h:325
std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
Definition Unit.h:650

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
5762{
5763 return (!m_modAuras[auraType].empty());
5764}

References m_modAuras.

Referenced by Player::CanTameExoticPets(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraEmpathy(), AuraEffect::HandleAuraFeatherFall(), AuraEffect::HandleAuraHover(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModStalked(), AuraEffect::HandleAuraTrackStealthed(), AuraEffect::HandleAuraUntrackable(), AuraEffect::HandleAuraWaterWalk(), AuraEffect::HandleComprehendLanguage(), AuraEffect::HandleForceMoveForward(), HasAllowOnlyAbilityAura(), HasAOECharmAura(), HasAttackerSpellCritChanceAura(), HasAuraTypeWithFamilyFlags(), HasCloneCasterAura(), HasConfuseAura(), HasControlVehicleAura(), HasDecreaseSpeedAura(), HasDetectAmoreAura(), HasDetectSpellsAura(), HasFearAura(), HasFeatherFallAura(), HasFlyAura(), HasGhostAura(), HasHealthRegenInCombatAura(), HasHoverAura(), HasIgnoreHitDirectionAura(), HasIgnoreTargetResistAura(), HasIncreaseMountedFlightSpeedAura(), HasIncreaseMountedSpeedAura(), HasInterruptRegenAura(), HasInvisibilityAura(), HasInvisibilityDetectAura(), HasMountedAura(), HasNoPVPCreditAura(), HasOpenStableAura(), HasPacifyAura(), HasPacifySilenceAura(), HasPeriodicDummyAura(), HasPreventDurabilityLossAura(), HasPreventResurectionAura(), HasPreventsFleeingAura(), HasReflectSpellsAura(), HasRegenDuringCombatAura(), HasRootAura(), HasShapeshiftAura(), HasSilenceAura(), HasSpellMagnetAura(), HasSpiritOfRedemptionAura(), HasStealthAura(), HasStealthDetectAura(), HasStunAura(), HasTauntAura(), HasThreatAura(), HasTransformAura(), HasUnattackableAura(), HasWaterBreathingAura(), and HasWaterWalkAura().

◆ HasAuraTypeWithAffectMask()

bool Unit::HasAuraTypeWithAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
5795{
5796 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5797 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5798 if ((*i)->IsAffectedOnSpell(affectedSpell))
5799 return true;
5800 return false;
5801}

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
5767{
5768 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5769 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5770 if (caster == (*i)->GetCasterGUID())
5771 return true;
5772 return false;
5773}

References GetAuraEffectsByType().

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

◆ HasAuraTypeWithFamilyFlags()

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

References GetAuraEffectsByType(), and HasAuraType().

◆ HasAuraTypeWithMiscvalue()

bool Unit::HasAuraTypeWithMiscvalue ( AuraType  auratype,
int32  miscvalue 
) const
5786{
5787 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5788 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5789 if (miscvalue == (*i)->GetMiscValue())
5790 return true;
5791 return false;
5792}

References GetAuraEffectsByType().

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

◆ HasAuraTypeWithTriggerSpell()

bool Unit::HasAuraTypeWithTriggerSpell ( AuraType  auratype,
uint32  triggerSpell 
) const
5813{
5814 for (AuraEffect const* aura : GetAuraEffectsByType(auratype))
5815 {
5816 if (aura->GetSpellInfo()->Effects[aura->GetEffIndex()].TriggerSpell == triggerSpell)
5817 {
5818 return true;
5819 }
5820 }
5821
5822 return false;
5823}

References GetAuraEffectsByType().

Referenced by WorldSession::HandlePetActionHelper().

◆ HasAuraTypeWithValue()

bool Unit::HasAuraTypeWithValue ( AuraType  auratype,
int32  value 
) const
5804{
5805 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5806 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5807 if (value == (*i)->GetAmount())
5808 return true;
5809 return false;
5810}

References GetAuraEffectsByType().

◆ HasAuraWithMechanic()

bool Unit::HasAuraWithMechanic ( uint32  mechanicMask) const
5849{
5850 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5851 {
5852 SpellInfo const* spellInfo = iter->second->GetBase()->GetSpellInfo();
5853 if (spellInfo->Mechanic && (mechanicMask & (1 << spellInfo->Mechanic)))
5854 return true;
5855
5856 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5857 if (iter->second->HasEffect(i) && spellInfo->Effects[i].Effect && spellInfo->Effects[i].Mechanic)
5858 if (mechanicMask & (1 << spellInfo->Effects[i].Mechanic))
5859 return true;
5860 }
5861
5862 return false;
5863}

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
779{
780 AuraEffectList const& auras = GetAuraEffectsByType(type);
781 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
782 if ((!excludeAura || excludeAura != (*itr)->GetSpellInfo()->Id) && //Avoid self interrupt of channeled Crowd Control spells like Seduction
783 ((*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE))
784 return true;
785 return false;
786}

References AURA_INTERRUPT_FLAG_TAKE_DAMAGE, and GetAuraEffectsByType().

Referenced by HasBreakableByDamageCrowdControlAura().

◆ HasBreakableByDamageCrowdControlAura()

bool Unit::HasBreakableByDamageCrowdControlAura ( Unit excludeCasterChannel = nullptr) const
789{
790 uint32 excludeAura = 0;
791 if (Spell* currentChanneledSpell = excludeCasterChannel ? excludeCasterChannel->GetCurrentSpell(CURRENT_CHANNELED_SPELL) : nullptr)
792 excludeAura = currentChanneledSpell->GetSpellInfo()->Id; //Avoid self interrupt of channeled Crowd Control spells like Seduction
793
799}
@ SPELL_AURA_MOD_FEAR
Definition SpellAuraDefines.h:70
@ SPELL_AURA_MOD_ROOT
Definition SpellAuraDefines.h:89
@ SPELL_AURA_TRANSFORM
Definition SpellAuraDefines.h:119
@ 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:778
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition Unit.h:1509

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().

◆ HasCloneCasterAura()

bool Unit::HasCloneCasterAura ( ) const
inline
@ SPELL_AURA_CLONE_CASTER
Definition SpellAuraDefines.h:310

References HasAuraType(), and SPELL_AURA_CLONE_CASTER.

Referenced by WorldSession::HandleMirrorImageDataRequest().

◆ HasConfuseAura()

bool Unit::HasConfuseAura ( ) const
inline

◆ HasControlVehicleAura()

bool Unit::HasControlVehicleAura ( ) const
inline

◆ HasDecreaseSpeedAura()

bool Unit::HasDecreaseSpeedAura ( ) const
inline

◆ HasDetectAmoreAura()

bool Unit::HasDetectAmoreAura ( ) const
inline
@ SPELL_AURA_DETECT_AMORE
Definition SpellAuraDefines.h:233

References HasAuraType(), and SPELL_AURA_DETECT_AMORE.

Referenced by AuraEffect::HandleDetectAmore().

◆ HasDetectSpellsAura()

bool Unit::HasDetectSpellsAura ( ) const
inline
@ SPELL_AURA_DEFLECT_SPELLS
Definition SpellAuraDefines.h:350

References HasAuraType(), and SPELL_AURA_DEFLECT_SPELLS.

◆ HasExtraUnitMovementFlag()

uint16 Unit::HasExtraUnitMovementFlag ( uint16  f) const
inline

◆ HasFearAura()

◆ HasFeatherFallAura()

bool Unit::HasFeatherFallAura ( ) const
inline
@ SPELL_AURA_FEATHER_FALL
Definition SpellAuraDefines.h:168

References HasAuraType(), and SPELL_AURA_FEATHER_FALL.

Referenced by Player::GetAurasForTarget(), and Player::HandleFall().

◆ HasFlyAura()

◆ HasGhostAura()

bool Unit::HasGhostAura ( ) const
inline

◆ HasHealthRegenInCombatAura()

bool Unit::HasHealthRegenInCombatAura ( ) const
inline
@ SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT
Definition SpellAuraDefines.h:224

References HasAuraType(), and SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT.

Referenced by Player::RegenerateAll().

◆ HasHoverAura()

bool Unit::HasHoverAura ( ) const
inline
1723{ return HasAuraType(SPELL_AURA_HOVER); };
@ SPELL_AURA_HOVER
Definition SpellAuraDefines.h:169

References HasAuraType(), and SPELL_AURA_HOVER.

Referenced by Player::GetAurasForTarget(), Player::HandleFall(), and Creature::UpdateMovementFlags().

◆ HasIgnoreHitDirectionAura()

bool Unit::HasIgnoreHitDirectionAura ( ) const
inline

◆ HasIgnoreTargetResistAura()

bool Unit::HasIgnoreTargetResistAura ( ) const
inline

◆ HasIncreaseMountedFlightSpeedAura()

◆ HasIncreaseMountedSpeedAura()

bool Unit::HasIncreaseMountedSpeedAura ( ) const
inline
@ SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED
Definition SpellAuraDefines.h:95

References HasAuraType(), and SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED.

◆ HasInterruptRegenAura()

bool Unit::HasInterruptRegenAura ( ) const
inline
@ SPELL_AURA_INTERRUPT_REGEN
Definition SpellAuraDefines.h:157

References HasAuraType(), and SPELL_AURA_INTERRUPT_REGEN.

Referenced by Player::Regenerate().

◆ HasInvisibilityAura()

bool Unit::HasInvisibilityAura ( ) const
inline

◆ HasInvisibilityDetectAura()

bool Unit::HasInvisibilityDetectAura ( ) const
inline
@ SPELL_AURA_MOD_INVISIBILITY_DETECT
Definition SpellAuraDefines.h:82

References HasAuraType(), and SPELL_AURA_MOD_INVISIBILITY_DETECT.

Referenced by AuraEffect::HandleModInvisibilityDetect().

◆ HasMainhandWeapon()

bool Unit::HasMainhandWeapon ( ) const
inline
936{ return HasWeapon(BASE_ATTACK); }
virtual bool HasWeapon(WeaponAttackType type) const =0

References BASE_ATTACK, and HasWeapon().

◆ hasMainhandWeaponForAttack()

bool Unit::hasMainhandWeaponForAttack ( ) const
inline
virtual bool HasWeaponForAttack(WeaponAttackType type) const
Definition Unit.h:941

References BASE_ATTACK, and HasWeaponForAttack().

◆ HasMainhandWeaponForAttack()

bool Unit::HasMainhandWeaponForAttack ( ) const
inline

◆ HasMountedAura()

◆ HasNegativeAuraWithAttribute()

bool Unit::HasNegativeAuraWithAttribute ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5838{
5839 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5840 {
5841 Aura const* aura = iter->second->GetBase();
5842 if (!iter->second->IsPositive() && aura->GetSpellInfo()->Attributes & flag && (!guid || aura->GetCasterGUID() == guid))
5843 return true;
5844 }
5845 return false;
5846}
uint32 Attributes
Definition SpellInfo.h:324

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

◆ HasNegativeAuraWithInterruptFlag()

bool Unit::HasNegativeAuraWithInterruptFlag ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5826{
5827 if (!(m_interruptMask & flag))
5828 return false;
5829 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end(); ++iter)
5830 {
5831 if (!(*iter)->IsPositive() && (*iter)->GetBase()->GetSpellInfo()->AuraInterruptFlags & flag && (!guid || (*iter)->GetBase()->GetCasterGUID() == guid))
5832 return true;
5833 }
5834 return false;
5835}

References m_interruptableAuras, and m_interruptMask.

Referenced by ThreatContainer::SelectNextVictim().

◆ HasNoPVPCreditAura()

bool Unit::HasNoPVPCreditAura ( ) const
inline
@ SPELL_AURA_NO_PVP_CREDIT
Definition SpellAuraDefines.h:222

References HasAuraType(), and SPELL_AURA_NO_PVP_CREDIT.

Referenced by Player::RewardHonor().

◆ HasNpcFlag()

bool Unit::HasNpcFlag ( NPCFlags  flags) const
inline

◆ HasOffhandWeapon()

bool Unit::HasOffhandWeapon ( ) const
inline
937{ return HasWeapon(OFF_ATTACK); }

References HasWeapon(), and OFF_ATTACK.

◆ HasOffhandWeaponForAttack()

◆ HasOpenStableAura()

bool Unit::HasOpenStableAura ( ) const
inline
@ SPELL_AURA_OPEN_STABLE
Definition SpellAuraDefines.h:355

References HasAuraType(), and SPELL_AURA_OPEN_STABLE.

◆ HasPacifyAura()

bool Unit::HasPacifyAura ( ) const
inline
@ SPELL_AURA_MOD_PACIFY
Definition SpellAuraDefines.h:88

References HasAuraType(), and SPELL_AURA_MOD_PACIFY.

Referenced by AuraEffect::HandleAuraModPacify(), and WorldSession::HandlePetActionHelper().

◆ HasPacifySilenceAura()

bool Unit::HasPacifySilenceAura ( ) const
inline

◆ HasPeriodicDummyAura()

bool Unit::HasPeriodicDummyAura ( ) const
inline

◆ HasPreventDurabilityLossAura()

bool Unit::HasPreventDurabilityLossAura ( ) const
inline
@ SPELL_AURA_PREVENT_DURABILITY_LOSS
Definition SpellAuraDefines.h:352

References HasAuraType(), and SPELL_AURA_PREVENT_DURABILITY_LOSS.

Referenced by Player::DurabilityPointsLoss().

◆ HasPreventResurectionAura()

bool Unit::HasPreventResurectionAura ( ) const
inline

◆ HasPreventsFleeingAura()

bool Unit::HasPreventsFleeingAura ( ) const
inline
@ SPELL_AURA_PREVENTS_FLEEING
Definition SpellAuraDefines.h:155

References HasAuraType(), and SPELL_AURA_PREVENTS_FLEEING.

Referenced by Creature::DoFleeToGetAssistance().

◆ HasRangedWeapon()

bool Unit::HasRangedWeapon ( ) const
inline
938{ return HasWeapon(RANGED_ATTACK); }

References HasWeapon(), and RANGED_ATTACK.

◆ HasRangedWeaponForAttack()

bool Unit::HasRangedWeaponForAttack ( ) const
inline

◆ HasReflectSpellsAura()

bool Unit::HasReflectSpellsAura ( ) const
inline
@ SPELL_AURA_REFLECT_SPELLS
Definition SpellAuraDefines.h:91

References HasAuraType(), and SPELL_AURA_REFLECT_SPELLS.

Referenced by Spell::DoSpellHitOnUnit().

◆ HasRegenDuringCombatAura()

bool Unit::HasRegenDuringCombatAura ( ) const
inline
@ SPELL_AURA_MOD_REGEN_DURING_COMBAT
Definition SpellAuraDefines.h:179

References HasAuraType(), and SPELL_AURA_MOD_REGEN_DURING_COMBAT.

Referenced by Player::RegenerateAll(), and Player::RegenerateHealth().

◆ HasRootAura()

bool Unit::HasRootAura ( ) const
inline

◆ HasShapeshiftAura()

bool Unit::HasShapeshiftAura ( ) const
inline

◆ HasSharedVision()

◆ HasSilenceAura()

bool Unit::HasSilenceAura ( ) const
inline

◆ HasSpell()

virtual bool Unit::HasSpell ( uint32  ) const
inlinevirtual

◆ HasSpellCooldown()

◆ HasSpellItemCooldown()

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

Reimplemented in Player.

1277{ return false; }

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

◆ HasSpellMagnetAura()

bool Unit::HasSpellMagnetAura ( ) const
inline

◆ HasSpiritOfRedemptionAura()

◆ HasStealthAura()

◆ HasStealthDetectAura()

bool Unit::HasStealthDetectAura ( ) const
inline
@ SPELL_AURA_MOD_STEALTH_DETECT
Definition SpellAuraDefines.h:80

References HasAuraType(), and SPELL_AURA_MOD_STEALTH_DETECT.

Referenced by AuraEffect::HandleModStealthDetect().

◆ HasStunAura()

◆ HasTauntAura()

bool Unit::HasTauntAura ( ) const
inline
@ SPELL_AURA_MOD_TAUNT
Definition SpellAuraDefines.h:74

References HasAuraType(), and SPELL_AURA_MOD_TAUNT.

Referenced by Creature::CanCreatureAttack(), and PetAI::SelectNextTarget().

◆ HasThreatAura()

bool Unit::HasThreatAura ( ) const
inline
@ SPELL_AURA_MOD_THREAT
Definition SpellAuraDefines.h:73

References HasAuraType(), and SPELL_AURA_MOD_THREAT.

Referenced by ApplyTotalThreatModifier().

◆ HasTransformAura()

bool Unit::HasTransformAura ( ) const
inline

◆ HasUnattackableAura()

bool Unit::HasUnattackableAura ( ) const
inline

◆ HasUnitFlag()

bool Unit::HasUnitFlag ( UnitFlags  flags) const
inline
718{ 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_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::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_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(), boss_the_lurker_below::SummonedCreatureDies(), 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::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_ravenous_worg::npc_ravenous_worgAI::UpdateAI(), and Player::UpdateTriggerVisibility().

◆ HasUnitFlag2()

◆ HasUnitMovementFlag()

◆ HasUnitState()

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

References m_state.

Referenced by Spell::_cast(), Creature::_IsTargetAcceptable(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), AddThreat(), advisor_baseAI::advisor_baseAI(), Attack(), AttackerStateUpdate(), FollowerAI::AttackStart(), npc_raging_spirit::npc_raging_spiritAI::AttackStart(), boss_alar::boss_alar(), boss_anetheron::boss_anetheron(), boss_anzu::boss_anzu(), boss_apothecary_hummel::boss_apothecary_hummelAI::boss_apothecary_hummelAI(), boss_archimonde::boss_archimonde(), boss_azgalor::boss_azgalor(), 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_halazzi::boss_halazzi(), boss_hexlord_malacrass::boss_hexlord_malacrass(), boss_high_astromancer_solarian::boss_high_astromancer_solarian(), boss_high_king_maulgar::boss_high_king_maulgar(), boss_janalai::boss_janalai(), boss_jarien::boss_jarien(), boss_kazrogal::boss_kazrogal(), boss_kelidan_the_breaker::boss_kelidan_the_breaker(), boss_kiggler_the_crazed::boss_kiggler_the_crazed(), boss_kiljaeden::boss_kiljaeden(), 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_rage_winterchill::boss_rage_winterchill(), 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_supremus::boss_supremus(), 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(), PathGenerator::CalculatePath(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), boss_gurtogg_bloodboil::CanAIAttack(), PetAI::CanAttack(), Player::CanEquipItem(), CanFreeMove(), Creature::CanPeriodicallyCallForAssistance(), Creature::CanStartAttack(), spell_dk_death_grip::CheckCast(), Spell::CheckCast(), Spell::CheckPetCast(), spell_warr_retaliation::CheckProc(), SpellInfo::CheckTarget(), 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::EffectEnergize(), Spell::EffectHealMaxHealth(), 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(), boss_priestess_delrissa::JustEngagedWith(), npc_coren_direbrew_sisters::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), boss_essence_of_desire::boss_essence_of_desireAI::JustEngagedWith(), boss_priestess_lackey_commonAI::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), PetAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), GridObjectLoader::LoadCreatures(), MagicSpellHitResult(), MeleeSpellHitResult(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), boss_kaelthas::MovementInform(), 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_hyjal_frost_wyrm::npc_hyjal_frost_wyrm(), npc_hyjal_gargoyle::npc_hyjal_gargoyle(), npc_hyjal_ground_trash::npc_hyjal_ground_trash(), npc_icc_spire_frostwyrm::npc_icc_spire_frostwyrm(), npc_inner_demon::npc_inner_demon(), npc_kiljaeden_controller::npc_kiljaeden_controller(), npc_sunblade_arch_mage::npc_sunblade_arch_mage(), Acore::FriendlyCCedInRange::operator()(), MysticBuffetTargetFilter::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(), npc_ashtongue_channeler::Reset(), RollMeleeOutcomeAgainst(), boss_faction_championsAI::SelectEnemyCaster(), ThreatContainer::SelectNextVictim(), 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_priestess_lackey_commonAI::UpdateAI(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::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_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_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_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_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::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::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_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::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_dalronn_the_controller::UpdateAI(), npc_enslaved_proto_drake::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(), npc_maiev_illidan::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_high_nethermancer_zerevor::UpdateAI(), boss_lady_malande::UpdateAI(), boss_veras_darkshadow::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_doomlord_kazzak::boss_doomlordkazzakAI::UpdateAI(), boss_doomwalker::UpdateAI(), boss_leotheras_the_blind::UpdateAI(), boss_gruul::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), boss_watchkeeper_gargolmar::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), boss_alar::UpdateAI(), advisor_baseAI::UpdateAI(), npc_maghar_captive::npc_maghar_captiveAI::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_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
5776{
5777 AuraEffectList const& mAuraList = GetAuraEffectsByType(auraType);
5778 for (AuraEffectList::const_iterator i = mAuraList.begin(); i != mAuraList.end(); ++i)
5779 if ((*i)->GetBase()->CanBeSentToClient())
5780 return true;
5781
5782 return false;
5783}

References GetAuraEffectsByType().

◆ HasWaterBreathingAura()

bool Unit::HasWaterBreathingAura ( ) const
inline
@ SPELL_AURA_WATER_BREATHING
Definition SpellAuraDefines.h:145

References HasAuraType(), and SPELL_AURA_WATER_BREATHING.

Referenced by Player::getMaxTimer().

◆ HasWaterWalkAura()

bool Unit::HasWaterWalkAura ( ) const
inline
@ SPELL_AURA_WATER_WALK
Definition SpellAuraDefines.h:167

References HasAuraType(), and SPELL_AURA_WATER_WALK.

Referenced by Player::GetAurasForTarget().

◆ HasWeapon()

virtual bool Unit::HasWeapon ( WeaponAttackType  type) const
pure virtual

Implemented in Creature, and Player.

Referenced by HasMainhandWeapon(), HasOffhandWeapon(), and HasRangedWeapon().

◆ HasWeaponForAttack()

virtual bool Unit::HasWeaponForAttack ( WeaponAttackType  type) const
inlinevirtual

Reimplemented in Creature, and Player.

941{ return CanUseAttackType(type); }
bool CanUseAttackType(uint8 attacktype) const
Definition Unit.h:945

References CanUseAttackType().

Referenced by hasMainhandWeaponForAttack(), HasMainhandWeaponForAttack(), HasOffhandWeaponForAttack(), HasRangedWeaponForAttack(), Creature::HasWeaponForAttack(), and Player::HasWeaponForAttack().

◆ haveOffhandWeapon()

bool Unit::haveOffhandWeapon ( ) const
523{
524 if (Player const* player = ToPlayer())
525 return player->GetWeaponForAttack(OFF_ATTACK, true);
526
527 return CanDualWield();
528}
bool CanDualWield() const
Definition Unit.h:932

References CanDualWield(), OFF_ATTACK, and Object::ToPlayer().

Referenced by boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), and boss_twin_valkyrAI::myDoMeleeAttackIfReady().

◆ HealBySpell()

int32 Unit::HealBySpell ( HealInfo healInfo,
bool  critical = false 
)
11289{
11290 uint32 heal = healInfo.GetHeal();
11291 sScriptMgr->ModifyHealReceived(this, healInfo.GetTarget(), heal, healInfo.GetSpellInfo());
11292 healInfo.SetHeal(heal);
11293
11294 // calculate heal absorb and reduce healing
11295 CalcHealAbsorb(healInfo);
11296
11297 int32 gain = Unit::DealHeal(healInfo.GetHealer(), healInfo.GetTarget(), healInfo.GetHeal());
11298 healInfo.SetEffectiveHeal(gain);
11299
11300 SendHealSpellLog(healInfo, critical);
11301 return gain;
11302}
Unit * GetHealer() const
Definition Unit.h:410
void SetHeal(uint32 amount)
Definition Unit.h:400
void SetEffectiveHeal(uint32 amount)
Definition Unit.h:405
static void CalcHealAbsorb(HealInfo &healInfo)
Definition Unit.cpp:2514
static int32 DealHeal(Unit *healer, Unit *victim, uint32 addhealth)
Definition Unit.cpp:10995
void SendHealSpellLog(HealInfo const &healInfo, bool critical=false)
Definition Unit.cpp:11271

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
1053{ 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_kalec::JustEngagedWith(), boss_sathrovarr::JustEngagedWith(), npc_akama_illidan::JustEngagedWith(), npc_maiev_illidan::JustEngagedWith(), boss_olm_the_summoner::JustEngagedWith(), boss_priestess_lackey_commonAI::JustEngagedWith(), boss_yazzai::JustEngagedWith(), boss_grand_warlock_nethekurse::JustEngagedWith(), Player::LoadFromDB(), npc_death_knight_initiate::OnGossipHello(), SetHealth(), SpellPctHealingModsDone(), Update(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::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::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::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_grand_warlock_nethekurse::UpdateAI(), and npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI().

◆ HealthBelowPctDamaged()

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

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_mandokir::boss_mandokirAI::DamageDealt(), 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_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(), npc_akama_shade::DamageTaken(), boss_vazruden::DamageTaken(), npc_millhouse_manastorm::npc_millhouse_manastormAI::DamageTaken(), npc_magister_aledis::DamageTaken(), BossAI::DamageTaken(), boss_halazzi::DamageTaken(), boss_buru::DamageTaken(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::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)
15085{
15086 // Checking for existing in the table
15087 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15088 {
15089 if (i->DRGroup != group)
15090 continue;
15091 if (int32(i->hitCount) < GetDiminishingReturnsMaxLevel(group))
15092 i->hitCount += 1;
15093 return;
15094 }
15096}
DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group)
Definition SpellMgr.cpp:264
Definition Unit.h:272

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

Referenced by Spell::DoSpellHitOnUnit().

◆ InitCharmInfo()

CharmInfo * Unit::InitCharmInfo ( )
15849{
15850 if (!m_charmInfo)
15851 m_charmInfo = new CharmInfo(this);
15852
15853 return m_charmInfo;
15854}
Definition CharmInfo.h:127

References m_charmInfo.

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

◆ InitStatBuffMods()

void Unit::InitStatBuffMods ( )
inline
1023 {
1024 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + i, 0);
1025 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + i, 0);
1026 }

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 
)
17429{
17430 Player* player = ToPlayer();
17431 PetStable& petStable = player->GetOrInitPetStable();
17432 if (petStable.CurrentPet || petStable.GetUnslottedHunterPet())
17433 return false;
17434
17435 pet->SetCreatorGUID(GetGUID());
17436 pet->SetFaction(GetFaction());
17437 pet->SetUInt32Value(UNIT_CREATED_BY_SPELL, spell_id);
17438
17439 if (IsPlayer())
17441
17442 if (!pet->InitStatsForLevel(level))
17443 {
17444 LOG_ERROR("entities.unit", "Pet::InitStatsForLevel() failed for creature (Entry: {})!", pet->GetEntry());
17445 return false;
17446 }
17447
17448 pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
17449 // this enables pet details window (Shift+P)
17450 pet->InitPetCreateSpells();
17451 pet->SetFullHealth();
17452 pet->FillPetInfo(&petStable.CurrentPet.emplace());
17453 return true;
17454}
@ UNIT_CREATED_BY_SPELL
Definition UpdateFields.h:138
bool InitStatsForLevel(uint8 level)
Definition Pet.cpp:1018
Definition PetDefines.h:206
PetInfo const * GetUnslottedHunterPet() const
Definition PetDefines.h:234
Optional< PetInfo > CurrentPet
Definition PetDefines.h:229
void FillPetInfo(PetStable::PetInfo *petInfo) const
Definition Pet.cpp:2471
void InitPetCreateSpells()
Definition Pet.cpp:2046
PetStable & GetOrInitPetStable()
Definition Player.cpp:15553
void SetFullHealth()
Definition Unit.h:1063
void SetFaction(uint32 faction)
Definition Unit.cpp:10096
void ReplaceAllUnitFlags(UnitFlags flags)
Remove the Unit flag specify only.
Definition Unit.h:721
CharmInfo * GetCharmInfo()
Definition Unit.h:1222
void SetCreatorGUID(ObjectGuid creator)
Definition Unit.h:687
void SetPetNumber(uint32 petnumber, bool statwindow)
Definition CharmInfo.cpp:240

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

Referenced by CreateTamedPetFrom(), and CreateTamedPetFrom().

◆ InterruptNonMeleeSpells()

void Unit::InterruptNonMeleeSpells ( bool  withDelayed,
uint32  spellid = 0,
bool  withInstant = true,
bool  bySelf = false 
)
4163{
4164 // generic spells are interrupted if they are not finished or delayed
4165 if (m_currentSpells[CURRENT_GENERIC_SPELL] && (!spell_id || m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->Id == spell_id))
4166 InterruptSpell(CURRENT_GENERIC_SPELL, withDelayed, withInstant, bySelf);
4167
4168 // autorepeat spells are interrupted if they are not finished or delayed
4169 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL] && (!spell_id || m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id == spell_id))
4170 InterruptSpell(CURRENT_AUTOREPEAT_SPELL, withDelayed, withInstant, bySelf);
4171
4172 // channeled spells are interrupted if they are not finished, even if they are delayed
4173 if (m_currentSpells[CURRENT_CHANNELED_SPELL] && (!spell_id || m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->Id == spell_id))
4174 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4175}

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(), 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::DamageTaken(), npc_vrykul_skeleton::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(), boss_akilzon::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(), boss_felblood_kaelthas::GravityLapseSequence(), spell_dk_death_grip::HandleBaseDummy(), WorldSession::HandleCancelCastOpcode(), spell_magtheridon_shadow_grasp::HandleDummyRemove(), spell_novos_crystal_handler_death_aura::HandleEffectApply(), spell_hydross_cleansing_field_command::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLootOpcode(), WorldSession::HandlePetActionHelper(), spell_the_lich_king_jump::HandleScript(), boss_shade_of_aran::JustEngagedWith(), npc_kilrek::JustEngagedWith(), boss_archimonde::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(), npc_akama_illidan::PathEndReached(), PretendToDie(), boss_alar::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_astromancer_solarian::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), boss_illidan_stormrage::ScheduleAbilities(), boss_the_lurker_below::SchedulerPhaseOne(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), boss_anomalus::SetData(), setDeathState(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), StopAttackFaction(), Player::TeleportTo(), CasterAI::UpdateAI(), TotemAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::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(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and PetAI::UpdateAI().

◆ InterruptSpell()

void Unit::InterruptSpell ( CurrentSpellTypes  spellType,
bool  withDelayed = true,
bool  withInstant = true,
bool  bySelf = false 
)
4094{
4095 //LOG_DEBUG("entities.unit", "Interrupt spell for unit {}.", GetEntry());
4096 Spell* spell = m_currentSpells[spellType];
4097 if (spell
4098 && (withDelayed || spell->getState() != SPELL_STATE_DELAYED)
4099 && (withInstant || spell->GetCastTime() > 0 || spell->getState() == SPELL_STATE_CASTING)) // xinef: or spell is in casting state (channeled spells only)
4100 {
4101 // for example, do not let self-stun aura interrupt itself
4102 if (!spell->IsInterruptable())
4103 return;
4104
4105 // send autorepeat cancel message for autorepeat spells
4106 if (spellType == CURRENT_AUTOREPEAT_SPELL)
4107 if (IsPlayer())
4109
4110 if (spell->getState() != SPELL_STATE_FINISHED)
4111 spell->cancel(bySelf);
4112 else
4113 {
4114 m_currentSpells[spellType] = nullptr;
4115 spell->SetReferencedFromCurrent(false);
4116 }
4117 }
4118}
@ SPELL_STATE_DELAYED
Definition Spell.h:231
void SendAutoRepeatCancel(Unit *target)
Definition PlayerMisc.cpp:152
bool IsInterruptable() const
Definition Spell.h:564
int32 GetCastTime() const
Definition Spell.h:550
uint32 getState() const
Definition Spell.h:485
void cancel(bool bySelf=false)
Definition Spell.cpp:3730

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

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(), SmartAI::JustEngagedWith(), Player::RemoveItemDependentAurasAndCasts(), SetCurrentCastedSpell(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_nightbane::TriggerHealthTakeOff(), and npc_belnistrasz::npc_belnistraszAI::UpdateAI().

◆ InvalidateValuesUpdateCache()

void Unit::InvalidateValuesUpdateCache ( )
inlineprivate
2147{ _valuesUpdateCache.clear(); }

References _valuesUpdateCache.

Referenced by SetUInt32Value(), and Update().

◆ IsAlive()

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

References Alive, and 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(), 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::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(), 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(), 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(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), 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(), 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_rajaxx::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_freya::boss_freyaAI::JustEngagedWith(), npc_underbat::JustEngagedWith(), boss_sartharion::boss_sartharionAI::JustEngagedWith(), boss_fathomlord_karathress::JustReachedHome(), boss_rotface::boss_rotfaceAI::JustSummoned(), Kill(), boss_hadronox::boss_hadronoxAI::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), Player::LoadCorpse(), GridObjectLoader::LoadCreatures(), Player::LoadFromDB(), 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(), go_palehoof_sphere::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), spell_yogg_saron_brain_link_aura::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::AnyDeadUnitObjectInRangeCheck::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(), SmartScript::ProcessAction(), RemoveCharmedBy(), Group::RemoveMember(), Player::RemovePet(), Battleground::RemovePlayerAtLeave(), Player::RepopAtGraveyard(), boss_kiljaeden::Reset(), 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(), BossAI::ScheduleEnrageTimer(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), Player::SendLoot(), npc_corrupted_totem::SetAura(), instance_naxxramas::SetBossState(), SetConfused(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::SetData(), instance_scarlet_monastery::instance_scarlet_monastery_InstanceMapScript::SetData(), npc_enslaved_proto_drake::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(), 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(), 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(), npc_dark_iron_guzzler::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::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::UpdateAI(), PetAI::UpdateAI(), npc_gunship::npc_gunshipAI::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(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsAlwaysDetectableFor()

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

Reimplemented from WorldObject.

14266{
14268 return true;
14269
14270 if (HasAuraTypeWithCaster(SPELL_AURA_MOD_STALKED, seer->GetGUID()))
14271 return true;
14272
14273 if (Player* ownerPlayer = GetSpellModOwner())
14274 if (Player const* seerPlayer = seer->ToPlayer())
14275 {
14276 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14277 return true;
14278 }
14279
14280 return false;
14281}
@ SPELL_AURA_MOD_STALKED
Definition SpellAuraDefines.h:131
virtual bool IsAlwaysDetectableFor(WorldObject const *) const
Definition Object.h:671

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

: Check if unit is eligible for sparring damages. Work only if attacker and victim are creatures.

Reimplemented from WorldObject.

14247{
14249 return true;
14250
14251 // Always seen by owner
14252 if (ObjectGuid guid = GetCharmerOrOwnerGUID())
14253 if (seer->GetGUID() == guid)
14254 return true;
14255
14256 if (Player const* seerPlayer = seer->ToPlayer())
14257 if (Unit* owner = GetOwner())
14258 if (Player* ownerPlayer = owner->ToPlayer())
14259 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14260 return true;
14261
14262 return false;
14263}
virtual bool IsAlwaysVisibleFor(WorldObject const *) const
Definition Object.h:668

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

◆ IsArmorer()

bool Unit::IsArmorer ( ) const
inline
@ UNIT_NPC_FLAG_REPAIR
Definition UnitDefines.h:327
bool HasNpcFlag(NPCFlags flags) const
Definition Unit.h:734

References HasNpcFlag(), and UNIT_NPC_FLAG_REPAIR.

◆ isAttackingPlayer()

bool Unit::isAttackingPlayer ( ) const
10507{
10509 return true;
10510
10511 if (!m_Controlled.empty())
10512 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10513 if ((*itr)->isAttackingPlayer())
10514 return true;
10515
10516 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
10517 if (m_SummonSlot[i])
10518 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
10519 if (summon->isAttackingPlayer())
10520 return true;
10521
10522 return false;
10523}
Creature * GetCreature(ObjectGuid const guid)
Definition Map.cpp:2498

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

◆ isAttackReady()

◆ IsAttackSpeedOverridenShapeShift()

bool Unit::IsAttackSpeedOverridenShapeShift ( ) const
19548{
19549 // Mirroring clientside gameplay logic
19550 if (ShapeshiftForm form = GetShapeshiftForm())
19551 if (SpellShapeshiftFormEntry const* entry = sSpellShapeshiftFormStore.LookupEntry(form))
19552 return entry->attackSpeed > 0;
19553
19554 return false;
19555}

References GetShapeshiftForm(), and sSpellShapeshiftFormStore.

Referenced by Player::CalculateMinMaxDamage().

◆ IsAuctioner()

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

References HasNpcFlag(), and UNIT_NPC_FLAG_AUCTIONEER.

◆ IsBanker()

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

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.

673{ return false;}

Referenced by Player::SetMover().

◆ isBlockCritical()

bool Unit::isBlockCritical ( )
3141{
3143 return true;
3144 return false;
3145}
@ 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:1237

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

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

◆ IsClass()

◆ IsContestedGuard()

bool Unit::IsContestedGuard ( ) const
inline
983 {
985 return entry->IsContestedGuardFaction();
986
987 return false;
988 }

References GetFactionTemplateEntry().

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

◆ IsControllableGuardian()

bool Unit::IsControllableGuardian ( ) const
inline

◆ IsControlledByPlayer()

◆ IsCreatedByPlayer()

bool Unit::IsCreatedByPlayer ( ) const
inline
1249{ 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
2021{
2022 // only physical spells damage gets reduced by armor
2023 if ((schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0)
2024 return false;
2025 if (spellInfo)
2026 {
2027 // there are spells with no specific attribute but they have "ignores armor" in tooltip
2028 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_IGNORE_ARMOR))
2029 return false;
2030
2031 // bleeding effects are not reduced by armor
2032 if (effIndex != MAX_SPELL_EFFECTS)
2033 {
2034 if (spellInfo->Effects[effIndex].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE ||
2035 spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
2036 if (spellInfo->GetEffectMechanicMask(effIndex) & (1 << MECHANIC_BLEED))
2037 return false;
2038 }
2039 }
2040 return true;
2041}
@ MECHANIC_BLEED
Definition SharedDefines.h:1340
@ SPELL_ATTR0_CU_IGNORE_ARMOR
Definition SpellInfo.h:191

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

References Corpse, Dead, and m_deathState.

Referenced by 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(), Player::GiveLevel(), 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(), Player::PrepareGossipMenu(), SmartScript::ProcessAction(), Player::RepopAtGraveyard(), npc_anubisath_sentinel::aqsentinelAI::Reset(), WorldSession::SendAttackStop(), SendMeleeAttackStop(), instance_molten_core::instance_molten_core_InstanceMapScript::SetBossState(), and npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI().

◆ IsDuringRemoveFromWorld()

◆ isDying()

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

References JustDied, and m_deathState.

Referenced by Creature::IsInvisibleDueToDespawn(), and SetHover().

◆ IsEngaged()

◆ IsEngagedBy()

bool Unit::IsEngagedBy ( Unit const *  who) const
inline

◆ IsFalling()

◆ IsFFAPvP()

bool Unit::IsFFAPvP ( ) const
inline

◆ IsFlying()

◆ IsFriendlyTo()

bool Unit::IsFriendlyTo ( Unit const *  unit) const
10282{
10283 return GetReactionTo(unit) >= REP_FRIENDLY;
10284}

References GetReactionTo(), and REP_FRIENDLY.

Referenced by Spell::_cast(), AuraApplication::_InitFlags(), Creature::_IsTargetAcceptable(), FollowerAI::AssistPlayerInCombatAgainst(), 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
@ UNIT_NPC_FLAG_GOSSIP
Definition UnitDefines.h:315

References HasNpcFlag(), and UNIT_NPC_FLAG_GOSSIP.

◆ IsGuardian()

◆ IsGuildMaster()

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

References HasNpcFlag(), and UNIT_NPC_FLAG_PETITIONER.

◆ IsHostileTo()

◆ IsHostileToPlayers()

bool Unit::IsHostileToPlayers ( ) const
10287{
10288 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10289 if (!my_faction || !my_faction->faction)
10290 return false;
10291
10292 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10293 if (raw_faction && raw_faction->reputationListID >= 0)
10294 return false;
10295
10296 return my_faction->IsHostileToPlayers();
10297}
int32 reputationListID
Definition DBCStructure.h:909
uint32 faction
Definition DBCStructure.h:941
bool IsHostileToPlayers() const
Definition DBCStructure.h:981

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

◆ IsHovering()

◆ IsHunterPet()

◆ IsImmunedToDamage() [1/3]

bool Unit::IsImmunedToDamage ( Spell const *  spell) const
12840{
12841 SpellInfo const* spellInfo = spell->GetSpellInfo();
12842 if (!spellInfo)
12843 {
12844 return false;
12845 }
12846
12848 {
12849 return false;
12850 }
12851
12853 {
12854 return false;
12855 }
12856
12857 uint32 schoolMask = spell->GetSpellSchoolMask();
12858 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12859 {
12860 return false;
12861 }
12862
12863 // If m_immuneToDamage type contain magic, IMMUNE damage.
12864 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12865 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12866 {
12867 if ((itr->type & schoolMask) == schoolMask)
12868 {
12869 return true;
12870 }
12871 }
12872
12873 return false;
12874}
@ 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
std::vector< SpellImmune > SpellImmuneList
Definition SpellDefines.h:182

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

◆ IsImmunedToDamage() [2/3]

bool Unit::IsImmunedToDamage ( SpellInfo const *  spellInfo) const
12808{
12809 if (!spellInfo)
12810 {
12811 return false;
12812 }
12813
12814 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
12815 {
12816 return false;
12817 }
12818
12819 if (spellInfo->HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) || spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
12820 {
12821 return false;
12822 }
12823
12824 uint32 schoolMask = spellInfo->GetSchoolMask();
12825 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12826 {
12827 return false;
12828 }
12829
12830 // If m_immuneToDamage type contain magic, IMMUNE damage.
12831 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12832 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12833 if ((itr->type & schoolMask) == schoolMask)
12834 return true;
12835
12836 return false;
12837}

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

◆ IsImmunedToDamage() [3/3]

bool Unit::IsImmunedToDamage ( SpellSchoolMask  meleeSchoolMask) const
12792{
12793 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12794 {
12795 return false;
12796 }
12797
12798 // If m_immuneToDamage type contain magic, IMMUNE damage.
12799 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12800 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12801 if ((itr->type & meleeSchoolMask) == meleeSchoolMask)
12802 return true;
12803
12804 return false;
12805}

References IMMUNITY_DAMAGE, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

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

◆ IsImmunedToDamageOrSchool() [1/2]

bool Unit::IsImmunedToDamageOrSchool ( SpellInfo const *  spellInfo) const
12956{
12957 return IsImmunedToDamage(spellInfo) || IsImmunedToSchool(spellInfo);
12958}
bool IsImmunedToSchool(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:12876
bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:12791

References IsImmunedToDamage(), and IsImmunedToSchool().

◆ IsImmunedToDamageOrSchool() [2/2]

◆ IsImmunedToSchool() [1/3]

bool Unit::IsImmunedToSchool ( Spell const *  spell) const
12916{
12917 SpellInfo const* spellInfo = spell->GetSpellInfo();
12919 {
12920 return false;
12921 }
12922
12923 uint32 schoolMask = spell->GetSpellSchoolMask();
12924 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12925 {
12926 return false;
12927 }
12928
12929 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12930 {
12931 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12932 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12933 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12934 {
12935 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
12936 {
12937 return true;
12938 }
12939 }
12940 }
12941
12942 return false;
12943}
@ IMMUNITY_SCHOOL
Definition SharedDefines.h:1396
bool CanPierceImmuneAura(SpellInfo const *aura) const
Definition SpellInfo.cpp:1323

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

◆ IsImmunedToSchool() [2/3]

bool Unit::IsImmunedToSchool ( SpellInfo const *  spellInfo) const
12893{
12894 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
12895 return false;
12896
12897 uint32 schoolMask = spellInfo->GetSchoolMask();
12898 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12899 {
12900 return false;
12901 }
12902
12903 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12904 {
12905 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12906 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12907 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12908 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
12909 return true;
12910 }
12911
12912 return false;
12913}

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

◆ IsImmunedToSchool() [3/3]

bool Unit::IsImmunedToSchool ( SpellSchoolMask  meleeSchoolMask) const
12877{
12878 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12879 {
12880 return false;
12881 }
12882
12883 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12884 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12885 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12886 if ((itr->type & meleeSchoolMask) == meleeSchoolMask)
12887 return true;
12888
12889 return false;
12890}

References IMMUNITY_SCHOOL, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

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

◆ IsImmunedToSpell()

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

Reimplemented in Creature.

12961{
12962 if (!spellInfo)
12963 return false;
12964
12965 // Single spell immunity.
12966 SpellImmuneList const& idList = m_spellImmune[IMMUNITY_ID];
12967 for (SpellImmuneList::const_iterator itr = idList.begin(); itr != idList.end(); ++itr)
12968 if (itr->type == spellInfo->Id)
12969 return true;
12970
12971 // xinef: my special immunity, if spellid is not on this list it means npc is immune
12972 SpellImmuneList const& allowIdList = m_spellImmune[IMMUNITY_ALLOW_ID];
12973 if (!allowIdList.empty())
12974 {
12975 for (SpellImmuneList::const_iterator itr = allowIdList.begin(); itr != allowIdList.end(); ++itr)
12976 if (itr->type == spellInfo->Id)
12977 return false;
12978 return true;
12979 }
12980
12981 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
12982 return false;
12983
12984 if (spellInfo->Dispel)
12985 {
12986 SpellImmuneList const& dispelList = m_spellImmune[IMMUNITY_DISPEL];
12987 for (SpellImmuneList::const_iterator itr = dispelList.begin(); itr != dispelList.end(); ++itr)
12988 if (itr->type == spellInfo->Dispel)
12989 return true;
12990 }
12991
12992 // Spells that don't have effectMechanics.
12993 if (spellInfo->Mechanic)
12994 {
12995 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
12996 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
12997 if (itr->type == spellInfo->Mechanic)
12998 return true;
12999 }
13000
13001 bool immuneToAllEffects = true;
13002 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
13003 {
13004 // State/effect immunities applied by aura expect full spell immunity
13005 // Ignore effects with mechanic, they are supposed to be checked separately
13006 if (!spellInfo->Effects[i].IsEffect())
13007 continue;
13008
13009 // Xinef: if target is immune to one effect, and the spell has transform aura - it is immune to whole spell
13010 if (IsImmunedToSpellEffect(spellInfo, i))
13011 {
13012 if (spellInfo->HasAura(SPELL_AURA_TRANSFORM))
13013 return true;
13014 continue;
13015 }
13016
13017 immuneToAllEffects = false;
13018 break;
13019 }
13020 if (immuneToAllEffects) //Return immune only if the target is immune to all spell effects.
13021 return true;
13022
13023 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
13024 {
13025 SpellSchoolMask spellSchoolMask = spellInfo->GetSchoolMask();
13026 if (spell)
13027 {
13028 spellSchoolMask = spell->GetSpellSchoolMask();
13029 }
13030
13031 if (spellSchoolMask != SPELL_SCHOOL_MASK_NONE)
13032 {
13033 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
13034 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
13035 {
13036 SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(itr->spellId);
13037 if (((itr->type & spellSchoolMask) == spellSchoolMask)
13038 && (!immuneSpellInfo || immuneSpellInfo->IsPositive()) && !spellInfo->IsPositive()
13039 && !spellInfo->CanPierceImmuneAura(immuneSpellInfo))
13040 {
13041 return true;
13042 }
13043 }
13044 }
13045 }
13046
13047 return false;
13048}
@ 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(), HasSpiritOfRedemptionAura(), 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_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(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), SpellHitResult(), and SpellHitResult().

◆ IsImmunedToSpellEffect()

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

Reimplemented in Creature, and Totem.

13051{
13052 if (!spellInfo || !spellInfo->Effects[index].IsEffect())
13053 return false;
13054
13055 // xinef: pet scaling auras
13056 if (spellInfo->HasAttribute(SPELL_ATTR4_OWNER_POWER_SCALING))
13057 return false;
13058
13059 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
13060 return false;
13061
13062 //If m_immuneToEffect type contain this effect type, IMMUNE effect.
13063 uint32 effect = spellInfo->Effects[index].Effect;
13064 SpellImmuneList const& effectList = m_spellImmune[IMMUNITY_EFFECT];
13065 for (SpellImmuneList::const_iterator itr = effectList.begin(); itr != effectList.end(); ++itr)
13066 {
13067 if (itr->type == effect && (itr->spellId != 62692 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13068 {
13069 return true;
13070 }
13071 }
13072
13073 if (uint32 mechanic = spellInfo->Effects[index].Mechanic)
13074 {
13075 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
13076 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
13077 if (itr->type == mechanic)
13078 return true;
13079 }
13080
13081 if (uint32 aura = spellInfo->Effects[index].ApplyAuraName)
13082 {
13084 for (SpellImmuneList::const_iterator itr = list.begin(); itr != list.end(); ++itr)
13085 {
13086 if (itr->type == aura && (itr->spellId != 64848 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13087 {
13088 if (!spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
13089 {
13090 if (itr->blockType == SPELL_BLOCK_TYPE_ALL || spellInfo->IsPositive()) // xinef: added for pet scaling
13091 {
13092 return true;
13093 }
13094 }
13095 }
13096 }
13097
13098 if (!spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
13099 {
13100 // Check for immune to application of harmful magical effects
13102 for (AuraEffectList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter)
13103 {
13104 if (/*(spellInfo->Dispel == DISPEL_MAGIC || spellInfo->Dispel == DISPEL_CURSE || spellInfo->Dispel == DISPEL_DISEASE) &&*/ // Magic debuff, xinef: all kinds?
13105 ((*iter)->GetMiscValue() & spellInfo->GetSchoolMask()) && // Check school
13106 !spellInfo->IsPositiveEffect(index) && // Harmful
13107 spellInfo->Effects[index].Effect != SPELL_EFFECT_PERSISTENT_AREA_AURA) // Not Persistent area auras
13108 {
13109 return true;
13110 }
13111 }
13112 }
13113 }
13114
13115 return false;
13116}
@ 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
@ SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL
Definition SpellAuraDefines.h:330
@ SPELL_BLOCK_TYPE_ALL
Definition SpellDefines.h:159
bool CanRestoreMana(SpellInfo const *spellInfo) const
Definition Unit.cpp:21263

References CanRestoreMana(), SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), 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_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
884{ return IsImmuneToPC() && IsImmuneToNPC(); }

References IsImmuneToNPC(), and IsImmuneToPC().

◆ IsImmuneToNPC()

◆ IsImmuneToPC()

◆ isInAccessiblePlaceFor()

bool Unit::isInAccessiblePlaceFor ( Creature const *  c) const
4227{
4228 if (c->GetMapId() == MAP_THE_RING_OF_VALOR)
4229 {
4230 // skip transport check, check for being below floor level
4231 if (this->GetPositionZ() < 28.0f)
4232 return false;
4233 if (BattlegroundMap* bgMap = c->GetMap()->ToBattlegroundMap())
4234 if (Battleground* bg = bgMap->GetBG())
4235 if (bg->GetStartTime() < 80133) // 60000ms preparation time + 20133ms elevator rise time
4236 return false;
4237 }
4238 else if (c->GetMapId() == MAP_ICECROWN_CITADEL)
4239 {
4240 // if static transport doesn't match - return false
4241 if (c->GetTransport() != this->GetTransport() && ((c->GetTransport() && c->GetTransport()->IsStaticTransport()) || (this->GetTransport() && this->GetTransport()->IsStaticTransport())))
4242 return false;
4243
4244 // special handling for ICC (map 631), for non-flying pets in Gunship Battle, for trash npcs this is done via CanAIAttack
4245 if (c->GetOwnerGUID().IsPlayer() && !c->CanFly())
4246 {
4247 if (c->GetTransport() != this->GetTransport())
4248 return false;
4249 if (this->GetTransport())
4250 {
4251 if (c->GetPositionY() < 2033.0f)
4252 {
4253 if (this->GetPositionY() > 2033.0f)
4254 return false;
4255 }
4256 else if (c->GetPositionY() < 2438.0f)
4257 {
4258 if (this->GetPositionY() < 2033.0f || this->GetPositionY() > 2438.0f)
4259 return false;
4260 }
4261 else if (this->GetPositionY() < 2438.0f)
4262 return false;
4263 }
4264 }
4265 }
4266 else
4267 {
4268 // pussywizard: prevent any bugs by passengers exiting transports or normal creatures flying away
4269 if (c->GetTransport() != this->GetTransport())
4270 return false;
4271 }
4272
4273 LiquidStatus liquidStatus = GetLiquidData().Status;
4274 bool isInWater = (liquidStatus & MAP_LIQUID_STATUS_IN_CONTACT) != 0;
4275
4276 // In water or jumping in water
4277 if (isInWater || (liquidStatus == LIQUID_MAP_ABOVE_WATER && (IsFalling() || (ToPlayer() && ToPlayer()->IsFalling()))))
4278 {
4279 return c->CanEnterWater();
4280 }
4281 else
4282 {
4283 return c->CanWalk() || c->CanFly();
4284 }
4285}
@ MAP_THE_RING_OF_VALOR
Definition AreaDefines.h:260
@ MAP_ICECROWN_CITADEL
Definition AreaDefines.h:264
LiquidStatus
Definition GridTerrainData.h:190
@ LIQUID_MAP_ABOVE_WATER
Definition GridTerrainData.h:192
#define MAP_LIQUID_STATUS_IN_CONTACT
Definition GridTerrainData.h:32
Definition Map.h:686
BattlegroundMap * ToBattlegroundMap()
Definition Map.h:396
bool IsFalling() const
Definition Unit.cpp:19985
LiquidData const & GetLiquidData() const
Definition Object.cpp:3181
LiquidStatus Status
Definition GridTerrainData.h:206

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_ICECROWN_CITADEL, MAP_LIQUID_STATUS_IN_CONTACT, MAP_THE_RING_OF_VALOR, 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(), boss_high_nethermancer_zerevor::CastDampenMagicIfPossible(), 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_felblood_kaelthas::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_aura::HandleEffectRemove(), WorldSession::HandleEquipmentSetUse(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), spell_putricide_mutated_transformation::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(), boss_muru::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::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_kiljaeden::Reset(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), instance_naxxramas::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(), 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_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(), 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(), 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
21070{
21071 // Check target exists
21072 if (!who)
21073 return false;
21074 // Search in threat list
21075 ObjectGuid guid = who->GetGUID();
21076 for (ThreatContainer::StorageType::const_iterator i = m_ThreatMgr.GetThreatList().begin(); i != m_ThreatMgr.GetThreatList().end(); ++i)
21077 {
21078 HostileReference* ref = (*i);
21079 // Return true if the unit matches
21080 if (ref && ref->getUnitGuid() == guid)
21081 return true;
21082 }
21083 // Nothing found, false.
21084 return false;
21085}
Definition ThreatMgr.h:48
ObjectGuid getUnitGuid() const
Definition ThreatMgr.h:106
ThreatContainer::StorageType const & GetThreatList() const
Definition ThreatMgr.h:273

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

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

◆ IsInDisallowedMountForm()

bool Unit::IsInDisallowedMountForm ( ) const
21299{
21300 if (SpellInfo const* transformSpellInfo = sSpellMgr->GetSpellInfo(getTransForm()))
21301 {
21302 if (transformSpellInfo->HasAttribute(SPELL_ATTR0_ALLOW_WHILE_MOUNTED))
21303 {
21304 return false;
21305 }
21306 }
21307
21308 if (ShapeshiftForm form = GetShapeshiftForm())
21309 {
21310 SpellShapeshiftFormEntry const* shapeshift = sSpellShapeshiftFormStore.LookupEntry(form);
21311 if (!shapeshift)
21312 {
21313 return true;
21314 }
21315
21316 if (!(shapeshift->flags1 & SHAPESHIFT_FLAG_STANCE))
21317 {
21318 return true;
21319 }
21320 }
21321
21323 {
21324 return false;
21325 }
21326
21327 CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(GetDisplayId());
21328 if (!display)
21329 {
21330 return true;
21331 }
21332
21334 if (!displayExtra)
21335 {
21336 return true;
21337 }
21338
21339 CreatureModelDataEntry const* model = sCreatureModelDataStore.LookupEntry(display->ModelId);
21340 ChrRacesEntry const* race = sChrRacesStore.LookupEntry(displayExtra->DisplayRaceID);
21341
21342 if (model && !(model->HasFlag(CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT)))
21343 {
21344 if (race && !(race->HasFlag(CHRRACES_FLAGS_CAN_MOUNT)))
21345 {
21346 return true;
21347 }
21348 }
21349
21350 return false;
21351}
@ 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
@ SHAPESHIFT_FLAG_STANCE
Definition UnitDefines.h:104
uint32 getTransForm() const
Definition Unit.h:1888
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:804
uint32 flags1
Definition DBCStructure.h:1823

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

Referenced by Player::ActivateTaxiPathTo(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), 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
4217{
4218 return IsWithinDistInMap(target, distance) && HasInArc(arc, target);
4219}

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

◆ IsInnkeeper()

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

References HasNpcFlag(), and UNIT_NPC_FLAG_INNKEEPER.

Referenced by npc_innkeeper::OnGossipHello().

◆ IsInPartyWith()

bool Unit::IsInPartyWith ( Unit const *  unit) const
18808{
18809 if (this == unit)
18810 return true;
18811
18812 Unit const* u1 = GetCharmerOrOwnerOrSelf();
18813 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
18814 if (u1 == u2)
18815 return true;
18816
18817 if (u1->IsPlayer() && u2->IsPlayer())
18818 return u1->ToPlayer()->IsInSameGroupWith(u2->ToPlayer());
18819 // Xinef: we assume that npcs with the same faction are in party
18820 else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
18821 return u1->GetFaction() == u2->GetFaction();
18822 // Xinef: creature type_flag should work for party check only if player group is not a raid
18825 return true;
18826 else
18827 return false;
18828}
bool isRaidGroup() const
Definition Group.cpp:2270
bool IsInSameGroupWith(Player const *p) const
Definition Player.cpp:2316

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

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

◆ IsInRaidWith()

bool Unit::IsInRaidWith ( Unit const *  unit) const
18831{
18832 if (this == unit)
18833 return true;
18834
18835 Unit const* u1 = GetCharmerOrOwnerOrSelf();
18836 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
18837 if (u1 == u2)
18838 return true;
18839
18840 if (u1->IsPlayer() && u2->IsPlayer())
18841 return u1->ToPlayer()->IsInSameRaidWith(u2->ToPlayer());
18842 // Xinef: we assume that npcs with the same faction are in party
18843 else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
18844 return u1->GetFaction() == u2->GetFaction();
18847 return true;
18848 else
18849 return false;
18850}

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

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

◆ IsInSanctuary()

bool Unit::IsInSanctuary ( ) const
inline

◆ IsInWater()

bool Unit::IsInWater ( ) const
virtual

◆ IsLevitating()

◆ IsMounted()

◆ IsMovementPreventedByCasting()

bool Unit::IsMovementPreventedByCasting ( ) const
virtual

Reimplemented in Creature.

4193{
4194 // can always move when not casting
4196 {
4197 return false;
4198 }
4199
4200 // channeled spells during channel stage (after the initial cast timer) allow movement with a specific spell attribute
4202 {
4203 if (spell->getState() != SPELL_STATE_FINISHED && spell->IsChannelActive())
4204 {
4205 if (spell->GetSpellInfo()->IsActionAllowedChannel())
4206 {
4207 return false;
4208 }
4209 }
4210 }
4211
4212 // prohibit movement for all other spell casts
4213 return true;
4214}
@ UNIT_STATE_CASTING
Definition UnitDefines.h:185

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

Referenced by TimedFleeingMovementGenerator::Update().

◆ isMoving()

◆ IsNeutralToAll()

bool Unit::IsNeutralToAll ( ) const
10300{
10301 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10302 if (!my_faction || !my_faction->faction)
10303 return true;
10304
10305 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10306 if (raw_faction && raw_faction->reputationListID >= 0)
10307 return false;
10308
10309 return my_faction->IsNeutralToAll();
10310}
bool IsNeutralToAll() const
Definition DBCStructure.h:982

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
4133{
4134 // We don't do loop here to explicitly show that melee spell is excluded.
4135 // Maybe later some special spells will be excluded too.
4136
4137 // generic spells are cast when they are not finished and not delayed
4140 (withDelayed || m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_DELAYED))
4141 {
4142 if (!skipInstant || m_currentSpells[CURRENT_GENERIC_SPELL]->GetCastTime())
4143 {
4144 if (!isAutoshoot || !m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4145 return true;
4146 }
4147 }
4148 // channeled spells may be delayed, but they are still considered cast
4149 if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] &&
4151 {
4152 if (!isAutoshoot || !m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4153 return true;
4154 }
4155 // autorepeat spells may be finished or delayed, but they are still considered cast
4156 if (!skipAutorepeat && m_currentSpells[CURRENT_AUTOREPEAT_SPELL])
4157 return true;
4158
4159 return false;
4160}
@ 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(), Player::CanExecutePendingSpellCastRequest(), CombatStop(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), ScriptedAI::DoCastSpell(), Spell::EffectKnockBack(), Spell::finish(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), isSpellBlocked(), boss_shade_of_aran::JustEngagedWith(), boss_pandemonius::JustEngagedWith(), MeleeSpellHitResult(), Spell::prepare(), SmartScript::ProcessEvent(), RollMeleeOutcomeAgainst(), setDeathState(), StopAttackFaction(), boss_netherspite::SwitchToPortalPhase(), Player::TeleportTo(), TotemAI::UpdateAI(), npc_chesspiece::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(), npc_warmage_violetstand::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ IsOnVehicle()

◆ IsPet()

bool Unit::IsPet ( ) const
inline
763{ return m_unitTypeMask & UNIT_MASK_PET; }
@ UNIT_MASK_PET
Definition UnitDefines.h:160

References m_unitTypeMask, and UNIT_MASK_PET.

Referenced by Spell::_cast(), Spell::AddUnitTarget(), spell_warl_demonic_pact_aura::AfterCheckProc(), 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(), 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(), 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_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)
17370{
17371 Unit* owner = GetOwner();
17372
17373 if (!owner || !owner->IsPlayer())
17374 return false;
17375
17376 // if the owner has that pet aura, return true
17377 for (PetAura const* petAura : owner->m_petAuras)
17378 if (petAura->GetAura(GetEntry()) == aura->GetId())
17379 return true;
17380
17381 return false;
17382}
Definition SpellMgr.h:470
uint32 GetId(std::string const &username)
Definition AccountMgr.cpp:229

References Object::GetEntry(), Aura::GetId(), GetOwner(), Object::IsPlayer(), and m_petAuras.

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

◆ IsPetInCombat()

bool Unit::IsPetInCombat ( ) const
inline

◆ IsPolymorphed()

bool Unit::IsPolymorphed ( ) const
16775{
16776 uint32 transformId = getTransForm();
16777 if (!transformId)
16778 return false;
16779
16780 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(transformId);
16781 if (!spellInfo)
16782 return false;
16783
16784 return spellInfo->GetSpellSpecific() == SPELL_SPECIFIC_MAGE_POLYMORPH;
16785}
@ SPELL_SPECIFIC_MAGE_POLYMORPH
Definition SpellInfo.h:160
SpellSpecificType GetSpellSpecific() const
Definition SpellInfo.cpp:2137

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
1255 {
1256 if (Unit* u = GetCharm())
1257 return u->isPossessed();
1258 else
1259 return false;
1260 }

References GetCharm().

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

◆ isPossessing() [2/2]

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

References GetCharmGUID(), Object::GetGUID(), and isPossessed().

◆ IsPvP()

◆ IsQuestGiver()

bool Unit::IsQuestGiver ( ) const
inline
@ UNIT_NPC_FLAG_QUESTGIVER
Definition UnitDefines.h:316

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
5866{
5868 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5869 {
5870 if ((*i)->GetMiscValue() == script)
5871 if ((*i)->IsAffectedOnSpell(spell))
5872 return (*i);
5873 }
5874 return nullptr;
5875}
@ 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()

bool Unit::IsServiceProvider ( ) const
inline

◆ IsSitState()

bool Unit::IsSitState ( ) const
16745{
16746 uint8 s = getStandState();
16747 return
16751}
@ UNIT_STAND_STATE_SIT_HIGH_CHAIR
Definition UnitDefines.h:38
@ UNIT_STAND_STATE_SIT_MEDIUM_CHAIR
Definition UnitDefines.h:37
@ UNIT_STAND_STATE_SIT_LOW_CHAIR
Definition UnitDefines.h:36
@ UNIT_STAND_STATE_SIT_CHAIR
Definition UnitDefines.h:34

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 
)
3115{
3116 // These spells can't be blocked
3117 if (spellProto && spellProto->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3118 return false;
3119
3120 if (victim->HasIgnoreHitDirectionAura() || victim->HasInArc(M_PI, this))
3121 {
3122 // Check creatures flags_extra for disable block
3123 if (victim->IsCreature() &&
3125 return false;
3126
3127 float blockChance = victim->GetUnitBlockChance();
3128 blockChance += (int32(GetWeaponSkillValue(attackType)) - int32(victim->GetMaxSkillValueForLevel())) * 0.04f;
3129
3130 // xinef: cant block while casting or while stunned
3131 if (blockChance < 0.0f || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3132 blockChance = 0.0f;
3133
3134 if (roll_chance_f(blockChance))
3135 return true;
3136 }
3137 return false;
3138}
@ CREATURE_FLAG_EXTRA_NO_BLOCK
Definition CreatureData.h:49
@ SPELL_ATTR0_NO_ACTIVE_DEFENSE
Definition SharedDefines.h:403
@ UNIT_STATE_CONTROLLED
Definition UnitDefines.h:211
bool HasIgnoreHitDirectionAura() const
Definition Unit.h:1733
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const *target=nullptr) const
Definition Unit.cpp:3804
float GetUnitBlockChance() const
Definition Unit.cpp:3716

References CREATURE_FLAG_EXTRA_NO_BLOCK, GetMaxSkillValueForLevel(), GetUnitBlockChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), Creature::HasFlagsExtra(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), Object::IsCreature(), IsNonMeleeSpellCast(), roll_chance_f(), SPELL_ATTR0_NO_ACTIVE_DEFENSE, Object::ToCreature(), 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
1684{ return !(HasUnitState(UNIT_STATE_MOVING)); }
@ UNIT_STATE_MOVING
Definition UnitDefines.h:210

References HasUnitState(), and UNIT_STATE_MOVING.

Referenced by RotateMovementGenerator::Initialize(), IdleMovementGenerator::Reset(), and SetFacingToObject().

◆ IsSummon()

bool Unit::IsSummon ( ) const
inline
@ UNIT_MASK_SUMMON
Definition UnitDefines.h:156

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(), 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(), 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(), InstanceScript::OnCreatureCreate(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnCreatureCreate(), instance_hyjal::instance_mount_hyjal_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(), 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()

◆ 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
17457{
17458 SpellInfo const* spellProto = aura->GetSpellInfo();
17459 SpellInfo const* procSpell = eventInfo.GetSpellInfo();
17460
17461 // let the aura be handled by new proc system if it has new entry
17462 if (sSpellMgr->GetSpellProcEntry(spellProto->Id))
17463 return false;
17464
17465 // Get proc Event Entry
17466 spellProcEvent = sSpellMgr->GetSpellProcEvent(spellProto->Id);
17467
17468 // Get EventProcFlag
17469 uint32 EventProcFlag;
17470 if (spellProcEvent && spellProcEvent->procFlags) // if exist get custom spellProcEvent->procFlags
17471 EventProcFlag = spellProcEvent->procFlags;
17472 else
17473 EventProcFlag = spellProto->ProcFlags; // else get from spell proto
17474 // Continue if no trigger exist
17475 if (!EventProcFlag)
17476 return false;
17477
17478 // Additional checks for triggered spells (ignore trap casts)
17479 if (eventInfo.GetHitMask() & PROC_EX_INTERNAL_TRIGGERED && !(EventProcFlag & PROC_FLAG_DONE_TRAP_ACTIVATION))
17480 {
17482 return false;
17483 }
17484
17485 // Xinef: additional check for player auras - only player spells can trigger player proc auras
17486 // Xinef: skip victim auras
17487 // Excluded player shoot spells
17488 // Excluded player item spells
17489 if (!isVictim && IsPlayer() && !(EventProcFlag & (PROC_FLAG_KILL | PROC_FLAG_DEATH)))
17490 {
17491 if (procSpell && procSpell->SpellFamilyName == SPELLFAMILY_GENERIC && procSpell->GetCategory() != 76 &&
17492 (!eventInfo.GetProcSpell() || !eventInfo.GetProcSpell()->m_CastItem) &&
17493 (!eventInfo.GetTriggerAuraSpell() || eventInfo.GetTriggerAuraSpell()->SpellFamilyName == SPELLFAMILY_GENERIC))
17494 {
17495 return false;
17496 }
17497 }
17498
17499 // Check spellProcEvent data requirements
17500 if (!sSpellMgr->IsSpellProcEventCanTriggeredBy(spellProto, spellProcEvent, EventProcFlag, eventInfo, active))
17501 return false;
17502 // In most cases req get honor or XP from kill
17503 if (EventProcFlag & PROC_FLAG_KILL && IsPlayer())
17504 {
17505 bool allow = false;
17506
17507 if (victim)
17508 allow = ToPlayer()->isHonorOrXPTarget(victim);
17509
17510 // Shadow Word: Death - can trigger from every kill
17511 if (aura->GetId() == 32409 || aura->GetId() == 18372 || aura->GetId() == 18213)
17512 allow = true;
17513 if (!allow)
17514 return false;
17515 }
17516 // Aura added by spell can`t trigger from self (prevent drop charges/do triggers)
17517 // But except periodic and kill triggers (can triggered from self)
17518 if (procSpell && procSpell->Id == spellProto->Id
17519 && !(spellProto->ProcFlags & (PROC_FLAG_TAKEN_PERIODIC | PROC_FLAG_KILL)))
17520 return false;
17521
17522 // Check if current equipment allows aura to proc
17523 if (!isVictim && IsPlayer() && !spellProto->HasAttribute(SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT))
17524 {
17525 Player* player = ToPlayer();
17526 if (spellProto->EquippedItemClass == ITEM_CLASS_WEAPON)
17527 {
17528 Item* item = nullptr;
17529 if (attType == BASE_ATTACK)
17531 else if (attType == OFF_ATTACK)
17533 else
17535
17536 if (player->IsInFeralForm())
17537 return false;
17538
17539 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_WEAPON || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17540 return false;
17541 }
17542 else if (spellProto->EquippedItemClass == ITEM_CLASS_ARMOR)
17543 {
17544 // Check if player is wearing shield
17546 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_ARMOR || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17547 return false;
17548 }
17549 }
17550 // Get chance from spell
17551 float chance = float(spellProto->ProcChance);
17552 // If in spellProcEvent exist custom chance, chance = spellProcEvent->customChance;
17553 if (spellProcEvent && spellProcEvent->customChance)
17554 chance = spellProcEvent->customChance;
17555 // If PPM exist calculate chance from PPM
17556 if (spellProcEvent && spellProcEvent->ppmRate != 0)
17557 {
17558 if (!isVictim)
17559 {
17560 uint32 WeaponSpeed = GetAttackTime(attType);
17561 chance = GetPPMProcChance(WeaponSpeed, spellProcEvent->ppmRate, spellProto);
17562 }
17563 else if (victim)
17564 {
17565 uint32 WeaponSpeed = victim->GetAttackTime(attType);
17566 chance = victim->GetPPMProcChance(WeaponSpeed, spellProcEvent->ppmRate, spellProto);
17567 }
17568 }
17569
17570 // Custom chances
17571 switch (spellProto->SpellFamilyName)
17572 {
17574 {
17575 // Recklessness, allow to proc only once for whirlwind
17576 if (spellProto->Id == 1719 && procSpell && procSpell->Id == 44949)
17577 return false;
17578 }
17579 }
17580
17581 if (eventInfo.GetProcChance())
17582 {
17583 chance = *eventInfo.GetProcChance();
17584 }
17585
17586 // Apply chance modifer aura
17587 if (Player* modOwner = GetSpellModOwner())
17588 {
17589 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CHANCE_OF_SUCCESS, chance);
17590 }
17591
17592 return roll_chance_f(chance);
17593}
@ ITEM_CLASS_ARMOR
Definition ItemTemplate.h:295
@ ITEM_CLASS_WEAPON
Definition ItemTemplate.h:293
@ EQUIPMENT_SLOT_RANGED
Definition Player.h:698
@ SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT
Definition SharedDefines.h:494
@ SPELL_ATTR3_CAN_PROC_FROM_PROCS
Definition SharedDefines.h:519
@ SPELLMOD_CHANCE_OF_SUCCESS
Definition SpellDefines.h:94
@ PROC_EX_INTERNAL_TRIGGERED
Definition SpellMgr.h:221
@ PROC_FLAG_DEATH
Definition SpellMgr.h:143
@ PROC_FLAG_TAKEN_PERIODIC
Definition SpellMgr.h:135
@ PROC_FLAG_KILL
Definition SpellMgr.h:108
@ PROC_FLAG_DONE_TRAP_ACTIVATION
Definition SpellMgr.h:138
Item * GetUseableItemByPos(uint8 bag, uint8 slot) const
Definition Player.h:1262
bool isHonorOrXPTarget(Unit *victim) const
Definition Player.cpp:12646
uint32 GetCategory() const
Definition SpellInfo.cpp:871
int32 EquippedItemClass
Definition SpellInfo.h:375
uint32 ProcFlags
Definition SpellInfo.h:355
int32 EquippedItemSubClassMask
Definition SpellInfo.h:376
float GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
Definition Unit.cpp:13495
uint32 Class
Definition ItemTemplate.h:621

References BASE_ATTACK, ItemTemplate::Class, SpellProcEventEntry::customChance, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, SpellInfo::EquippedItemClass, SpellInfo::EquippedItemSubClassMask, GetAttackTime(), SpellInfo::GetCategory(), ProcEventInfo::GetHitMask(), Aura::GetId(), GetPPMProcChance(), ProcEventInfo::GetProcChance(), ProcEventInfo::GetProcSpell(), ProcEventInfo::GetSpellInfo(), Aura::GetSpellInfo(), GetSpellModOwner(), Item::GetTemplate(), ProcEventInfo::GetTriggerAuraSpell(), 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_EX_INTERNAL_TRIGGERED, PROC_FLAG_DEATH, PROC_FLAG_DONE_TRAP_ACTIVATION, PROC_FLAG_KILL, PROC_FLAG_TAKEN_PERIODIC, SpellInfo::ProcChance, SpellInfo::ProcFlags, SpellProcEventEntry::procFlags, roll_chance_f(), SPELL_ATTR3_CAN_PROC_FROM_PROCS, SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT, SPELLFAMILY_GENERIC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyName, SPELLMOD_CHANCE_OF_SUCCESS, sSpellMgr, ItemTemplate::SubClass, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ isTurning()

bool Unit::isTurning ( ) const
inline

◆ IsUnderLastManaUseEffect()

bool Unit::IsUnderLastManaUseEffect ( ) const

◆ IsUnderWater()

bool Unit::IsUnderWater ( ) const
virtual
4378{
4380}
@ LIQUID_MAP_UNDER_WATER
Definition GridTerrainData.h:195

References WorldObject::GetLiquidData(), LIQUID_MAP_UNDER_WATER, and LiquidData::Status.

Referenced by Creature::setDeathState().

◆ IsValidAssistTarget()

bool Unit::IsValidAssistTarget ( Unit const *  target) const
14046{
14047 return _IsValidAssistTarget(target, nullptr);
14048}
bool _IsValidAssistTarget(Unit const *target, SpellInfo const *bySpell) const
Definition Unit.cpp:14051

References _IsValidAssistTarget().

Referenced by SmartAI::AssistPlayerInCombatAgainst().

◆ IsValidAttackTarget()

bool Unit::IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell = nullptr 
) const
13923{
13924 return _IsValidAttackTarget(target, bySpell);
13925}

References _IsValidAttackTarget().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), CreatureGroup::GetNewTargetForMember(), WorldSession::HandleAttackSwingOpcode(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), npc_beryl_sorcerer::npc_beryl_sorcererAI::JustEngagedWith(), CreatureGroup::MemberEngagingTarget(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), boss_kaelthas::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::CheckCast(), Spell::CheckEffectTarget(), SpellInfo::CheckTarget(), Map::CreatureRelocation(), DealDamage(), DealMeleeDamage(), MotionTransport::DelayedTeleportTransport(), 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::HandleSummon(), TempSummon::InitStats(), KillRewarder::KillRewarder(), spell_igb_overheat_aura::Load(), MagicSpellHitResult(), npc_brann_radio::npc_brann_radioAI::MoveInLineOfSight(), BattlefieldWG::OnUnitDeath(), OutDebugInfo(), VehicleAI::Permissible(), Map::PlayerRelocation(), SmartScript::ProcessAction(), RemoveCharmedBy(), RemoveFromWorld(), Spell::SelectImplicitCasterObjectTargets(), SetCharmedBy(), SetOwnerGUID(), SetSpeed(), Player::StopCastingCharm(), Map::SummonCreature(), UpdateCharmAI(), Creature::UpdateEntry(), UpdateHeight(), UpdateOrientation(), and UpdateSpeed().

◆ IsVendor()

◆ IsVisible()

bool Unit::IsVisible ( ) const
inline
@ SEC_PLAYER
Definition Common.h:57
@ SERVERSIDE_VISIBILITY_GM
Definition SharedDefines.h:1273
T_VALUES GetValue(FLAG_TYPE flag) const
Definition Object.h:377

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(), 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

◆ IsWithinMeleeRange()

bool Unit::IsWithinMeleeRange ( Unit const *  obj,
float  dist = 0.f 
) const
666{
667 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
668 return false;
669
670 float dx = GetPositionX() - obj->GetPositionX();
671 float dy = GetPositionY() - obj->GetPositionY();
672 float dz = GetPositionZ() - obj->GetPositionZ();
673 float distsq = dx * dx + dy * dy + dz * dz;
674
675 float maxdist = dist + GetMeleeRange(obj);
676
677 return distsq < maxdist * maxdist;
678}

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(), boss_alar::CanAIAttack(), PetAI::CanAttack(), Spell::CheckRange(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), spell_shazzrah_gate_dummy::FilterTargets(), boss_supremus::FindHatefulStrikeTarget(), boss_ouro::IsPlayerWithinMeleeRange(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), boss_swamplord_muselek::JustEngagedWith(), boss_vem::JustEngagedWith(), CreatureAI::MoveCircleChecks(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), SpellTargetSelector::operator()(), MysticBuffetTargetFilter::operator()(), SmartScript::ProcessEvent(), 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_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::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), PetAI::UpdateAI(), npc_dark_fiend::UpdateAI(), npc_zuljin_vortex::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
687{
688 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
689 {
690 return false;
691 }
692
693 auto dx = GetPositionX() - obj->GetPositionX();
694 auto dy = GetPositionY() - obj->GetPositionY();
695 auto dz = GetPositionZ() - obj->GetPositionZ();
696 auto distsq = dx * dx + dy * dy + dz * dz;
697
698 return distsq <= dist * dist;
699}

References Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::InSamePhase(), and WorldObject::IsInMap().

Referenced by boss_swamplord_muselek::CanShootVictim(), npc_sunblade_scout::JustEngagedWith(), and npc_amanishi_scout::JustEngagedWith().

◆ JumpTo() [1/2]

void Unit::JumpTo ( float  speedXY,
float  speedZ,
bool  forward = true 
)
19558{
19559 float angle = forward ? 0 : M_PI;
19560 if (IsCreature())
19561 GetMotionMaster()->MoveJumpTo(angle, speedXY, speedZ);
19562 else
19563 {
19564 float vcos = cos(angle + GetOrientation());
19565 float vsin = std::sin(angle + GetOrientation());
19566
19567 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19568 data << GetPackGUID();
19569 data << uint32(0); // Sequence
19570 data << float(vcos); // x direction
19571 data << float(vsin); // y direction
19572 data << float(speedXY); // Horizontal speed
19573 data << float(-speedZ); // Z Movement speed (vertical)
19574
19575 ToPlayer()->GetSession()->SendPacket(&data);
19576 }
19577}
void MoveJumpTo(float angle, float speedXY, float speedZ)
The unit will jump in a specific direction.
Definition MotionMaster.cpp:587
WorldSession * GetSession() const
Definition Player.h:2007
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition WorldSession.cpp:226
@ SMSG_MOVE_KNOCK_BACK
Definition Opcodes.h:269

References GetMotionMaster(), Position::GetOrientation(), Object::GetPackGUID(), Player::GetSession(), Object::IsCreature(), MotionMaster::MoveJumpTo(), WorldSession::SendPacket(), SMSG_MOVE_KNOCK_BACK, and Object::ToPlayer().

Referenced by Spell::EffectLeapBack().

◆ JumpTo() [2/2]

void Unit::JumpTo ( WorldObject obj,
float  speedZ 
)
19580{
19581 float x, y, z;
19582 obj->GetContactPoint(this, x, y, z);
19583 float speedXY = GetExactDist2d(x, y) * 10.0f / speedZ;
19584 GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ);
19585}
void MoveJump(Position const &pos, float speedXY, float speedZ, uint32 id=0)
Definition MotionMaster.h:229
void GetContactPoint(WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
Definition Object.cpp:2755

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
17736{
17737 // Prevent killing unit twice (and giving reward from kill twice)
17738 if (!victim->GetHealth())
17739 return;
17740
17741 if (killer && !killer->IsInMap(victim))
17742 killer = nullptr;
17743
17744 // find player: owner of controlled `this` or `this` itself maybe
17745 Player* player = killer ? killer->GetCharmerOrOwnerPlayerOrPlayerItself() : nullptr;
17746 Creature* creature = victim->ToCreature();
17747
17748 bool isRewardAllowed = true;
17749 if (creature)
17750 {
17751 isRewardAllowed = (creature->IsDamageEnoughForLootingAndReward() && !creature->IsLootRewardDisabled());
17752 if (!isRewardAllowed)
17753 creature->SetLootRecipient(nullptr);
17754 }
17755
17756 // pussywizard: remade this if section (player is on the same map
17757 if (isRewardAllowed && creature)
17758 {
17759 Player* lr = creature->GetLootRecipient();
17760 if (lr && lr->IsInMap(creature))
17761 player = creature->GetLootRecipient();
17762 else if (Group* lrg = creature->GetLootRecipientGroup())
17763 for (GroupReference* itr = lrg->GetFirstMember(); itr != nullptr; itr = itr->next())
17764 if (Player* member = itr->GetSource())
17765 if (member->IsAtLootRewardDistance(creature))
17766 {
17767 player = member;
17768 break;
17769 }
17770 }
17771
17772 // Exploit fix
17773 if (creature && creature->IsPet() && creature->GetOwnerGUID().IsPlayer())
17774 isRewardAllowed = false;
17775
17776 // Reward player, his pets, and group/raid members
17777 // call kill spell proc event (before real die and combat stop to triggering auras removed at death/combat stop)
17778 if (isRewardAllowed && player && player != victim)
17779 {
17780 WorldPacket data(SMSG_PARTYKILLLOG, (8 + 8)); // send event PARTY_KILL
17781 data << player->GetGUID(); // player with killing blow
17782 data << victim->GetGUID(); // victim
17783
17784 Player* looter = player;
17785 Group* group = player->GetGroup();
17786 bool hasLooterGuid = false;
17787
17788 if (group)
17789 {
17790 group->BroadcastPacket(&data, group->GetMemberGroup(player->GetGUID()));
17791
17792 if (creature)
17793 {
17794 group->UpdateLooterGuid(creature, true);
17795 if (group->GetLooterGuid() && group->GetLootMethod() != FREE_FOR_ALL)
17796 {
17797 looter = ObjectAccessor::FindPlayer(group->GetLooterGuid());
17798 if (looter)
17799 {
17800 hasLooterGuid = true;
17801 creature->SetLootRecipient(looter); // update creature loot recipient to the allowed looter.
17802 }
17803 }
17804 }
17805 }
17806 else
17807 {
17808 player->SendDirectMessage(&data);
17809
17810 if (creature)
17811 {
17812 WorldPacket data2(SMSG_LOOT_LIST, 8 + 1 + 1);
17813 data2 << creature->GetGUID();
17814 data2 << uint8(0); // unk1
17815 data2 << uint8(0); // no group looter
17816 player->SendMessageToSet(&data2, true);
17817 }
17818 }
17819
17820 // Generate loot before updating looter
17821 if (creature)
17822 {
17823 Loot* loot = &creature->loot;
17824 loot->clear();
17825
17826 if (uint32 lootid = creature->GetCreatureTemplate()->lootid)
17827 loot->FillLoot(lootid, LootTemplates_Creature, looter, false, false, creature->GetLootMode(), creature);
17828
17829 if (creature->GetLootMode())
17831
17832 if (group)
17833 {
17834 if (hasLooterGuid)
17835 group->SendLooter(creature, looter);
17836 else
17837 group->SendLooter(creature, nullptr);
17838
17839 // Update round robin looter only if the creature had loot
17840 if (!creature->loot.empty())
17841 group->UpdateLooterGuid(creature);
17842 }
17843 }
17844
17845 player->RewardPlayerAndGroupAtKill(victim, false);
17846 }
17847
17848 // 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
17849 if (killer && (killer->IsPet() || killer->IsTotem()))
17850 if (Unit* owner = killer->GetOwner())
17851 {
17852 Unit::ProcDamageAndSpell(owner, victim, PROC_FLAG_KILL, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17853 sScriptMgr->OnPlayerCreatureKilledByPet( killer->GetCharmerOrOwnerPlayerOrPlayerItself(), victim->ToCreature());
17854 }
17855
17856 if (killer != victim)
17857 {
17858 Unit::ProcDamageAndSpell(killer, victim, killer ? PROC_FLAG_KILL : 0, PROC_FLAG_KILLED, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17859 }
17860
17861 // Proc auras on death - must be before aura/combat remove
17862 Unit::ProcDamageAndSpell(victim, nullptr, PROC_FLAG_DEATH, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17863
17864 // update get killing blow achievements, must be done before setDeathState to be able to require auras on target
17865 // and before Spirit of Redemption as it also removes auras
17866 if (killer)
17867 if (Player* killerPlayer = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
17868 killerPlayer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, victim);
17869
17870 // Spirit of Redemption
17871 // if talent known but not triggered (check priest class for speedup check)
17872 bool spiritOfRedemption = false;
17874 {
17875 if (AuraEffect* aurEff = victim->GetAuraEffectDummy(20711))
17876 {
17877 // Xinef: aura_spirit_of_redemption is triggered by 27827 shapeshift
17878 if (victim->HasSpiritOfRedemptionAura() || victim->HasAura(27827))
17879 {
17880 /*LOG_INFO("misc", "Player ({}) died with spirit of redemption. Killer (Entry: {}, Name: {}), Map: {}, x: {}, y: {}, z: {}",
17881 victim->GetGUID().ToString(), killer ? killer->GetEntry() : 1, killer ? killer->GetName() : "", victim->GetMapId(), victim->GetPositionX(),
17882 victim->GetPositionY(), victim->GetPositionZ());
17883
17884 ACE_Stack_Trace trace(0, 50);
17885 LOG_INFO("misc", "TRACE: {}\n\n", trace);*/
17886 }
17887 else
17888 {
17889 // save value before aura remove
17890 uint32 ressSpellId = victim->GetUInt32Value(PLAYER_SELF_RES_SPELL);
17891 if (!ressSpellId)
17892 ressSpellId = victim->ToPlayer()->GetResurrectionSpellId();
17893
17894 //Remove all expected to remove at death auras (most important negative case like DoT or periodic triggers)
17895 victim->RemoveAllAurasOnDeath();
17896
17897 // Stop attacks
17898 victim->CombatStop();
17900
17901 // restore for use at real death
17902 victim->SetUInt32Value(PLAYER_SELF_RES_SPELL, ressSpellId);
17903
17904 // FORM_SPIRITOFREDEMPTION and related auras
17905 victim->CastSpell(victim, 27827, true, nullptr, aurEff);
17906 spiritOfRedemption = true;
17907 }
17908 }
17909 }
17910
17911 if (!spiritOfRedemption)
17912 {
17913 LOG_DEBUG("entities.unit", "SET DeathState::JustDied");
17915 }
17916
17917 // Inform pets (if any) when player kills target)
17918 // MUST come after victim->setDeathState(DeathState::JustDied); or pet next target
17919 // selection will get stuck on same target and break pet react state
17920 if (player)
17921 {
17922 Pet* pet = player->GetPet();
17923 if (pet && pet->IsAlive() && pet->isControlled())
17924 pet->AI()->KilledUnit(victim);
17925 }
17926
17927 // 10% durability loss on death
17928 // clean InHateListOf
17929 if (Player* plrVictim = victim->ToPlayer())
17930 {
17931 // remember victim PvP death for corpse type and corpse reclaim delay
17932 // at original death (not at SpiritOfRedemtionTalent timeout)
17933 plrVictim->SetPvPDeath(player != nullptr);
17934
17935 // only if not player and not controlled by player pet. And not at BG
17936 if ((durabilityLoss && !player && !plrVictim->InBattleground()) || (player && sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP)))
17937 {
17938 LOG_DEBUG("entities.unit", "We are dead, losing {} percent durability", sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH));
17939 plrVictim->DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH), false);
17940 // durability lost message
17941 plrVictim->SendDurabilityLoss();
17942 }
17943 // Call KilledUnit for creatures
17944 if (killer && killer->IsCreature() && killer->IsAIEnabled)
17945 killer->ToCreature()->AI()->KilledUnit(victim);
17946
17947 // last damage from non duel opponent or opponent controlled creature
17948 if (plrVictim->duel)
17949 {
17950 plrVictim->duel->Opponent->CombatStopWithPets(true);
17951 plrVictim->CombatStopWithPets(true);
17952 plrVictim->DuelComplete(DUEL_INTERRUPTED);
17953 }
17954 }
17955 else // creature died
17956 {
17957 LOG_DEBUG("entities.unit", "DealDamageNotPlayer");
17958
17959 if (!creature->IsPet() && creature->GetLootMode() > 0)
17960 {
17961 creature->GetThreatMgr().ClearAllThreat();
17962
17963 // must be after setDeathState which resets dynamic flags
17964 if (!creature->loot.isLooted())
17965 {
17967 }
17968 else
17969 {
17970 creature->AllLootRemovedFromCorpse();
17971 }
17972 }
17973
17974 // Call KilledUnit for creatures, this needs to be called after the lootable flag is set
17975 if (killer && killer->IsCreature() && killer->IsAIEnabled)
17976 killer->ToCreature()->AI()->KilledUnit(victim);
17977
17978 // Call creature just died function
17979 if (CreatureAI* ai = creature->AI())
17980 {
17981 ai->JustDied(killer);
17982 }
17983
17984 if (TempSummon* summon = creature->ToTempSummon())
17985 {
17986 if (WorldObject* summoner = summon->GetSummoner())
17987 {
17988 if (summoner->ToCreature() && summoner->ToCreature()->IsAIEnabled)
17989 {
17990 summoner->ToCreature()->AI()->SummonedCreatureDies(creature, killer);
17991 }
17992 else if (summoner->ToGameObject() && summoner->ToGameObject()->AI())
17993 {
17994 summoner->ToGameObject()->AI()->SummonedCreatureDies(creature, killer);
17995 }
17996 }
17997 }
17998
17999 // Dungeon specific stuff, only applies to players killing creatures
18000 if (creature->GetInstanceId())
18001 {
18002 Map* instanceMap = creature->GetMap();
18003 //Player* creditedPlayer = GetCharmerOrOwnerPlayerOrPlayerItself();
18005
18006 if (instanceMap->IsDungeon() && player)
18007 if (instanceMap->IsRaidOrHeroicDungeon())
18009 instanceMap->ToInstanceMap()->PermBindAllPlayers();
18010 }
18011 }
18012
18013 // outdoor pvp things, do these after setting the death state, else the player activity notify won't work... doh...
18014 // handle player kill only if not suicide (spirit of redemption for example)
18015 if (player && killer != victim)
18016 {
18017 if (OutdoorPvP* pvp = player->GetOutdoorPvP())
18018 pvp->HandleKill(player, victim);
18019
18020 if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetZoneId()))
18021 bf->HandleKill(player, victim);
18022 }
18023
18024 //if (victim->IsPlayer())
18025 // if (OutdoorPvP* pvp = victim->ToPlayer()->GetOutdoorPvP())
18026 // pvp->HandlePlayerActivityChangedpVictim->ToPlayer();
18027
18028 // battleground things (do this at the end, so the death state flag will be properly set to handle in the bg->handlekill)
18029 if (player)
18030 if (Battleground* bg = player->GetBattleground())
18031 {
18032 if (victim->IsPlayer())
18033 bg->HandleKillPlayer(victim->ToPlayer(), player);
18034 else
18035 bg->HandleKillUnit(victim->ToCreature(), player);
18036 }
18037
18038 // achievement stuff
18039 if (killer && victim->IsPlayer())
18040 {
18041 if (killer->IsCreature())
18043 else if (victim != killer && killer->IsPlayer())
18045 }
18046
18047 // Hook for OnPVPKill Event
18048 if (killer)
18049 {
18050 if (Player* killerPlr = killer->ToPlayer())
18051 {
18052 if (Player* killedPlr = victim->ToPlayer())
18053 sScriptMgr->OnPlayerPVPKill(killerPlr, killedPlr);
18054 else if (Creature* killedCre = victim->ToCreature())
18055 sScriptMgr->OnPlayerCreatureKill(killerPlr, killedCre);
18056 }
18057 else if (Creature* killerCre = killer->ToCreature())
18058 {
18059 if (Player* killed = victim->ToPlayer())
18060 sScriptMgr->OnPlayerKilledByCreature(killerCre, killed);
18061 }
18062 }
18063
18064 sScriptMgr->OnUnitDeath(victim, killer);
18065}
#define sBattlefieldMgr
Definition BattlefieldMgr.h:77
@ CREATURE_FLAG_EXTRA_INSTANCE_BIND
Definition CreatureData.h:45
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER
Definition DBCEnums.h:138
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE
Definition DBCEnums.h:137
@ ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS
Definition DBCEnums.h:170
@ CONFIG_DURABILITY_LOSS_IN_PVP
Definition IWorld.h:64
@ RATE_DURABILITY_LOSS_ON_DEATH
Definition IWorld.h:520
LootStore LootTemplates_Creature("creature_loot_template", "creature entry", true)
@ FREE_FOR_ALL
Definition LootMgr.h:58
@ PLAYER_FLAGS_IS_OUT_OF_BOUNDS
Definition Player.h:494
@ UNIT_DYNFLAG_LOOTABLE
Definition SharedDefines.h:3121
@ DUEL_INTERRUPTED
Definition SharedDefines.h:3612
@ PROC_FLAG_KILLED
Definition SpellMgr.h:107
@ PLAYER_SELF_RES_SPELL
Definition UpdateFields.h:370
Definition Battlefield.h:204
Definition CreatureAI.h:70
virtual void KilledUnit(Unit *)
Definition CreatureAI.h:131
Loot loot
Definition Creature.h:230
uint16 GetLootMode() const
Definition Creature.h:244
void AllLootRemovedFromCorpse()
Definition Creature.cpp:3002
bool IsLootRewardDisabled() const
Definition Creature.h:366
Player * GetLootRecipient() const
Definition Creature.cpp:1312
bool IsDamageEnoughForLootingAndReward() const
Definition Creature.cpp:3815
Group * GetLootRecipientGroup() const
Definition Creature.cpp:1319
GroupReference * next()
Definition GroupReference.h:36
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
Definition Group.cpp:1756
uint8 GetMemberGroup(ObjectGuid guid) const
Definition Group.cpp:2383
ObjectGuid GetLooterGuid() const
Definition Group.cpp:2320
LootMethod GetLootMethod() const
Definition Group.cpp:2315
void UpdateLooterGuid(WorldObject *pLootedObject, bool ifneed=false)
Definition Group.cpp:1867
void SendLooter(Creature *creature, Player *pLooter)
Definition Group.cpp:966
void PermBindAllPlayers()
Definition Map.cpp:2336
Definition Map.h:156
bool IsRaidOrHeroicDungeon() const
Definition Map.h:298
InstanceMap * ToInstanceMap()
Definition Map.h:393
virtual void SetDynamicFlag(uint32 flag)
Definition Object.h:124
Definition OutdoorPvP.h:186
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5713
TeamId GetTeamId(bool original=false) const
Definition Player.h:2118
Battleground * GetBattleground(bool create=false) const
Definition Player.cpp:12173
uint32 GetResurrectionSpellId()
Definition Player.cpp:12589
OutdoorPvP * GetOutdoorPvP() const
Definition Player.cpp:12490
void RewardPlayerAndGroupAtKill(Unit *victim, bool isBattleGround)
Definition Player.cpp:12703
void RemoveAllAurasOnDeath()
Definition Unit.cpp:5382
AuraEffect * GetAuraEffectDummy(uint32 spellid) const
Definition Unit.cpp:5583
uint32 GetInstanceId() const
Definition Object.h:449
uint32 GetZoneId() const
Definition Object.cpp:3148
@ SMSG_PARTYKILLLOG
Definition Opcodes.h:531
@ SMSG_LOOT_LIST
Definition Opcodes.h:1047
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:245
uint32 mingold
Definition CreatureData.h:231
uint32 maxgold
Definition CreatureData.h:232
uint32 lootid
Definition CreatureData.h:224
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:837
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:570

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_CONTEXT_ABILITY, 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(), FREE_FOR_ALL, Loot::generateMoneyLoot(), GetAuraEffectDummy(), Player::GetBattleground(), GetCharmerOrOwnerPlayerOrPlayerItself(), 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::GetUInt32Value(), WorldObject::GetZoneId(), HasAura(), Creature::HasFlagsExtra(), Player::HasPlayerFlag(), HasSpiritOfRedemptionAura(), Player::InBattleground(), IsAIEnabled, IsAlive(), IsClass(), Pet::isControlled(), Object::IsCreature(), Creature::IsDamageEnoughForLootingAndReward(), Map::IsDungeon(), WorldObject::IsInMap(), Loot::isLooted(), Creature::IsLootRewardDisabled(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), Map::IsRaidOrHeroicDungeon(), IsTotem(), JustDied, 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(), SetUInt32Value(), SMSG_LOOT_LIST, SMSG_PARTYKILLLOG, sScriptMgr, sWorld, Object::ToCreature(), Map::ToInstanceMap(), Object::ToPlayer(), ToTempSummon(), UNIT_DYNFLAG_LOOTABLE, Player::UpdateAchievementCriteria(), and Group::UpdateLooterGuid().

Referenced by boss_headless_horseman_head::DamageTaken(), boss_viscidus::DamageTaken(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::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_illidan_stormrage::DoAction(), boss_illidari_council::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::HandleDummy(), spell_pos_rimefang_frost_nova::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_yogg_saron_titanic_storm::HandleDummyEffect(), spell_item_rocket_chicken::HandleDummyTick(), spell_ulduar_arachnopod_damaged_aura::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_teron_gorefiend_spiritual_vengeance::HandleEffectRemove(), spell_voa_overcharge_aura::HandlePeriodicDummy(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_leotheras_clear_consuming_madness::HandleScriptEffect(), 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_ahune::JustDied(), npc_frozen_core::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_aura::OnRemove(), WretchedGhoulCleaner::operator()(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::PassengerBoarded(), SmartScript::ProcessAction(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::RandomizeCompositionsAndShow(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), 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(), npc_crusade_persuaded::npc_crusade_persuadedAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::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(), npc_gunship::npc_gunshipAI::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
1175{ Kill(this, this, durabilityLoss, attackType, spellProto, spell); };

References Kill().

Referenced by boss_felblood_kaelthas::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_illidari_council::DoAction(), npc_xt002_boombot::npc_xt002_boombotAI::Explode(), npc_raging_flames::FixateRandomTarget(), npc_rancid_mushroom::InitializeAI(), 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_singularity::Reset(), boss_archimonde::Reset(), npc_dark_iron_guzzler::SpellHit(), boss_faerlina::boss_faerlinaAI::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(), npc_brewfest_super_brew_trigger::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and npc_frost_tomb::UpdateAI().

◆ KnockbackFrom()

void Unit::KnockbackFrom ( float  x,
float  y,
float  speedXY,
float  speedZ 
)
19177{
19178 Player* player = ToPlayer();
19179 if (!player)
19180 {
19181 if (Unit* charmer = GetCharmer())
19182 {
19183 player = charmer->ToPlayer();
19184 if (player && player->m_mover != this)
19185 player = nullptr;
19186 }
19187 }
19188
19189 if (!player)
19190 {
19191 GetMotionMaster()->MoveKnockbackFrom(x, y, speedXY, speedZ);
19192 }
19193 else
19194 {
19195 float vcos, vsin;
19196 GetSinCos(x, y, vsin, vcos);
19197
19198 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19199 data << GetPackGUID();
19200 data << uint32(0); // counter
19201 data << float(vcos); // x direction
19202 data << float(vsin); // y direction
19203 data << float(speedXY); // Horizontal speed
19204 data << float(-speedZ); // Z Movement speed (vertical)
19205
19206 player->GetSession()->SendPacket(&data);
19207
19208 if (player->HasIncreaseMountedFlightSpeedAura() || player->HasFlyAura())
19209 player->SetCanFly(true, true);
19210
19211 player->SetCanKnockback(true);
19212 }
19213}
void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ)
Definition MotionMaster.cpp:558
SafeUnitPointer m_mover
Definition Player.h:2343
void SetCanKnockback(bool value)
Definition Player.h:2510
bool SetCanFly(bool apply, bool packetOnly=false) override
Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pre...
Definition Player.cpp:15890
bool HasFlyAura() const
Definition Unit.h:1724
bool HasIncreaseMountedFlightSpeedAura() const
Definition Unit.h:1751
void GetSinCos(float x, float y, float &vsin, float &vcos) const
Definition Position.cpp:92

References GetCharmer(), GetMotionMaster(), Object::GetPackGUID(), Player::GetSession(), Position::GetSinCos(), HasFlyAura(), HasIncreaseMountedFlightSpeedAura(), Player::m_mover, MotionMaster::MoveKnockbackFrom(), WorldSession::SendPacket(), Player::SetCanFly(), Player::SetCanKnockback(), SMSG_MOVE_KNOCK_BACK, and Object::ToPlayer().

Referenced by _ExitVehicle(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), Spell::EffectKnockBack(), spell_warhead_detonate::HandleDummy(), npc_vekjik::OnGossipSelect(), and npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI().

◆ MagicSpellHitResult()

SpellMissInfo Unit::MagicSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3342{
3343 // Can`t miss on dead target (on skinning for example)
3344 if (!victim->IsAlive() && !victim->IsPlayer())
3345 return SPELL_MISS_NONE;
3346
3347 // vehicles cant miss
3348 if (IsVehicle())
3349 return SPELL_MISS_NONE;
3350
3351 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3352 // resist and deflect chances
3353 // xinef: skip all calculations, proof: Toxic Tolerance quest
3354 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3355 return SPELL_MISS_NONE;
3356
3357 if (spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
3358 {
3359 return SPELL_MISS_NONE;
3360 }
3361
3362 SpellSchoolMask schoolMask = spellInfo->GetSchoolMask();
3363 int32 thisLevel = getLevelForTarget(victim);
3364 if (IsCreature() && ToCreature()->IsTrigger())
3365 thisLevel = std::max<int32>(thisLevel, spellInfo->SpellLevel);
3366 int32 levelDiff = int32(victim->getLevelForTarget(this)) - thisLevel;
3367
3368 int32 MISS_CHANCE_MULTIPLIER;
3369 if (sWorld->getBoolConfig(CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS) && !IsPlayer()) // keep it as it was originally (7 and 11)
3370 {
3371 MISS_CHANCE_MULTIPLIER = victim->IsPlayer() ? 7 : 11;
3372 }
3373 else
3374 {
3375 MISS_CHANCE_MULTIPLIER = sWorld->getRate(
3376 victim->IsPlayer()
3379 }
3380
3381 // Base hit chance from attacker and victim levels
3382 int32 modHitChance = levelDiff < 3
3383 ? 96 - levelDiff
3384 : 94 - (levelDiff - 2) * MISS_CHANCE_MULTIPLIER;
3385
3386 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
3387 if (Player* modOwner = GetSpellModOwner())
3388 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_RESIST_MISS_CHANCE, modHitChance);
3389
3390 // Increase from attacker SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT auras
3392
3393 // Spells with SPELL_ATTR3_ALWAYS_HIT will ignore target's avoidance effects
3394 // xinef: imo it should completly ignore all calculations, eg: 14792. Hits 80 level players on blizz without any problems
3395 //if (!spell->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3396 {
3397 // Chance hit from victim SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE auras
3399 // Reduce spell hit chance for Area of effect spells from victim SPELL_AURA_MOD_AOE_AVOIDANCE aura
3400 if (spellInfo->IsAffectingArea())
3401 modHitChance -= victim->GetTotalAuraModifier(SPELL_AURA_MOD_AOE_AVOIDANCE);
3402
3403 // Decrease hit chance from victim rating bonus
3404 if (victim->IsPlayer())
3405 modHitChance -= int32(victim->ToPlayer()->GetRatingBonusValue(CR_HIT_TAKEN_SPELL));
3406 }
3407
3408 int32 HitChance = modHitChance * 100;
3409 // Increase hit chance from attacker SPELL_AURA_MOD_SPELL_HIT_CHANCE and attacker ratings
3410 // Xinef: Totems should inherit casters ratings?
3411 if (IsTotem())
3412 {
3413 if (Unit* owner = GetOwner())
3414 HitChance += int32(owner->m_modSpellHitChance * 100.0f);
3415 }
3416 else
3417 HitChance += int32(m_modSpellHitChance * 100.0f);
3418
3419 if (HitChance < 100)
3420 HitChance = 100;
3421 else if (HitChance > 10000)
3422 HitChance = 10000;
3423
3424 int32 tmp = 10000 - HitChance;
3425
3426 int32 rand = irand(1, 10000); // Needs to be 1 to 10000 to avoid the 1/10000 chance to miss on 100% hit rating
3427
3428 if (rand < tmp)
3429 return SPELL_MISS_MISS;
3430
3431 // Chance resist mechanic (select max value from every mechanic spell effect)
3432 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3433 tmp += resist_chance;
3434
3435 // Chance resist debuff
3436 if (!spellInfo->IsPositive() && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))
3437 {
3438 bool bNegativeAura = true;
3439 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3440 {
3441 // Xinef: Check if effect exists!
3442 if (spellInfo->Effects[i].IsEffect() && spellInfo->Effects[i].ApplyAuraName == 0)
3443 {
3444 bNegativeAura = false;
3445 break;
3446 }
3447 }
3448
3449 if (bNegativeAura)
3450 {
3451 tmp += victim->GetMaxPositiveAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3452 tmp += victim->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3453 }
3454
3455 // Players resistance for binary spells
3456 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && (spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_NORMAL | SPELL_SCHOOL_MASK_HOLY)) == 0)
3457 tmp += int32(Unit::GetEffectiveResistChance(this, spellInfo->GetSchoolMask(), victim) * 10000.0f); // 100 for spell calculations, and 100 for return value percentage
3458 }
3459
3460 // Roll chance
3461 if (rand < tmp)
3462 return SPELL_MISS_RESIST;
3463
3464 // cast by caster in front of victim
3465 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasIgnoreHitDirectionAura()))
3466 {
3467 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3468 tmp += deflect_chance;
3469 if (rand < tmp)
3470 return SPELL_MISS_DEFLECT;
3471 }
3472
3473 return SPELL_MISS_NONE;
3474}
@ CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS
Definition IWorld.h:170
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER
Definition IWorld.h:528
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE
Definition IWorld.h:527
@ 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
@ SPELL_AURA_MOD_DEBUFF_RESISTANCE
Definition SpellAuraDefines.h:241
@ 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:92
@ CR_HIT_TAKEN_SPELL
Definition Unit.h:230
float GetRatingBonusValue(CombatRating cr) const
Definition Player.cpp:5206
int32 GetMaxNegativeAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6108
int32 GetMaxPositiveAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6094
int32 GetMechanicResistChance(SpellInfo const *spell)
Definition Unit.cpp:3147

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(), SpellInfo::HasAttribute(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, irand(), SpellInfo::IsAffectingArea(), IsAlive(), Object::IsCreature(), Object::IsPlayer(), 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_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(), and UNIT_STATE_STUNNED.

Referenced by SpellHitResult(), and SpellHitResult().

◆ MeleeDamageBonusDone()

uint32 Unit::MeleeDamageBonusDone ( Unit pVictim,
uint32  damage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13119{
13120 if (!victim || pdamage == 0)
13121 return 0;
13122
13123 if (IsCreature())
13124 {
13125 // Dancing Rune Weapon...
13126 if (GetEntry() == 27893)
13127 {
13128 if (Unit* owner = GetOwner())
13129 return owner->MeleeDamageBonusDone(victim, pdamage, attType, spellProto, damageSchoolMask) / 2;
13130 }
13131 }
13132
13133 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
13134
13135 // Done fixed damage bonus auras
13136 int32 DoneFlatBenefit = 0;
13137
13138 // ..done
13140 for (AuraEffectList::const_iterator i = mDamageDoneCreature.begin(); i != mDamageDoneCreature.end(); ++i)
13141 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13142 DoneFlatBenefit += (*i)->GetAmount();
13143
13144 // ..done
13145 // SPELL_AURA_MOD_DAMAGE_DONE included in weapon damage
13146
13147 // ..done (base at attack power for marked target and base at attack power for creature type)
13148 int32 APbonus = 0;
13149
13150 if (attType == RANGED_ATTACK)
13151 {
13152 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
13153
13154 // ..done (base at attack power and creature type)
13156 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
13157 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13158 APbonus += (*i)->GetAmount();
13159 }
13160 else
13161 {
13162 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
13163
13164 // ..done (base at attack power and creature type)
13166 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
13167 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13168 APbonus += (*i)->GetAmount();
13169 }
13170
13171 if (APbonus != 0) // Can be negative
13172 {
13173 bool normalized = false;
13174 if (spellProto)
13175 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
13176 if (spellProto->Effects[i].Effect == SPELL_EFFECT_NORMALIZED_WEAPON_DMG)
13177 {
13178 normalized = true;
13179 break;
13180 }
13181 DoneFlatBenefit += int32(APbonus / 14.0f * GetAPMultiplier(attType, normalized));
13182 }
13183
13184 // Done total percent damage auras
13185 float DoneTotalMod = 1.0f;
13186
13187 // mods for SPELL_SCHOOL_MASK_NORMAL are already factored in base melee damage calculation
13188 if (!(damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL))
13189 {
13190 // Some spells don't benefit from pct done mods
13192 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
13193 {
13194 if (!spellProto || (spellProto->ValidateAttribute6SpellDamageMods(this, *i, false) &&
13195 sScriptMgr->IsNeedModMeleeDamagePercent(this, *i, DoneTotalMod, spellProto)))
13196 {
13197 if (((*i)->GetMiscValue() & damageSchoolMask))
13198 {
13199 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
13200 AddPct(DoneTotalMod, (*i)->GetAmount());
13201 else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
13202 AddPct(DoneTotalMod, (*i)->GetAmount());
13203 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
13204 AddPct(DoneTotalMod, (*i)->GetAmount());
13205 }
13206 }
13207 }
13208 }
13209
13211 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
13212 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13213 if (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13214 AddPct(DoneTotalMod, (*i)->GetAmount());
13215
13216 // bonus against aurastate
13218 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
13219 if (victim->HasAuraState(AuraStateType((*i)->GetMiscValue())))
13220 if (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13221 AddPct(DoneTotalMod, (*i)->GetAmount());
13222
13223 // done scripted mod (take it from owner)
13224 Unit* owner = GetOwner() ? GetOwner() : this;
13225 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13226 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
13227 {
13228 if (spellProto && !spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13229 continue;
13230
13231 if (!(*i)->IsAffectedOnSpell(spellProto))
13232 continue;
13233
13234 switch ((*i)->GetMiscValue())
13235 {
13236 // Tundra Stalker
13237 // Merciless Combat
13238 case 7277:
13239 {
13240 // Merciless Combat
13241 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
13242 {
13243 if (!victim->HealthAbovePct(35))
13244 AddPct(DoneTotalMod, (*i)->GetAmount());
13245 }
13246 // Tundra Stalker
13247 else
13248 {
13249 // Frost Fever (target debuff)
13250 if (victim->HasAura(55095))
13251 AddPct(DoneTotalMod, (*i)->GetAmount());
13252 }
13253 break;
13254 }
13255 // Rage of Rivendare
13256 case 7293:
13257 {
13258 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0x02000000, 0))
13259 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
13260 break;
13261 }
13262 // Marked for Death
13263 case 7598:
13264 case 7599:
13265 case 7600:
13266 case 7601:
13267 case 7602:
13268 {
13269 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
13270 AddPct(DoneTotalMod, (*i)->GetAmount());
13271 break;
13272 }
13273 // Dirty Deeds
13274 case 6427:
13275 case 6428:
13276 {
13277 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
13278 {
13279 // effect 0 has expected value but in negative state
13280 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
13281 AddPct(DoneTotalMod, bonus);
13282 }
13283 break;
13284 }
13285 }
13286 }
13287
13288 // Custom scripted damage
13289 if (spellProto)
13290 switch (spellProto->SpellFamilyName)
13291 {
13293 // Glacier Rot
13294 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
13296 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
13297 AddPct(DoneTotalMod, aurEff->GetAmount());
13298 break;
13299 }
13300
13301 // Some spells don't benefit from done mods
13302 if (spellProto)
13303 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
13304 {
13305 DoneFlatBenefit = 0;
13306 DoneTotalMod = 1.0f;
13307 }
13308
13309 float tmpDamage = float(int32(pdamage) + DoneFlatBenefit) * DoneTotalMod;
13310
13311 // apply spellmod to Done damage
13312 if (spellProto)
13313 if (Player* modOwner = GetSpellModOwner())
13314 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_DAMAGE, tmpDamage);
13315
13316 // bonus result can be negative
13317 return uint32(std::max(tmpDamage, 0.0f));
13318}
@ SPELL_EFFECT_NORMALIZED_WEAPON_DMG
Definition SharedDefines.h:899
@ SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM
Definition SharedDefines.h:583
@ SPELL_ATTR3_IGNORE_CASTER_MODIFIERS
Definition SharedDefines.h:522
@ 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:76
float GetAPMultiplier(WeaponAttackType attType, bool normalized)
Definition Unit.cpp:17251
AuraEffect * GetDummyAuraEffect(SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
Definition Unit.h:1374

References AddPct(), AURA_STATE_HEALTHLESS_35_PERCENT, SpellInfo::Effects, GetAPMultiplier(), GetAuraEffect(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDiseasesByCaster(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetOwner(), GetSpellModOwner(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HealthAbovePct(), SpellInfo::Id, Object::IsCreature(), MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_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(), 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 
)
13321{
13322 if (pdamage == 0)
13323 return 0;
13324
13325 int32 TakenFlatBenefit = 0;
13326
13327 // ..taken
13329 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
13330 if ((*i)->GetMiscValue() & damageSchoolMask)
13331 TakenFlatBenefit += (*i)->GetAmount();
13332
13333 if (attType != RANGED_ATTACK)
13335 else
13337
13338 // Taken total percent damage auras
13339 float TakenTotalMod = 1.0f;
13340
13342
13343 // .. taken pct (special attacks)
13344 if (spellProto)
13345 {
13346 // From caster spells
13348 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
13349 if ((*i)->GetCasterGUID() == attacker->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
13350 AddPct(TakenTotalMod, (*i)->GetAmount());
13351
13352 // Mod damage from spell mechanic
13353 uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask();
13354
13355 // Shred, Maul - "Effects which increase Bleed damage also increase Shred damage"
13356 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[0] & 0x00008800)
13357 mechanicMask |= (1 << MECHANIC_BLEED);
13358
13359 if (mechanicMask)
13360 {
13362 for (AuraEffectList::const_iterator i = mDamageDoneMechanic.begin(); i != mDamageDoneMechanic.end(); ++i)
13363 if (mechanicMask & uint32(1 << ((*i)->GetMiscValue())))
13364 AddPct(TakenTotalMod, (*i)->GetAmount());
13365 }
13366 }
13367
13368 TakenTotalMod = processDummyAuras(TakenTotalMod);
13369
13370 // .. taken pct: class scripts
13371 /*AuraEffectList const& mclassScritAuras = GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13372 for (AuraEffectList::const_iterator i = mclassScritAuras.begin(); i != mclassScritAuras.end(); ++i)
13373 {
13374 switch ((*i)->GetMiscValue())
13375 {
13376 }
13377 }*/
13378
13379 if (attType != RANGED_ATTACK)
13380 {
13382 for (AuraEffectList::const_iterator i = mModMeleeDamageTakenPercent.begin(); i != mModMeleeDamageTakenPercent.end(); ++i)
13383 AddPct(TakenTotalMod, (*i)->GetAmount());
13384 }
13385 else
13386 {
13387 AuraEffectList const& mModRangedDamageTakenPercent = GetAuraEffectsByType(SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT);
13388 for (AuraEffectList::const_iterator i = mModRangedDamageTakenPercent.begin(); i != mModRangedDamageTakenPercent.end(); ++i)
13389 AddPct(TakenTotalMod, (*i)->GetAmount());
13390 }
13391
13392 // No positive taken bonus, custom attr
13393 if (spellProto)
13394 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
13395 {
13396 TakenFlatBenefit = 0;
13397 TakenTotalMod = 1.0f;
13398 }
13399
13400 // xinef: sanctified wrath talent
13401 if (TakenTotalMod < 1.0f && attacker->HasIgnoreTargetResistAura())
13402 {
13403 float ignoreModifier = 1.0f - TakenTotalMod;
13404 bool addModifier = false;
13406 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
13407 if ((*j)->GetMiscValue() & damageSchoolMask)
13408 {
13409 ApplyPct(ignoreModifier, (*j)->GetAmount());
13410 addModifier = true;
13411 }
13412
13413 if (addModifier)
13414 TakenTotalMod += ignoreModifier;
13415 }
13416
13417 float tmpDamage = (float(pdamage) + TakenFlatBenefit) * TakenTotalMod;
13418
13419 // bonus result can be negative
13420 return uint32(std::max(tmpDamage, 0.0f));
13421}
@ 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:11946
bool HasIgnoreTargetResistAura() const
Definition Unit.h:1749

References AddPct(), ApplyPct(), SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), Object::GetGUID(), GetTotalAuraModifier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::HasAttribute(), HasIgnoreTargetResistAura(), 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 
)
3169{
3170 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3171 // resist and deflect chances
3172 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3173 return SPELL_MISS_NONE;
3174
3175 WeaponAttackType attType = BASE_ATTACK;
3176
3177 // Check damage class instead of attack type to correctly handle judgements
3178 // - they are meele, but can't be dodged/parried/deflected because of ranged dmg class
3179 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED)
3180 attType = RANGED_ATTACK;
3181
3182 int32 attackerWeaponSkill;
3183 // skill value for these spells (for example judgements) is 5* level
3184 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED && !spellInfo->IsRangedWeaponSpell())
3185 attackerWeaponSkill = GetLevel() * 5;
3186 // bonus from skills is 0.04% per skill Diff
3187 else
3188 attackerWeaponSkill = int32(GetWeaponSkillValue(attType, victim));
3189
3190 int32 skillDiff = attackerWeaponSkill - int32(victim->GetMaxSkillValueForLevel(this));
3191
3192 uint32 roll = urand (0, 10000);
3193
3194 uint32 missChance = uint32(MeleeSpellMissChance(victim, attType, skillDiff, spellInfo->Id) * 100.0f);
3195 // Roll miss
3196 uint32 tmp = missChance;
3197 if (roll < tmp)
3198 return SPELL_MISS_MISS;
3199
3200 bool canDodge = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_DODGE);
3201 bool canParry = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_PARRY);
3202 bool canBlock = spellInfo->HasAttribute(SPELL_ATTR3_COMPLETELY_BLOCKED) && !spellInfo->HasAttribute(SPELL_ATTR0_CU_DIRECT_DAMAGE);
3203
3204 // Same spells cannot be parry/dodge
3205 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3206 return SPELL_MISS_NONE;
3207
3208 // Chance resist mechanic
3209 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3210 tmp += resist_chance;
3211 if (roll < tmp)
3212 return SPELL_MISS_RESIST;
3213
3214 // Ranged attacks can only miss, resist and deflect
3215 if (attType == RANGED_ATTACK)
3216 {
3217 // only if in front
3218 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasIgnoreHitDirectionAura()))
3219 {
3220 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3221 tmp += deflect_chance;
3222 if (roll < tmp)
3223 return SPELL_MISS_DEFLECT;
3224 }
3225
3226 canDodge = false;
3227 canParry = false;
3228 }
3229
3230 // Check for attack from behind
3231 // xinef: if from behind or spell requires cast from behind
3232 if (!victim->HasInArc(M_PI, this))
3233 {
3234 if (!victim->HasIgnoreHitDirectionAura() || spellInfo->HasAttribute(SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET))
3235 {
3236 // Can`t dodge from behind in PvP (but its possible in PvE)
3237 if (victim->IsPlayer())
3238 {
3239 canDodge = false;
3240 }
3241
3242 // Can`t parry or block
3243 canParry = false;
3244 canBlock = false;
3245 }
3246 }
3247
3248 // Check creatures flags_extra for disable parry
3249 if (victim->IsCreature())
3250 {
3251 uint32 flagEx = victim->ToCreature()->GetCreatureTemplate()->flags_extra;
3252 // Xinef: no dodge flag
3253 if (flagEx & CREATURE_FLAG_EXTRA_NO_DODGE)
3254 canDodge = false;
3255 if (flagEx & CREATURE_FLAG_EXTRA_NO_PARRY)
3256 canParry = false;
3257 // Check creatures flags_extra for disable block
3258 if (flagEx & CREATURE_FLAG_EXTRA_NO_BLOCK)
3259 canBlock = false;
3260 }
3261 // Ignore combat result aura
3263 for (AuraEffectList::const_iterator i = ignore.begin(); i != ignore.end(); ++i)
3264 {
3265 if (!(*i)->IsAffectedOnSpell(spellInfo))
3266 continue;
3267 switch ((*i)->GetMiscValue())
3268 {
3269 case MELEE_HIT_DODGE:
3270 canDodge = false;
3271 break;
3272 case MELEE_HIT_BLOCK:
3273 canBlock = false;
3274 break;
3275 case MELEE_HIT_PARRY:
3276 canParry = false;
3277 break;
3278 default:
3279 LOG_DEBUG("entities.unit", "Spell {} SPELL_AURA_IGNORE_COMBAT_RESULT has unhandled state {}", (*i)->GetId(), (*i)->GetMiscValue());
3280 break;
3281 }
3282 }
3283
3284 if (canDodge)
3285 {
3286 // Roll dodge
3287 int32 dodgeChance = int32(victim->GetUnitDodgeChance() * 100.0f) - skillDiff * 4;
3288 // Reduce enemy dodge chance by SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
3290 dodgeChance = int32(float(dodgeChance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
3291 // Reduce dodge chance by attacker expertise rating
3292 if (IsPlayer())
3293 dodgeChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3294 else
3296
3297 // xinef: cant dodge while casting or while stunned
3298 if (dodgeChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3299 dodgeChance = 0;
3300
3301 tmp += dodgeChance;
3302 if (roll < tmp)
3303 return SPELL_MISS_DODGE;
3304 }
3305
3306 if (canParry)
3307 {
3308 // Roll parry
3309 int32 parryChance = int32(victim->GetUnitParryChance() * 100.0f) - skillDiff * 4;
3310 // Reduce parry chance by attacker expertise rating
3311 if (IsPlayer())
3312 parryChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3313 else
3315
3316 // xinef: cant parry while casting or while stunned
3317 if (parryChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3318 parryChance = 0;
3319
3320 tmp += parryChance;
3321 if (roll < tmp)
3322 return SPELL_MISS_PARRY;
3323 }
3324
3325 if (canBlock)
3326 {
3327 int32 blockChance = int32(victim->GetUnitBlockChance() * 100.0f) - skillDiff * 4;
3328
3329 // xinef: cant block while casting or while stunned
3330 if (blockChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3331 blockChance = 0;
3332
3333 tmp += blockChance;
3334 if (roll < tmp)
3335 return SPELL_MISS_BLOCK;
3336 }
3337
3338 return SPELL_MISS_NONE;
3339}
@ CREATURE_FLAG_EXTRA_NO_PARRY
Definition CreatureData.h:47
@ CREATURE_FLAG_EXTRA_NO_DODGE
Definition CreatureData.h:68
@ 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
@ 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
float GetUnitDodgeChance() const
Definition Unit.cpp:3654
float GetTotalAuraMultiplier(AuraType auratype) const
Definition Unit.cpp:5980
float GetUnitParryChance() const
Definition Unit.cpp:3671
float MeleeSpellMissChance(Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
Definition Unit.cpp:19021
uint32 flags_extra
Definition CreatureData.h:246

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(), GetUnitBlockChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, Object::IsCreature(), IsNonMeleeSpellCast(), Object::IsPlayer(), 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_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(), UNIT_STATE_CONTROLLED, UNIT_STATE_STUNNED, urand(), and VICTIMSTATE_DODGE.

Referenced by SpellHitResult(), and SpellHitResult().

◆ MeleeSpellMissChance()

float Unit::MeleeSpellMissChance ( Unit const *  victim,
WeaponAttackType  attType,
int32  skillDiff,
uint32  spellId 
) const
19022{
19023 SpellInfo const* spellInfo = spellId ? sSpellMgr->GetSpellInfo(spellId) : nullptr;
19024 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
19025 {
19026 return 0.0f;
19027 }
19028
19029 //calculate miss chance
19030 float missChance = victim->GetUnitMissChance(attType);
19031
19032 // Check if dual wielding, add additional miss penalty - when mainhand has on next swing spell, offhand doesnt suffer penalty
19033 if (!spellId && (attType != RANGED_ATTACK) && HasOffhandWeaponForAttack() && (!m_currentSpells[CURRENT_MELEE_SPELL] || !m_currentSpells[CURRENT_MELEE_SPELL]->IsNextMeleeSwingSpell()))
19034 {
19035 missChance += 19;
19036 }
19037
19038 // bonus from skills is 0.04%
19039 //miss_chance -= skillDiff * 0.04f;
19040 int32 diff = -skillDiff;
19041 if (victim->IsPlayer())
19042 missChance += diff > 0 ? diff * 0.04f : diff * 0.02f;
19043 else
19044 missChance += diff > 10 ? 1 + (diff - 10) * 0.4f : diff * 0.1f;
19045
19046 // Calculate hit chance
19047 float hitChance = 100.0f;
19048
19049 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
19050 if (spellId)
19051 {
19052 if (Player* modOwner = GetSpellModOwner())
19053 modOwner->ApplySpellMod(spellId, SPELLMOD_RESIST_MISS_CHANCE, hitChance);
19054 }
19055
19056 missChance -= hitChance - 100.0f;
19057
19058 if (attType == RANGED_ATTACK)
19059 missChance -= m_modRangedHitChance;
19060 else
19061 missChance -= m_modMeleeHitChance;
19062
19063 // Limit miss chance from 0 to 60%
19064 if (missChance < 0.0f)
19065 return 0.0f;
19066 if (missChance > 60.0f)
19067 return 60.0f;
19068 return missChance;
19069}

References CURRENT_MELEE_SPELL, GetSpellModOwner(), GetUnitMissChance(), SpellInfo::HasAttribute(), HasOffhandWeaponForAttack(), Object::IsPlayer(), m_currentSpells, m_modMeleeHitChance, m_modRangedHitChance, RANGED_ATTACK, SPELL_ATTR7_NO_ATTACK_MISS, SPELLMOD_RESIST_MISS_CHANCE, and sSpellMgr.

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ ModifyAuraState()

void Unit::ModifyAuraState ( AuraStateType  flag,
bool  apply 
)
10542{
10543 if (apply)
10544 {
10545 if (!HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10546 {
10547 SetFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10548 Unit::AuraMap& tAuras = GetOwnedAuras();
10549 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10550 {
10551 if ((*itr).second->IsRemoved())
10552 continue;
10553
10554 if ((*itr).second->GetSpellInfo()->CasterAuraState == flag )
10555 if (AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()))
10556 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, true);
10557 }
10558 }
10559 }
10560 else
10561 {
10562 if (HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10563 {
10564 RemoveFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10565
10566 if (flag != AURA_STATE_ENRAGE) // enrage aura state triggering continues auras
10567 {
10568 Unit::AuraMap& tAuras = GetOwnedAuras();
10569 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10570 {
10571 if ((*itr).second->GetSpellInfo()->CasterAuraState == flag )
10572 if (AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()))
10573 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, false);
10574 }
10575 }
10576 }
10577 }
10578}
@ AURA_STATE_ENRAGE
Definition SharedDefines.h:1309
@ AURA_EFFECT_HANDLE_REAL
Definition SpellAuraDefines.h:42
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:641
AuraMap & GetOwnedAuras()
Definition Unit.h:1310

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(), Spell::finish(), debug_commandscript::HandleDebugSetAuraStateCommand(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), ProcDamageAndSpellFor(), Update(), and UpdateReactives().

◆ ModifyHealth()

int32 Unit::ModifyHealth ( int32  val)
14143{
14144 int32 gain = 0;
14145
14146 if (dVal == 0)
14147 return 0;
14148
14149 int32 curHealth = (int32)GetHealth();
14150
14151 int32 val = dVal + curHealth;
14152 if (val <= 0)
14153 {
14154 SetHealth(0);
14155 return -curHealth;
14156 }
14157
14158 int32 maxHealth = (int32)GetMaxHealth();
14159
14160 if (val < maxHealth)
14161 {
14162 SetHealth(val);
14163 gain = val - curHealth;
14164 }
14165 else if (curHealth != maxHealth)
14166 {
14167 SetHealth(maxHealth);
14168 gain = maxHealth - curHealth;
14169 }
14170
14171 return gain;
14172}

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 
)
14201{
14202 if (dVal == 0)
14203 return 0;
14204
14205 int32 gain = 0;
14206
14207 int32 curPower = (int32)GetPower(power);
14208
14209 int32 val = dVal + curPower;
14210 if (val <= 0)
14211 {
14212 SetPower(power, 0, withPowerUpdate);
14213 return -curPower;
14214 }
14215
14216 int32 maxPower = (int32)GetMaxPower(power);
14217
14218 if (val < maxPower)
14219 {
14220 SetPower(power, val, withPowerUpdate);
14221 gain = val - curPower;
14222 }
14223 else if (curPower != maxPower)
14224 {
14225 SetPower(power, maxPower, withPowerUpdate);
14226 gain = maxPower - curPower;
14227 }
14228
14229 if (GetAI())
14230 {
14231 GetAI()->OnPowerUpdate(power, gain, dVal, curPower);
14232 }
14233
14234 return gain;
14235}
virtual void OnPowerUpdate(Powers, int32, int32, uint32)
Called when the creature power updates.
Definition UnitAI.h:373
void SetPower(Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
Definition Unit.cpp:15617

References GetAI(), GetMaxPower(), GetPower(), UnitAI::OnPowerUpdate(), and SetPower().

Referenced by CalcAbsorbResist(), spell_igb_cannon_blast::CalculatePower(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), EnergizeBySpell(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_kelthuzad_detonate_mana_aura::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 
)
14239{
14240 float amount = (float)GetMaxPower(power);
14241 ApplyPercentModFloatVar(amount, pct, apply);
14242
14243 return ModifyPower(power, (int32)amount - (int32)GetMaxPower(power));
14244}

References ApplyPercentModFloatVar(), GetMaxPower(), and ModifyPower().

Referenced by AuraEffect::HandleAuraModIncreaseEnergyPercent().

◆ ModifyRedirectThreat()

void Unit::ModifyRedirectThreat ( int32  amount)
inline
void ModifyThreatPct(int32 amount)
Definition ThreatMgr.h:307

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
15025{
15026 if (!spellInfo || castTime < 0)
15027 return;
15028
15029 if (spellInfo->IsChanneled() && spellInfo->HasAura(SPELL_AURA_MOUNTED))
15030 return;
15031
15032 // called from caster
15033 if (Player* modOwner = GetSpellModOwner())
15035 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, castTime, spell, bool(modOwner != this && !IsPet()));
15036
15037 switch (spellInfo->DmgClass)
15038 {
15040 if (spellInfo->AttributesEx5 & SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC) // required double check
15041 castTime = int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
15042 else if (spellInfo->SpellVisual[0] == 3881 && HasAura(67556)) // cooking with Chef Hat.
15043 castTime = 500;
15044 break;
15046 break; // no known cases
15048 castTime = CanInstantCast() ? 0 : int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
15049 break;
15051 castTime = int32(float(castTime) * m_modAttackSpeedPct[RANGED_ATTACK]);
15052 break;
15053 default:
15054 break;
15055 }
15056}
@ SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC
Definition SharedDefines.h:580
@ SPELLMOD_CASTING_TIME
Definition SpellDefines.h:86
bool CanInstantCast() const
Definition Unit.h:1519

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 
)
14925{
14926 // don't mod permanent auras duration
14927 if (duration < 0)
14928 return duration;
14929
14930 // some auras are not affected by duration modifiers
14931 if (spellProto->HasAttribute(SPELL_ATTR7_NO_TARGET_DURATION_MOD))
14932 return duration;
14933
14934 // cut duration only of negative effects
14935 // xinef: also calculate self casts, spell can be reflected for example
14936 if (!positive)
14937 {
14938 int32 mechanic = spellProto->GetSpellMechanicMaskByEffectMask(effectMask);
14939
14940 int32 durationMod;
14941 int32 durationMod_always = 0;
14942 int32 durationMod_not_stack = 0;
14943
14944 for (uint8 i = 1; i <= MECHANIC_ENRAGED; ++i)
14945 {
14946 if (!(mechanic & 1 << i))
14947 continue;
14948
14949 // Xinef: spells affecting movement imparing effects should not reduce duration if disoriented mechanic is present
14950 if (i == MECHANIC_SNARE && (mechanic & (1 << MECHANIC_DISORIENTED)))
14951 continue;
14952
14953 // Find total mod value (negative bonus)
14954 int32 new_durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD, i);
14955 // Find max mod (negative bonus)
14956 int32 new_durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, i);
14957 // Check if mods applied before were weaker
14958 if (new_durationMod_always < durationMod_always)
14959 durationMod_always = new_durationMod_always;
14960 if (new_durationMod_not_stack < durationMod_not_stack)
14961 durationMod_not_stack = new_durationMod_not_stack;
14962 }
14963
14964 // Select strongest negative mod
14965 if (durationMod_always > durationMod_not_stack)
14966 durationMod = durationMod_not_stack;
14967 else
14968 durationMod = durationMod_always;
14969
14970 if (durationMod != 0)
14971 AddPct(duration, durationMod);
14972
14973 // there are only negative mods currently
14974 durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, spellProto->Dispel);
14975 durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, spellProto->Dispel);
14976
14977 durationMod = 0;
14978 if (durationMod_always > durationMod_not_stack)
14979 durationMod += durationMod_not_stack;
14980 else
14981 durationMod += durationMod_always;
14982
14983 if (durationMod != 0)
14984 AddPct(duration, durationMod);
14985 }
14986 else
14987 {
14988 // else positive mods here, there are no currently
14989 // when there will be, change GetTotalAuraModifierByMiscValue to GetTotalPositiveAuraModifierByMiscValue
14990 }
14991
14992 // Glyphs which increase duration of selfcasted buffs
14993 if (target == this)
14994 {
14995 switch (spellProto->SpellFamilyName)
14996 {
14997 case SPELLFAMILY_DRUID:
14998 if (spellProto->SpellFamilyFlags[0] & 0x100)
14999 {
15000 // Glyph of Thorns
15001 if (AuraEffect* aurEff = GetAuraEffect(57862, 0))
15002 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
15003 }
15004 break;
15006 if ((spellProto->SpellFamilyFlags[0] & 0x00000002) && spellProto->SpellIconID == 298)
15007 {
15008 // Glyph of Blessing of Might
15009 if (AuraEffect* aurEff = GetAuraEffect(57958, 0))
15010 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
15011 }
15012 else if ((spellProto->SpellFamilyFlags[0] & 0x00010000) && spellProto->SpellIconID == 306)
15013 {
15014 // Glyph of Blessing of Wisdom
15015 if (AuraEffect* aurEff = GetAuraEffect(57979, 0))
15016 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
15017 }
15018 break;
15019 }
15020 }
15021 return std::max(duration, 0);
15022}
constexpr auto MINUTE
Definition Common.h:47
@ SPELL_ATTR7_NO_TARGET_DURATION_MOD
Definition SharedDefines.h:642
@ MECHANIC_ENRAGED
Definition SharedDefines.h:1356
@ MECHANIC_DISORIENTED
Definition SharedDefines.h:1327
@ 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

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 
)
13510{
13511 if (mount)
13513
13515
13516 if (Player* player = ToPlayer())
13517 {
13518 sScriptMgr->AnticheatSetUnderACKmount(player);
13519
13520 // mount as a vehicle
13521 if (VehicleId)
13522 {
13523 if (CreateVehicleKit(VehicleId, creatureEntry))
13524 {
13525 GetVehicleKit()->Reset();
13526
13527 // Send others that we now have a vehicle
13529 data << GetPackGUID();
13530 data << uint32(VehicleId);
13531 SendMessageToSet(&data, true);
13532
13534 player->GetSession()->SendPacket(&data);
13535
13536 // mounts can also have accessories
13538 }
13539 }
13540
13541 // unsummon pet
13542 Pet* pet = player->GetPet();
13543 if (pet)
13544 {
13546 // don't unsummon pet in arena but SetFlag UNIT_FLAG_STUNNED to disable pet's interface
13547 if (bg && bg->isArena())
13549 else
13550 player->UnsummonPetTemporaryIfAny();
13551 }
13552
13553 // xinef: if we have charmed npc, stun him also
13554 if (Unit* charm = player->GetCharm())
13555 if (charm->IsCreature())
13556 charm->SetUnitFlag(UNIT_FLAG_STUNNED);
13557
13558 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13559 data << GetPackGUID();
13560 data << uint32(GameTime::GetGameTime().count()); // Packet counter
13561 data << player->GetCollisionHeight();
13562 player->GetSession()->SendPacket(&data);
13563 }
13564
13566}
@ AURA_INTERRUPT_FLAG_MOUNT
Definition SpellDefines.h:60
bool isArena() const
Definition Battleground.h:404
bool CreateVehicleKit(uint32 id, uint32 creatureEntry)
Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
Definition Unit.cpp:18748
void Reset(bool evading=false)
Definition Vehicle.cpp:120
void InstallAllAccessories(bool evading)
Definition Vehicle.cpp:87

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(), SetUInt32Value(), SetUnitFlag(), SMSG_MOVE_SET_COLLISION_HGT, SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, and UNIT_FLAG_STUNNED.

Referenced by AuraEffect::HandleAuraMounted(), spell_mount_check_aura::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 
)
20018{
20019 DisableSpline();
20020 if (IsPlayer())
20021 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));
20022 else
20023 {
20024 Position pos = {x, y, z, orientation};
20025 SendTeleportPacket(pos);
20026 UpdatePosition(x, y, z, orientation, true);
20029 }
20030}
@ TELE_TO_WITH_PET
Definition Player.h:833
@ TELE_TO_NOT_LEAVE_VEHICLE
Definition Player.h:832
@ TELE_TO_SPELL
Definition Player.h:831
@ TELE_TO_NOT_LEAVE_COMBAT
Definition Player.h:829
@ TELE_TO_NOT_UNSUMMON_PET
Definition Player.h:830
@ TELE_TO_NOT_LEAVE_TRANSPORT
Definition Player.h:828
void ReinitializeMovement()
Definition MotionMaster.cpp:904
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition Player.cpp:1339
void SendTeleportPacket(Position &pos)
Definition Unit.cpp:20039
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition Unit.cpp:19163
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition Unit.cpp:20058

References DisableSpline(), WorldLocation::GetMapId(), GetMotionMaster(), Object::IsPlayer(), 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(), UpdateObjectVisibility(), and UpdatePosition().

◆ NearTeleportTo() [2/2]

void Unit::NearTeleportTo ( Position pos,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
20013{
20014 NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), casting, vehicleTeleport, withPet, removeTransport);
20015}
void NearTeleportTo(Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
Definition Unit.cpp:20012

References Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and NearTeleportTo().

Referenced by boss_viscidus::DamageTaken(), npc_madrigosa::DoAction(), npc_akama_illidan::DoAction(), Spell::EffectLeap(), Spell::EffectResurrectPet(), Spell::EffectStuck(), Spell::EffectSummonPet(), Spell::EffectTeleportUnits(), Spell::EffectTeleUnitsFaceCaster(), npc_giant_claw_tentacle::Emerge(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnterEvadeMode(), 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_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_chesspiece::OnCharmed(), npc_vh_sinclari::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), npc_chesspiece::Reset(), 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(), npc_doomfire_spirit::TryTeleportInDirection(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_magus_telestra::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::UpdateAI().

◆ OutDebugInfo()

void Unit::OutDebugInfo ( ) const
20268{
20269 LOG_ERROR("entities.unit", "Unit::OutDebugInfo");
20270 LOG_INFO("entities.unit", "GUID {}, name {}", GetGUID().ToString(), GetName());
20271 LOG_INFO("entities.unit", "OwnerGUID {}, MinionGUID {}, CharmerGUID {}, CharmedGUID {}",
20273 LOG_INFO("entities.unit", "In world {}, unit type mask {}", (uint32)(IsInWorld() ? 1 : 0), m_unitTypeMask);
20274 if (IsInWorld())
20275 LOG_INFO("entities.unit", "Mapid {}", GetMapId());
20276
20277 LOG_INFO("entities.unit", "Summon Slot: ");
20278 for (uint32 i = 0; i < MAX_SUMMON_SLOT; ++i)
20279 LOG_INFO("entities.unit", "{}, ", m_SummonSlot[i].ToString());
20280 LOG_INFO("server.loading", " ");
20281
20282 LOG_INFO("entities.unit", "Controlled List: ");
20283 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20284 LOG_INFO("entities.unit", "{}, ", (*itr)->GetGUID().ToString());
20285 LOG_INFO("server.loading", " ");
20286
20287 LOG_INFO("entities.unit", "Aura List: ");
20288 for (AuraApplicationMap::const_iterator itr = m_appliedAuras.begin(); itr != m_appliedAuras.end(); ++itr)
20289 LOG_INFO("entities.unit", "{}, ", itr->first);
20290 LOG_INFO("server.loading", " ");
20291
20292 if (IsVehicle())
20293 {
20294 LOG_INFO("entities.unit", "Passenger List: ");
20295 for (SeatMap::iterator itr = GetVehicleKit()->Seats.begin(); itr != GetVehicleKit()->Seats.end(); ++itr)
20296 if (Unit* passenger = ObjectAccessor::GetUnit(*GetVehicleBase(), itr->second.Passenger.Guid))
20297 LOG_INFO("entities.unit", "{}, ", passenger->GetGUID().ToString());
20298 LOG_INFO("server.loading", " ");
20299 }
20300
20301 if (GetVehicle())
20302 LOG_INFO("entities.unit", "On vehicle {}.", GetVehicleBase()->GetEntry());
20303}
Seats
Definition boss_flame_leviathan.cpp:168
SeatMap Seats
Definition Vehicle.h:56

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, Vehicle::Seats, and Position::ToString().

Referenced by SetMinion().

◆ PatchValuesUpdate()

void Unit::PatchValuesUpdate ( ByteBuffer valuesUpdateBuf,
BuildValuesCachePosPointers posPointers,
Player target 
)
private
20882{
20883 Creature const* creature = ToCreature();
20884
20885 // UNIT_NPC_FLAGS
20886 if (creature && posPointers.UnitNPCFlagsPos >= 0)
20887 {
20888 uint32 appendValue = m_uint32Values[UNIT_NPC_FLAGS];
20889
20890 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && appendValue & UNIT_NPC_FLAG_FLIGHTMASTER)
20891 appendValue |= UNIT_NPC_FLAG_GOSSIP; // flight masters need NPC gossip flag to show instant flight toggle option
20892
20893 if (!target->CanSeeSpellClickOn(creature))
20894 appendValue &= ~UNIT_NPC_FLAG_SPELLCLICK;
20895
20896 if (!target->CanSeeVendor(creature))
20897 appendValue &= ~UNIT_NPC_FLAG_VENDOR_MASK;
20898
20899 if (!creature->IsValidTrainerForPlayer(target, &appendValue))
20900 appendValue &= ~UNIT_NPC_FLAG_TRAINER;
20901
20902 valuesUpdateBuf.put(posPointers.UnitNPCFlagsPos, appendValue);
20903 }
20904
20905 // UNIT_FIELD_AURASTATE
20906 if (posPointers.UnitFieldAuraStatePos >= 0)
20907 valuesUpdateBuf.put(posPointers.UnitFieldAuraStatePos, uint32(BuildAuraStateUpdateForTarget(target)));
20908
20909 // UNIT_FIELD_FLAGS
20910 if (posPointers.UnitFieldFlagsPos >= 0)
20911 {
20912 uint32 appendValue = m_uint32Values[UNIT_FIELD_FLAGS];
20913 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
20914 appendValue &= ~UNIT_FLAG_NOT_SELECTABLE;
20915
20916 valuesUpdateBuf.put(posPointers.UnitFieldFlagsPos, appendValue);
20917 }
20918
20919 // UNIT_FIELD_DISPLAYID
20920 // Use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures.
20921 if (posPointers.UnitFieldDisplayPos >= 0)
20922 {
20924 if (creature)
20925 {
20926 CreatureTemplate const* cinfo = creature->GetCreatureTemplate();
20927
20928 // this also applies for transform auras
20929 if (SpellInfo const* transform = sSpellMgr->GetSpellInfo(getTransForm()))
20930 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
20931 if (transform->Effects[i].IsAura(SPELL_AURA_TRANSFORM))
20932 if (CreatureTemplate const* transformInfo = sObjectMgr->GetCreatureTemplate(transform->Effects[i].MiscValue))
20933 {
20934 cinfo = transformInfo;
20935 break;
20936 }
20937
20939 {
20940 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
20941 displayId = cinfo->GetFirstVisibleModel()->CreatureDisplayID;
20942 else
20943 displayId = cinfo->GetFirstInvisibleModel()->CreatureDisplayID;
20944 }
20945 }
20946
20947 valuesUpdateBuf.put(posPointers.UnitFieldDisplayPos, uint32(displayId));
20948 }
20949
20950 // UNIT_DYNAMIC_FLAGS
20951 // Hide lootable animation for unallowed players.
20952 if (posPointers.UnitDynamicFlagsPos >= 0)
20953 {
20955
20956 if (creature)
20957 {
20958 if (creature->hasLootRecipient())
20959 {
20960 dynamicFlags |= UNIT_DYNFLAG_TAPPED;
20961 if (creature->isTappedBy(target))
20962 dynamicFlags |= UNIT_DYNFLAG_TAPPED_BY_PLAYER;
20963 }
20964
20965 if (!target->isAllowedToLoot(creature))
20966 dynamicFlags &= ~UNIT_DYNFLAG_LOOTABLE;
20967 }
20968
20969 // unit UNIT_DYNFLAG_TRACK_UNIT should only be sent to caster of SPELL_AURA_MOD_STALKED auras
20970 if (dynamicFlags & UNIT_DYNFLAG_TRACK_UNIT)
20972 dynamicFlags &= ~UNIT_DYNFLAG_TRACK_UNIT;
20973
20974 valuesUpdateBuf.put(posPointers.UnitDynamicFlagsPos, dynamicFlags);
20975 }
20976
20977 // UNIT_FIELD_BYTES_2
20978 if (posPointers.UnitFieldBytes2Pos >= 0)
20979 {
20980 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
20981 {
20983 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
20984 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
20985 // Allow targetting opposite faction in party when enabled in config
20986 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (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 !!
20987 }// pussywizard / Callmephil
20988 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
20989 (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject()))
20990 {
20991 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & 0xFFFFF2FF)); // clear UNIT_BYTE2_FLAG_PVP, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY
20992 }
20993 }
20994
20995 // UNIT_FIELD_FACTIONTEMPLATE
20996 if (posPointers.UnitFieldFactionTemplatePos >= 0)
20997 {
20998 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
20999 {
21001 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
21002 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
21003 // pretend that all other HOSTILE players have own faction, to allow follow, heal, rezz (trade wont work)
21004 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
21005 }// pussywizard / Callmephil
21006 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
21007 (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject()))
21008 {
21009 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
21010 }
21011 }
21012
21013 sScriptMgr->OnPatchValuesUpdate(this, valuesUpdateBuf, posPointers, target);
21014}
@ CREATURE_FLAG_EXTRA_TRIGGER
Definition CreatureData.h:52
@ CONFIG_INSTANT_TAXI
Definition IWorld.h:385
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition IWorld.h:73
@ UNIT_DYNFLAG_TRACK_UNIT
Definition SharedDefines.h:3122
void put(std::size_t pos, T value)
Definition ByteBuffer.h:137
bool IsValidTrainerForPlayer(Player *player, uint32 *npcFlags=nullptr) const
Definition Creature.cpp:1271
bool isTappedBy(Player const *player) const
Definition Creature.cpp:1387
bool isAllowedToLoot(Creature const *creature)
Definition PlayerStorage.cpp:5620
bool CanSeeVendor(Creature const *creature) const
Definition Player.cpp:14273
bool IsSpectator() const
Definition Player.h:2586
bool CanSeeSpellClickOn(Creature const *creature) const
Definition Player.cpp:14250
uint32 BuildAuraStateUpdateForTarget(Unit *target) const
Definition Unit.cpp:10580
bool IsGMAccount() const
Definition WorldSession.cpp:180
int32 UnitFieldFlagsPos
Definition UnitUtils.h:99
int32 UnitFieldDisplayPos
Definition UnitUtils.h:100
int32 UnitDynamicFlagsPos
Definition UnitUtils.h:101
int32 UnitFieldAuraStatePos
Definition UnitUtils.h:98
int32 UnitFieldFactionTemplatePos
Definition UnitUtils.h:103
int32 UnitFieldBytes2Pos
Definition UnitUtils.h:102
int32 UnitNPCFlagsPos
Definition UnitUtils.h:97
uint32 CreatureDisplayID
Definition CreatureData.h:179
CreatureModel const * GetFirstInvisibleModel() const
Definition Creature.cpp:162
CreatureModel const * GetFirstVisibleModel() const
Definition Creature.cpp:172

References BuildAuraStateUpdateForTarget(), Player::CanSeeSpellClickOn(), Player::CanSeeVendor(), CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP, CONFIG_INSTANT_TAXI, CREATURE_FLAG_EXTRA_TRIGGER, CreatureModel::CreatureDisplayID, WorldObject::FindMap(), Creature::GetCreatureTemplate(), GetFaction(), GetFactionTemplateEntry(), CreatureTemplate::GetFirstInvisibleModel(), CreatureTemplate::GetFirstVisibleModel(), Object::GetGUID(), Player::GetSession(), getTransForm(), HasAuraTypeWithCaster(), CreatureTemplate::HasFlagsExtra(), Creature::hasLootRecipient(), Player::isAllowedToLoot(), Map::IsBattleArena(), IsControlledByPlayer(), FactionTemplateEntry::IsFriendlyTo(), Player::IsGameMaster(), WorldSession::IsGMAccount(), IsInRaidWith(), Player::IsSpectator(), Creature::isTappedBy(), Creature::IsValidTrainerForPlayer(), Object::m_uint32Values, MAX_SPELL_EFFECTS, ByteBuffer::put(), sObjectMgr, SPELL_AURA_MOD_STALKED, SPELL_AURA_TRANSFORM, sScriptMgr, sSpellMgr, sWorld, Object::ToCreature(), UNIT_BYTE2_FLAG_SANCTUARY, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_DYNFLAG_TRACK_UNIT, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FLAGS, UNIT_NPC_FLAG_FLIGHTMASTER, UNIT_NPC_FLAG_GOSSIP, UNIT_NPC_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, and BuildValuesCachePosPointers::UnitNPCFlagsPos.

Referenced by BuildValuesUpdate().

◆ PauseMovement()

void Unit::PauseMovement ( uint32  timer = 0,
uint8  slot = 0 
)
virtual

Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline.

16703{
16704 if (slot >= MAX_MOTION_SLOT)
16705 return;
16706
16707 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16708 movementGenerator->Pause(timer);
16709
16710 StopMoving();
16711}
@ MAX_MOTION_SLOT
Definition MotionMaster.h:66
Definition MovementGenerator.h:28
void StopMoving()
Definition Unit.cpp:16683

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 
)
20378{
20379 CharmInfo* charmInfo = GetCharmInfo();
20380 if (!charmInfo || !IsCreature())
20381 return;
20382
20383 if ((sDisableMgr->IsPathfindingEnabled(GetMap()) || result != SPELL_FAILED_LINE_OF_SIGHT) && target)
20384 {
20385 if ((result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE) || !ToCreature()->HasReactState(REACT_PASSIVE))
20386 if (Unit* owner = GetOwner())
20387 {
20388 if (spellInfo->IsPositive() && IsFriendlyTo(target))
20389 {
20390 AttackStop();
20391 charmInfo->SetIsAtStay(false);
20392 charmInfo->SetIsCommandAttack(true);
20393 charmInfo->SetIsReturning(false);
20394 charmInfo->SetIsFollowing(false);
20395
20396 GetMotionMaster()->MoveFollow(target, PET_FOLLOW_DIST, rand_norm() * 2 * M_PI);
20397 }
20398 else if (owner->IsValidAttackTarget(target))
20399 {
20400 AttackStop();
20401 charmInfo->SetIsAtStay(false);
20402 charmInfo->SetIsCommandAttack(true);
20403 charmInfo->SetIsReturning(false);
20404 charmInfo->SetIsFollowing(false);
20405
20406 if (!ToCreature()->HasReactState(REACT_PASSIVE))
20407 ToCreature()->AI()->AttackStart(target);
20408 else
20409 GetMotionMaster()->MoveChase(target);
20410 }
20411 }
20412
20413 // can be extended in future
20414 if (result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE)
20415 {
20416 charmInfo->SetForcedSpell(spellInfo->IsPositive() ? -int32(spellInfo->Id) : spellInfo->Id);
20417 charmInfo->SetForcedTargetGUID(target->GetGUID());
20418 }
20419 else
20420 {
20421 charmInfo->SetForcedSpell(0);
20423 }
20424 }
20425}
#define sDisableMgr
Definition DisableMgr.h:88
#define PET_FOLLOW_DIST
Definition PetDefines.h:202
@ SPELL_FAILED_OUT_OF_RANGE
Definition SharedDefines.h:1046
@ SPELL_FAILED_LINE_OF_SIGHT
Definition SharedDefines.h:996
void MoveChase(Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
Force the unit to chase this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:313
void MoveFollow(Unit *target, float dist, float angle, MovementSlot slot=MOTION_SLOT_ACTIVE, bool inheritWalkState=true, bool inheritSpeed=true)
The unit will follow this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:409
virtual void AttackStart(Unit *)
Definition UnitAI.cpp:27
void SetIsAtStay(bool val)
Definition CharmInfo.cpp:365
void SetIsFollowing(bool val)
Definition CharmInfo.cpp:375
void SetIsReturning(bool val)
Definition CharmInfo.cpp:385
void SetForcedSpell(uint32 id)
Definition CharmInfo.h:177
void SetForcedTargetGUID(ObjectGuid guid=ObjectGuid::Empty)
Definition CharmInfo.h:179
void SetIsCommandAttack(bool val)
Definition CharmInfo.cpp:303

References Creature::AI(), UnitAI::AttackStart(), AttackStop(), ObjectGuid::Empty, GetCharmInfo(), Object::GetGUID(), WorldObject::GetMap(), GetMotionMaster(), GetOwner(), SpellInfo::Id, Object::IsCreature(), IsFriendlyTo(), SpellInfo::IsPositive(), MotionMaster::MoveChase(), MotionMaster::MoveFollow(), PET_FOLLOW_DIST, rand_norm(), REACT_PASSIVE, sDisableMgr, CharmInfo::SetForcedSpell(), CharmInfo::SetForcedTargetGUID(), CharmInfo::SetIsAtStay(), CharmInfo::SetIsCommandAttack(), CharmInfo::SetIsFollowing(), CharmInfo::SetIsReturning(), SPELL_FAILED_LINE_OF_SIGHT, SPELL_FAILED_OUT_OF_RANGE, and Object::ToCreature().

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
6435{
6436 // Not much to do if no flags are set.
6437 if (procAttacker && actor)
6438 actor->ProcDamageAndSpellFor(false, victim, procAttacker, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6439 // Now go on with a victim's events'n'auras
6440 // Not much to do if no flags are set or there is no victim
6441 if (victim && victim->IsAlive() && procVictim)
6442 victim->ProcDamageAndSpellFor(true, actor, procVictim, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6443}

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 
)
16092{
16093 // Player is loaded now - do not allow passive spell casts to proc
16094 if (IsPlayer() && ToPlayer()->GetSession()->PlayerLoading())
16095 return;
16096 // For melee/ranged based attack need update skills and set some Aura states if victim present
16097 if (procFlag & MELEE_BASED_TRIGGER_MASK && target && procPhase == PROC_SPELL_PHASE_HIT)
16098 {
16099 // Xinef: Shaman in ghost wolf form cant proc anything melee based
16100 if (!isVictim && GetShapeshiftForm() == FORM_GHOSTWOLF)
16101 return;
16102
16103 // Update skills here for players
16104 // only when you are not fighting other players or their pets/totems (pvp)
16105 if (IsPlayer() && !target->IsCharmedOwnedByPlayerOrPlayer())
16106 {
16107 // On melee based hit/miss/resist/parry/dodge need to update skill (for victim and attacker)
16109 {
16110 ToPlayer()->UpdateCombatSkills(target, attType, isVictim, procSpell ? procSpell->m_weaponItem : nullptr);
16111 }
16112 // Update defence if player is victim and we block - TODO: confirm that blocked attacks only have a chance to increase defence skill
16113 else if (isVictim && procExtra & (PROC_EX_BLOCK))
16114 {
16115 ToPlayer()->UpdateCombatSkills(target, attType, true);
16116 }
16117 }
16118 // If exist crit/parry/dodge/block need update aura state (for victim and attacker)
16120 {
16121 // for victim
16122 if (isVictim)
16123 {
16124 // if victim and dodge attack
16125 if (procExtra & PROC_EX_DODGE)
16126 {
16127 // Update AURA_STATE on dodge
16128 if (!IsClass(CLASS_ROGUE, CLASS_CONTEXT_ABILITY_REACTIVE)) // skip Rogue Riposte
16129 {
16132 }
16133 }
16134 // if victim and parry attack
16135 if (procExtra & PROC_EX_PARRY)
16136 {
16137 // For Hunters only Counterattack (skip Mongoose bite)
16139 {
16142 }
16143 else
16144 {
16147 }
16148 }
16149 // if and victim block attack
16150 if (procExtra & PROC_EX_BLOCK)
16151 {
16154 }
16155 }
16156 else // For attacker
16157 {
16158 // Overpower on victim dodge
16159 if (procExtra & PROC_EX_DODGE)
16160 {
16162 {
16163 AddComboPoints(target, 1);
16165 }
16166 }
16167
16168 // Wolverine Bite
16169 if ((procExtra & PROC_HIT_CRITICAL) && IsHunterPet())
16170 {
16171 AddComboPoints(target, 1);
16173 }
16174 }
16175 }
16176 }
16177
16178 Unit* actor = isVictim ? target : this;
16179 Unit* actionTarget = !isVictim ? target : this;
16180
16181 ProcEventInfo eventInfo = ProcEventInfo(actor, actionTarget, target, procFlag, 0, procPhase, procExtra, procSpell, damageInfo, healInfo, procAura, procAuraEffectIndex);
16182
16183 ProcTriggeredList procTriggered;
16184 // Fill procTriggered list
16185 for (AuraApplicationMap::const_iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16186 {
16187 // Do not allow auras to proc from effect triggered by itself
16188 if (procAura && procAura->Id == itr->first)
16189 continue;
16190
16191 // Xinef: Generic Item Equipment cooldown, -1 is a special marker
16192 if (itr->second->GetBase()->GetCastItemGUID() && HasSpellItemCooldown(itr->first, uint32(-1)))
16193 continue;
16194
16195 ProcTriggeredData triggerData(itr->second->GetBase());
16196 // Defensive procs are active on absorbs (so absorption effects are not a hindrance)
16197 bool active = damage || (procExtra & PROC_EX_BLOCK && isVictim);
16198 if (isVictim)
16199 procExtra &= ~PROC_EX_INTERNAL_REQ_FAMILY;
16200
16201 SpellInfo const* spellProto = itr->second->GetBase()->GetSpellInfo();
16202
16203 // only auras that have trigger spell should proc from fully absorbed damage
16204 if (procExtra & PROC_EX_ABSORB && isVictim)
16205 if (damage || spellProto->Effects[EFFECT_0].TriggerSpell || spellProto->Effects[EFFECT_1].TriggerSpell || spellProto->Effects[EFFECT_2].TriggerSpell)
16206 active = true;
16207
16208 // xinef: fix spell procing from damaging / healing casts if spell has DoT / HoT effect only
16209 // only player spells are taken into account
16210 if (!active && !isVictim && !(procFlag & PROC_FLAG_DONE_PERIODIC) && procSpellInfo && procSpellInfo->SpellFamilyName && (procSpellInfo->HasAura(SPELL_AURA_PERIODIC_DAMAGE) || procSpellInfo->HasAura(SPELL_AURA_PERIODIC_HEAL)))
16211 active = true;
16212
16213 // AuraScript Hook
16214 if (!triggerData.aura->CallScriptCheckProcHandlers(itr->second, eventInfo))
16215 {
16216 continue;
16217 }
16218
16219 bool isTriggeredAtSpellProcEvent = IsTriggeredAtSpellProcEvent(target, triggerData.aura, attType, isVictim, active, triggerData.spellProcEvent, eventInfo);
16220
16221 // AuraScript Hook
16222 if (!triggerData.aura->CallScriptAfterCheckProcHandlers(itr->second, eventInfo, isTriggeredAtSpellProcEvent))
16223 {
16224 continue;
16225 }
16226
16227 // do checks using conditions table
16228 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_SPELL_PROC, spellProto->Id);
16229 ConditionSourceInfo condInfo = ConditionSourceInfo(eventInfo.GetActor(), eventInfo.GetActionTarget());
16230 if (!sConditionMgr->IsObjectMeetToConditions(condInfo, conditions))
16231 {
16232 continue;
16233 }
16234
16235 bool hasTriggeredProc = false;
16236 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
16237 {
16238 if (itr->second->HasEffect(i))
16239 {
16240 AuraEffect* aurEff = itr->second->GetBase()->GetEffect(i);
16241
16242 // Skip this auras
16243 if (isNonTriggerAura[aurEff->GetAuraType()])
16244 continue;
16245
16246 // If not trigger by default and spellProcEvent == nullptr - skip
16247 if (!isTriggerAura[aurEff->GetAuraType()] && !triggerData.spellProcEvent)
16248 continue;
16249
16250 switch (aurEff->GetAuraType())
16251 {
16254 case SPELL_AURA_DUMMY:
16256 if (uint32 triggerSpellId = aurEff->GetSpellInfo()->Effects[i].TriggerSpell)
16257 {
16258 triggerData.triggerSpelId[i] = triggerSpellId;
16259 hasTriggeredProc = true;
16260 }
16261 break;
16262 default:
16263 break;
16264 }
16265
16266 // Some spells must always trigger
16267 //if (isAlwaysTriggeredAura[aurEff->GetAuraType()])
16268 triggerData.effMask |= 1 << i;
16269 }
16270 }
16271
16272 if (triggerData.effMask)
16273 {
16274 // If there is aura that triggers another proc aura, make sure that the triggered one is going to be proccessed on top of it
16275 if (hasTriggeredProc)
16276 {
16277 bool proccessed = false;
16278 for (uint8 i = 0; i < EFFECT_ALL; ++i)
16279 {
16280 if (uint32 triggeredSpellId = triggerData.triggerSpelId[i])
16281 {
16282 auto iter = std::find(procTriggered.begin(), procTriggered.end(), triggeredSpellId);
16283 if (iter != procTriggered.end())
16284 {
16285 std::advance(iter, 1);
16286 procTriggered.insert(iter, triggerData);
16287 proccessed = true;
16288 break;
16289 }
16290 }
16291 }
16292
16293 if (!proccessed)
16294 {
16295 procTriggered.push_front(triggerData);
16296 }
16297 }
16298 else
16299 {
16300 procTriggered.push_front(triggerData);
16301 }
16302 }
16303 }
16304
16305 // Nothing found
16306 if (procTriggered.empty())
16307 return;
16308
16309 // Note: must SetCantProc(false) before return
16311 SetCantProc(true);
16312
16313 // Handle effects proceed this time
16314 for (ProcTriggeredList::const_iterator i = procTriggered.begin(); i != procTriggered.end(); ++i)
16315 {
16316 // look for aura in auras list, it may be removed while proc event processing
16317 if (i->aura->IsRemoved())
16318 continue;
16319
16320 bool useCharges = i->aura->IsUsingCharges();
16321 // no more charges to use, prevent proc
16322 if (useCharges && !i->aura->GetCharges())
16323 continue;
16324
16325 bool takeCharges = false;
16326 SpellInfo const* spellInfo = i->aura->GetSpellInfo();
16327
16328 AuraApplication* aurApp = i->aura->GetApplicationOfTarget(GetGUID());
16329
16330 bool prepare = i->aura->CallScriptPrepareProcHandlers(aurApp, eventInfo);
16331
16332 // For players set spell cooldown if need
16333 uint32 cooldown = 0;
16334 if (prepare && i->spellProcEvent && i->spellProcEvent->cooldown)
16335 cooldown = i->spellProcEvent->cooldown;
16336
16337 // Xinef: set cooldown for actual proc
16338 eventInfo.SetProcCooldown(cooldown);
16339
16340 // Note: must SetCantProc(false) before return
16342 SetCantProc(true);
16343
16344 bool handled = i->aura->CallScriptProcHandlers(aurApp, eventInfo);
16345
16346 // "handled" is needed as long as proc can be handled in multiple places
16347 if (!handled && HandleAuraProc(target, damage, i->aura, procSpellInfo, procFlag, procExtra, cooldown, &handled))
16348 {
16349 uint32 Id = i->aura->GetId();
16350 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), Id);
16351 takeCharges = true;
16352 }
16353
16354 if (!handled)
16355 for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex)
16356 {
16357 if (!(i->effMask & (1 << effIndex)))
16358 continue;
16359
16360 AuraEffect* triggeredByAura = i->aura->GetEffect(effIndex);
16361 ASSERT(triggeredByAura);
16362
16363 bool prevented = i->aura->CallScriptEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16364 if (prevented)
16365 {
16366 takeCharges = true;
16367 continue;
16368 }
16369
16370 switch (triggeredByAura->GetAuraType())
16371 {
16373 {
16374 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16375 // Don`t drop charge or add cooldown for not started trigger
16376 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16377 takeCharges = true;
16378 break;
16379 }
16381 {
16382 // target has to be valid
16383 if (!eventInfo.GetProcTarget())
16384 break;
16385
16386 triggeredByAura->HandleProcTriggerDamageAuraProc(aurApp, eventInfo); // this function is part of the new proc system
16387 takeCharges = true;
16388 break;
16389 }
16391 case SPELL_AURA_DUMMY:
16392 {
16393 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());
16394 if (HandleDummyAuraProc(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, eventInfo))
16395 takeCharges = true;
16396 break;
16397 }
16402 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, isVictim ? "a victim's" : "an attacker's", triggeredByAura->GetId());
16403 takeCharges = true;
16404 break;
16406 {
16407 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16408 if (HandleOverrideClassScriptAuraProc(target, damage, triggeredByAura, procSpellInfo, cooldown))
16409 takeCharges = true;
16410 break;
16411 }
16413 {
16414 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16415 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16416 if (damage > 0)
16417 {
16419 takeCharges = true;
16420 }
16421 break;
16422 }
16424 {
16425 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16426 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16427 HandleAuraRaidProcFromCharge(triggeredByAura);
16428 takeCharges = true;
16429 break;
16430 }
16432 {
16433 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());
16434
16435 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16436 takeCharges = true;
16437 break;
16438 }
16440 // Skip melee hits or instant cast spells
16441 // xinef: check channeled spells which are affected by haste also
16442 if (procSpellInfo && (procSpellInfo->SpellFamilyName || !IsPlayer()) &&
16443 (procSpellInfo->CalcCastTime() > 0 /*||
16444 (procSpell->IsChanneled() && procSpell->GetDuration() > 0 && (HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, procSpell) || procSpell->HasAttribute(SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC)))*/))
16445 takeCharges = true;
16446 break;
16448 // Skip Melee hits and spells ws wrong school
16449 if (procSpellInfo && (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16450 takeCharges = true;
16451 break;
16453 // Skip Melee hits and targets with magnet aura
16454 if (procSpellInfo && (triggeredByAura->GetBase()->GetUnitOwner()->ToUnit() == ToUnit())) // Magnet
16455 takeCharges = true;
16456 break;
16459 // Skip melee hits and spells ws wrong school or zero cost
16460 if (procSpellInfo &&
16461 (procSpellInfo->ManaCost != 0 || procSpellInfo->ManaCostPercentage != 0 || (procSpellInfo->SpellFamilyFlags[1] & 0x2)) && // Cost check, mutilate include
16462 (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16463 takeCharges = true;
16464 break;
16467 // Compare mechanic
16468 if (procSpellInfo && procSpellInfo->Mechanic == uint32(triggeredByAura->GetMiscValue()))
16469 takeCharges = true;
16470 break;
16472 // Compare casters
16473 if (target && triggeredByAura->GetCasterGUID() == target->GetGUID())
16474 takeCharges = true;
16475 break;
16476 // CC Auras which use their amount amount to drop
16477 // Are there any more auras which need this?
16483 {
16484 // Spell own direct damage at apply wont break the CC
16485 // Xinef: Or when the aura is at full duration (assume that such auras should be added at the end, skipping all damage procs etc.)
16486 if (procSpellInfo)
16487 if ((!i->aura->IsPermanent() && i->aura->GetDuration() == i->aura->GetMaxDuration()) || procSpellInfo->Id == triggeredByAura->GetId() ||
16488 procSpellInfo->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
16489 break;
16490
16491 // chargeable mods are breaking on hit
16492 if (useCharges)
16493 takeCharges = true;
16494 else if (triggeredByAura->GetAmount()) // aura must have amount
16495 {
16496 int32 damageLeft = triggeredByAura->GetAmount();
16497 // No damage left
16498 if (damageLeft < int32(damage))
16499 i->aura->Remove();
16500 else
16501 triggeredByAura->SetAmount(damageLeft - damage);
16502 }
16503 break;
16504 }
16506 if (procSpellInfo && procSpellInfo->Id == 20647) // hack for warriors execute, both dummy and damage spell are affected by ignore aurastate aura
16507 break;
16508 takeCharges = true;
16509 break;
16512 {
16513 if (triggeredByAura->GetSpellModifier())
16514 {
16515 // Do proc if mod is consumed by spell
16516 if (!procSpell || procSpell->m_appliedMods.find(i->aura) != procSpell->m_appliedMods.end())
16517 {
16518 takeCharges = true;
16519 }
16520 }
16521 break;
16522 }
16523 default:
16524 takeCharges = true;
16525 break;
16526 }
16527 i->aura->CallScriptAfterEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16528 }
16529 // Remove charge (aura can be removed by triggers)
16530 // xinef: take into account attribute6 of proc spell
16531 if (prepare && useCharges && takeCharges)
16532 if (!procSpellInfo || isVictim || !procSpellInfo->HasAttribute(SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES))
16533 i->aura->DropCharge();
16534
16535 i->aura->CallScriptAfterProcHandlers(aurApp, eventInfo);
16536
16538 SetCantProc(false);
16539 }
16540
16541 // Cleanup proc requirements
16543 SetCantProc(false);
16544}
@ CONDITION_SOURCE_TYPE_SPELL_PROC
Definition ConditionMgr.h:147
@ 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
@ 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_FLAG_DONE_PERIODIC
Definition SpellMgr.h:134
static bool isNonTriggerAura[TOTAL_AURAS]
Definition Unit.cpp:105
static bool isTriggerAura[TOTAL_AURAS]
Definition Unit.cpp:103
std::list< ProcTriggeredData > ProcTriggeredList
Definition Unit.cpp:15891
@ REACTIVE_OVERPOWER
Definition Unit.h:596
@ REACTIVE_DEFENSE
Definition Unit.h:594
@ REACTIVE_HUNTER_PARRY
Definition Unit.h:595
@ REACTIVE_WOLVERINE_BITE
Definition Unit.h:597
void HandleProcTriggerDamageAuraProc(AuraApplication *aurApp, ProcEventInfo &eventInfo)
Definition SpellAuraEffects.cpp:7269
SpellModifier * GetSpellModifier() const
Definition SpellAuraEffects.h:52
Unit * GetUnitOwner() const
Definition SpellAuras.h:108
void UpdateCombatSkills(Unit *victim, WeaponAttackType attType, bool defence, Item *item=nullptr)
Definition PlayerUpdates.cpp:1025
Definition Unit.h:420
void SetProcCooldown(uint32 cooldown)
Definition Unit.h:454
Unit * GetActionTarget() const
Definition Unit.h:440
Unit * GetProcTarget() const
Definition Unit.h:441
bool HandleProcTriggerSpell(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
Definition Unit.cpp:8976
bool HandleAuraRaidProcFromChargeWithValue(AuraEffect *triggeredByAura)
Definition Unit.cpp:17595
bool IsHunterPet() const
Definition Unit.h:764
bool IsTriggeredAtSpellProcEvent(Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
Definition Unit.cpp:17456
bool HandleAuraProc(Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
Definition Unit.cpp:8781
virtual bool HasSpellItemCooldown(uint32, uint32) const
Definition Unit.h:1277
bool HandleDummyAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
Definition Unit.cpp:6645
void StartReactiveTimer(ReactiveType reactive)
Definition Unit.h:1775
bool HandleOverrideClassScriptAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
Definition Unit.cpp:9901
bool HandleAuraRaidProcFromCharge(AuraEffect *triggeredByAura)
Definition Unit.cpp:17684
Definition Unit.cpp:15872

References AddComboPoints(), ASSERT, ProcTriggeredData::aura, AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, SpellInfo::CalcCastTime(), Aura::CallScriptAfterCheckProcHandlers(), Aura::CallScriptCheckProcHandlers(), CLASS_CONTEXT_ABILITY_REACTIVE, 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(), Aura::GetEffect(), Object::GetGUID(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), ProcEventInfo::GetProcTarget(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), AuraEffect::GetSpellModifier(), Aura::GetUnitOwner(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandleProcTriggerDamageAuraProc(), HandleProcTriggerSpell(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasSpellItemCooldown(), SpellInfo::Id, IsCharmedOwnedByPlayerOrPlayer(), IsClass(), 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, and Player::UpdateCombatSkills().

Referenced by CalcAbsorbResist(), and ProcDamageAndSpell().

◆ processDummyAuras()

float Unit::processDummyAuras ( float  TakenTotalMod) const
private
11947{
11948 // note: old code coming from TC, just extracted here to remove the code duplication + solve potential crash
11949 // see: https://github.com/TrinityCore/TrinityCore/commit/c85710e148d75450baedf6632b9ca6fd40b4148e
11950
11951 // .. taken pct: dummy auras
11952 auto const& mDummyAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
11953 for (auto i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i)
11954 {
11955 if (!(*i) || !(*i)->GetSpellInfo())
11956 {
11957 continue;
11958 }
11959
11960 if (auto spellIconId = (*i)->GetSpellInfo()->SpellIconID)
11961 {
11962 switch (spellIconId)
11963 {
11964 // Cheat Death
11965 case 2109:
11966 if ((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
11967 {
11968 // Patch 2.4.3: The resilience required to reach the 90% damage reduction cap
11969 // is 22.5% critical strike damage reduction, or 444 resilience.
11970 // To calculate for 90%, we multiply the 100% by 4 (22.5% * 4 = 90%)
11971 float mod = -1.0f * GetMeleeCritDamageReduction(400);
11972 AddPct(TakenTotalMod, std::max(mod, float((*i)->GetAmount())));
11973 }
11974 break;
11975 }
11976 }
11977 }
11978 return TakenTotalMod;
11979}

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.

4288{
4291}
virtual void ProcessTerrainStatusUpdate()
Definition Unit.cpp:4293
virtual void ProcessPositionDataChanged(PositionFullTerrainStatus const &data)
Definition Object.cpp:1174

References WorldObject::ProcessPositionDataChanged(), and ProcessTerrainStatusUpdate().

Referenced by Creature::Create().

◆ ProcessTerrainStatusUpdate()

void Unit::ProcessTerrainStatusUpdate ( )
virtual

Reimplemented in Player.

4294{
4295 if (IsCreature())
4297
4298 if (IsFlying() || (!IsControlledByPlayer()))
4299 return;
4300
4301 LiquidData const& liquidData = GetLiquidData();
4302
4303 // remove appropriate auras if we are swimming/not swimming respectively
4304 if (liquidData.Status & MAP_LIQUID_STATUS_SWIMMING)
4306 else if (!isSwimming())
4308
4309 // liquid aura handling
4310 LiquidTypeEntry const* curLiquid = nullptr;
4311 if ((liquidData.Status & MAP_LIQUID_STATUS_SWIMMING))
4312 curLiquid = sLiquidTypeStore.LookupEntry(liquidData.Entry);
4313
4314 if (curLiquid != _lastLiquid)
4315 {
4318
4319 // Set _lastLiquid before casting liquid spell to avoid infinite loops
4320 _lastLiquid = curLiquid;
4321
4323 if (curLiquid && curLiquid->SpellId && (!player || !player->IsGameMaster()))
4324 CastSpell(this, curLiquid->SpellId, true);
4325 }
4326}
DBCStorage< LiquidTypeEntry > sLiquidTypeStore(LiquidTypefmt)
@ AURA_INTERRUPT_FLAG_NOT_ABOVEWATER
Definition SpellDefines.h:50
@ AURA_INTERRUPT_FLAG_NOT_UNDERWATER
Definition SpellDefines.h:51
void UpdateMovementFlags()
Definition Creature.cpp:3450
bool isSwimming() const
Definition Unit.h:1638
bool IsFlying() const
Definition Unit.h:1640
Definition GridTerrainData.h:199
uint32 Entry
Definition GridTerrainData.h:202
Definition DBCStructure.h:1284
uint32 SpellId
Definition DBCStructure.h:1290

References _lastLiquid, AURA_INTERRUPT_FLAG_NOT_ABOVEWATER, AURA_INTERRUPT_FLAG_NOT_UNDERWATER, CastSpell(), LiquidData::Entry, GetCharmerOrOwnerPlayerOrPlayerItself(), WorldObject::GetLiquidData(), IsControlledByPlayer(), Object::IsCreature(), IsFlying(), Player::IsGameMaster(), isSwimming(), MAP_LIQUID_STATUS_SWIMMING, RemoveAurasDueToSpell(), RemoveAurasWithInterruptFlags(), sLiquidTypeStore, LiquidTypeEntry::SpellId, LiquidData::Status, Object::ToCreature(), and Creature::UpdateMovementFlags().

Referenced by ProcessPositionDataChanged(), and Player::ProcessTerrainStatusUpdate().

◆ ProhibitSpellSchool()

virtual void Unit::ProhibitSpellSchool ( SpellSchoolMask  ,
uint32   
)
inlinevirtual

Reimplemented in Creature, and Player.

1516{ }

Referenced by Spell::EffectInterruptCast().

◆ propagateSpeedChange()

void Unit::propagateSpeedChange ( )
inline
void propagateSpeedChange()
Definition MotionMaster.cpp:890

References GetMotionMaster(), and MotionMaster::propagateSpeedChange().

Referenced by SetSpeed(), and SetWalk().

◆ RecalculateObjectScale()

void Unit::RecalculateObjectScale ( )
virtual
16788{
16790 float scale = GetNativeObjectScale() + CalculatePct(1.0f, scaleAuras);
16791 float scaleMin = IsPlayer() ? 0.1f : 0.01f;
16792 SetObjectScale(std::max(scale, scaleMin));
16793}
@ 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:120
virtual float GetNativeObjectScale() const
Definition Unit.h:1892

References CalculatePct(), GetNativeObjectScale(), GetTotalAuraModifier(), Object::IsPlayer(), Object::SetObjectScale(), SPELL_AURA_MOD_SCALE, and SPELL_AURA_MOD_SCALE_2.

Referenced by AuraEffect::HandleAuraModScale().

◆ RemoveAllAttackers()

void Unit::RemoveAllAttackers ( )

Remove all units in m_attackers list and send them AttackStop()

10529{
10530 while (!m_attackers.empty())
10531 {
10532 AttackerSet::iterator iter = m_attackers.begin();
10533 if (!(*iter)->AttackStop())
10534 {
10535 LOG_ERROR("entities.unit", "WORLD: Unit has an attacker that isn't attacking it!");
10536 m_attackers.erase(iter);
10537 }
10538 }
10539}

References LOG_ERROR, and m_attackers.

Referenced by CombatStop(), Spell::EffectSanctuary(), boss_kaelthas::ExecuteMiddleEvent(), AuraEffect::HandleFeignDeath(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), boss_attumen::SpellHit(), and npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI().

◆ RemoveAllAuras()

void Unit::RemoveAllAuras ( )
5353{
5354 // this may be a dead loop if some events on aura remove will continiously apply aura on remove
5355 // we want to have all auras removed, so use your brain when linking events
5356 while (!m_appliedAuras.empty() || !m_ownedAuras.empty())
5357 {
5358 AuraApplicationMap::iterator aurAppIter;
5359 for (aurAppIter = m_appliedAuras.begin(); aurAppIter != m_appliedAuras.end();)
5361
5362 AuraMap::iterator aurIter;
5363 for (aurIter = m_ownedAuras.begin(); aurIter != m_ownedAuras.end();)
5364 RemoveOwnedAura(aurIter);
5365 }
5366}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by CleanupBeforeRemoveFromMap(), boss_muru::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::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_aura::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_kalecgos::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(), 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::JustEngagedWith(), boss_high_astromancer_solarian::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::OnRemove(), PretendToDie(), boss_alar::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::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::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::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)
5427{
5428 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5429 {
5430 Aura const* aura = iter->second->GetBase();
5431 if (aura->GetSpellInfo()->HasAura(type))
5432 ++iter;
5433 else
5435 }
5436
5437 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5438 {
5439 Aura* aura = iter->second;
5440 if (aura->GetSpellInfo()->HasAura(type))
5441 ++iter;
5442 else
5444 }
5445}

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_aura::HandleEffectRemove(), and npc_iron_watcher::npc_iron_watcherAI::SpellHit().

◆ RemoveAllAurasOnDeath()

void Unit::RemoveAllAurasOnDeath ( )
5383{
5384 // used just after dieing to remove all visible auras
5385 // and disable the mods for the passive ones
5386 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5387 {
5388 Aura const* aura = iter->second->GetBase();
5391 else
5392 ++iter;
5393 }
5394
5395 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5396 {
5397 Aura* aura = iter->second;
5400 else
5401 ++iter;
5402 }
5403}
@ SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD
Definition SharedDefines.h:643
@ AURA_REMOVE_BY_DEATH
Definition SpellAuraDefines.h:396
bool IsDeathPersistent() const
Definition SpellAuras.cpp:1087

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 ( )
5406{
5407 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5408 {
5409 Aura const* aura = iter->second->GetBase();
5410 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5412 else
5413 ++iter;
5414 }
5415
5416 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5417 {
5418 Aura* aura = iter->second;
5419 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5421 else
5422 ++iter;
5423 }
5424}
bool IsRequiringDeadTarget() const
Definition SpellInfo.cpp:1222

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)
11131{
11132 // possessed pet and vehicle
11133 if (IsPlayer())
11135
11136 while (!m_Controlled.empty())
11137 {
11138 Unit* target = *m_Controlled.begin();
11139 m_Controlled.erase(m_Controlled.begin());
11140 if (target->GetCharmerGUID() == GetGUID())
11141 {
11142 target->RemoveCharmAuras();
11143 }
11144 else if (target->GetOwnerGUID() == GetGUID() && target->IsSummon())
11145 {
11146 if (!(onDeath && !IsPlayer() && target->IsGuardian()))
11147 {
11148 target->ToTempSummon()->UnSummon();
11149 }
11150 }
11151 else
11152 {
11153 LOG_ERROR("entities.unit", "Unit {} is trying to release unit {} which is neither charmed nor owned by it", GetEntry(), target->GetEntry());
11154 }
11155 }
11156}
void StopCastingCharm(Aura *except=nullptr)
Definition Player.cpp:9335
bool IsGuardian() const
Definition Unit.h:761
void RemoveCharmAuras()
Definition Unit.cpp:11241

References GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), IsGuardian(), Object::IsPlayer(), IsSummon(), LOG_ERROR, m_Controlled, RemoveCharmAuras(), Player::StopCastingCharm(), Object::ToPlayer(), ToTempSummon(), and TempSummon::UnSummon().

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ RemoveAllDynObjects()

void Unit::RemoveAllDynObjects ( )
6220{
6221 while (!m_dynObj.empty())
6222 m_dynObj.front()->Remove();
6223}

References m_dynObj.

Referenced by RemoveFromWorld(), Player::TeleportTo(), and npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI().

◆ RemoveAllGameObjects()

void Unit::RemoveAllGameObjects ( )
6320{
6321 while(!m_gameObj.empty())
6322 {
6323 GameObject* go = ObjectAccessor::GetGameObject(*this, *m_gameObj.begin());
6324 if (go)
6325 {
6327 go->SetRespawnTime(0);
6328 go->Delete();
6329 }
6330 m_gameObj.erase(m_gameObj.begin());
6331 }
6332}
void Delete()
Definition GameObject.cpp:982
void SetRespawnTime(int32 respawn)
Definition GameObject.cpp:1288

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)
10908{
10909 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
10910 {
10911 Unit* unit = *itr;
10912 ++itr;
10913 if (unit->GetEntry() == entry && unit->IsCreature()
10914 && unit->ToCreature()->IsSummon()) // minion, actually
10915 unit->ToTempSummon()->UnSummon();
10916 // i think this is safe because i have never heard that a despawned minion will trigger a same minion
10917 }
10918}

References Object::GetEntry(), Object::IsCreature(), IsSummon(), m_Controlled, Object::ToCreature(), ToTempSummon(), 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)
4904{
4905 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
4906 {
4907 if (check(iter->second))
4908 {
4909 RemoveAura(iter);
4910 continue;
4911 }
4912 ++iter;
4913 }
4914}

References m_appliedAuras, and RemoveAura().

Referenced by RemoveArenaAuras().

◆ RemoveAppliedAuras() [2/2]

void Unit::RemoveAppliedAuras ( uint32  spellId,
std::function< bool(AuraApplication const *)> const &  check 
)
4930{
4931 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
4932 {
4933 if (check(iter->second))
4934 {
4935 RemoveAura(iter);
4936 continue;
4937 }
4938 ++iter;
4939 }
4940}

References m_appliedAuras, and RemoveAura().

◆ RemoveAreaAurasDueToLeaveWorld()

void Unit::RemoveAreaAurasDueToLeaveWorld ( )
5320{
5321 // make sure that all area auras not applied on self are removed - prevent access to deleted pointer later
5322 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5323 {
5324 Aura* aura = iter->second;
5325 ++iter;
5326 Aura::ApplicationMap const& appMap = aura->GetApplicationMap();
5327 for (Aura::ApplicationMap::const_iterator itr = appMap.begin(); itr != appMap.end();)
5328 {
5329 AuraApplication* aurApp = itr->second;
5330 ++itr;
5331 Unit* target = aurApp->GetTarget();
5332 if (target == this)
5333 continue;
5334 target->RemoveAura(aurApp);
5335 // things linked on aura remove may apply new area aura - so start from the beginning
5336 iter = m_ownedAuras.begin();
5337 }
5338 }
5339
5340 // remove area auras owned by others
5341 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5342 {
5343 if (iter->second->GetBase()->GetOwner() != this)
5344 {
5345 RemoveAura(iter);
5346 }
5347 else
5348 ++iter;
5349 }
5350}
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 ( )
5369{
5370 // in join, remove positive buffs, on end, remove negative
5371 // used to remove positive visible auras in arenas
5372 RemoveAppliedAuras([](AuraApplication const* aurApp)
5373 {
5374 Aura const* aura = aurApp->GetBase();
5375 return (!aura->GetSpellInfo()->HasAttribute(SPELL_ATTR4_ALLOW_ENETRING_ARENA) // don't remove stances, shadowform, pally/hunter auras
5376 && !aura->IsPassive() // don't remove passive auras
5377 && (aurApp->IsPositive() || !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD))) || // not negative death persistent auras
5378 aura->GetSpellInfo()->HasAttribute(SPELL_ATTR5_REMOVE_ENTERING_ARENA); // special marker, always remove
5379 });
5380}
@ 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
bool IsPositive() const
Definition SpellAuras.h:68
void RemoveAppliedAuras(std::function< bool(AuraApplication const *)> const &check)
Definition Unit.cpp:4903

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 
)
4883{
4884 if (aura->IsRemoved())
4885 return;
4886 if (AuraApplication* aurApp = aura->GetApplicationOfTarget(GetGUID()))
4887 RemoveAura(aurApp, mode);
4888}

References Aura::GetApplicationOfTarget(), Object::GetGUID(), Aura::IsRemoved(), and RemoveAura().

◆ RemoveAura() [2/4]

void Unit::RemoveAura ( AuraApplication aurApp,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4840{
4841 // we've special situation here, RemoveAura called while during aura removal
4842 // this kind of call is needed only when aura effect removal handler
4843 // or event triggered by it expects to remove
4844 // not yet removed effects of an aura
4845 if (aurApp->GetRemoveMode())
4846 {
4847 // remove remaining effects of an aura
4848 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4849 {
4850 if (aurApp->HasEffect(itr))
4851 aurApp->_HandleEffect(itr, false);
4852 }
4853 return;
4854 }
4855 // no need to remove
4856 if (aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) != aurApp || aurApp->GetBase()->IsRemoved())
4857 return;
4858
4859 uint32 spellId = aurApp->GetBase()->GetId();
4860 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4861
4862 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4863 {
4864 if (aurApp == iter->second)
4865 {
4866 // Prevent Arena Preparation aura from being removed by player actions
4867 // It's an invisibility spell so any interaction/spell cast etc. removes it.
4868 // Should only be removed by the arena script, once the match starts.
4870 {
4871 return;
4872 }
4873
4874 RemoveAura(iter, mode);
4875 return;
4876 }
4877 else
4878 ++iter;
4879 }
4880}
@ 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 
)
4810{
4811 AuraApplication* aurApp = i->second;
4812 // Do not remove aura which is already being removed
4813 if (aurApp->GetRemoveMode())
4814 return;
4815 Aura* aura = aurApp->GetBase();
4816 _UnapplyAura(i, mode);
4817 // Remove aura - for Area and Target auras
4818 if (aura->GetOwner() == this)
4819 aura->Remove(mode);
4820}

References _UnapplyAura(), AuraApplication::GetBase(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), and Aura::Remove().

Referenced by _RemoveNoStackAurasDueToAura(), boss_marli::_schedulePhaseTroll(), ApplySpellDispelImmunity(), Player::CheckAreaExploreAndOutdoor(), 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(), npc_harrison_jones::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::HandleDummy(), HandleDummyAuraProc(), spell_valanar_kinetic_bomb_aura::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::HandleInfusion(), spell_warl_demonic_circle_summon::HandleRemove(), spell_putricide_eat_ooze::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::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_aura::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(), RemoveAppliedAuras(), RemoveAreaAurasDueToLeaveWorld(), RemoveAura(), RemoveAura(), RemoveAura(), RemoveAurasByShapeShift(), RemoveAurasByType(), RemoveAurasDueToItemSpell(), RemoveAurasDueToSpell(), RemoveAurasWithAttribute(), RemoveAurasWithFamily(), RemoveAurasWithInterruptFlags(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), BattlegroundIC::RemovePlayer(), BattlegroundMap::RemovePlayerFromMap(), boss_bjarngrim::boss_bjarngrimAI::RemoveStanceAura(), boss_gyth::boss_gythAI::Reset(), 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::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(), 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::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 
)
4823{
4824 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4825 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4826 {
4827 Aura const* aura = iter->second->GetBase();
4828 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4829 && (!caster || aura->GetCasterGUID() == caster))
4830 {
4831 RemoveAura(iter, removeMode);
4832 return;
4833 }
4834 else
4835 ++iter;
4836 }
4837}

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 
)
4959{
4960 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4961 for (AuraMap::iterator iter = range.first; iter != range.second;)
4962 {
4963 Aura* aura = iter->second;
4964 if ((aura->GetType() == UNIT_AURA_TYPE)
4965 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
4966 {
4967 aura->ModStackAmount(-1, removeMode);
4968 return;
4969 }
4970 else
4971 ++iter;
4972 }
4973}
@ UNIT_AURA_TYPE
Definition SpellAuraDefines.h:385
bool ModStackAmount(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT, bool periodicReset=false)
Definition SpellAuras.cpp:1021
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_aura::HandleExtraEffect(), spell_oculus_evasive_maneuvers_aura::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_item_brittle_armor::HandleScript(), spell_item_mercurial_shield::HandleScript(), boss_selin_fireheart::JustEngagedWith(), and boss_viscidus::SpellHit().

◆ RemoveAurasByShapeShift()

void Unit::RemoveAurasByShapeShift ( )
5304{
5305 uint32 mechanic_mask = (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT);
5306 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5307 {
5308 Aura const* aura = iter->second->GetBase();
5309 if ((aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask) &&
5311 {
5312 RemoveAura(iter);
5313 continue;
5314 }
5315 ++iter;
5316 }
5317}
@ SPELL_ATTR0_CU_AURA_CC
Definition SpellInfo.h:181
uint32 GetAllEffectsMechanicMask() const
Definition SpellInfo.cpp:1992

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 
)
5144{
5145 // simple check if list is empty
5146 if (m_modAuras[auraType].empty())
5147 return;
5148
5149 for (AuraEffectList::iterator iter = m_modAuras[auraType].begin(); iter != m_modAuras[auraType].end();)
5150 {
5151 Aura* aura = (*iter)->GetBase();
5153
5154 ++iter;
5155 if (aura != except && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5156 && ((negative && !aurApp->IsPositive()) || (positive && aurApp->IsPositive())))
5157 {
5158 uint32 removedAuras = m_removedAurasCount;
5159 RemoveAura(aurApp);
5160 if (m_removedAurasCount > removedAuras + 1)
5161 iter = m_modAuras[auraType].begin();
5162 }
5163 }
5164}

References Aura::GetApplicationOfTarget(), Aura::GetCasterGUID(), Object::GetGUID(), AuraApplication::IsPositive(), m_modAuras, m_removedAurasCount, and RemoveAura().

Referenced by _EnterVehicle(), Spell::_handle_finish_phase(), Player::ActivateTaxiPathTo(), Battleground::AddPlayer(), Attack(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), spell_gen_summon_tournament_mount::CheckIfLanceEquipped(), ClearComboPoints(), Player::ContinueTaxiFlight(), boss_kologarn_arms::boss_kologarn_armsAI::DamageTaken(), Spell::DoSpellHitOnUnit(), Spell::EffectPowerBurn(), Spell::EffectTriggerSpell(), BattlegroundWS::EventPlayerClickedOnFlag(), ExitVehicle(), WorldSession::HandleAuctionHelloOpcode(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItems(), 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_rog_vanish::HandleEffect(), spell_hydross_mark_of_hydross::HandleEffectApply(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandleListStabledPetsOpcode(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), WorldSession::HandleMoveWorldportAck(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_algalon_remove_phase_aura::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(), boss_gurtogg_bloodboil::JustEngagedWith(), 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(), GameObject::Use(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ RemoveAurasDueToItemSpell()

void Unit::RemoveAurasDueToItemSpell ( uint32  spellId,
ObjectGuid  castItemGuid 
)
5119{
5120 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
5121 {
5122 if (iter->second->GetBase()->GetCastItemGUID() == castItemGuid)
5123 {
5124 RemoveAura(iter);
5125 iter = m_appliedAuras.lower_bound(spellId);
5126 }
5127 else
5128 ++iter;
5129 }
5130
5131 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
5132 {
5133 if (iter->second->GetCastItemGUID() == castItemGuid)
5134 {
5136 iter = m_ownedAuras.lower_bound(spellId);
5137 }
5138 else
5139 ++iter;
5140 }
5141}

References AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, RemoveAura(), and RemoveOwnedAura().

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 
)
4943{
4944 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
4945 {
4946 Aura const* aura = iter->second->GetBase();
4947 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4948 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
4949 {
4950 RemoveAura(iter, removeMode);
4951 iter = m_appliedAuras.lower_bound(spellId);
4952 }
4953 else
4954 ++iter;
4955 }
4956}

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::CheckCast(), boss_volazj::CheckPhaseMinions(), spell_botanica_shift_form_aura::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::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(), WorldState::DispelAdalsSongOfBattle(), WorldState::DispelMagtheridonTeam(), 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_frozen_core::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::DoAction(), npc_maiev_illidan::DoAction(), npc_pet_gen_argent_pony_bridle::DoAction(), boss_alar::DoDiveBomb(), InstanceScript::DoRemoveAurasDueToSpellOnPlayers(), Spell::DoTriggersOnSpellHit(), Spell::EffectApplyGlyph(), Spell::EffectHeal(), Spell::EffectRemoveAura(), Spell::EffectSchoolDMG(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), boss_zuljin::EnterPhase(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), BattleExperienceEvent::Execute(), SendEncounterUnit::Execute(), FrostBombExplosion::Execute(), AuraRemoveEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), spell_sindragosa_ice_tomb_trap_aura::ExtraRemoveEffect(), spell_mother_shahraz_fatal_attraction_dummy::FilterTargets(), 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(), spell_moroes_vanish::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_warhead_detonate::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), HandleDummyAuraProc(), spell_magtheridon_shadow_grasp_visual::HandleDummyRemove(), spell_shadowfang_keep_forsaken_skills_aura::HandleDummyTick(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_q12730_quenching_mist::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_reliquary_of_souls_aura_of_suffering_aura::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_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), spell_transitus_shield_beam_aura::HandleOnEffectRemove(), OPvPCapturePointZM_Graveyard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_algalon_remove_phase_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldState::HandlePlayerLeaveZone(), OutdoorPvPEP::HandlePlayerLeaveZone(), OutdoorPvPHP::HandlePlayerLeaveZone(), OutdoorPvPNA::HandlePlayerLeaveZone(), OutdoorPvPSI::HandlePlayerLeaveZone(), OutdoorPvPTF::HandlePlayerLeaveZone(), OutdoorPvPZM::HandlePlayerLeaveZone(), spell_gen_consume::HandleProc(), spell_pri_t4_4p_bonus::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), spell_icc_harvest_blight_specimen::HandleQuestComplete(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleRemove(), spell_dru_enrage::HandleRemove(), spell_pal_divine_intervention::HandleRemove(), spell_pal_avenging_wrath::HandleRemove(), spell_rog_killing_spree_aura::HandleRemove(), spell_warr_vigilance::HandleRemove(), WorldSession::HandleRemoveGlyph(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_putricide_clear_aura_effect_value::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_jump_remove_aura::HandleScript(), spell_icc_harvest_blight_specimen::HandleScript(), spell_festergut_pungent_blight::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_q10651_q10692_book_of_fel_names::HandleScript(), spell_halion_clear_debuffs::HandleScriptEffect(), spell_q12823_remove_collapsing_cave_aura::HandleScriptEffect(), spell_illidari_council_judgement::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_zuljin::JustEngagedWith(), boss_bronjahm::boss_bronjahmAI::JustEngagedWith(), boss_doomwalker::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_gurtogg_bloodboil::JustEngagedWith(), boss_hydross_the_unstable::JustReachedHome(), boss_felblood_kaelthas::LapseAction(), boss_garfrost::boss_garfrostAI::MovementInform(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::MovementInform(), boss_felmyst::MovementInform(), boss_shade_of_akama::MovementInform(), boss_kaelthas::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_aura::OnApply(), spell_halion_leave_twilight_realm_aura::OnApply(), spell_systems_shutdown_aura::OnApply(), npc_chesspiece::OnCharmed(), npc_eye_of_acherus::OnCharmed(), npc_aged_dying_ancient_kodo::OnGossipHello(), spell_claw_rage_aura::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_gen_curse_of_pain::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), BattlefieldWG::OnPlayerLeaveZone(), lfg::LFGPlayerScript::OnPlayerMapChanged(), MidsummerPlayerScript::OnPlayerUpdateZone(), boss_shade_of_aran::OnPowerUpdate(), spell_halion_combustion_consumption_aura::OnRemove(), spell_halion_leave_twilight_realm_aura::OnRemove(), spell_algalon_phase_punch_aura::OnRemove(), spell_load_into_catapult_aura::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_quest_test_flight_charging::PerformKick(), SmartScript::ProcessAction(), 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::RemovePrison(), Pet::removeSpell(), Player::removeSpell(), spell_gen_eject_all_passengers::RemoveVehicleAuras(), spell_gen_defend::RemoveVisualShields(), boss_malchezaar::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), boss_kiljaeden::Reset(), boss_twilight_corrupter::Reset(), boss_nalorakk::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(), npc_akama_shade::sGossipSelect(), 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(), advisor_baseAI::SpellHit(), boss_moorabi::boss_moorabiAI::SpellHitTarget(), boss_festergut::boss_festergutAI::SpellHitTarget(), boss_ahune::Submerge(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_cthun::SummonedCreatureDies(), npc_kiljaeden_controller::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_aura::Update(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_eye_of_acherus::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_mimiron::boss_mimironAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_anzu::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 
)
4976{
4977 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4978 for (AuraMap::iterator iter = range.first; iter != range.second;)
4979 {
4980 Aura* aura = iter->second;
4981 if (aura->GetCasterGUID() == casterGUID)
4982 {
4983 DispelInfo dispelInfo(dispeller, dispellerSpellId, chargesRemoved);
4984
4985 // Call OnDispel hook on AuraScript
4986 aura->CallScriptDispel(&dispelInfo);
4987
4989 aura->ModCharges(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
4990 else
4991 aura->ModStackAmount(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
4992
4993 // Call AfterDispel hook on AuraScript
4994 aura->CallScriptAfterDispel(&dispelInfo);
4995
4996 switch (aura->GetSpellInfo()->SpellFamilyName)
4997 {
4998 case SPELLFAMILY_HUNTER:
4999 {
5000 // Noxious Stings
5001 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x1000)
5002 {
5003 if (Unit* caster = aura->GetCaster())
5004 {
5005 if (AuraEffect* aureff = caster->GetAuraEffect(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_HUNTER, 3521, 1))
5006 {
5007 if (Aura* noxious = Aura::TryCreate(aura->GetSpellInfo(), aura->GetEffectMask(), dispeller, caster))
5008 {
5009 noxious->SetDuration(aura->GetDuration() * aureff->GetAmount() / 100);
5010 if (aura->GetUnitOwner())
5011 if (const std::vector<int32>* spell_triggered = sSpellMgr->GetSpellLinked(-int32(aura->GetId())))
5012 for (std::vector<int32>::const_iterator itr = spell_triggered->begin(); itr != spell_triggered->end(); ++itr)
5013 aura->GetUnitOwner()->RemoveAurasDueToSpell(*itr);
5014 }
5015 }
5016 }
5017 }
5018 break;
5019 }
5021 {
5022 // Icy Clutch, remove with Frost Fever
5023 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x4000000)
5024 {
5025 if (AuraEffect* aureff = GetAuraEffect(SPELL_AURA_MOD_DECREASE_SPEED, SPELLFAMILY_DEATHKNIGHT, 0, 0x40000, 0, casterGUID))
5026 RemoveAurasDueToSpell(aureff->GetId());
5027 }
5028 }
5029 default:
5030 break;
5031 }
5032 return;
5033 }
5034 else
5035 ++iter;
5036 }
5037}
void CallScriptDispel(DispelInfo *dispelInfo)
Definition SpellAuras.cpp:2390
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:973
void CallScriptAfterDispel(DispelInfo *dispelInfo)
Definition SpellAuras.cpp:2403
Definition Unit.h:296

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 
)
5040{
5041 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5042 for (AuraMap::iterator iter = range.first; iter != range.second;)
5043 {
5044 Aura* aura = iter->second;
5045 if (aura->GetCasterGUID() == casterGUID)
5046 {
5047 int32 damage[MAX_SPELL_EFFECTS];
5048 int32 baseDamage[MAX_SPELL_EFFECTS];
5049 uint8 effMask = 0;
5050 uint8 recalculateMask = 0;
5051 Unit* caster = aura->GetCaster();
5052 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5053 {
5054 if (aura->GetEffect(i))
5055 {
5056 baseDamage[i] = aura->GetEffect(i)->GetBaseAmount();
5057 damage[i] = aura->GetEffect(i)->GetAmount();
5058 effMask |= (1 << i);
5059 if (aura->GetEffect(i)->CanBeRecalculated())
5060 recalculateMask |= (1 << i);
5061 }
5062 else
5063 {
5064 baseDamage[i] = 0;
5065 damage[i] = 0;
5066 }
5067 }
5068
5070 // Cast duration to unsigned to prevent permanent aura's such as Righteous Fury being permanently added to caster
5071 uint32 dur = std::min(2u * MINUTE * IN_MILLISECONDS, uint32(aura->GetDuration()));
5072
5073 if (Aura* oldAura = stealer->GetAura(aura->GetId(), aura->GetCasterGUID()))
5074 {
5075 if (stealCharge)
5076 oldAura->ModCharges(1);
5077 else
5078 oldAura->ModStackAmount(1);
5079 oldAura->SetDuration(int32(dur));
5080 }
5081 else
5082 {
5083 // single target state must be removed before aura creation to preserve existing single target aura
5084 if (aura->IsSingleTarget())
5085 aura->UnregisterSingleTarget();
5086
5087 // Xinef: if stealer has same aura
5088 Aura* curAura = stealer->GetAura(aura->GetId());
5089 if (!curAura || (!curAura->IsPermanent() && curAura->GetDuration() < (int32)dur))
5090 if (Aura* newAura = Aura::TryRefreshStackOrCreate(aura->GetSpellInfo(), effMask, stealer, nullptr, &baseDamage[0], nullptr, aura->GetCasterGUID()))
5091 {
5092 // created aura must not be single target aura,, so stealer won't loose it on recast
5093 if (newAura->IsSingleTarget())
5094 {
5095 newAura->UnregisterSingleTarget();
5096 // bring back single target aura status to the old aura
5097 aura->SetIsSingleTarget(true);
5098 caster->GetSingleCastAuras().push_back(aura);
5099 }
5100 // FIXME: using aura->GetMaxDuration() maybe not blizzlike but it fixes stealing of spells like Innervate
5101 newAura->SetLoadedState(aura->GetMaxDuration(), int32(dur), stealCharge ? 1 : aura->GetCharges(), 1, recalculateMask, &damage[0]);
5102 newAura->ApplyForTargets();
5103 }
5104 }
5105
5106 if (stealCharge)
5108 else
5110
5111 return;
5112 }
5113 else
5114 ++iter;
5115 }
5116}
bool CanBeRecalculated() const
Definition SpellAuraEffects.h:78
int32 GetBaseAmount() const
Definition SpellAuraEffects.h:57
void UnregisterSingleTarget()
Definition SpellAuras.cpp:1167
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)
5167{
5168 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5169 {
5170 SpellInfo const* spell = iter->second->GetBase()->GetSpellInfo();
5171 if (spell->Attributes & flags)
5172 RemoveAura(iter);
5173 else
5174 ++iter;
5175 }
5176}

References SpellInfo::Attributes, m_appliedAuras, and RemoveAura().

◆ RemoveAurasWithFamily()

void Unit::RemoveAurasWithFamily ( SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID 
)
5250{
5251 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5252 {
5253 Aura const* aura = iter->second->GetBase();
5254 if (!casterGUID || aura->GetCasterGUID() == casterGUID)
5255 {
5256 SpellInfo const* spell = aura->GetSpellInfo();
5257 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5258 {
5259 RemoveAura(iter);
5260 continue;
5261 }
5262 }
5263 ++iter;
5264 }
5265}

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 
)
5215{
5216 if (!(m_interruptMask & flag))
5217 return;
5218
5219 // interrupt auras
5220 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end();)
5221 {
5222 Aura* aura = (*iter)->GetBase();
5223 ++iter;
5224 if ((aura->GetSpellInfo()->AuraInterruptFlags & flag) && (!except || aura->GetId() != except))
5225 {
5226 uint32 removedAuras = m_removedAurasCount;
5227 RemoveAura(aura);
5228 if (m_removedAurasCount > removedAuras + 1)
5229 iter = m_interruptableAuras.begin();
5230 }
5231 }
5232
5233 // interrupt channeled spell
5235 {
5236 if (spell->getState() == SPELL_STATE_CASTING && (spell->m_spellInfo->ChannelInterruptFlags & flag) && spell->m_spellInfo->Id != except)
5237 {
5238 // Do not interrupt if auto shot
5239 if (!(isAutoshot && spell->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS)))
5240 {
5241 InterruptNonMeleeSpells(false, spell->m_spellInfo->Id);
5242 }
5243 }
5244 }
5245
5247}

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::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 
)
5287{
5288 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5289 {
5290 Aura const* aura = iter->second->GetBase();
5291 if (!except || aura->GetId() != except)
5292 {
5293 if (aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask)
5294 {
5295 RemoveAura(iter, removemode);
5296 continue;
5297 }
5298 }
5299 ++iter;
5300 }
5301}

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetId(), Aura::GetSpellInfo(), m_appliedAuras, and RemoveAura().

Referenced by HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), spell_rog_vanish_purge::HandleRootRemove(), spell_rog_vanish_purge::HandleSnareRemove(), and RemoveMovementImpairingAuras().

◆ RemoveBindSightAuras()

void Unit::RemoveBindSightAuras ( )
11237{
11239}
@ SPELL_AURA_BIND_SIGHT
Definition SpellAuraDefines.h:64

References RemoveAurasByType(), and SPELL_AURA_BIND_SIGHT.

Referenced by RemoveFromWorld().

◆ RemoveCharmAuras()

void Unit::RemoveCharmAuras ( )

◆ RemoveCharmedBy()

void Unit::RemoveCharmedBy ( Unit charmer)
18586{
18587 if (!IsCharmed())
18588 return;
18589
18590 if (!charmer)
18591 charmer = GetCharmer();
18592 if (charmer != GetCharmer()) // one aura overrides another?
18593 {
18594 // LOG_FATAL("entities.unit", "Unit::RemoveCharmedBy: this: {} true charmer: {} false charmer: {}",
18595 // GetGUID().ToString(), GetCharmerGUID().ToString(), charmer->GetGUID().ToString());
18596 // ABORT();
18597 return;
18598 }
18599
18600 CharmType type;
18602 type = CHARM_TYPE_POSSESS;
18603 else if (charmer && charmer->IsOnVehicle(this))
18604 type = CHARM_TYPE_VEHICLE;
18605 else
18606 type = CHARM_TYPE_CHARM;
18607
18608 if (_oldFactionId)
18609 {
18611 _oldFactionId = 0;
18612 }
18613 else
18615
18616 CastStop();
18617 AttackStop();
18618
18619 // xinef: update speed after charming
18620 UpdateSpeed(MOVE_RUN, false);
18621
18622 // xinef: do not break any controlled motion slot
18623 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == NULL_MOTION_TYPE)
18624 {
18625 StopMoving();
18627 }
18628 // xinef: if we have any controlled movement, clear active and idle only
18629 else
18631
18633
18634 // xinef: remove stunned flag if owner was mounted
18637
18638 // If charmer still exists
18639 if (!charmer)
18640 return;
18641
18642 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18643 ASSERT(type != CHARM_TYPE_VEHICLE || (IsCreature() && IsVehicle()));
18644
18645 charmer->SetCharm(this, false);
18646
18648
18649 Player* playerCharmer = charmer->ToPlayer();
18650 if (playerCharmer)
18651 {
18652 switch (type)
18653 {
18654 case CHARM_TYPE_VEHICLE:
18655 playerCharmer->SetClientControl(this, false);
18656 playerCharmer->SetClientControl(charmer, true); // verified
18659 break;
18660 case CHARM_TYPE_POSSESS:
18661 playerCharmer->SetClientControl(this, false);
18662 playerCharmer->SetClientControl(charmer, true); // verified
18667 break;
18668 case CHARM_TYPE_CHARM:
18670 {
18672 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18673 {
18675 if (GetCharmInfo())
18676 GetCharmInfo()->SetPetNumber(0, true);
18677 else
18678 LOG_ERROR("entities.unit", "Aura::HandleModCharm: target={} has a charm aura but no charm info!", GetGUID().ToString());
18679 }
18680 }
18681 break;
18682 default:
18683 break;
18684 }
18685 }
18686
18687 if (Player* player = ToPlayer())
18688 {
18689 sScriptMgr->AnticheatSetUnderACKmount(player);
18690 }
18691
18692 // xinef: restore threat
18693 for (CharmThreatMap::const_iterator itr = _charmThreatInfo.begin(); itr != _charmThreatInfo.end(); ++itr)
18694 {
18695 if (Unit* target = ObjectAccessor::GetUnit(*this, itr->first))
18696 if (!IsFriendlyTo(target))
18697 AddThreat(target, itr->second);
18698 }
18699
18700 _charmThreatInfo.clear();
18701
18702 if (Creature* creature = ToCreature())
18703 {
18704 // Vehicle should not attack its passenger after he exists the seat
18705 if (type != CHARM_TYPE_VEHICLE && charmer->IsAlive() && !charmer->IsFriendlyTo(creature))
18706 if (Attack(charmer, true))
18707 GetMotionMaster()->MoveChase(charmer);
18708
18709 // Creature will restore its old AI on next update
18710 if (creature->AI())
18711 creature->AI()->OnCharmed(false);
18712
18713 // Xinef: Remove movement flag flying
18715 }
18716 else
18717 ToPlayer()->SetClientControl(this, true); // verified
18718
18719 // a guardian should always have charminfo
18720 if (playerCharmer && this != charmer->GetFirstControlled())
18721 playerCharmer->SendRemoveControlBar();
18722
18723 // xinef: Always delete charm info (restores react state)
18724 if (IsPlayer() || (IsCreature() && !ToCreature()->IsGuardian()))
18726}
CharmType
Definition CharmInfo.h:44
@ CHARM_TYPE_CHARM
Definition CharmInfo.h:45
@ CHARM_TYPE_POSSESS
Definition CharmInfo.h:46
@ CHARM_TYPE_VEHICLE
Definition CharmInfo.h:47
@ MOTION_SLOT_CONTROLLED
Definition MotionMaster.h:65
@ MOTION_SLOT_ACTIVE
Definition MotionMaster.h:64
@ NULL_MOTION_TYPE
Definition MotionMaster.h:58
@ CREATURE_TYPE_DEMON
Definition SharedDefines.h:2630
@ CLASS_CONTEXT_PET_CHARM
Definition UnitDefines.h:237
@ UNIT_STATE_NO_ENVIRONMENT_UPD
Definition UnitDefines.h:198
@ MOVE_RUN
Definition UnitDefines.h:350
@ UNIT_FLAG_DISABLE_MOVE
Definition UnitDefines.h:252
void InitDefault()
Definition MotionMaster.cpp:87
void MovementExpiredOnSlot(MovementSlot slot, bool reset=true)
Definition MotionMaster.h:194
void MovementExpired(bool reset=true)
Definition MotionMaster.h:180
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition Object.cpp:750
void SendRemoveControlBar()
Definition Player.cpp:9738
void SetClientControl(Unit *target, bool allowMove, bool packetOnly=false)
Definition Player.cpp:12829
void DeleteCharmInfo()
Definition Unit.cpp:15856
void RestoreFaction()
Definition Unit.cpp:18728
void SetCharm(Unit *target, bool apply)
Definition Unit.cpp:10920
void StopAttackingInvalidTarget()
Definition Unit.cpp:20236
void CastStop(uint32 except_spellid=0, bool withInstant=true)
Interrupt the unit cast for all the current spells.
Definition Unit.cpp:1172
bool Attack(Unit *victim, bool meleeAttack)
Definition Unit.cpp:10312
CharmThreatMap _charmThreatInfo
Definition Unit.h:2116
void RemoveUnitMovementFlag(uint32 f)
Definition Unit.h:744
void UpdateSpeed(UnitMoveType mtype, bool forced)
Definition Unit.cpp:14301
uint32 unit_class
Definition CreatureData.h:213

References _charmThreatInfo, _oldFactionId, AddThreat(), ASSERT, Attack(), AttackStop(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, CLASS_CONTEXT_PET_CHARM, CLASS_WARLOCK, ClearUnitState(), CREATURE_TYPE_DEMON, DeleteCharmInfo(), GetCharmer(), GetCharmInfo(), Creature::GetCreatureTemplate(), GetFirstControlled(), Object::GetGUID(), GetMotionMaster(), ObjectAccessor::GetUnit(), HasUnitState(), MotionMaster::InitDefault(), IsAlive(), IsCharmed(), IsClass(), Object::IsCreature(), IsFriendlyTo(), IsGuardian(), IsOnVehicle(), Object::IsPlayer(), 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, 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
977{ m_ComboPointHolders.erase(unit); }

References m_ComboPointHolders.

Referenced by AddComboPoints(), and ClearComboPoints().

◆ RemoveDynObject()

bool Unit::RemoveDynObject ( uint32  spellId)
6198{
6199 if (m_dynObj.empty())
6200 return false;
6201
6202 bool result = false;
6203 for (DynObjectList::iterator i = m_dynObj.begin(); i != m_dynObj.end();)
6204 {
6205 DynamicObject* dynObj = *i;
6206 if (dynObj->GetSpellId() == spellId)
6207 {
6208 dynObj->Remove();
6209 i = m_dynObj.begin();
6210 result = true;
6211 }
6212 else
6213 ++i;
6214 }
6215
6216 return result;
6217}
void Remove()
Definition DynamicObject.cpp:185

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 ( )
5471{
5472 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5473 {
5474 Aura const* aura = iter->second->GetBase();
5475 SpellInfo const* spellInfo = aura->GetSpellInfo();
5477 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5478 ++iter;
5479 else
5481 }
5482
5483 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5484 {
5485 Aura* aura = iter->second;
5486 SpellInfo const* spellInfo = aura->GetSpellInfo();
5488 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5489 ++iter;
5490 else
5492 }
5493}
@ SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT
Definition SharedDefines.h:444
@ SPELL_ATTR0_CU_IGNORE_EVADE
Definition SpellInfo.h:187

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, GetOwnerGUID(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), Aura::IsPassive(), ObjectGuid::IsPlayer(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, 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
1815{ /* nothing to do yet */ }

Referenced by FollowerReference::targetObjectDestroyLink().

◆ RemoveFromWorld()

void Unit::RemoveFromWorld ( )
overridevirtual

Reimplemented from Object.

15734{
15735 // cleanup
15736 ASSERT(GetGUID());
15737
15738 if (IsInWorld())
15739 {
15741 if (IsVehicle())
15743
15747
15750
15751 ExitVehicle(); // Remove applied auras with SPELL_AURA_CONTROL_VEHICLE
15754
15756
15757 if (GetCharmerGUID())
15758 {
15759 LOG_FATAL("entities.unit", "Unit {} has charmer guid when removed from world", GetEntry());
15760 ABORT();
15761 }
15762
15763 if (Unit* owner = GetOwner())
15764 {
15765 if (owner->m_Controlled.find(this) != owner->m_Controlled.end())
15766 {
15768 owner->SetMinion((Minion*)this, false);
15769 LOG_INFO("entities.unit", "Unit {} is in controlled list of {} when removed from world", GetEntry(), owner->GetEntry());
15770 //ABORT();
15771 }
15772 }
15773
15776 }
15777}
void RemoveNotOwnSingleTargetAuras()
Definition Unit.cpp:5178
void UnsummonAllTotems(bool onDeath=false)
Definition Unit.cpp:11249
void RemoveAllDynObjects()
Definition Unit.cpp:6219
void RemoveAreaAurasDueToLeaveWorld()
Definition Unit.cpp:5319
void RemoveBindSightAuras()
Definition Unit.cpp:11236
void RemoveAllControlled(bool onDeath=false)
Definition Unit.cpp:11130
void RemoveFromWorld() override
Definition Object.cpp:1193

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 
)
6254{
6255 if (!gameObj || gameObj->GetOwnerGUID() != GetGUID())
6256 return;
6257
6259
6260 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
6261 {
6262 if (m_ObjectSlot[i] == gameObj->GetGUID())
6263 {
6264 m_ObjectSlot[i].Clear();
6265 break;
6266 }
6267 }
6268
6269 // GO created by some spell
6270 if (uint32 spellid = gameObj->GetSpellId())
6271 {
6272 RemoveAurasDueToSpell(spellid);
6273
6274 if (IsPlayer())
6275 {
6276 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(spellid);
6277 // Need activate spell use for owner
6278 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6279 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6280 ToPlayer()->SendCooldownEvent(createBySpell);
6281 }
6282 }
6283
6284 m_gameObj.remove(gameObj->GetGUID());
6285
6286 if (del)
6287 {
6288 gameObj->SetRespawnTime(0);
6289 gameObj->Delete();
6290 }
6291}
void Clear()
Definition ObjectGuid.h:138
void SendCooldownEvent(SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
Definition Player.cpp:11085

References ObjectGuid::Clear(), GameObject::Delete(), ObjectGuid::Empty, Object::GetGUID(), Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), SpellInfo::IsCooldownStartedOnEvent(), Object::IsPlayer(), m_gameObj, m_ObjectSlot, MAX_GAMEOBJECT_SLOT, RemoveAurasDueToSpell(), Player::SendCooldownEvent(), GameObject::SetOwnerGUID(), GameObject::SetRespawnTime(), sSpellMgr, and Object::ToPlayer().

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(), 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 
)
6294{
6295 if (m_gameObj.empty())
6296 return;
6297
6298 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
6299 {
6300 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6301 {
6302 if (spellid > 0 && go->GetSpellId() != spellid)
6303 {
6304 ++itr;
6305 continue;
6306 }
6307
6308 go->SetOwnerGUID(ObjectGuid::Empty);
6309 if (del)
6310 {
6311 go->SetRespawnTime(0);
6312 go->Delete();
6313 }
6314 }
6315 m_gameObj.erase(itr++);
6316 }
6317}

References ObjectGuid::Empty, ObjectAccessor::GetGameObject(), and m_gameObj.

◆ removeHatedBy()

void Unit::removeHatedBy ( HostileReference )
inline
915{ /* nothing to do yet */ }

Referenced by HostileReference::targetObjectDestroyLink().

◆ RemoveMovementImpairingAuras()

void Unit::RemoveMovementImpairingAuras ( bool  withRoot)
5268{
5269 if (withRoot)
5271
5272 // Snares
5273 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5274 {
5275 Aura const* aura = iter->second->GetBase();
5277 {
5278 RemoveAura(iter);
5279 continue;
5280 }
5281
5282 ++iter;
5283 }
5284}
bool HasEffectMechanic(Mechanics mechanic) const
Definition SpellInfo.cpp:884

References Aura::GetSpellInfo(), SpellInfo::HasEffectMechanic(), m_appliedAuras, 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 ( )
5179{
5180 // single target auras from other casters
5181 // Iterate m_ownedAuras - aura is marked as single target in Unit::AddAura (and pushed to m_ownedAuras).
5182 // m_appliedAuras will NOT contain the aura before first Unit::Update after adding it to m_ownedAuras.
5183 // Quickly removing such an aura will lead to it not being unregistered from caster's single cast auras container
5184 // leading to assertion failures if the aura was cast on a player that can
5185 // (and is changing map at the point where this function is called).
5186 // Such situation occurs when player is logging in inside an instance and fails the entry check for any reason.
5187 // The aura that was loaded from db (indirectly, via linked casts) gets removed before it has a chance
5188 // to register in m_appliedAuras
5189 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5190 {
5191 Aura const* aura = iter->second;
5192
5193 if (aura->GetCasterGUID() != GetGUID() && aura->IsSingleTarget())
5194 RemoveOwnedAura(iter);
5195 else
5196 ++iter;
5197 }
5198
5199 // single target auras at other targets
5200 AuraList& scAuras = GetSingleCastAuras();
5201 for (AuraList::iterator iter = scAuras.begin(); iter != scAuras.end();)
5202 {
5203 Aura* aura = *iter;
5204 if (aura->GetUnitOwner() != this)
5205 {
5206 aura->Remove();
5207 iter = scAuras.begin();
5208 }
5209 else
5210 ++iter;
5211 }
5212}

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
736{ 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(), npc_akama_illidan::DoAction(), spell_q12096_q12092_dummy::HandleDummy(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), 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_akama_illidan::JustReachedHome(), 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(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_announcer_toc10::OnGossipHello(), npc_hyjal_jaina::OnGossipSelect(), npc_hyjal_thrall::OnGossipSelect(), boss_doomrel::OnGossipSelect(), boss_majordomo::OnGossipSelect(), npc_zulaman_hostage::OnGossipSelect(), npc_arthas::OnGossipSelect(), npc_ulduar_keeper::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_illidan::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_magister_aledis::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), 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::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_general_andorov::sGossipSelect(), npc_akama_shade::sGossipSelect(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_chesspiece::SpellHitTarget(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_deathstalker_fearleia::sQuestAccept(), 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(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), and Vehicle::Vehicle().

◆ RemoveOwnedAura() [1/3]

void Unit::RemoveOwnedAura ( Aura aura,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4772{
4773 if (aura->IsRemoved())
4774 return;
4775
4776 ASSERT(aura->GetOwner() == this);
4777
4778 uint32 spellId = aura->GetId();
4779 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4780
4781 for (AuraMap::iterator itr = range.first; itr != range.second; ++itr)
4782 {
4783 if (itr->second == aura)
4784 {
4785 RemoveOwnedAura(itr, removeMode);
4786 return;
4787 }
4788 }
4789
4790 ABORT();
4791}

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 
)
4739{
4740 Aura* aura = i->second;
4741 ASSERT(!aura->IsRemoved());
4742
4743 // if unit currently update aura list then make safe update iterator shift to next
4746
4747 m_ownedAuras.erase(i);
4748 m_removedAuras.push_back(aura);
4749
4750 // Unregister single target aura
4751 if (aura->IsSingleTarget())
4752 aura->UnregisterSingleTarget();
4753
4754 aura->_Remove(removeMode);
4755
4756 i = m_ownedAuras.begin();
4757}
void _Remove(AuraRemoveMode removeMode)
Definition SpellAuras.cpp:574

References Aura::_Remove(), ASSERT, Aura::IsRemoved(), Aura::IsSingleTarget(), m_auraUpdateIterator, m_ownedAuras, m_removedAuras, and Aura::UnregisterSingleTarget().

Referenced by Player::_removeTalentAurasAndSpells(), _UpdateSpells(), Player::ActivateSpec(), Spell::EffectApplyGlyph(), WorldSession::HandleCancelAuraOpcode(), WorldSession::HandlePetCancelAuraOpcode(), WorldSession::HandleRemoveGlyph(), AuraEffect::HandleShapeshiftBoosts(), boss_zuljin::JustEngagedWith(), spell_gen_animal_blood::OnApply(), spell_contagion_of_rot::OnApply(), UnitAura::Remove(), RemoveAllAuras(), RemoveAllAurasExceptType(), RemoveAllAurasOnDeath(), RemoveAllAurasRequiringDeadTarget(), RemoveAurasDueToItemSpell(), RemoveEvadeAuras(), Player::RemoveItemDependentAurasAndCasts(), RemoveNotOwnSingleTargetAuras(), RemoveOwnedAura(), RemoveOwnedAura(), RemoveOwnedAuras(), RemoveOwnedAuras(), Player::removeSpell(), boss_falric::boss_falricAI::UpdateAI(), and Player::UpdateAreaDependentAuras().

◆ RemoveOwnedAura() [3/3]

void Unit::RemoveOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4760{
4761 for (AuraMap::iterator itr = m_ownedAuras.lower_bound(spellId); itr != m_ownedAuras.upper_bound(spellId);)
4762 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask) && (!casterGUID || itr->second->GetCasterGUID() == casterGUID))
4763 {
4764 RemoveOwnedAura(itr, removeMode);
4765 itr = m_ownedAuras.lower_bound(spellId);
4766 }
4767 else
4768 ++itr;
4769}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [1/2]

void Unit::RemoveOwnedAuras ( std::function< bool(Aura const *)> const &  check)
4891{
4892 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
4893 {
4894 if (check(iter->second))
4895 {
4896 RemoveOwnedAura(iter);
4897 continue;
4898 }
4899 ++iter;
4900 }
4901}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [2/2]

void Unit::RemoveOwnedAuras ( uint32  spellId,
std::function< bool(Aura const *)> const &  check 
)
4917{
4918 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
4919 {
4920 if (check(iter->second))
4921 {
4922 RemoveOwnedAura(iter);
4923 continue;
4924 }
4925 ++iter;
4926 }
4927}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemovePetAura()

void Unit::RemovePetAura ( PetAura const *  petSpell)
17343{
17344 if (!IsPlayer())
17345 return;
17346
17347 m_petAuras.erase(petSpell);
17348 if (Pet* pet = ToPlayer()->GetPet())
17349 pet->RemoveAurasDueToSpell(petSpell->GetAura(pet->GetEntry()));
17350 if (Unit* charm = GetCharm())
17351 charm->RemoveAurasDueToSpell(petSpell->GetAura(charm->GetEntry()));
17352}

References PetAura::GetAura(), GetCharm(), Object::IsPlayer(), m_petAuras, and Object::ToPlayer().

Referenced by Player::_removeTalentAurasAndSpells(), Pet::CastPetAuras(), AuraEffect::HandleAuraDummy(), and Player::removeSpell().

◆ RemovePlayerFromVision()

void Unit::RemovePlayerFromVision ( Player player)
11226{
11227 m_sharedVision.remove(player);
11228 player->m_isInSharedVisionOf.erase(this);
11229 if (m_sharedVision.empty())
11230 {
11231 setActive(false);
11232 SetWorldObject(false);
11233 }
11234}

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 UnitDefines.h:25
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

UnitFlags available in UnitDefines.h.

720{ RemoveFlag(UNIT_FIELD_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_FIELD_FLAGS.

Referenced by spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), Player::BuildPlayerRepop(), boss_thekal::CheckPhaseTransition(), Player::CleanupAfterTaxiFlight(), ClearInCombat(), ClearInPetCombat(), boss_alar::DamageTaken(), 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(), npc_frozen_core::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_illidan_stormrage::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(), ConfusedMovementGenerator< T >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), WorldSession::DoLootRelease(), Spell::EffectResurrectPet(), Spell::EffectSkinning(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), 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::FeignDeath(), TimedFleeingMovementGenerator::Finalize(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::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_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), WorldSession::HandlePlayerLoginToCharInWorld(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_kiljaeden::InitializeAI(), boss_jarien::IsSummonedBy(), boss_sothos::IsSummonedBy(), boss_apothecary_hummel::boss_apothecary_hummelAI::JustDied(), boss_volazj::JustDied(), boss_ichoron::boss_ichoronAI::JustDied(), boss_taerar::boss_taerarAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_ymiron::boss_ymironAI::JustEngagedWith(), boss_hazzarah::JustSummoned(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), boss_shade_of_akama::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_amanitar_mushrooms::npc_amanitar_mushrooms(), 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_aura::OnRemove(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), RemoveCharmedBy(), Vehicle::RemovePassenger(), boss_keristrasza::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(), boss_kalecgos::Reset(), boss_kiljaeden::Reset(), boss_muru::Reset(), npc_harrison_jones::Reset(), npc_amanishi_lookout::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::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::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::Reset(), advisor_baseAI::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(), 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(), advisor_baseAI::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(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_arlokk::boss_arlokkAI::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::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_mimiron::boss_mimironAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::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_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 ( )
18761{
18762 if (!m_vehicleKit)
18763 return;
18764
18766 delete m_vehicleKit;
18767
18768 m_vehicleKit = nullptr;
18769
18770 m_updateFlag &= ~UPDATEFLAG_VEHICLE;
18771 m_unitTypeMask &= ~UNIT_MASK_VEHICLE;
18773}
@ UNIT_NPC_FLAG_SPELLCLICK
Definition UnitDefines.h:339
@ UNIT_NPC_FLAG_PLAYER_VEHICLE
Definition UnitDefines.h:340
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:736

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, RemoveNpcFlag(), Vehicle::Uninstall(), UNIT_NPC_FLAG_PLAYER_VEHICLE, and UNIT_NPC_FLAG_SPELLCLICK.

Referenced by Dismount(), AuraEffect::HandleAuraSetVehicle(), npc_gunship::npc_gunshipAI::JustDied(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), spell_blood_queen_frenzied_bloodthirst_aura::OnRemove(), and RemoveFromWorld().

◆ RemoveVisibleAura()

void Unit::RemoveVisibleAura ( uint8  slot)
inline
1481{ m_visibleAuras.erase(slot); UpdateAuraForGroup(slot);}
void UpdateAuraForGroup(uint8 slot)
Definition Unit.cpp:17202

References m_visibleAuras, and UpdateAuraForGroup().

Referenced by AuraApplication::_Remove().

◆ ReplaceAllDynamicFlags()

◆ ReplaceAllNpcFlags()

void Unit::ReplaceAllNpcFlags ( NPCFlags  flags)
inline

References 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::JustSummoned(), Pet::LoadPetFromDB(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_shandy_dalaran::OnGossipSelect(), go_crystalline_tear::OnQuestAccept(), boss_yoggsaron_descend_portal::boss_yoggsaron_descend_portalAI::OnSpellClick(), 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::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(), GameEventMgr::UpdateEventNPCFlags(), and npc_captain_saeed::npc_captain_saeedAI::WaypointReached().

◆ ReplaceAllUnitFlags()

◆ ReplaceAllUnitFlags2()

void Unit::ReplaceAllUnitFlags2 ( UnitFlags2  flags)
inline

◆ resetAttackTimer()

◆ ResetRedirectThreat()

◆ RespondsToCallForHelp()

bool Unit::RespondsToCallForHelp ( ) const
inline
990 {
992 return entry->FactionRespondsToCallForHelp();
993
994 return false;
995 }

References GetFactionTemplateEntry().

Referenced by Creature::CanAssistTo().

◆ RestoreDisplayId()

void Unit::RestoreDisplayId ( )
16809{
16810 AuraEffect* handledAura = nullptr;
16811 AuraEffect* handledAuraForced = nullptr;
16812 // try to receive model from transform auras
16814 if (!transforms.empty())
16815 {
16816 // iterate over already applied transform auras - from newest to oldest
16817 for (auto i = transforms.rbegin(); i != transforms.rend(); ++i)
16818 {
16819 if (AuraApplication const* aurApp = (*i)->GetBase()->GetApplicationOfTarget(GetGUID()))
16820 {
16821 if (!handledAura)
16822 handledAura = (*i);
16823 // xinef: prefer negative/forced auras
16824 if ((*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) || !aurApp->IsPositive())
16825 {
16826 handledAuraForced = (*i);
16827 break;
16828 }
16829 }
16830 }
16831 }
16832
16833 // Xinef: include clone auras (eg mirror images)
16834 if (!handledAuraForced && !handledAura)
16835 {
16837 if (!cloneAuras.empty())
16838 for (Unit::AuraEffectList::const_iterator i = cloneAuras.begin(); i != cloneAuras.end(); ++i)
16839 handledAura = *i;
16840 }
16841
16843
16844 // xinef: order of execution is important!
16845 // first forced transform auras, then shapeshifts, then normal transform
16846 // transform aura was found
16847 if (handledAuraForced)
16848 {
16849 handledAuraForced->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
16850 return;
16851 }
16852 else if (!shapeshiftAura.empty()) // we've found shapeshift
16853 {
16854 // only one such aura possible at a time
16855 if (uint32 modelId = GetModelForForm(GetShapeshiftForm(), shapeshiftAura.front()->GetId()))
16856 {
16857 SetDisplayId(modelId);
16858 return;
16859 }
16860 }
16861 else if (handledAura)
16862 {
16863 handledAura->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
16864 return;
16865 }
16866
16867 // no auras found - set modelid to default
16869}
@ AURA_EFFECT_HANDLE_SEND_FOR_CLIENT
Definition SpellAuraDefines.h:43
void HandleEffect(AuraApplication *aurApp, uint8 mode, bool apply)
Definition SpellAuraEffects.cpp:748
uint32 GetModelForForm(ShapeshiftForm form, uint32 spellId) const
Definition Unit.cpp:19233

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 ( )
18729{
18730 if (IsPlayer())
18732 else
18733 {
18735 {
18736 if (Unit* owner = GetOwner())
18737 {
18738 SetFaction(owner->GetFaction());
18739 return;
18740 }
18741 }
18742
18743 if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate()) // normal creature
18744 SetFaction(cinfo->faction);
18745 }
18746}
void SetFactionForRace(uint8 race)
Definition Player.cpp:5870

References GetOwner(), getRace(), HasUnitTypeMask(), Object::IsPlayer(), SetFaction(), Player::SetFactionForRace(), Object::ToCreature(), Object::ToPlayer(), 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(), 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(), 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 
)
16714{
16715 if (slot >= MAX_MOTION_SLOT)
16716 return;
16717
16718 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16719 movementGenerator->Resume(timer);
16720}

References GetMotionMaster(), and MAX_MOTION_SLOT.

Referenced by boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight().

◆ RewardRage()

void Unit::RewardRage ( uint32  damage,
uint32  weaponSpeedHitFactor,
bool  attacker 
)
20170{
20171 // Rage formulae https://wowwiki-archive.fandom.com/wiki/Rage#Formulae
20172 float addRage;
20173
20174 float rageconversion = ((0.0091107836f * GetLevel() * GetLevel()) + 3.225598133f * GetLevel()) + 4.2652911f;
20175
20176 // Unknown if correct, but lineary adjust rage conversion above level 70
20177 if (GetLevel() > 70)
20178 rageconversion += 13.27f * (GetLevel() - 70);
20179
20180 if (attacker)
20181 {
20182 // see Bornak's bluepost explanation (05/29/2009)
20183 float rageFromDamageDealt = damage / rageconversion * 7.5f;
20184 addRage = (rageFromDamageDealt + weaponSpeedHitFactor) / 2.0f;
20185 addRage = std::min(addRage, rageFromDamageDealt * 2.0f);
20187 }
20188 else
20189 {
20190 addRage = damage / rageconversion * 2.5f;
20191
20192 // Berserker Rage effect
20193 if (HasAura(18499))
20194 addRage *= 3.0f;
20195 }
20196
20197 addRage *= sWorld->getRate(RATE_POWER_RAGE_INCOME);
20198
20199 ModifyPower(POWER_RAGE, uint32(addRage * 10));
20200}
@ RATE_POWER_RAGE_INCOME
Definition IWorld.h:437
@ SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT
Definition SpellAuraDefines.h:276

References AddPct(), GetLevel(), GetTotalAuraModifier(), HasAura(), ModifyPower(), POWER_RAGE, RATE_POWER_RAGE_INCOME, SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT, and sWorld.

Referenced by DealDamage(), and DealMeleeDamage().

◆ RollMeleeOutcomeAgainst() [1/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType 
) const
2798{
2799 // This is only wrapper
2800
2801 // Miss chance based on melee
2802 //float miss_chance = MeleeMissChanceCalc(victim, attType);
2803 float miss_chance = MeleeSpellMissChance(victim, attType, int32(GetWeaponSkillValue(attType, victim)) - int32(victim->GetMaxSkillValueForLevel(this)), 0);
2804
2805 // Critical hit chance
2806 float crit_chance = GetUnitCriticalChance(attType, victim);
2807 if (crit_chance < 0)
2808 crit_chance = 0;
2809
2810 float dodge_chance = victim->GetUnitDodgeChance();
2811 float block_chance = victim->GetUnitBlockChance();
2812 float parry_chance = victim->GetUnitParryChance();
2813
2814 // Useful if want to specify crit & miss chances for melee, else it could be removed
2815 //LOG_DEBUG("entities.unit", "MELEE OUTCOME: miss {} crit {} dodge {} parry {} block {}", miss_chance, crit_chance, dodge_chance, parry_chance, block_chance);
2816
2817 return RollMeleeOutcomeAgainst(victim, attType, int32(crit_chance * 100), int32(miss_chance * 100), int32(dodge_chance * 100), int32(parry_chance * 100), int32(block_chance * 100));
2818}
float GetUnitCriticalChance(WeaponAttackType attackType, Unit const *victim) const
Definition Unit.cpp:3742

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
2821{
2822 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks())
2823 {
2824 return MELEE_HIT_EVADE;
2825 }
2826
2827 int32 attackerMaxSkillValueForLevel = GetMaxSkillValueForLevel(victim);
2828 int32 victimMaxSkillValueForLevel = victim->GetMaxSkillValueForLevel(this);
2829
2830 int32 attackerWeaponSkill = GetWeaponSkillValue(attType, victim);
2831 int32 victimDefenseSkill = victim->GetDefenseSkillValue(this);
2832
2833 sScriptMgr->OnBeforeRollMeleeOutcomeAgainst(this, victim, attType, attackerMaxSkillValueForLevel, victimMaxSkillValueForLevel, attackerWeaponSkill, victimDefenseSkill, crit_chance, miss_chance, dodge_chance, parry_chance, block_chance);
2834
2835 // bonus from skills is 0.04%
2836 int32 skillBonus = 4 * (attackerWeaponSkill - victimMaxSkillValueForLevel);
2837 int32 sum = 0, tmp = 0;
2838 int32 roll = urand (0, 10000);
2839
2840 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: skill bonus of {} for attacker", skillBonus);
2841 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: rolled {}, miss {}, dodge {}, parry {}, block {}, crit {}",
2842 // roll, miss_chance, dodge_chance, parry_chance, block_chance, crit_chance);
2843
2844 tmp = miss_chance;
2845
2846 if (tmp > 0 && roll < (sum += tmp))
2847 {
2848 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: MISS");
2849 return MELEE_HIT_MISS;
2850 }
2851
2852 // Dodge chance
2853
2854 // only players can't dodge if attacker is behind
2855 if (victim->IsPlayer() && !victim->HasInArc(M_PI, this) && !victim->HasIgnoreHitDirectionAura())
2856 {
2857 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind and victim was a player.");
2858 }
2859 // Xinef: do not allow to dodge with CREATURE_FLAG_EXTRA_NO_DODGE flag
2860 else if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_DODGE)))
2861 {
2862 // Reduce dodge chance by attacker expertise rating
2863 if (IsPlayer())
2864 dodge_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2865 else
2866 dodge_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2867
2868 // Modify dodge chance by attacker SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
2870 dodge_chance = int32 (float (dodge_chance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
2871
2872 tmp = dodge_chance;
2873
2874 // xinef: if casting or stunned - cant dodge
2875 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2876 tmp = 0;
2877
2878 if ((tmp > 0) // check if unit _can_ dodge
2879 && ((tmp -= skillBonus) > 0)
2880 && roll < (sum += tmp))
2881 {
2882 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: DODGE <{}, {})", sum - tmp, sum);
2883 return MELEE_HIT_DODGE;
2884 }
2885 }
2886
2887 // parry & block chances
2888
2889 // check if attack comes from behind, nobody can parry or block if attacker is behind
2890 if (!victim->HasInArc(M_PI, this) && !victim->HasIgnoreHitDirectionAura())
2891 {
2892 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind.");
2893 }
2894 else
2895 {
2896 // Reduce parry chance by attacker expertise rating
2897 if (IsPlayer())
2898 parry_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2899 else
2900 parry_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2901
2902 if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_PARRY)))
2903 {
2904 tmp = parry_chance;
2905
2906 // xinef: cant parry while casting or while stunned
2907 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2908 tmp = 0;
2909
2910 if (tmp > 0 // check if unit _can_ parry
2911 && (tmp -= skillBonus) > 0
2912 && roll < (sum += tmp))
2913 {
2914 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: PARRY <{}, {})", sum - tmp, sum);
2915 return MELEE_HIT_PARRY;
2916 }
2917 }
2918
2919 if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_BLOCK)))
2920 {
2921 tmp = block_chance;
2922
2923 // xinef: cant block while casting or while stunned
2924 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2925 tmp = 0;
2926
2927 if (tmp > 0 // check if unit _can_ block
2928 && (tmp -= skillBonus) > 0
2929 && roll < (sum += tmp))
2930 {
2931 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: BLOCK <{}, {})", sum - tmp, sum);
2932 return MELEE_HIT_BLOCK;
2933 }
2934 }
2935 }
2936
2937 // 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)
2938 if (attType != RANGED_ATTACK &&
2939 (IsPlayer() || IsPet()) &&
2940 !victim->IsPlayer() && !victim->IsPet() &&
2941 GetLevel() < victim->getLevelForTarget(this))
2942 {
2943 // cap possible value (with bonuses > max skill)
2944 int32 skill = attackerWeaponSkill;
2945 int32 maxskill = attackerMaxSkillValueForLevel;
2946 skill = (skill > maxskill) ? maxskill : skill;
2947
2948 tmp = (10 + (victimDefenseSkill - skill)) * 100;
2949 tmp = tmp > 4000 ? 4000 : tmp;
2950 if (roll < (sum += tmp))
2951 {
2952 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: GLANCING <{}, {})", sum - 4000, sum);
2953 return MELEE_HIT_GLANCING;
2954 }
2955 }
2956
2957 // mobs can score crushing blows if they're 4 or more levels above victim
2958 if (getLevelForTarget(victim) >= victim->getLevelForTarget(this) + 4 &&
2959 // can be from by creature (if can) or from controlled player that considered as creature
2962 {
2963 // when their weapon skill is 15 or more above victim's defense skill
2964 tmp = victimDefenseSkill;
2965 int32 tmpmax = victimMaxSkillValueForLevel;
2966 // having defense above your maximum (from items, talents etc.) has no effect
2967 tmp = tmp > tmpmax ? tmpmax : tmp;
2968 // tmp = mob's level * 5 - player's current defense skill
2969 tmp = attackerMaxSkillValueForLevel - tmp;
2970 if (tmp >= 15)
2971 {
2972 // add 2% chance per lacking skill point, min. is 15%
2973 tmp = tmp * 200 - 1500;
2974 if (roll < (sum += tmp))
2975 {
2976 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRUSHING <{}, {})", sum - tmp, sum);
2977 return MELEE_HIT_CRUSHING;
2978 }
2979 }
2980 }
2981
2982 // Critical chance
2983 tmp = crit_chance;
2984
2985 if (tmp > 0 && roll < (sum += tmp))
2986 {
2987 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT <{}, {})", sum - tmp, sum);
2988 if (IsCreature() && (ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_CRIT)))
2989 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT DISABLED)");
2990 else
2991 return MELEE_HIT_CRIT;
2992 }
2993
2994 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: NORMAL");
2995 return MELEE_HIT_NORMAL;
2996}
@ CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS
Definition CreatureData.h:50
@ CREATURE_FLAG_EXTRA_NO_CRIT
Definition CreatureData.h:62

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, GetDefenseSkillValue(), GetLevel(), getLevelForTarget(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetWeaponSkillValue(), Creature::HasFlagsExtra(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsNonMeleeSpellCast(), IsPet(), Object::IsPlayer(), 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_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), 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.

21229{
21230 Talk(textId, CHAT_MSG_MONSTER_SAY, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target);
21231}

References CHAT_MSG_MONSTER_SAY, CONFIG_LISTEN_RANGE_SAY, and sWorld.

◆ SelectNearbyNoTotemTarget()

Unit * Unit::SelectNearbyNoTotemTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
17053{
17054 std::list<Unit*> targets;
17055 Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck u_check(this, this, dist);
17057 Cell::VisitAllObjects(this, searcher, dist);
17058
17059 // remove current target
17060 if (GetVictim())
17061 targets.remove(GetVictim());
17062
17063 if (exclude)
17064 targets.remove(exclude);
17065
17066 // remove not LoS targets
17067 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
17068 {
17069 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
17070 {
17071 std::list<Unit*>::iterator tIter2 = tIter;
17072 ++tIter;
17073 targets.erase(tIter2);
17074 }
17075 else
17076 ++tIter;
17077 }
17078
17079 // no appropriate targets
17080 if (targets.empty())
17081 return nullptr;
17082
17083 // select random
17085}
bool IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell=nullptr) const
Definition Unit.cpp:13922
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition Containers.h:133
Definition GridNotifiers.h:423

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
17018{
17019 std::list<Unit*> targets;
17020 Acore::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, this, dist);
17022 Cell::VisitAllObjects(this, searcher, dist);
17023
17024 // remove current target
17025 if (GetVictim())
17026 targets.remove(GetVictim());
17027
17028 if (exclude)
17029 targets.remove(exclude);
17030
17031 // remove not LoS targets
17032 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
17033 {
17034 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
17035 {
17036 std::list<Unit*>::iterator tIter2 = tIter;
17037 ++tIter;
17038 targets.erase(tIter2);
17039 }
17040 else
17041 ++tIter;
17042 }
17043
17044 // no appropriate targets
17045 if (targets.empty())
17046 return nullptr;
17047
17048 // select random
17050}
Definition GridNotifiers.h:861

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitAllObjects().

Referenced by boss_yazzai::JustEngagedWith(), 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

6536{
6537 LOG_DEBUG("entities.unit", "WORLD: Sending SMSG_ATTACKERSTATEUPDATE");
6538
6539 uint32 tmpDamage[MAX_ITEM_PROTO_DAMAGES] = { };
6540 uint32 tmpAbsorb[MAX_ITEM_PROTO_DAMAGES] = { };
6541 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6542 {
6543 //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
6544 tmpDamage[i] = damageInfo->damages[i].damage;
6545 tmpAbsorb[i] = damageInfo->damages[i].absorb;
6546 if (damageInfo->target->IsPlayer() && damageInfo->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6547 {
6548 tmpAbsorb[i] = tmpDamage[i];
6549 tmpDamage[i] = 0;
6550 }
6551 }
6552
6553 uint32 count = 1;
6554 if (tmpDamage[1] || tmpAbsorb[1] || damageInfo->damages[1].resist)
6555 {
6556 ++count;
6557 }
6558
6559 std::size_t const maxsize = 4 + 5 + 5 + 4 + 4 + 1 + count * (4 + 4 + 4 + 4 + 4) + 1 + 4 + 4 + 4 + 4 + 4 * 12;
6560 WorldPacket data(SMSG_ATTACKERSTATEUPDATE, maxsize); // we guess size
6561 data << uint32(damageInfo->HitInfo);
6562 data << damageInfo->attacker->GetPackGUID();
6563 data << damageInfo->target->GetPackGUID();
6564 data << uint32(tmpDamage[0] + tmpDamage[1]); // Full damage
6565 int32 overkill = tmpDamage[0] + tmpDamage[1] - damageInfo->target->GetHealth();
6566 data << uint32(overkill < 0 ? 0 : overkill); // Overkill
6567 data << uint8(count); // Sub damage count
6568
6569 for (uint32 i = 0; i < count; ++i)
6570 {
6571 data << uint32(damageInfo->damages[i].damageSchoolMask); // School of sub damage
6572 data << float(tmpDamage[i]); // sub damage
6573 data << uint32(tmpDamage[i]); // Sub Damage
6574 }
6575
6577 {
6578 for (uint32 i = 0; i < count; ++i)
6579 {
6580 data << uint32(tmpAbsorb[i]); // Absorb
6581 }
6582 }
6583
6585 {
6586 for (uint32 i = 0; i < count; ++i)
6587 {
6588 data << uint32(damageInfo->damages[i].resist); // Resist
6589 }
6590 }
6591
6592 data << uint8(damageInfo->TargetState);
6593 data << uint32(0); // Unknown attackerstate
6594 data << uint32(0); // Melee spellid
6595
6596 if (damageInfo->HitInfo & HITINFO_BLOCK)
6597 data << uint32(damageInfo->blocked_amount);
6598
6599 if (damageInfo->HitInfo & HITINFO_RAGE_GAIN)
6600 data << uint32(0);
6601
6603 if (damageInfo->HitInfo & HITINFO_UNK1)
6604 {
6605 data << uint32(0);
6606 data << float(0);
6607 data << float(0);
6608 data << float(0);
6609 data << float(0);
6610 data << float(0);
6611 data << float(0);
6612 data << float(0);
6613 data << float(0);
6614 data << float(0); // Found in a loop with 1 iteration
6615 data << float(0); // ditto ^
6616 data << uint32(0);
6617 }
6618
6619 SendMessageToSet(&data, true);
6620}
@ HITINFO_RAGE_GAIN
Definition Unit.h:120
@ HITINFO_UNK1
Definition Unit.h:97
@ 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(), CalcDamageInfo::HitInfo, HITINFO_BLOCK, HITINFO_FULL_ABSORB, HITINFO_FULL_RESIST, HITINFO_PARTIAL_ABSORB, HITINFO_PARTIAL_RESIST, HITINFO_RAGE_GAIN, HITINFO_UNK1, Object::IsPlayer(), LOG_DEBUG, MAX_ITEM_PROTO_DAMAGES, CalcDamageInfo::resist, WorldObject::SendMessageToSet(), SMSG_ATTACKERSTATEUPDATE, CalcDamageInfo::target, CalcDamageInfo::TargetState, and Object::ToPlayer().

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 
)
6623{
6624 CalcDamageInfo dmgInfo;
6625 dmgInfo.HitInfo = HitInfo;
6626 dmgInfo.attacker = this;
6627 dmgInfo.target = target;
6628
6629 dmgInfo.damages[0].damage = Damage - AbsorbDamage - Resist - BlockedAmount;
6630 dmgInfo.damages[0].damageSchoolMask = damageSchoolMask;
6631 dmgInfo.damages[0].absorb = AbsorbDamage;
6632 dmgInfo.damages[0].resist = Resist;
6633
6634 dmgInfo.damages[1].damage = 0;
6635 dmgInfo.damages[1].damageSchoolMask = 0;
6636 dmgInfo.damages[1].absorb = 0;
6637 dmgInfo.damages[1].resist = 0;
6638
6639 dmgInfo.TargetState = TargetState;
6640 dmgInfo.blocked_amount = BlockedAmount;
6641 SendAttackStateUpdate(&dmgInfo);
6642}
HitInfo
Definition Unit.h:95

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)
20132{
20133 if (!GetThreatMgr().isThreatListEmpty())
20134 {
20135 uint32 count = GetThreatMgr().GetThreatList().size();
20136
20137 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_HIGHEST_THREAT_UPDATE Message");
20138 WorldPacket data(SMSG_HIGHEST_THREAT_UPDATE, 8 + 8 + count * 8);
20139 data << GetPackGUID();
20140 data << pHostileReference->getUnitGuid().WriteAsPacked();
20141 data << uint32(count);
20143 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
20144 {
20145 data << (*itr)->getUnitGuid().WriteAsPacked();
20146 data << uint32((*itr)->GetThreat() * 100);
20147 }
20148 SendMessageToSet(&data, false);
20149 }
20150}
PackedGuid WriteAsPacked() const
Definition ObjectGuid.h:316
std::list< HostileReference * > StorageType
Definition ThreatMgr.h:147
@ SMSG_HIGHEST_THREAT_UPDATE
Definition Opcodes.h:1184

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 ( )
20360{
20362 data << GetPackGUID();
20363 SendMessageToSet(&data, false);
20364}
@ 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 ( )
20153{
20154 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_CLEAR Message");
20156 data << GetPackGUID();
20157 SendMessageToSet(&data, false);
20158}
@ 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 ( )
16915{
16916 if (m_cleanupDone)
16917 {
16918 return;
16919 }
16920
16922 if (Player* playerMe = ToPlayer())
16923 {
16924 WorldPacket data(SMSG_UPDATE_COMBO_POINTS, packGUID.size() + 1);
16925 data << packGUID;
16926 data << uint8(m_comboPoints);
16927 playerMe->SendDirectMessage(&data);
16928 }
16929
16930 ObjectGuid ownerGuid = GetCharmerOrOwnerGUID();
16931 Player* owner = nullptr;
16932 if (ownerGuid.IsPlayer())
16933 {
16934 owner = ObjectAccessor::GetPlayer(*this, ownerGuid);
16935 }
16936
16937 if (m_movedByPlayer || owner)
16938 {
16939 WorldPacket data(SMSG_PET_UPDATE_COMBO_POINTS, GetPackGUID().size() + packGUID.size() + 1);
16940 data << GetPackGUID();
16941 data << packGUID;
16942 data << uint8(m_comboPoints);
16943
16944 if (m_movedByPlayer)
16946
16947 if (owner && owner != m_movedByPlayer)
16948 owner->SendDirectMessage(&data);
16949 }
16950}
Definition ObjectGuid.h:263
std::size_t size() const
Definition ObjectGuid.h:274
@ SMSG_PET_UPDATE_COMBO_POINTS
Definition Opcodes.h:1200
@ SMSG_UPDATE_COMBO_POINTS
Definition Opcodes.h:955

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 
)
11305{
11306 WorldPacket data(SMSG_SPELLENERGIZELOG, (8 + 8 + 4 + 4 + 4 + 1));
11307 data << victim->GetPackGUID();
11308 data << GetPackGUID();
11309 data << uint32(spellID);
11310 data << uint32(powerType);
11311 data << uint32(damage);
11312 SendMessageToSet(&data, true);
11313}
@ 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 
)
11272{
11273 uint32 overheal = healInfo.GetHeal() - healInfo.GetEffectiveHeal();
11274
11275 // we guess size
11276 WorldPacket data(SMSG_SPELLHEALLOG, (8 + 8 + 4 + 4 + 4 + 4 + 1 + 1));
11277 data << healInfo.GetTarget()->GetPackGUID();
11278 data << GetPackGUID();
11279 data << uint32(healInfo.GetSpellInfo()->Id);
11280 data << uint32(healInfo.GetHeal());
11281 data << uint32(overheal);
11282 data << uint32(healInfo.GetAbsorb()); // Absorb amount
11283 data << uint8(critical ? 1 : 0);
11284 data << uint8(0); // unused
11285 SendMessageToSet(&data, true);
11286}
@ 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 
)
3076{
3077 WorldPacket data(SMSG_ATTACKSTART, 8 + 8);
3078 data << GetGUID();
3079 data << victim->GetGUID();
3080 if (sendTo)
3081 sendTo->SendDirectMessage(&data);
3082 else
3083 SendMessageToSet(&data, true);
3084 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTART");
3085}
@ SMSG_ATTACKSTART
Definition Opcodes.h:353

References Object::GetGUID(), 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)

Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead.

3092{
3093 // pussywizard: calling SendMeleeAttackStop without clearing UNIT_STATE_MELEE_ATTACKING and then AttackStart the same player may spoil npc rotating!
3094 // pussywizard: this happens in some boss scripts, just add clearing here
3095 // ClearUnitState(UNIT_STATE_MELEE_ATTACKING); // commented out for now
3096
3097 WorldPacket data(SMSG_ATTACKSTOP, (8 + 8 + 4));
3098 data << GetPackGUID();
3099
3100 if (victim)
3101 {
3102 data << victim->GetPackGUID();
3103 data << (uint32)victim->isDead();
3104 }
3105 SendMessageToSet(&data, true);
3106 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTOP");
3107
3108 if (victim)
3109 LOG_DEBUG("entities.unit", "{} {} stopped attacking {} {}", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString(), (victim->IsPlayer() ? "player" : "creature"), victim->GetGUID().ToString());
3110 else
3111 LOG_DEBUG("entities.unit", "{} {} stopped attacking", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString());
3112}
bool isDead() const
Definition Unit.h:1716
@ SMSG_ATTACKSTOP
Definition Opcodes.h:354

References Object::GetGUID(), Object::GetGUID(), Object::GetPackGUID(), isDead(), Object::IsPlayer(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_ATTACKSTOP, and ObjectGuid::ToString().

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::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(), and boss_razorscale::boss_razorscaleAI::UpdateAI().

◆ SendMonsterMove()

void Unit::SendMonsterMove ( float  NewPosX,
float  NewPosY,
float  NewPosZ,
uint32  TransitTime,
SplineFlags  sf = SPLINEFLAG_WALK_MODE 
)
539{
540 WorldPacket data(SMSG_MONSTER_MOVE, 1 + 12 + 4 + 1 + 4 + 4 + 4 + 12 + GetPackGUID().size());
541 data << GetPackGUID();
542
543 data << uint8(0); // new in 3.1
544 data << GetPositionX() << GetPositionY() << GetPositionZ();
545 data << GameTime::GetGameTimeMS().count();
546 data << uint8(0);
547 data << uint32(sf);
548 data << TransitTime; // Time in between points
549 data << uint32(1); // 1 single waypoint
550 data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B
551
552 SendMessageToSet(&data, true);
553}
@ 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)
20700{
20701 if (!movespline->Initialized())
20702 return;
20704 data << GetPackGUID();
20705 sendTo->SendDirectMessage(&data);
20706}
@ 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)
16738{
16739 WorldPacket data;
16740 BuildHeartBeatMsg(&data);
16741 SendMessageToSet(&data, self);
16742}
void BuildHeartBeatMsg(WorldPacket *data) const
Definition Object.cpp:2084

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(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_madrigosa::DoAction(), boss_nightbane::EnterEvadeMode(), boss_kaelthas::ExecuteMiddleEvent(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), boss_felmyst::InitializeAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_harbinger_skyriss::JustSummoned(), MotionMaster::MoveFall(), npc_twilight_volunteer::MovementInform(), boss_felmyst::MovementInform(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), npc_dancing_flames::npc_dancing_flamesAI::Reset(), boss_felmyst::ScheduleGroundAbilities(), SetCharm(), SetHover(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_felmyst::StartIntro(), boss_nightbane::TriggerHealthTakeOff(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::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::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), Player::UpdateCharmedAI(), and brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI().

◆ SendMovementHover()

void Unit::SendMovementHover ( Player sendTo)
20737{
20738 if (!movespline->Initialized())
20739 return;
20741 data << GetPackGUID();
20742 sendTo->SendDirectMessage(&data);
20743}
@ 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)
20678{
20679 if (!movespline->Initialized())
20680 return;
20682 data << GetPackGUID();
20683 sendTo->SendDirectMessage(&data);
20684}
@ 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)
6446{
6447 AuraEffect const* aura = pInfo->auraEff;
6449 data << GetPackGUID();
6450 data << aura->GetCasterGUID().WriteAsPacked();
6451 data << uint32(aura->GetId()); // spellId
6452 data << uint32(1); // count
6453 data << uint32(aura->GetAuraType()); // auraId
6454 switch (aura->GetAuraType())
6455 {
6458 {
6459 //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
6460 uint32 damage = pInfo->damage;
6461 uint32 absorb = pInfo->absorb;
6462 if (IsPlayer() && ToPlayer()->GetCommandStatus(CHEAT_GOD))
6463 {
6464 absorb = damage;
6465 damage = 0;
6466 }
6467
6468 data << uint32(damage); // damage
6469 data << uint32(pInfo->overDamage); // overkill?
6470 data << uint32(aura->GetSpellInfo()->GetSchoolMask());
6471 data << uint32(absorb); // absorb
6472 data << uint32(pInfo->resist); // resist
6473 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6474 }
6475 break;
6478 data << uint32(pInfo->damage); // damage
6479 data << uint32(pInfo->overDamage); // overheal
6480 data << uint32(pInfo->absorb); // absorb
6481 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6482 break;
6485 data << uint32(aura->GetMiscValue()); // power type
6486 data << uint32(pInfo->damage); // damage
6487 break;
6489 data << uint32(aura->GetMiscValue()); // power type
6490 data << uint32(pInfo->damage); // amount
6491 data << float(pInfo->multiplier); // gain multiplier
6492 break;
6493 default:
6494 LOG_ERROR("entities.unit", "Unit::SendPeriodicAuraLog: unknown aura {}", uint32(aura->GetAuraType()));
6495 return;
6496 }
6497
6498 SendMessageToSet(&data, true);
6499}
@ 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:521
bool critical
Definition Unit.h:522
uint32 overDamage
Definition Unit.h:518
uint32 resist
Definition Unit.h:520
uint32 damage
Definition Unit.h:517
AuraEffect const * auraEff
Definition Unit.h:516
uint32 absorb
Definition Unit.h:519

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::IsPlayer(), 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(), 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--------------—

16642{
16643 Unit* owner = GetOwner();
16644 if (!owner || !owner->IsPlayer())
16645 return;
16646
16648 data << uint8(msg);
16649 owner->ToPlayer()->GetSession()->SendPacket(&data);
16650}
@ SMSG_PET_ACTION_FEEDBACK
Definition Opcodes.h:740

References GetOwner(), Player::GetSession(), Object::IsPlayer(), WorldSession::SendPacket(), SMSG_PET_ACTION_FEEDBACK, and Object::ToPlayer().

Referenced by WorldSession::HandlePetCancelAuraOpcode().

◆ SendPetAIReaction()

void Unit::SendPetAIReaction ( ObjectGuid  guid)
16665{
16666 Unit* owner = GetOwner();
16667 if (!owner || !owner->IsPlayer())
16668 return;
16669
16670 WorldPacket data(SMSG_AI_REACTION, 8 + 4);
16671 data << guid;
16672 data << uint32(AI_REACTION_HOSTILE);
16673 owner->ToPlayer()->GetSession()->SendPacket(&data);
16674}
@ SMSG_AI_REACTION
Definition Opcodes.h:346

References AI_REACTION_HOSTILE, GetOwner(), Player::GetSession(), Object::IsPlayer(), WorldSession::SendPacket(), SMSG_AI_REACTION, and Object::ToPlayer().

Referenced by PetAI::DoAttack(), and WorldSession::HandlePetActionHelper().

◆ SendPetTalk()

void Unit::SendPetTalk ( uint32  pettalk)
16653{
16654 Unit* owner = GetOwner();
16655 if (!owner || !owner->IsPlayer())
16656 return;
16657
16659 data << GetGUID();
16660 data << uint32(pettalk);
16661 owner->ToPlayer()->GetSession()->SendPacket(&data);
16662}
@ SMSG_PET_ACTION_SOUND
Definition Opcodes.h:834

References Object::GetGUID(), GetOwner(), Player::GetSession(), Object::IsPlayer(), WorldSession::SendPacket(), SMSG_PET_ACTION_SOUND, and Object::ToPlayer().

Referenced by WorldSession::HandlePetActionHelper().

◆ SendPlaySpellImpact()

void Unit::SendPlaySpellImpact ( ObjectGuid  guid,
uint32  id 
)
18953{
18955 data << guid; // target
18956 data << uint32(id); // SpellVisualKit.dbc index
18957 SendMessageToSet(&data, true);
18958}
@ 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)
18945{
18947 data << GetGUID();
18948 data << uint32(id); // SpellVisualKit.dbc index
18949 SendMessageToSet(&data, true);
18950}
@ 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(), SmartScript::ProcessAction(), and Player::RegenerateAll().

◆ SendRemoveFromThreatListOpcode()

void Unit::SendRemoveFromThreatListOpcode ( HostileReference pHostileReference)
20161{
20162 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_REMOVE Message");
20163 WorldPacket data(SMSG_THREAT_REMOVE, 8 + 8);
20164 data << GetPackGUID();
20165 data << pHostileReference->getUnitGuid().WriteAsPacked();
20166 SendMessageToSet(&data, false);
20167}
@ 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 
)
6526{
6527 WorldPacket data(SMSG_SPELLORDAMAGE_IMMUNE, 8 + 8 + 4 + 1);
6528 data << GetGUID();
6529 data << target->GetGUID();
6530 data << uint32(spellId);
6531 data << uint8(0); // bool - log format: 0-default, 1-debug
6532 SendMessageToSet(&data, true);
6533}
@ SMSG_SPELLORDAMAGE_IMMUNE
Definition Opcodes.h:641

References Object::GetGUID(), Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLORDAMAGE_IMMUNE.

Referenced by DealMeleeDamage(), Spell::EffectEnergize(), Spell::EffectHealMaxHealth(), and AuraEffect::SendTickImmune().

◆ SendSpellDamageResist()

void Unit::SendSpellDamageResist ( Unit target,
uint32  spellId 
)
6516{
6517 WorldPacket data(SMSG_PROCRESIST, 8 + 8 + 4 + 1);
6518 data << GetGUID();
6519 data << target->GetGUID();
6520 data << uint32(spellId);
6521 data << uint8(0); // bool - log format: 0-default, 1-debug
6522 SendMessageToSet(&data, true);
6523}
@ SMSG_PROCRESIST
Definition Opcodes.h:638

References Object::GetGUID(), Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_PROCRESIST.

◆ SendSpellMiss()

void Unit::SendSpellMiss ( Unit target,
uint32  spellID,
SpellMissInfo  missInfo 
)
6502{
6503 WorldPacket data(SMSG_SPELLLOGMISS, (4 + 8 + 1 + 4 + 8 + 1));
6504 data << uint32(spellID);
6505 data << GetGUID();
6506 data << uint8(0); // can be 0 or 1
6507 data << uint32(1); // target count
6508 // for (i = 0; i < target count; ++i)
6509 data << target->GetGUID(); // target GUID
6510 data << uint8(missInfo);
6511 // end loop
6512 SendMessageToSet(&data, true);
6513}
@ SMSG_SPELLLOGMISS
Definition Opcodes.h:617

References Object::GetGUID(), Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLLOGMISS.

Referenced by DealMeleeDamage(), and Spell::DoAllEffectOnTarget().

◆ SendSpellNonMeleeDamageLog() [1/2]

void Unit::SendSpellNonMeleeDamageLog ( SpellNonMeleeDamage log)
6367{
6368 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6369 //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
6370 uint32 damage = log->damage;
6371 uint32 absorb = log->absorb;
6372 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6373 {
6374 absorb = damage;
6375 damage = 0;
6376 }
6377 data << log->target->GetPackGUID();
6378 data << log->attacker->GetPackGUID();
6379 data << uint32(log->spellInfo->Id);
6380 data << uint32(damage); // damage amount
6381 int32 overkill = damage - log->target->GetHealth();
6382 data << uint32(overkill > 0 ? overkill : 0); // overkill
6383 data << uint8 (log->schoolMask); // damage school
6384 data << uint32(absorb); // AbsorbedDamage
6385 data << uint32(log->resist); // resist
6386 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
6387 data << uint8 (log->unused); // unused
6388 data << uint32(log->blocked); // blocked
6389 data << uint32(log->HitInfo);
6390 data << uint32(log->HitInfo);
6392 //if (log->HitInfo & SPELL_HIT_TYPE_CRIT_DEBUG)
6393 //{
6394 // data << float(log->CritRoll);
6395 // data << float(log->CritNeeded);
6396 //}
6397 //if (log->HitInfo & SPELL_HIT_TYPE_HIT_DEBUG)
6398 //{
6399 // data << float(log->HitRoll);
6400 // data << float(log->HitNeeded);
6401 //}
6402 //if (log->HitInfo & SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG)
6403 //{
6404 // data << float(log->MissChance);
6405 // data << float(log->DodgeChance);
6406 // data << float(log->ParryChance);
6407 // data << float(log->BlockChance);
6408 // data << float(log->GlanceChance);
6409 // data << float(log->CrushChance);
6410 //}
6411 SendMessageToSet(&data, true);
6412}
@ 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:503
bool unused
Definition Unit.h:504

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), 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(), and SpellNonMeleeDamage::unused.

Referenced by CalcAbsorbResist(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectEnvironmentalDMG(), spell_sindragosa_s_fury::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 
)
6415{
6416 SpellNonMeleeDamage log(this, target, spellInfo, damageSchoolMask);
6417 log.damage = Damage;
6418 log.absorb = AbsorbedDamage;
6419 log.resist = Resist;
6420 log.physicalLog = PhysicalDamage;
6421 log.blocked = Blocked;
6422 log.HitInfo = 0;
6423 if (CriticalHit)
6424 {
6425 log.HitInfo |= SPELL_HIT_TYPE_CRIT;
6426 }
6427 if (Split)
6428 {
6429 log.HitInfo |= SPELL_HIT_TYPE_SPLIT;
6430 }
6432}
@ SPELL_HIT_TYPE_SPLIT
Definition SharedDefines.h:1538
Definition Unit.h:489

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 
)
6335{
6336 // Xinef: function for players only, placed in unit because of cosmetics
6337 if (!IsPlayer())
6338 return;
6339
6340 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
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 = log->damage;
6343 uint32 absorb = log->absorb;
6344 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6345 {
6346 absorb = damage;
6347 damage = 0;
6348 }
6349 data << log->target->GetPackGUID();
6350 data << attacker->GetPackGUID();
6351 data << uint32(log->spellInfo->Id);
6352 data << uint32(damage); // damage amount
6353 int32 overkill = damage - log->target->GetHealth();
6354 data << uint32(overkill > 0 ? overkill : 0); // overkill
6355 data << uint8 (log->schoolMask); // damage school
6356 data << uint32(absorb); // AbsorbedDamage
6357 data << uint32(log->resist); // resist
6358 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
6359 data << uint8 (log->unused); // unused
6360 data << uint32(log->blocked); // blocked
6361 data << uint32(log->HitInfo);
6362 data << uint8 (0); // flag to use extend data
6363 ToPlayer()->SendDirectMessage(&data);
6364}

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, Player::SendDirectMessage(), SMSG_SPELLNONMELEEDAMAGELOG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), and SpellNonMeleeDamage::unused.

Referenced by Spell::DoAllEffectOnTarget().

◆ SendTameFailure()

void Unit::SendTameFailure ( uint8  result)
20033{
20035 data << uint8(result);
20036 ToPlayer()->SendDirectMessage(&data);
20037}
@ 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)
20040{
20042 if (IsCreature())
20043 Relocate(&pos);
20044 if (IsPlayer())
20045 {
20046 ToPlayer()->SetCanTeleport(true);
20047 }
20048 WorldPacket data2(MSG_MOVE_TELEPORT, 38);
20049 data2 << GetPackGUID();
20050 BuildMovementPacket(&data2);
20051 if (IsCreature())
20052 Relocate(&oldPos);
20053 if (IsPlayer())
20054 Relocate(&pos);
20055 SendMessageToSet(&data2, false);
20056}
@ MSG_MOVE_TELEPORT
Definition Opcodes.h:227

References BuildMovementPacket(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::IsCreature(), Object::IsPlayer(), MSG_MOVE_TELEPORT, Position::Relocate(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), and Object::ToPlayer().

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

◆ SendThreatListUpdate()

void Unit::SendThreatListUpdate ( )
20112{
20113 if (!GetThreatMgr().isThreatListEmpty())
20114 {
20115 uint32 count = GetThreatMgr().GetThreatList().size();
20116
20117 //LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_UPDATE Message");
20118 WorldPacket data(SMSG_THREAT_UPDATE, 8 + count * 8);
20119 data << GetPackGUID();
20120 data << uint32(count);
20122 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
20123 {
20124 data << (*itr)->getUnitGuid().WriteAsPacked();
20125 data << uint32((*itr)->GetThreat() * 100);
20126 }
20127 SendMessageToSet(&data, false);
20128 }
20129}
@ 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
665{ 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 
)
18936{
18937 Aura* aura = target->GetAura(spellId, GetGUID());
18938 if (!aura)
18939 aura = AddAura(spellId, target);
18940 if (aura && stack)
18941 aura->SetStackAmount(stack);
18942}
void SetStackAmount(uint8 num)
Definition SpellAuras.cpp:995

References AddAura(), GetAura(), Object::GetGUID(), and Aura::SetStackAmount().

Referenced by boss_viscidus::DamageTaken(), spell_capacitus_polarity_charge::HandleTargets(), spell_thaddius_pos_neg_charge::HandleTargets(), and BattlefieldWG::OnPlayerJoinWar().

◆ SetBaseWeaponDamage()

void Unit::SetBaseWeaponDamage ( WeaponAttackType  attType,
WeaponDamageRange  damageRange,
float  value,
uint8  damageIndex = 0 
)
inline
1153{ 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()

bool Unit::SetCanFly ( bool  enable,
bool  packetOnly = false 
)
virtual

Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().

Doesn't inform the client.

Reimplemented in Player, and Creature.

20643{
20645 return false;
20646
20647 if (enable)
20648 {
20651 }
20652 else
20653 {
20655 }
20656
20657 return true;
20658}
@ MOVEMENTFLAG_CAN_FLY
Definition UnitDefines.h:389
@ MOVEMENTFLAG_MASK_MOVING_FLY
Definition UnitDefines.h:406
void AddUnitMovementFlag(uint32 f)
Definition Unit.h:743

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_CAN_FLY, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_MASK_MOVING_FLY, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_chapter5_light_of_dawn_aura::OnApply(), spell_chapter5_light_of_dawn_aura::OnRemove(), Player::SetCanFly(), and Creature::SetCanFly().

◆ SetCanModifyStats()

◆ SetCantProc()

void Unit::SetCantProc ( bool  apply)
17320{
17321 if (apply)
17322 ++m_procDeep;
17323 else
17324 {
17326 --m_procDeep;
17327 }
17328}

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
10921{
10922 if (apply)
10923 {
10924 if (IsPlayer())
10925 {
10926 if (!AddGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
10927 LOG_FATAL("entities.unit", "Player {} is trying to charm unit {}, but it already has a charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
10928
10929 charm->m_ControlledByPlayer = true;
10931 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10932 }
10933 else
10934 charm->m_ControlledByPlayer = false;
10935
10936 // PvP, FFAPvP
10937 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, GetByteValue(UNIT_FIELD_BYTES_2, 1));
10938
10939 if (!charm->AddGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
10940 LOG_FATAL("entities.unit", "Unit {} is being charmed, but it already has a charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
10941
10942 _isWalkingBeforeCharm = charm->IsWalking();
10944 {
10945 charm->SetWalk(false);
10946 charm->SendMovementFlagUpdate();
10947 }
10948
10949 m_Controlled.insert(charm);
10950 }
10951 else
10952 {
10953 if (IsPlayer())
10954 {
10955 if (!RemoveGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
10956 LOG_FATAL("entities.unit", "Player {} is trying to uncharm unit {}, but it has another charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
10957 }
10958
10959 if (!charm->RemoveGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
10960 LOG_FATAL("entities.unit", "Unit {} is being uncharmed, but it has another charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
10961
10962 if (charm->IsPlayer())
10963 {
10964 charm->m_ControlledByPlayer = true;
10965 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10966 charm->ToPlayer()->UpdatePvPState();
10967 }
10968 else if (Player* player = charm->GetCharmerOrOwnerPlayerOrPlayerItself())
10969 {
10970 charm->m_ControlledByPlayer = true;
10971 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10972 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, player->GetByteValue(UNIT_FIELD_BYTES_2, 1));
10973
10974 // Xinef: skip controlled erase if charmed unit is owned by charmer
10975 if (charm->IsInWorld() && !charm->IsDuringRemoveFromWorld() && player->GetGUID() == this->GetGUID() && (charm->IsPet() || charm->HasUnitTypeMask(UNIT_MASK_MINION)))
10976 return;
10977 }
10978 else
10979 {
10980 charm->m_ControlledByPlayer = false;
10981 charm->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10982 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, 0);
10983 }
10984
10985 if (charm->IsWalking() != _isWalkingBeforeCharm)
10986 {
10987 charm->SetWalk(_isWalkingBeforeCharm);
10988 charm->SendMovementFlagUpdate(true); // send packet to self, to update movement state on player.
10989 }
10990
10991 m_Controlled.erase(charm);
10992 }
10993}
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(), Object::GetGUID(), WorldObject::GetName(), HasUnitTypeMask(), IsDuringRemoveFromWorld(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), IsWalking(), LOG_FATAL, m_Controlled, m_ControlledByPlayer, Object::RemoveGuidValue(), RemoveUnitFlag(), SendMovementFlagUpdate(), Object::SetByteValue(), SetUnitFlag(), SetWalk(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), 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 
)
18384{
18385 if (!charmer)
18386 return false;
18387
18388 if (!charmer->IsInWorld() || charmer->IsDuringRemoveFromWorld())
18389 {
18390 return false;
18391 }
18392
18393 // dismount players when charmed
18394 if (IsPlayer())
18396
18397 if (charmer->IsPlayer())
18399
18400 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18401 if (type == CHARM_TYPE_VEHICLE && !IsVehicle()) // pussywizard
18402 throw 1;
18403 ASSERT((type == CHARM_TYPE_VEHICLE) == IsVehicle());
18404
18405 LOG_DEBUG("entities.unit", "SetCharmedBy: charmer {} ({}), charmed {} ({}), type {}.",
18406 charmer->GetEntry(), charmer->GetGUID().ToString(), GetEntry(), GetGUID().ToString(), uint32(type));
18407
18408 if (this == charmer)
18409 {
18410 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Unit {} ({}) is trying to charm itself!", GetEntry(), GetGUID().ToString());
18411 return false;
18412 }
18413
18414 //if (HasUnitState(UNIT_STATE_UNATTACKABLE))
18415 // return false;
18416
18417 if (IsPlayer() && ToPlayer()->GetTransport())
18418 {
18419 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Player on transport is trying to charm {} ({})", GetEntry(), GetGUID().ToString());
18420 return false;
18421 }
18422
18423 // Already charmed
18424 if (GetCharmerGUID())
18425 {
18426 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) has already been charmed but {} ({}) is trying to charm it!",
18427 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18428 return false;
18429 }
18430
18431 CastStop();
18432 AttackStop();
18433
18434 // Xinef: dont reset threat and combat, put them on offline list, moved down after faction changes
18435 // CombatStop(); /// @todo: CombatStop(true) may cause crash (interrupt spells)
18436 // DeleteThreatList();
18437
18438 Player* playerCharmer = charmer->ToPlayer();
18439
18440 // Charmer stop charming
18441 if (playerCharmer)
18442 {
18443 playerCharmer->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18444 playerCharmer->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18445 }
18446
18447 // Charmed stop charming
18448 if (IsPlayer())
18449 {
18450 ToPlayer()->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18451 ToPlayer()->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18452 }
18453
18454 // StopCastingCharm may remove a possessed pet?
18455 if (!IsInWorld())
18456 {
18457 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) is not in world but {} ({}) is trying to charm it!",
18458 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18459 return false;
18460 }
18461
18462 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18463 // prevent undefined behaviour
18464 if (aurApp && aurApp->GetRemoveMode())
18465 return false;
18466
18468 SetFaction(charmer->GetFaction());
18469
18470 // Set charmed
18471 charmer->SetCharm(this, true);
18472
18474
18475 if (IsCreature())
18476 {
18477 GetMotionMaster()->Clear(false);
18479 StopMoving();
18480
18481 if (charmer->IsPlayer() && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM) && ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_DEMON)
18482 {
18483 // Disable CreatureAI/SmartAI and switch to CharmAI when charmed by warlock
18484 Creature* charmed = ToCreature();
18485 charmed->NeedChangeAI = true;
18486 charmed->IsAIEnabled = false;
18487 }
18488 else
18489 {
18490 ToCreature()->AI()->OnCharmed(true);
18491 }
18492
18493 // Xinef: If creature can fly, add normal player flying flag (fixes speed)
18494 if (charmer->IsPlayer() && ToCreature()->CanFly())
18496 }
18497 else
18498 {
18499 Player* player = ToPlayer();
18500 if (player->isAFK())
18501 player->ToggleAFK();
18502
18503 player->SetClientControl(this, false); // verified
18504 }
18505
18506 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18507 // prevent undefined behaviour
18508 if (aurApp && aurApp->GetRemoveMode())
18509 return false;
18510
18511 // Pets already have a properly initialized CharmInfo, don't overwrite it.
18512 // Xinef: I need charmInfo for vehicle
18513 if (/*type != CHARM_TYPE_VEHICLE &&*/ !GetCharmInfo())
18514 {
18515 InitCharmInfo();
18516 if (type == CHARM_TYPE_POSSESS)
18518 else if (type != CHARM_TYPE_VEHICLE)
18519 {
18521
18522 // Xinef: convert charm npcs dont have pet bar so initialize them as defensive helpers
18523 if (type == CHARM_TYPE_CONVERT && IsCreature())
18525 }
18526 }
18527
18528 if (playerCharmer)
18529 {
18530 switch (type)
18531 {
18532 case CHARM_TYPE_VEHICLE:
18535 playerCharmer->SetClientControl(this, true); // verified
18536 playerCharmer->VehicleSpellInitialize();
18537 break;
18538 case CHARM_TYPE_POSSESS:
18543 playerCharmer->SetClientControl(this, true); // verified
18544 playerCharmer->PossessSpellInitialize();
18545 break;
18546 case CHARM_TYPE_CHARM:
18548 {
18550 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18551 {
18552 // to prevent client crash
18554
18555 // just to enable stat window
18556 if (GetCharmInfo())
18557 GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
18558
18559 // if charmed two demons the same session, the 2nd gets the 1st one's name
18560 SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(GameTime::GetGameTime().count())); // cast can't be helped
18561 }
18562 }
18563 if (playerCharmer->m_seer != this)
18564 {
18566 playerCharmer->CharmSpellInitialize();
18567 }
18568 break;
18569 default:
18570 break;
18571 }
18572 }
18573 else if (IsPlayer())
18575
18576 if (Creature* creature = ToCreature())
18577 creature->RefreshSwimmingFlag();
18578
18579 if (IsPlayer())
18580 sScriptMgr->OnPlayerBeingCharmed(ToPlayer(), charmer, _oldFactionId, charmer->GetFaction());
18581
18582 return true;
18583}
@ CHARM_TYPE_CONVERT
Definition CharmInfo.h:48
@ REACT_DEFENSIVE
Definition Unit.h:549
@ UNIT_FIELD_PET_NAME_TIMESTAMP
Definition UpdateFields.h:133
void OnCharmed(bool apply) override
Called when unit is charmed.
Definition CreatureAI.cpp:33
void SetReactState(ReactStates state)
A creature can have 3 ReactStates : Agressive, Passive, Neutral.
Definition Creature.h:95
void MoveIdle()
Definition MotionMaster.cpp:232
void CharmSpellInitialize()
Definition Player.cpp:9684
WorldObject * m_seer
Definition Player.h:2344
void ToggleAFK()
Definition Player.cpp:1298
void PossessSpellInitialize()
Definition Player.cpp:9581
bool isAFK() const
Definition Player.h:1152
void VehicleSpellInitialize()
Definition Player.cpp:9609
void StopCastingBindSight(Aura *except=nullptr)
Definition Player.cpp:13130
virtual float GetFollowAngle() const
Definition Unit.h:1816
CharmInfo * InitCharmInfo()
Definition Unit.cpp:15848
void InitPossessCreateSpells()
Definition CharmInfo.cpp:77
void InitCharmCreateSpells()
Definition CharmInfo.cpp:98

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_CONTEXT_PET_CHARM, CLASS_MAGE, CLASS_WARLOCK, MotionMaster::Clear(), CREATURE_TYPE_DEMON, AuraApplication::GetBase(), GetCharmerGUID(), GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFaction(), GetFollowAngle(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetGUID(), GetMotionMaster(), AuraApplication::GetRemoveMode(), WorldObject::GetTransport(), CharmInfo::InitCharmCreateSpells(), InitCharmInfo(), CharmInfo::InitPossessCreateSpells(), Player::isAFK(), IsAIEnabled, IsClass(), Object::IsCreature(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Object::IsPlayer(), 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(), 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, 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
904{ m_CombatTimer = timer; }

References m_CombatTimer.

◆ SetConfused()

void Unit::SetConfused ( bool  apply)
protected
18352{
18353 if (apply)
18354 {
18355 SetTarget();
18357 }
18358 else
18359 {
18360 if (IsAlive())
18361 {
18362 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == CONFUSED_MOTION_TYPE)
18363 {
18365 StopMoving();
18366 }
18367
18368 if (GetVictim())
18370 }
18371 }
18372
18373 // xinef: block / allow control to real mover (eg. charmer)
18374 if (IsPlayer())
18375 {
18376 if (m_movedByPlayer)
18377 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18378 //else
18379 // ToPlayer()->SetClientControl(this, !apply);
18380 }
18381}
@ CONFUSED_MOTION_TYPE
Definition MotionMaster.h:44
void MoveConfused()
Enable the confusion movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:292

References CONFUSED_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveConfused(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), and Object::ToPlayer().

Referenced by SetControlled().

◆ SetContestedPvP()

void Unit::SetContestedPvP ( Player attackedPlayer = nullptr,
bool  lookForNearContestedGuards = true 
)
17282{
17284
17285 if (!player || ((attackedPlayer && (attackedPlayer == player || (player->duel && player->duel->Opponent == attackedPlayer))) || player->InBattleground()))
17286 return;
17287
17288 // check if there any guards that should care about the contested flag on player
17289 if (lookForNearContestedGuards)
17290 {
17291 std::list<Unit*> targets;
17294 Cell::VisitAllObjects(this, searcher, MAX_AGGRO_RADIUS);
17295
17296 // return if there are no contested guards found
17297 if (!targets.size())
17298 {
17299 return;
17300 }
17301 }
17302
17303 player->SetContestedPvPTimer(30000);
17305 {
17308 // call MoveInLineOfSight for nearby contested guards
17310 }
17312 {
17314 // call MoveInLineOfSight for nearby contested guards
17316 }
17317}
#define MAX_AGGRO_RADIUS
Definition Unit.h:43
void SetPlayerFlag(PlayerFlags flags)
Definition Player.h:1127
bool InBattleground() const
Definition Player.h:2262
void SetContestedPvPTimer(uint32 newTime)
Definition Player.h:1877

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 
)
18068{
18069 if (apply)
18070 {
18071 if (HasUnitState(state))
18072 return;
18073
18074 AddUnitState(state);
18075 switch (state)
18076 {
18077 case UNIT_STATE_STUNNED:
18078 SetStunned(true);
18079 break;
18080 case UNIT_STATE_ROOT:
18082 SetRooted(true);
18083 break;
18086 {
18089 // SendAutoRepeatCancel ?
18090 SetConfused(true);
18091 CastStop(0, false);
18092 }
18093 break;
18094 case UNIT_STATE_FLEEING:
18096 {
18099 // SendAutoRepeatCancel ?
18100 SetFeared(true, source, isFear);
18101 CastStop(0, false);
18102 }
18103 break;
18104 default:
18105 break;
18106 }
18107
18108 if (IsPlayer())
18109 {
18110 sScriptMgr->AnticheatSetRootACKUpd(ToPlayer());
18111 }
18112 }
18113 else
18114 {
18115 // xinef: moved from below, checked all SetX functions, no calls to currently modified state
18116 // xinef: added to each case because of return
18117 //ClearUnitState(state);
18118
18119 switch (state)
18120 {
18121 case UNIT_STATE_STUNNED:
18122 if (HasStunAura())
18123 return;
18124 ClearUnitState(state);
18125 SetStunned(false);
18126 break;
18127 case UNIT_STATE_ROOT:
18128 // Prevent creature_template_movement rooted flag from being removed on aura expiration.
18129 if (IsCreature())
18130 {
18131 if (ToCreature()->GetCreatureTemplate()->Movement.Rooted)
18132 {
18133 return;
18134 }
18135 }
18136
18137 if (HasRootAura() || GetVehicle())
18138 return;
18139 ClearUnitState(state);
18140 SetRooted(false);
18141 break;
18143 if (HasConfuseAura())
18144 return;
18145 ClearUnitState(state);
18146 SetConfused(false);
18147 break;
18148 case UNIT_STATE_FLEEING:
18149 if (HasFearAura())
18150 return;
18151 ClearUnitState(state);
18152 SetFeared(false);
18153 break;
18154 default:
18155 return;
18156 }
18157
18158 //ClearUnitState(state);
18159
18161 SetStunned(true);
18162 else
18163 {
18165 SetRooted(true);
18166
18168 SetConfused(true);
18170 {
18171 bool isFear = false;
18172 if (HasFearAura())
18173 {
18174 isFear = true;
18175 source = ObjectAccessor::GetUnit(*this, GetAuraEffectsByType(SPELL_AURA_MOD_FEAR).front()->GetCasterGUID());
18176 }
18177
18178 if (!source)
18179 {
18180 source = getAttackerForHelper();
18181 }
18182
18183 SetFeared(true, source, isFear);
18184 }
18185 }
18186 }
18187}
void SetFeared(bool apply, Unit *fearedBy=nullptr, bool isFear=false)
Definition Unit.cpp:18319
bool HasStunAura() const
Definition Unit.h:1760
void SetConfused(bool apply)
Definition Unit.cpp:18351
void SetStunned(bool apply)
Definition Unit.cpp:18189
Unit * getAttackerForHelper() const
Definition Unit.cpp:741
bool HasConfuseAura() const
Definition Unit.h:1758
void SetRooted(bool apply, bool isStun=false)
Definition Unit.cpp:18237
bool HasRootAura() const
Definition Unit.h:1759
bool HasFearAura() const
Definition Unit.h:1757
Definition Unit.h:257

References AddUnitState(), CastStop(), ClearUnitState(), getAttackerForHelper(), GetAuraEffectsByType(), ObjectAccessor::GetUnit(), GetVehicle(), HasConfuseAura(), HasFearAura(), HasRootAura(), HasStunAura(), HasUnitState(), Object::IsCreature(), Object::IsPlayer(), SendMeleeAttackStop(), SetConfused(), SetFeared(), SetRooted(), SetStunned(), SPELL_AURA_MOD_FEAR, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONFUSED, UNIT_STATE_FLEEING, UNIT_STATE_MELEE_ATTACKING, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by _ExitVehicle(), Vehicle::AddPassenger(), boss_ahune::boss_ahune(), boss_ouro::boss_ouro(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::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(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::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::EnterEvadeMode(), boss_svala::boss_svalaAI::EnterEvadeMode(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_shirrak_the_dead_watcher::EnterEvadeMode(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleAuraModRoot(), AuraEffect::HandleAuraModStun(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_q13007_iron_colossus::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_gen_visual_dummy_stun::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_gen_visual_dummy_stun::HandleEffectRemove(), AuraEffect::HandleModConfuse(), AuraEffect::HandleModFear(), AuraEffect::HandlePreventFleeing(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_volazj::JustDied(), CritterAI::JustEngagedWith(), boss_skadi::boss_skadiAI::JustEngagedWith(), boss_shirrak_the_dead_watcher::JustEngagedWith(), boss_skeram::JustSummoned(), npc_twilight_volunteer::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_illidan_stormrage::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_aura::OnApply(), spell_systems_shutdown_aura::OnRemove(), npc_akama_illidan::PathEndReached(), 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::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(), boss_illidan_stormrage::Reset(), npc_akama_illidan::Reset(), npc_target_dummy::npc_target_dummyAI::Reset(), boss_illidan_stormrage::ScheduleAbilities(), 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::UpdateAI(), npc_vrykul_skeleton::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

◆ SetCurrentCastedSpell()

void Unit::SetCurrentCastedSpell ( Spell pSpell)
3991{
3992 ASSERT(pSpell); // nullptr may be never passed here, use InterruptSpell or InterruptNonMeleeSpells
3993
3994 CurrentSpellTypes CSpellType = pSpell->GetCurrentContainer();
3995
3996 if (pSpell == m_currentSpells[CSpellType]) // avoid breaking self
3997 return;
3998
3999 bool bySelf = m_currentSpells[CSpellType] && m_currentSpells[CSpellType]->m_spellInfo->Id == pSpell->m_spellInfo->Id;
4000
4001 // break same type spell if it is not delayed
4002 InterruptSpell(CSpellType, false, true, bySelf);
4003
4004 // special breakage effects:
4005 switch (CSpellType)
4006 {
4008 {
4009 // generic spells always break channeled not delayed spells
4011 {
4012 if (!s->GetSpellInfo()->IsActionAllowedChannel())
4013 {
4015 }
4016 }
4017
4018 // autorepeat breaking
4020 {
4021 // break autorepeat if not Auto Shot
4022 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
4024 m_AutoRepeatFirstCast = true;
4025 }
4026
4027 // melee spells breaking
4029 {
4030 // break melee spells if cast time
4031 if (pSpell->GetCastTime() > 0)
4032 {
4034 }
4035 }
4036 if (pSpell->GetCastTime() > 0)
4038
4039 break;
4040 }
4042 {
4043 // channel spells always break generic non-delayed and any channeled spells
4045 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4046
4047 // it also does break autorepeat if not Auto Shot
4049 m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
4052
4053 break;
4054 }
4056 {
4057 // only Auto Shoot does not break anything
4058 if (pSpell->m_spellInfo->Id != 75)
4059 {
4060 // generic autorepeats break generic non-delayed and channeled non-delayed spells
4062 {
4063 if (!s->GetSpellInfo()->IsActionAllowedChannel())
4064 {
4066 }
4067 }
4068
4070 }
4071 // special action: set first cast flag
4072 m_AutoRepeatFirstCast = true;
4073
4074 break;
4075 }
4076
4077 default:
4078 // other spell types don't break anything now
4079 break;
4080 }
4081
4082 // current spell (if it is still here) may be safely deleted now
4083 if (m_currentSpells[CSpellType])
4084 m_currentSpells[CSpellType]->SetReferencedFromCurrent(false);
4085
4086 // set new current spell
4087 m_currentSpells[CSpellType] = pSpell;
4088 pSpell->SetReferencedFromCurrent(true);
4089
4090 pSpell->m_selfContainer = &(m_currentSpells[pSpell->GetCurrentContainer()]);
4091}
CurrentSpellTypes GetCurrentContainer() const
Definition Spell.cpp:7942
Spell ** m_selfContainer
Definition Spell.h:614

References AddUnitState(), ASSERT, CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, CURRENT_MELEE_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.

14605{
14606 // death state needs to be updated before RemoveAllAurasOnDeath() calls HandleChannelDeathItem(..) so that
14607 // it can be used to check creation of death items (such as soul shards).
14608 m_deathState = s;
14609
14611 {
14612 CombatStop();
14615 ClearComboPointHolders(); // any combo points pointed to unit lost at it death
14616
14617 if (IsNonMeleeSpellCast(false))
14619
14620 UnsummonAllTotems(true);
14621 RemoveAllControlled(true);
14623 }
14624
14625 if (s == DeathState::JustDied)
14626 {
14627 // remove aurastates allowing special moves
14630
14631 GetMotionMaster()->Clear(false);
14633
14634 // Xinef: Remove Hover so the corpse can fall to the ground
14635 SetHover(false);
14636
14637 if (despawn)
14638 DisableSpline();
14639 else
14640 StopMoving();
14641
14642 // without this when removing IncreaseMaxHealth aura player may stuck with 1 hp
14643 // do not why since in IncreaseMaxHealth currenthealth is checked
14644 SetHealth(0);
14645 SetPower(getPowerType(), 0);
14646
14647 // Stop emote on death
14649
14650 // players in instance don't have ZoneScript, but they have InstanceScript
14652 zoneScript->OnUnitDeath(this);
14653 }
14654 else if (s == DeathState::JustRespawned)
14655 {
14656 RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground)
14657 }
14658}
@ UNIT_FLAG_SKINNABLE
Definition UnitDefines.h:276
void ClearAllReactives()
Definition Unit.cpp:16960
virtual bool SetHover(bool enable, bool packetOnly=false, bool updateAnimationTier=true)
Definition Unit.cpp:20708
void ClearDiminishings()
Definition Unit.h:1783
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1203
ZoneScript * GetZoneScript() const
Definition Object.h:543
Definition ZoneScript.h:26

References Alive, MotionMaster::Clear(), ClearAllReactives(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearDiminishings(), CombatStop(), HostileRefMgr::deleteReferences(), DisableSpline(), getHostileRefMgr(), WorldObject::GetInstanceScript(), GetMotionMaster(), getPowerType(), GetThreatMgr(), WorldObject::GetZoneScript(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), JustDied, JustRespawned, m_deathState, MotionMaster::MoveIdle(), RemoveAllAurasOnDeath(), RemoveAllControlled(), Object::RemoveFlag(), SetHealth(), SetHover(), SetPower(), 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()

bool Unit::SetDisableGravity ( bool  disable,
bool  packetOnly = false,
bool  updateAnimationTier = true 
)
virtual

◆ SetDisplayId()

◆ SetEmoteState()

void Unit::SetEmoteState ( Emote  emoteState)
inline

◆ SetExtraUnitMovementFlags()

void Unit::SetExtraUnitMovementFlags ( uint16  f)
inline

◆ SetFacingTo()

void Unit::SetFacingTo ( float  ori)
20563{
20564 Movement::MoveSplineInit init(this);
20565 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ(), false);
20567 init.DisableTransportPathTransformations(); // It makes no sense to target global orientation
20568 init.SetFacing(ori);
20569 init.Launch();
20570}
ObjectGuid GetTransGUID() const override
Definition Unit.cpp:18789

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(), boss_kaelthas::ExecuteMiddleEvent(), DistractMovementGenerator::Finalize(), Creature::FocusTarget(), spell_item_unusual_compass::HandleDummy(), spell_drakkari_colossus_face_me::HandleScriptEffect(), boss_grand_warlock_nethekurse::IntroRP(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), boss_ragnaros::boss_ragnarosAI::JustDied(), boss_ingvar_the_plunderer::JustSummoned(), boss_nalorakk::MoveInLineOfSight(), boss_algalon_the_observer::boss_algalon_the_observerAI::MovementInform(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::MovementInform(), boss_zuljin::MovementInform(), npc_harrison_jones::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::MovementInform(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::MovementInform(), boss_illidan_stormrage::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_saviana_ragefire::boss_saviana_ragefireAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::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(), boss_illidan_stormrage::ScheduleAbilities(), boss_nightbane::ScheduleFly(), 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_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(), npc_pet_gen_plump_turkey::UpdateAI(), npc_general_andorov::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::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.
20573{
20574 // never face when already moving
20575 if (!IsStopped())
20576 return;
20577
20579 Movement::MoveSplineInit init(this);
20580 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
20581 init.SetFacing(GetAngle(object)); // when on transport, GetAngle will still return global coordinates (and angle) that needs transforming
20582 init.Launch();
20583}
bool IsStopped() const
Definition Unit.h:1684

References Position::GetAngle(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), IsStopped(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetFacing().

Referenced by boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), npc_ranshalla::npc_ranshallaAI::DoChannelTorchSpell(), npc_forest_frog::DoSpawnRandom(), spell_yogg_saron_target_selectors::HandleScript(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_maiev_illidan::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::JustSummoned(), npc_drakuru_shackles::npc_drakuru_shacklesAI::LockRageclaw(), boss_zuljin::MovementInform(), npc_harrison_jones::MovementInform(), npc_akama_illidan::MovementInform(), 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_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_nightbane::ScheduleFly(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), boss_the_lurker_below::SchedulerPhaseOne(), boss_shade_of_aran::SetGUID(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::SetGUID(), npc_harrison_jones::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), npc_death_knight_initiate::npc_death_knight_initiateAI::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)
10097{
10099 if (IsCreature())
10101}
void UpdateMoveInLineOfSightState()
Definition Creature.cpp:2590

References Object::IsCreature(), SetUInt32Value(), Object::ToCreature(), UNIT_FIELD_FACTIONTEMPLATE, and Creature::UpdateMoveInLineOfSightState().

Referenced by 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(), boss_kalecgos::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::HandleDummy(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFactionIdCommand(), npc_commandscript::HandleNpcSetFactionTempIdCommand(), spell_mutate_explode_bug::HandleOnHit(), spell_q10612_10613_the_fel_and_the_furious::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::JustSummoned(), boss_broggok::JustSummoned(), Pet::LoadPetFromDB(), boss_twilight_corrupter::MoveInLineOfSight(), npc_akama_shade::MovementInform(), 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(), InstanceScript::OnPlayerEnter(), 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_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_akama_shade::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(), npc_deathstalker_fearleia::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::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(), boss_mimiron::boss_mimironAI::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
18320{
18321 if (apply)
18322 {
18323 SetTarget();
18324 GetMotionMaster()->MoveFleeing(fearedBy, isFear ? 0 : sWorld->getIntConfig(CONFIG_CREATURE_FAMILY_FLEE_DELAY));
18325 }
18326 else
18327 {
18328 if (IsAlive())
18329 {
18330 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == FLEEING_MOTION_TYPE)
18331 {
18333 StopMoving();
18334 }
18335
18336 if (GetVictim())
18338 }
18339 }
18340
18341 // xinef: block / allow control to real mover (eg. charmer)
18342 if (IsPlayer())
18343 {
18344 if (m_movedByPlayer)
18345 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18346 //else
18347 // ToPlayer()->SetClientControl(this, !apply);
18348 }
18349}
@ CONFIG_CREATURE_FAMILY_FLEE_DELAY
Definition IWorld.h:284
@ FLEEING_MOTION_TYPE
Definition MotionMaster.h:49
void MoveFleeing(Unit *enemy, uint32 time=0)
Enable the target's fleeing movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:746

References CONFIG_CREATURE_FAMILY_FLEE_DELAY, FLEEING_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), MotionMaster::GetMotionSlotType(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveFleeing(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), sWorld, and Object::ToPlayer().

Referenced by SetControlled().

◆ SetFeatherFall()

bool Unit::SetFeatherFall ( bool  enable,
bool  packetOnly = false 
)
virtual

Reimplemented in Player, and Creature.

20687{
20689 return false;
20690
20691 if (enable)
20693 else
20695
20696 return true;
20697}
@ MOVEMENTFLAG_FALLING_SLOW
Definition UnitDefines.h:394

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_FALLING_SLOW, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraFeatherFall(), debug_commandscript::HandleDebugMoveflagsCommand(), Player::SetFeatherFall(), and Creature::SetFeatherFall().

◆ SetFullHealth()

◆ SetHealth()

void Unit::SetHealth ( uint32  val)
15530{
15532 val = 0;
15533 else if (IsPlayer() && getDeathState() == DeathState::Dead)
15534 val = 1;
15535 else
15536 {
15537 uint32 maxHealth = GetMaxHealth();
15538 if (maxHealth < val)
15539 val = maxHealth;
15540 }
15541
15542 float prevHealthPct = GetHealthPct();
15543
15545
15546 // mobs that are now or were below 30% need to update their speed
15547 if (IsCreature() && !(IsPet() && ToPet()->isControlled() && IsControlledByPlayer()) && (prevHealthPct < 30.0 || HealthBelowPct(30)))
15548 {
15549 UpdateSpeed(MOVE_RUN, false);
15550 }
15551
15552 // group update
15553 if (IsPlayer())
15554 {
15555 Player* player = ToPlayer();
15556 if (player->NeedSendSpectatorData())
15558
15559 if (player->GetGroup())
15561 }
15562 else if (Pet* pet = ToCreature()->ToPet())
15563 {
15564 if (pet->isControlled())
15565 {
15566 if (Unit* owner = GetOwner())
15567 if (Player* player = owner->ToPlayer())
15568 {
15569 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15570 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15571
15572 if (player->GetGroup())
15574 }
15575 }
15576 }
15577}
@ GROUP_UPDATE_FLAG_CUR_HP
Definition Group.h:101
@ GROUP_UPDATE_FLAG_PET_CUR_HP
Definition Group.h:113
bool NeedSendSpectatorData() const
Definition Player.cpp:15371
void SetGroupUpdateFlag(uint32 flag)
Definition Player.h:2484
float GetHealthPct() const
Definition Unit.h:1047
void SendCommand_UInt32Value(T *o, ObjectGuid targetGUID, const char *prefix, uint32 t)
Definition ArenaSpectator.h:62

References Dead, WorldObject::FindMap(), getDeathState(), Player::GetGroup(), Object::GetGUID(), GetHealthPct(), GetMaxHealth(), GetOwner(), GROUP_UPDATE_FLAG_CUR_HP, GROUP_UPDATE_FLAG_PET_CUR_HP, HealthBelowPct(), IsControlledByPlayer(), Object::IsCreature(), IsPet(), Object::IsPlayer(), JustDied, MOVE_RUN, Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_FIELD_HEALTH, and UpdateSpeed().

Referenced by boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), Player::BuildPlayerRepop(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_alar::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(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_oculus_soar_aura::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::HandleScript(), spell_ahune_synch_health::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(), 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(), npc_giant_claw_tentacle::Submerge(), npc_a_special_surprise::npc_a_special_surpriseAI::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(), 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.

20709{
20711 return false;
20712
20713 float hoverHeight = GetFloatValue(UNIT_FIELD_HOVERHEIGHT);
20714
20715 if (enable)
20716 {
20718 if (hoverHeight && GetPositionZ() - GetFloorZ() < hoverHeight)
20719 UpdateHeight(GetPositionZ() + hoverHeight);
20720 }
20721 else
20722 {
20724 if (hoverHeight && (!isDying() || !IsCreature()))
20725 {
20726 float newZ = std::max<float>(GetFloorZ(), GetPositionZ() - hoverHeight);
20728 UpdateHeight(newZ);
20729 }
20730 SendMovementFlagUpdate(); // pussywizard: needed for falling after death (instead of falling onto air at hover height)
20731 }
20732
20733 return true;
20734}
void UpdateHeight(float newZ)
Only server-side height update, does not broadcast to client.
Definition Unit.cpp:20104
void SendMovementFlagUpdate(bool self=false)
Definition Unit.cpp:16737
bool isDying() const
Definition Unit.h:1715
void UpdateAllowedPositionZ(float x, float y, float &z, float *groundZ=nullptr) const
Definition Object.cpp:1565
float GetFloorZ() const
Definition Object.cpp:3137

References AddUnitMovementFlag(), Object::GetFloatValue(), WorldObject::GetFloorZ(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), HasUnitMovementFlag(), Object::IsCreature(), isDying(), MOVEMENTFLAG_HOVER, RemoveUnitMovementFlag(), SendMovementFlagUpdate(), 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
883{ SetImmuneToPC(apply, keepCombat); SetImmuneToNPC(apply, keepCombat); }
void SetImmuneToNPC(bool apply, bool keepCombat=false)
Definition Unit.cpp:13661

References SetImmuneToNPC(), and SetImmuneToPC().

Referenced by spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), boss_chromaggus::boss_chromaggusAI::boss_chromaggusAI(), boss_nalorakk::boss_nalorakk(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_felblood_kaelthas::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_felblood_kaelthas::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_aura::HandleEffectApply(), spell_uldaman_stoned_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_item_draenic_pale_ale::HandleSummon(), boss_majordomo::boss_majordomoAI::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_nalorakk::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::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(), instance_zulaman::instance_zulaman_InstanceMapScript::OnCreatureCreate(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_ragnaros::boss_ragnarosAI::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_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(), 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(), 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 
)
13653{
13654 (void)keepCombat;
13655 if (apply)
13657 else
13659}

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(), 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(), npc_frozen_core::DoAction(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectRemove(), boss_felmyst::InitializeAI(), 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_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_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_felmyst::StartIntro(), 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 
)
13784{
13785 // only alive units can be in combat
13786 if (!IsAlive())
13787 return;
13788
13789 if (PvP)
13790 m_CombatTimer = std::max<uint32>(GetCombatTimer(), std::max<uint32>(5500, duration));
13791 else if (duration)
13792 m_CombatTimer = std::max<uint32>(GetCombatTimer(), duration);
13793
13795 return;
13796
13797 // xinef: if we somehow engage in combat (scripts, dunno) with player, remove this flag so he can fight back
13798 if (IsCreature() && enemy && IsImmuneToPC() && enemy->GetCharmerOrOwnerPlayerOrPlayerItself())
13799 SetImmuneToPC(false); // unit has engaged in combat, remove immunity so players can fight back
13800
13801 if (IsInCombat())
13802 return;
13803
13805
13806 if (Creature* creature = ToCreature())
13807 {
13808 // Set home position at place of engaging combat for escorted creatures
13809 if ((IsAIEnabled && creature->AI()->IsEscorted()) ||
13810 GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE ||
13811 GetMotionMaster()->GetCurrentMovementGeneratorType() == ESCORT_MOTION_TYPE)
13812 creature->SetHomePosition(GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
13813
13814 if (enemy)
13815 {
13816 creature->UpdateLeashExtensionTime();
13817
13818 if (IsAIEnabled)
13819 creature->AI()->JustEngagedWith(enemy);
13820
13821 if (creature->GetFormation())
13822 creature->GetFormation()->MemberEngagingTarget(creature, enemy);
13823
13824 sScriptMgr->OnUnitEnterCombat(creature, enemy);
13825 }
13826
13827 creature->RefreshSwimmingFlag();
13828
13829 if (IsPet())
13830 {
13831 UpdateSpeed(MOVE_RUN, true);
13832 UpdateSpeed(MOVE_SWIM, true);
13833 UpdateSpeed(MOVE_FLIGHT, true);
13834 }
13835
13836 if (!(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT))
13837 Dismount();
13838 if (!IsStandState()) // pussywizard: already done in CombatStart(target, initialAggro) for the target, but when aggro'ing from MoveInLOS CombatStart is not called!
13840 }
13841
13842 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
13843 {
13844 Unit* controlled = *itr;
13845 ++itr;
13846
13847 // Xinef: Dont set combat for passive units, they will evade in next update...
13848 if (controlled->IsCreature() && controlled->ToCreature()->HasReactState(REACT_PASSIVE))
13849 continue;
13850
13851 controlled->SetInCombatState(PvP, enemy, duration);
13852 }
13853
13854 if (Player* player = this->ToPlayer())
13855 {
13856 sScriptMgr->OnPlayerEnterCombat(player, enemy);
13857 }
13858}
@ ESCORT_MOTION_TYPE
Definition MotionMaster.h:57
@ WAYPOINT_MOTION_TYPE
Definition MotionMaster.h:41
@ CREATURE_TYPE_NON_COMBAT_PET
Definition SharedDefines.h:2639
@ CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT
Definition SharedDefines.h:2706
@ MOVE_FLIGHT
Definition UnitDefines.h:355
@ MOVE_SWIM
Definition UnitDefines.h:352
bool HasReactState(ReactStates state) const
Definition Creature.h:97
uint32 GetCombatTimer() const
Definition Unit.h:903
void SetInCombatState(bool PvP, Unit *enemy=nullptr, uint32 duration=0)
Definition Unit.cpp:13783
bool IsStandState() const
Definition Unit.cpp:16753

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(), Creature::HasReactState(), HasUnitState(), IsAIEnabled, IsAlive(), Object::IsCreature(), 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(), 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 
)
13626{
13627 // Xinef: Dont allow to start combat with triggers
13628 if (enemy->IsCreature() && enemy->ToCreature()->IsTrigger())
13629 return;
13630
13631 Unit* eOwner = enemy->GetCharmerOrOwnerOrSelf();
13632 if (eOwner->IsPvP() || eOwner->IsFFAPvP())
13633 {
13634 SetInCombatState(true, enemy, duration);
13635 return;
13636 }
13637
13638 // check for duel
13639 if (eOwner->IsPlayer() && eOwner->ToPlayer()->duel)
13640 {
13641 Unit const* myOwner = GetCharmerOrOwnerOrSelf();
13642 if (((Player const*)eOwner)->duel->Opponent == myOwner)
13643 {
13644 SetInCombatState(true, enemy, duration);
13645 return;
13646 }
13647 }
13648
13649 SetInCombatState(false, enemy, duration);
13650}

References Player::duel, GetCharmerOrOwnerOrSelf(), Object::IsCreature(), IsFFAPvP(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), SetInCombatState(), Object::ToCreature(), and Object::ToPlayer().

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(), and npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI().

◆ SetInFront()

◆ SetInstantCast()

void Unit::SetInstantCast ( bool  set)
inline
1518{ _instantCast = set; }

References _instantCast.

Referenced by AuraEffect::HandleModCastingSpeed().

◆ SetLastDamagedTargetGuid()

void Unit::SetLastDamagedTargetGuid ( ObjectGuid const &  guid)
inline

◆ SetLastExtraAttackSpell()

void Unit::SetLastExtraAttackSpell ( uint32  spellId)
inline
962{ _lastExtraAttackSpell = spellId; }

References _lastExtraAttackSpell.

Referenced by Spell::_handle_finish_phase().

◆ SetLastManaUse()

void Unit::SetLastManaUse ( uint32  spellCastTime)
inline
1089{ m_lastManaUse = spellCastTime; }

References m_lastManaUse.

Referenced by Spell::TakePower().

◆ SetLevel()

◆ SetMaxHealth()

void Unit::SetMaxHealth ( uint32  val)
15580{
15581 if (!val)
15582 val = 1;
15583
15584 uint32 health = GetHealth();
15586
15587 // group update
15588 if (IsPlayer())
15589 {
15590 Player* player = ToPlayer();
15591 if (player->NeedSendSpectatorData())
15593
15594 if (player->GetGroup())
15596 }
15597 else if (Pet* pet = ToCreature()->ToPet())
15598 {
15599 if (pet->isControlled())
15600 {
15601 if (Unit* owner = GetOwner())
15602 if (Player* player = owner->ToPlayer())
15603 {
15604 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15605 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15606
15607 if (player->GetGroup())
15609 }
15610 }
15611 }
15612
15613 if (val < health)
15614 SetHealth(val);
15615}
@ 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(), GROUP_UPDATE_FLAG_MAX_HP, GROUP_UPDATE_FLAG_PET_MAX_HP, Object::IsPlayer(), Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetHealth(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_MAXHEALTH.

Referenced by boss_xt002::boss_xt002AI::DoAction(), Spell::EffectSummonType(), 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(), npc_pet_hunter_snake_trap::UpdateAI(), Creature::UpdateMaxHealth(), Guardian::UpdateMaxHealth(), and Player::UpdateMaxHealth().

◆ SetMaxPower()

void Unit::SetMaxPower ( Powers  power,
uint32  val 
)
15669{
15670 uint32 cur_power = GetPower(power);
15671 SetStatInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power, val);
15672
15673 // group update
15674 if (IsPlayer())
15675 {
15676 Player* player = ToPlayer();
15677 if (getPowerType() == power && player->NeedSendSpectatorData())
15678 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15679
15680 if (player->GetGroup())
15682 }
15683 else if (Pet* pet = ToCreature()->ToPet())
15684 {
15685 if (pet->isControlled())
15686 {
15687 Unit* owner = GetOwner();
15688 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15690 }
15691 }
15692
15693 if (val < cur_power)
15694 SetPower(power, val);
15695}
@ 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(), GROUP_UPDATE_FLAG_MAX_POWER, GROUP_UPDATE_FLAG_PET_MAX_POWER, Object::IsPlayer(), Player::NeedSendSpectatorData(), POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetPower(), Object::SetStatInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), 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::HandleSummon(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), Creature::SelectLevel(), setPowerType(), Creature::UpdateMaxPower(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ SetMinion()

void Unit::SetMinion ( Minion minion,
bool  apply 
)
10730{
10731 LOG_DEBUG("entities.unit", "SetMinion {} for {}, apply {}", minion->GetEntry(), GetEntry(), apply);
10732
10733 if (apply)
10734 {
10735 if (minion->GetOwnerGUID())
10736 {
10737 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10738 return;
10739 }
10740
10741 minion->SetOwnerGUID(GetGUID());
10742
10743 m_Controlled.insert(minion);
10744
10745 if (IsPlayer())
10746 {
10747 minion->m_ControlledByPlayer = true;
10749 }
10750
10751 // Can only have one pet. If a new one is summoned, dismiss the old one.
10752 if (minion->IsGuardianPet())
10753 {
10754 if (Guardian* oldPet = GetGuardianPet())
10755 {
10756 if (oldPet != minion && (oldPet->IsPet() || minion->IsPet() || oldPet->GetEntry() != minion->GetEntry()))
10757 {
10758 // remove existing minion pet
10759 if (Pet* oldPetAsPet = oldPet->ToPet())
10760 {
10761 oldPetAsPet->Remove(PET_SAVE_NOT_IN_SLOT);
10762 }
10763 else
10764 {
10765 oldPet->UnSummon();
10766 }
10767
10768 SetPetGUID(minion->GetGUID());
10770 }
10771 }
10772 else
10773 {
10774 SetPetGUID(minion->GetGUID());
10776 }
10777 }
10778
10780 {
10782 }
10783
10784 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10785 {
10786 SetCritterGUID(minion->GetGUID());
10787 }
10788
10789 // PvP, FFAPvP
10791
10792 // Ghoul pets have energy instead of mana (is anywhere better place for this code?)
10793 if (minion->IsPetGhoul() || minion->GetEntry() == 24207 /*ENTRY_ARMY_OF_THE_DEAD*/)
10794 minion->setPowerType(POWER_ENERGY);
10795
10796 if (IsPlayer())
10797 {
10798 // Send infinity cooldown - client does that automatically but after relog cooldown needs to be set again
10799 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10800
10801 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10802 ToPlayer()->AddSpellAndCategoryCooldowns(spellInfo, 0, nullptr, true);
10803 }
10804 }
10805 else
10806 {
10807 if (minion->GetOwnerGUID() != GetGUID())
10808 {
10809 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10810 return;
10811 }
10812
10813 m_Controlled.erase(minion);
10814
10815 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10816 {
10817 if (GetCritterGUID() == minion->GetGUID())
10819 }
10820
10821 if (minion->IsGuardianPet())
10822 {
10823 if (GetPetGUID() == minion->GetGUID())
10825 }
10826 else if (minion->IsTotem())
10827 {
10828 // All summoned by totem minions must disappear when it is removed.
10829 if (SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(minion->ToTotem()->GetSpell()))
10830 {
10831 for (int i = 0; i < MAX_SPELL_EFFECTS; ++i)
10832 {
10833 if (spInfo->Effects[i].Effect != SPELL_EFFECT_SUMMON)
10834 continue;
10835
10836 RemoveAllMinionsByEntry(spInfo->Effects[i].MiscValue);
10837 }
10838 }
10839 }
10840
10841 if (IsPlayer())
10842 {
10843 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10844 // Remove infinity cooldown
10845 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10846 ToPlayer()->SendCooldownEvent(spellInfo);
10847
10848 // xinef: clear spell book
10849 if (m_Controlled.empty())
10851 }
10852
10853 //if (minion->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10854 {
10856 {
10857 // Check if there is another minion
10858 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10859 {
10860 // do not use this check, creature do not have charm guid
10861 //if (GetCharmGUID() == (*itr)->GetGUID())
10862 if (GetGUID() == (*itr)->GetCharmerGUID())
10863 continue;
10864
10865 //ASSERT((*itr)->GetOwnerGUID() == GetGUID());
10866 if ((*itr)->GetOwnerGUID() != GetGUID())
10867 {
10868 OutDebugInfo();
10869 (*itr)->OutDebugInfo();
10870 ABORT();
10871 }
10872 ASSERT((*itr)->IsCreature());
10873
10874 if (!(*itr)->HasUnitTypeMask(UNIT_MASK_CONTROLABLE_GUARDIAN))
10875 continue;
10876
10877 if (AddGuidValue(UNIT_FIELD_SUMMON, (*itr)->GetGUID()))
10878 {
10879 // show another pet bar if there is no charm bar
10880 if (IsPlayer() && !GetCharmGUID())
10881 {
10882 if ((*itr)->IsPet())
10884 else
10886 }
10887 }
10888 break;
10889 }
10890 }
10891 }
10892 }
10893}
@ PET_SAVE_NOT_IN_SLOT
Definition PetDefines.h:45
@ SPELL_EFFECT_SUMMON
Definition SharedDefines.h:806
@ SUMMON_TYPE_MINIPET
Definition SharedDefines.h:3299
bool IsGuardianPet() const
Definition TemporarySummon.cpp:391
bool IsPetGhoul() const
Definition TemporarySummon.h:85
void PetSpellInitialize()
Definition Player.cpp:9509
const SummonPropertiesEntry *const m_Properties
Definition TemporarySummon.h:64
uint32 GetSpell(uint8 slot=0) const
Definition Totem.h:59
void OutDebugInfo() const
Definition Unit.cpp:20267
ObjectGuid GetCritterGUID() const
Definition Unit.h:696
void SetOwnerGUID(ObjectGuid owner)
Definition Unit.cpp:10617
void SetCritterGUID(ObjectGuid guid)
Definition Unit.h:695
void setPowerType(Powers power)
Definition Unit.cpp:10019
void RemoveAllMinionsByEntry(uint32 entry)
Definition Unit.cpp:10907
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(), Object::GetGUID(), GetOwnerGUID(), GetPetGUID(), Totem::GetSpell(), Object::GetUInt32Value(), HasUnitTypeMask(), SpellInfo::IsCooldownStartedOnEvent(), Minion::IsGuardianPet(), IsPet(), Minion::IsPetGhoul(), Object::IsPlayer(), 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, UNIT_CREATED_BY_SPELL, UNIT_FIELD_BYTES_2, UNIT_FIELD_SUMMON, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_CONTROLABLE_GUARDIAN.

Referenced by Player::CreatePet(), 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
735{ SetFlag(UNIT_NPC_FLAGS, flags); }

References Object::SetFlag(), and UNIT_NPC_FLAGS.

Referenced by Vehicle::AddPassenger(), 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_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_akama_illidan::PathEndReached(), 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_deathstalker_fearleia::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_hyjal_jaina::hyjalJainaAI::Reset(), npc_hyjal_thrall::hyjalThrallAI::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::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_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(), Vehicle::Vehicle(), 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)
10618{
10619 if (GetOwnerGUID() == owner)
10620 return;
10621
10623 if (!owner)
10624 return;
10625
10626 m_applyResilience = !IsVehicle() && owner.IsPlayer();
10627
10628 // Update owner dependent fields
10629 Player* player = ObjectAccessor::GetPlayer(*this, owner);
10630 if (!player || !player->HaveAtClient(this)) // if player cannot see this unit yet, he will receive needed data with create object
10631 return;
10632
10634
10635 UpdateData udata;
10636 WorldPacket packet;
10637 BuildValuesUpdateBlockForPlayer(&udata, player);
10638 udata.BuildPacket(packet);
10639 player->SendDirectMessage(&packet);
10640
10642}
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition Object.cpp:257
void RemoveFieldNotifyFlag(uint16 flag)
Definition Object.h:196
void SetFieldNotifyFlag(uint16 flag)
Definition Object.h:195
bool HaveAtClient(WorldObject const *u) const
Definition Player.cpp:11389
Definition UpdateData.h:52
bool BuildPacket(WorldPacket &packet)
Definition UpdateData.cpp:48

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(), Player::LoadFromDB(), SetMinion(), and npc_grimstone::npc_grimstoneAI::UpdateEscortAI().

◆ SetPetGUID()

◆ SetPhaseMask()

void Unit::SetPhaseMask ( uint32  newPhaseMask,
bool  update 
)
overridevirtual

Reimplemented from WorldObject.

19083{
19084 if (newPhaseMask == GetPhaseMask())
19085 return;
19086
19087 if (IsInWorld())
19088 {
19089 // xinef: to comment, bellow line should be removed
19090 // pussywizard: goign to other phase (valithria, algalon) should not remove such auras
19091 //RemoveNotOwnSingleTargetAuras(newPhaseMask, true); // we can lost access to caster or target
19092
19093 if (!sScriptMgr->CanSetPhaseMask(this, newPhaseMask, update))
19094 return;
19095
19096 // modify hostile references for new phasemask, some special cases deal with hostile references themselves
19097 if (IsCreature() || (!ToPlayer()->IsGameMaster() && !ToPlayer()->GetSession()->PlayerLogout()))
19098 {
19099 HostileRefMgr& refMgr = getHostileRefMgr();
19100 HostileReference* ref = refMgr.getFirst();
19101
19102 while (ref)
19103 {
19104 if (Unit* unit = ref->GetSource()->GetOwner())
19105 if (Creature* creature = unit->ToCreature())
19106 refMgr.setOnlineOfflineState(creature, creature->InSamePhase(newPhaseMask));
19107
19108 ref = ref->next();
19109 }
19110
19111 // modify threat lists for new phasemask
19112 if (!IsPlayer())
19113 {
19116
19117 // merge expects sorted lists
19118 threatList.sort();
19119 offlineThreatList.sort();
19120 threatList.merge(offlineThreatList);
19121
19122 for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr)
19123 if (Unit* unit = (*itr)->getTarget())
19124 unit->getHostileRefMgr().setOnlineOfflineState(ToCreature(), unit->InSamePhase(newPhaseMask));
19125 }
19126 }
19127 }
19128
19129 WorldObject::SetPhaseMask(newPhaseMask, false);
19130
19131 if (!IsInWorld())
19132 {
19133 return;
19134 }
19135
19136 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); )
19137 {
19138 Unit* controlled = *itr;
19139 ++itr;
19140 if (controlled->IsCreature())
19141 {
19142 controlled->SetPhaseMask(newPhaseMask, true);
19143 }
19144 }
19145
19146 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
19147 {
19148 if (m_SummonSlot[i])
19149 {
19150 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
19151 {
19152 summon->SetPhaseMask(newPhaseMask, true);
19153 }
19154 }
19155 }
19156
19157 if (update)
19158 {
19160 }
19161}
Definition HostileRefMgr.h:31
void setOnlineOfflineState(bool isOnline)
Definition HostileRefMgr.cpp:98
HostileReference * getFirst()
Definition HostileRefMgr.h:59
HostileReference * next()
Definition ThreatMgr.h:115
FROM * GetSource() const
Definition Reference.h:97
ThreatContainer::StorageType const & GetOfflineThreatList() const
Definition ThreatMgr.h:274
Unit * GetOwner() const
Definition ThreatMgr.h:236
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition Unit.cpp:19082
virtual void SetPhaseMask(uint32 newPhaseMask, bool update)
Definition Object.cpp:2886
uint32 GetPhaseMask() const
Definition Object.h:452

References Map::GetCreature(), HostileRefMgr::getFirst(), getHostileRefMgr(), WorldObject::GetMap(), ThreatMgr::GetOfflineThreatList(), ThreatMgr::GetOwner(), WorldObject::GetPhaseMask(), Reference< TO, FROM >::GetSource(), ThreatMgr::GetThreatList(), GetThreatMgr(), WorldObject::InSamePhase(), Object::IsCreature(), Object::IsInWorld(), Object::IsPlayer(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, HostileReference::next(), HostileRefMgr::setOnlineOfflineState(), WorldObject::SetPhaseMask(), SetPhaseMask(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), and UpdateObjectVisibility().

Referenced by Pet::Create(), Creature::Create(), misc_commandscript::HandleAppearCommand(), modify_commandscript::HandleModifyPhaseCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), spell_wintergrasp_hide_small_elementals_aura::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 
)
15618{
15619 if (!fromRegenerate && GetPower(power) == val)
15620 return;
15621
15622 uint32 maxPower = GetMaxPower(power);
15623 if (maxPower < val)
15624 val = maxPower;
15625
15626 if (fromRegenerate)
15627 {
15630 }
15631 else
15633
15634 if (withPowerUpdate)
15635 {
15636 WorldPacket data(SMSG_POWER_UPDATE, 8 + 1 + 4);
15637 data << GetPackGUID();
15638 data << uint8(power);
15639 data << uint32(val);
15640 SendMessageToSet(&data, IsPlayer());
15641 }
15642
15643 // group update
15644 if (IsPlayer())
15645 {
15646 Player* player = ToPlayer();
15647 if (getPowerType() == power && player->NeedSendSpectatorData())
15648 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15649
15650 if (player->GetGroup())
15652 }
15653 else if (Pet* pet = ToCreature()->ToPet())
15654 {
15655 if (pet->isControlled())
15656 {
15657 Unit* owner = GetOwner();
15658 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15660 }
15661
15662 // Update the pet's character sheet with happiness damage bonus
15663 if (pet->getPetType() == HUNTER_PET && power == POWER_HAPPINESS)
15664 pet->UpdateDamagePhysical(BASE_ATTACK);
15665 }
15666}
@ GROUP_UPDATE_FLAG_PET_CUR_POWER
Definition Group.h:116
@ GROUP_UPDATE_FLAG_CUR_POWER
Definition Group.h:104
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition Util.h:619
void UpdateUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:663
void AddToObjectUpdateIfNeeded()
Definition Object.cpp:524
@ SMSG_POWER_UPDATE
Definition Opcodes.h:1182

References Object::AddToObjectUpdateIfNeeded(), AsUnderlyingType(), BASE_ATTACK, WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), Object::GetPackGUID(), GetPower(), getPowerType(), GROUP_UPDATE_FLAG_CUR_POWER, GROUP_UPDATE_FLAG_PET_CUR_POWER, HUNTER_PET, Object::IsPlayer(), 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(), 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_putricide_mutated_transformation::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::RemoveEnergy(), spell_igb_below_zero::RemovePassengers(), boss_curator::Reset(), boss_shade_of_aran::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)
10020{
10021 SetByteValue(UNIT_FIELD_BYTES_0, 3, new_powertype);
10022
10023 if (IsPlayer())
10024 {
10025 if (ToPlayer()->GetGroup())
10027 }
10028 else if (Pet* pet = ToCreature()->ToPet())
10029 {
10030 if (pet->isControlled())
10031 {
10032 Unit* owner = GetOwner();
10033 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
10035 }
10036 }
10037
10038 float powerMultiplier = 1.0f;
10039 if (!IsPet())
10040 if (Creature* creature = ToCreature())
10041 powerMultiplier = creature->GetCreatureTemplate()->ModMana;
10042
10043 switch (new_powertype)
10044 {
10045 default:
10046 case POWER_MANA:
10047 break;
10048 case POWER_RAGE:
10049 SetMaxPower(POWER_RAGE, uint32(std::ceil(GetCreatePowers(POWER_RAGE) * powerMultiplier)));
10050 SetPower(POWER_RAGE, 0);
10051 break;
10052 case POWER_FOCUS:
10053 SetMaxPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10054 SetPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10055 break;
10056 case POWER_ENERGY:
10057 SetMaxPower(POWER_ENERGY, uint32(std::ceil(GetCreatePowers(POWER_ENERGY) * powerMultiplier)));
10058 break;
10059 case POWER_HAPPINESS:
10060 SetMaxPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10061 SetPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10062 break;
10063 }
10064
10065 if (Player const* player = ToPlayer())
10066 if (player->NeedSendSpectatorData())
10067 {
10068 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "PWT", new_powertype);
10069 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetMaxPower(new_powertype) / 10 : GetMaxPower(new_powertype));
10070 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetPower(new_powertype) / 10 : GetPower(new_powertype));
10071 }
10072}
@ 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:15668

References WorldObject::FindMap(), GetCreatePowers(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), GetPower(), GROUP_UPDATE_FLAG_PET_POWER_TYPE, GROUP_UPDATE_FLAG_POWER_TYPE, IsPet(), Object::IsPlayer(), 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(), and UNIT_FIELD_BYTES_0.

Referenced by Pet::CreateBaseAtTamed(), AuraEffect::HandleAuraModShapeshift(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitDataForForm(), Vehicle::Install(), Pet::LoadPetFromDB(), npc_toc_rogue::npc_toc_rogueAI::npc_toc_rogueAI(), SetMinion(), and Player::SummonPet().

◆ SetPvP()

◆ setRace()

void Unit::setRace ( uint8  race)
21051{
21052 if (IsPlayer())
21053 m_race = race;
21054}

References Object::IsPlayer(), and m_race.

◆ SetRedirectThreat()

void Unit::SetRedirectThreat ( ObjectGuid  guid,
uint32  pct 
)
inline
919{ _redirectThreatInfo.Set(guid, pct); }
void Set(ObjectGuid guid, uint32 pct)
Definition ThreatMgr.h:301

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
18238{
18239 if (apply)
18240 {
18241 if (m_rootTimes > 0) // blizzard internal check?
18242 m_rootTimes++;
18243
18244 // MOVEMENTFLAG_ROOT cannot be used in conjunction with MOVEMENTFLAG_MASK_MOVING (tested 3.3.5a)
18245 // this will freeze clients. That's why we remove MOVEMENTFLAG_MASK_MOVING before
18246 // setting MOVEMENTFLAG_ROOT
18248
18249 if (IsFalling())
18250 {
18252 }
18253 else
18254 {
18256 }
18257
18258 // Creature specific
18259 if (!IsPlayer())
18260 {
18261 if (isStun && movespline->Finalized())
18262 {
18264 }
18265 else
18266 {
18267 StopMoving();
18268 }
18269 }
18270
18271 if (m_movedByPlayer)
18272 {
18273 WorldPacket data(SMSG_FORCE_MOVE_ROOT, GetPackGUID().size() + 4);
18274 data << GetPackGUID();
18275 data << m_rootTimes;
18277 }
18278 else
18279 {
18281 data << GetPackGUID();
18282 SendMessageToSet(&data, true);
18283 }
18284 }
18285 else
18286 {
18288
18289 if (!HasUnitState(UNIT_STATE_STUNNED)) // prevent moving if it also has stun effect
18290 {
18291 if (m_movedByPlayer)
18292 {
18294 data << GetPackGUID();
18295 data << m_rootTimes;
18297 }
18298 else
18299 {
18301 data << GetPackGUID();
18302 SendMessageToSet(&data, true);
18303 }
18304 }
18305 }
18306}
@ MOVEMENTFLAG_PENDING_ROOT
Definition UnitDefines.h:385
void StopMovingOnCurrentPos()
Definition Unit.cpp:16722
@ SMSG_FORCE_MOVE_UNROOT
Definition Opcodes.h:264
@ SMSG_FORCE_MOVE_ROOT
Definition Opcodes.h:262
@ SMSG_SPLINE_MOVE_ROOT
Definition Opcodes.h:824

References AddUnitMovementFlag(), Movement::MoveSpline::Finalized(), Object::GetPackGUID(), HasUnitState(), IsFalling(), Object::IsPlayer(), 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(), and UNIT_STATE_STUNNED.

Referenced by WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), SetControlled(), and SetStunned().

◆ SetShapeshiftForm()

void Unit::SetShapeshiftForm ( ShapeshiftForm  form)
21293{
21295 sScriptMgr->OnUnitSetShapeshiftForm((Unit*)this, form);
21296}

References Object::SetByteValue(), sScriptMgr, and UNIT_FIELD_BYTES_2.

Referenced by AuraEffect::HandleAuraModShapeshift(), and reset_commandscript::HandleResetStatsOrLevelHelper().

◆ SetSheath()

◆ SetSpeed()

void Unit::SetSpeed ( UnitMoveType  mtype,
float  rate,
bool  forced = false 
)
14481{
14482 if (rate < 0)
14483 rate = 0.0f;
14484
14485 // Update speed only on change
14486 if (m_speed_rate[mtype] == rate)
14487 return;
14488
14489 m_speed_rate[mtype] = rate;
14490
14492
14493 WorldPacket data;
14494 if (!forced)
14495 {
14496 switch (mtype)
14497 {
14498 case MOVE_WALK:
14499 data.Initialize(MSG_MOVE_SET_WALK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14500 break;
14501 case MOVE_RUN:
14502 data.Initialize(MSG_MOVE_SET_RUN_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14503 break;
14504 case MOVE_RUN_BACK:
14505 data.Initialize(MSG_MOVE_SET_RUN_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14506 break;
14507 case MOVE_SWIM:
14508 data.Initialize(MSG_MOVE_SET_SWIM_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14509 break;
14510 case MOVE_SWIM_BACK:
14511 data.Initialize(MSG_MOVE_SET_SWIM_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14512 break;
14513 case MOVE_TURN_RATE:
14514 data.Initialize(MSG_MOVE_SET_TURN_RATE, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14515 break;
14516 case MOVE_FLIGHT:
14517 data.Initialize(MSG_MOVE_SET_FLIGHT_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14518 break;
14519 case MOVE_FLIGHT_BACK:
14520 data.Initialize(MSG_MOVE_SET_FLIGHT_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14521 break;
14522 case MOVE_PITCH_RATE:
14523 data.Initialize(MSG_MOVE_SET_PITCH_RATE, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14524 break;
14525 default:
14526 LOG_ERROR("entities.unit", "Unit::SetSpeed: Unsupported move type ({}), data not sent to client.", mtype);
14527 return;
14528 }
14529
14530 data << GetPackGUID();
14531 BuildMovementPacket(&data);
14532 data << float(GetSpeed(mtype));
14533 SendMessageToSet(&data, true);
14534 }
14535 else
14536 {
14537 if (IsPlayer())
14538 {
14539 // register forced speed changes for WorldSession::HandleForceSpeedChangeAck
14540 // and do it only for real sent packets and use run for run/mounted as client expected
14541 ++ToPlayer()->m_forced_speed_changes[mtype];
14542
14543 // Xinef: update speed of pet also
14544 if (!IsInCombat())
14545 {
14546 Unit* pet = ToPlayer()->GetPet();
14547 if (!pet)
14548 pet = GetCharm();
14549
14550 // xinef: do not affect vehicles and possesed pets
14551 if (pet && (pet->HasUnitFlag(UNIT_FLAG_POSSESSED) || pet->IsVehicle()))
14552 pet = nullptr;
14553
14554 if (pet && pet->IsCreature() && !pet->IsInCombat() && pet->GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE)
14555 pet->UpdateSpeed(mtype, forced);
14556 if (Unit* critter = ObjectAccessor::GetUnit(*this, GetCritterGUID()))
14557 critter->UpdateSpeed(mtype, forced);
14558 }
14559 ToPlayer()->SetCanTeleport(true);
14560 }
14561
14562 switch (mtype)
14563 {
14564 case MOVE_WALK:
14566 break;
14567 case MOVE_RUN:
14569 break;
14570 case MOVE_RUN_BACK:
14572 break;
14573 case MOVE_SWIM:
14575 break;
14576 case MOVE_SWIM_BACK:
14578 break;
14579 case MOVE_TURN_RATE:
14581 break;
14582 case MOVE_FLIGHT:
14584 break;
14585 case MOVE_FLIGHT_BACK:
14587 break;
14588 case MOVE_PITCH_RATE:
14590 break;
14591 default:
14592 LOG_ERROR("entities.unit", "Unit::SetSpeed: Unsupported move type ({}), data not sent to client.", mtype);
14593 return;
14594 }
14595 data << GetPackGUID();
14596 data << (uint32)0; // moveEvent, NUM_PMOVE_EVTS = 0x39
14597 if (mtype == MOVE_RUN)
14598 data << uint8(0); // new 2.1.0
14599 data << float(GetSpeed(mtype));
14600 SendMessageToSet(&data, true);
14601 }
14602}
@ FOLLOW_MOTION_TYPE
Definition MotionMaster.h:54
@ MOVE_TURN_RATE
Definition UnitDefines.h:354
@ MOVE_FLIGHT_BACK
Definition UnitDefines.h:356
@ MOVE_SWIM_BACK
Definition UnitDefines.h:353
@ MOVE_PITCH_RATE
Definition UnitDefines.h:357
@ MOVE_RUN_BACK
Definition UnitDefines.h:351
@ MOVE_WALK
Definition UnitDefines.h:349
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition MotionMaster.cpp:913
uint8 m_forced_speed_changes[MAX_MOVE_TYPE]
Definition Player.h:2410
float GetSpeed(UnitMoveType mtype) const
Definition Unit.cpp:14475
void propagateSpeedChange()
Definition Unit.h:1665
@ 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

References BuildMovementPacket(), FOLLOW_MOTION_TYPE, GetCharm(), GetCritterGUID(), MotionMaster::GetCurrentMovementGeneratorType(), GetMotionMaster(), Object::GetPackGUID(), Player::GetPet(), GetSpeed(), ObjectAccessor::GetUnit(), HasUnitFlag(), WorldPacket::Initialize(), Object::IsCreature(), IsInCombat(), Object::IsPlayer(), 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(), UNIT_FLAG_POSSESSED, and UpdateSpeed().

Referenced by Battleground::AddCreature(), boss_bug_trio::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::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(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::FlyAway(), boss_volkhan::boss_volkhanAI::GoToAnvil(), misc_commandscript::HandleDismountCommand(), spell_mount_check_aura::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::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(), npc_zuljin_vortex::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::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)
16760{
16762
16763 if (IsStandState())
16765
16766 if (IsPlayer())
16767 {
16769 data << (uint8)state;
16770 ToPlayer()->GetSession()->SendPacket(&data);
16771 }
16772}
@ UNIT_BYTES_1_OFFSET_STAND_STATE
Definition UnitDefines.h:23
@ SMSG_STANDSTATE_UPDATE
Definition Opcodes.h:699

References AURA_INTERRUPT_FLAG_NOT_SEATED, Player::GetSession(), Object::IsPlayer(), IsStandState(), RemoveAurasWithInterruptFlags(), WorldSession::SendPacket(), Object::SetByteValue(), SMSG_STANDSTATE_UPDATE, Object::ToPlayer(), UNIT_BYTES_1_OFFSET_STAND_STATE, and UNIT_FIELD_BYTES_1.

Referenced by _ApplyAura(), 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::DamageTaken(), boss_alar::DamageTaken(), boss_thekal::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_nightbane::DoAction(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_the_lurker_below::DoAction(), boss_leotheras_the_blind::DoAction(), npc_madrigosa::DoAction(), boss_illidan_stormrage::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(), boss_ahune::Emerge(), UtherBatteredHiltEvent::Execute(), SuckBackEvent::Execute(), boss_ahune::ExecuteEvent(), boss_ingvar_the_plunderer::FeignDeath(), WorldSession::HandleAlterAppearance(), WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandleMovementOpcodes(), WorldSession::HandlePlayerLoginFromDB(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStandStateChangeOpcode(), spell_q11322_q11317_the_cleansing::if(), DistractMovementGenerator::Initialize(), boss_felmyst::InitializeAI(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), boss_kalecgos::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(), 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_madrigosa(), spell_love_is_in_the_air_romantic_picnic::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(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), Spell::prepare(), PretendToDie(), boss_alar::PretendToDie(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_vaelastrasz::boss_vaelAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_kalecgos::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_illidan_stormrage::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_harrison_jones::SpellHit(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), advisor_baseAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), boss_felmyst::StartIntro(), boss_ahune::Submerge(), 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::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::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::UpdateAI(), npc_thassarian2::npc_thassarian2AI::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
18190{
18192 {
18193 return;
18194 }
18195
18196 if (apply)
18197 {
18198 SetTarget();
18200
18201 if (IsPlayer())
18202 {
18204 }
18205
18206 SetRooted(true, true);
18207
18208 CastStop();
18209 }
18210 else
18211 {
18212 if (IsAlive() && GetVictim())
18214
18215 if (IsCreature())
18216 {
18217 // don't remove UNIT_FLAG_STUNNED for pet when owner is mounted (disabled pet's interface)
18218 Unit* owner = GetOwner();
18219 if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted())
18221
18222 // Xinef: same for charmed npcs
18223 owner = GetCharmer();
18224 if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted())
18226 }
18227 else
18229
18230 if (!HasUnitState(UNIT_STATE_ROOT)) // prevent moving if it also has root effect
18231 {
18232 SetRooted(false, true);
18233 }
18234 }
18235}

References CastStop(), GetCharmer(), Object::GetGUID(), GetOwner(), GetVictim(), HasUnitState(), IsAlive(), Object::IsCreature(), IsMounted(), Object::IsPlayer(), RemoveUnitFlag(), SetRooted(), SetStandState(), SetTarget(), SetUnitFlag(), Object::ToPlayer(), 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
1887{ m_transform = spellid;}

References m_transform.

Referenced by AuraEffect::HandleAuraTransform().

◆ SetUInt32Value()

void Unit::SetUInt32Value ( uint16  index,
uint32  value 
)
21354{
21355 Object::SetUInt32Value(index, value);
21356
21357 switch (index)
21358 {
21359 // Invalidating the cache on health change should fix an issue where the client sees dead NPCs when they are not.
21360 // We might also need to invalidate the cache for some other fields as well.
21361 case UNIT_FIELD_HEALTH:
21363 break;
21364 }
21365}
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:650
void InvalidateValuesUpdateCache()
Definition Unit.h:2147

References InvalidateValuesUpdateCache(), Object::SetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_LoadDailyQuestStatus(), Player::_LoadSkills(), Player::AddItemToBuyBackSlot(), Attack(), Player::CheckAreaExploreAndOutdoor(), Spell::CheckItems(), Player::Create(), Pet::CreateBaseAtTamed(), Player::CreatePet(), Player::CreatePet(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), Dismount(), npc_harrison_jones::DoAction(), boss_thekal::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_pathaleon_the_calculator::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_illidan_stormrage::DoAction(), Player::DuelComplete(), Spell::EffectSummonPet(), Spell::EffectTameCreature(), boss_jindo::EnterEvadeMode(), boss_zuljin::EnterPhase(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraTransform(), character_commandscript::HandleCharacterLevel(), debug_commandscript::HandleDebugMod32ValueCommand(), debug_commandscript::HandleDebugUpdateCommand(), spell_dk_dancing_rune_weapon_visual::HandleEffectApply(), spell_gen_model_visible::HandleEffectApply(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_baby_murloc::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), misc_commandscript::HandleHideAreaCommand(), modify_commandscript::HandleModifyStandStateCommand(), modify_commandscript::HandleMorphMountCommand(), WorldSession::HandleMovementOpcodes(), AuraEffect::HandleNoReagentUseAura(), npc_commandscript::HandleNpcPlayEmoteCommand(), WorldSession::HandlePetRename(), reset_commandscript::HandleResetHonorCommand(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), WorldSession::HandleSelfResOpcode(), WorldSession::HandleSetTitleOpcode(), WorldSession::HandleSetWatchedFactionOpcode(), misc_commandscript::HandleShowAreaCommand(), WorldSession::HandleTextEmoteOpcode(), titles_commandscript::HandleTitlesCurrentCommand(), titles_commandscript::HandleTitlesRemoveCommand(), titles_commandscript::HandleTitlesSetMaskCommand(), Player::InitGlyphsForLevel(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Initialize(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), InitTamedPet(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustDied(), boss_xt002::boss_xt002AI::JustEngagedWith(), npc_dragonflayer_forge_master::JustEngagedWith(), boss_jindo::JustEngagedWith(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_akama_illidan::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Kill(), Creature::LoadCreaturesAddon(), Creature::LoadEquipment(), Player::LoadFromDB(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), Player::ModifySkillBonus(), Mount(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), npc_harrison_jones::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), npc_tirion_fordring_tft::npc_tirion_fordringAI::MovementInform(), npc_akama_illidan::MovementInform(), npc_thassarian2::npc_thassarian2AI::MovementInform(), npc_apothecary_genericAI::MovementInform(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::npc_pos_martin_or_gorkun_secondAI(), spell_gen_clone_weapon_aura::OnApply(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_ame::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), spell_gen_clone_weapon_aura::OnRemove(), npc_eastvale_peasent::PathEndReached(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), Player::RemoveAmmo(), Player::RemoveItemFromBuyBackSlot(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), ReplaceAllDynamicFlags(), ReplaceAllNpcFlags(), Player::ReplaceAllPlayerFlags(), ReplaceAllUnitFlags(), ReplaceAllUnitFlags2(), boss_ragnaros::boss_ragnarosAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_zuljin::Reset(), boss_arlokk::boss_arlokkAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), npc_hor_leader::npc_hor_leaderAI::Reset(), boss_malygos::boss_malygosAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_amberpine_woodsman::npc_amberpine_woodsmanAI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetDailyQuestStatus(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), Spell::SendChannelStart(), Spell::SendChannelUpdate(), Player::SetAmmo(), Player::SetArenaPoints(), Player::SetArenaTeamInfoField(), SetCharmedBy(), SetCreateHealth(), SetCreateMana(), Player::SetCurrentTitle(), Player::SetDailyQuestStatus(), npc_ulduar_vx001::npc_ulduar_vx001AI::SetData(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::SetData(), npc_eastvale_peasent::SetData(), setDeathState(), Player::setDeathState(), SetDisplayId(), SetEmoteState(), SetFaction(), Player::SetFreePrimaryProfessions(), Player::SetFreeTalentPoints(), Player::SetGlyph(), Player::SetGlyphSlot(), SetHealth(), Player::SetHonorPoints(), Player::SetInGuild(), SetLevel(), SetMaxHealth(), Player::SetMoney(), SetNativeDisplayId(), CharmInfo::SetPetNumber(), Player::SetQuestSlot(), Player::SetQuestSlotTimer(), Player::SetRank(), Player::SetRestBonus(), Player::SetSkill(), SetVirtualItem(), Player::SetVisibleItemSlot(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Map::SummonCreature(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), Player::SummonPet(), Player::SwapQuestSlot(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_amberpine_woodsman::npc_amberpine_woodsmanAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), Player::UpdateArmorPenetration(), Player::UpdateDuelFlag(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), Player::UpdateExpertise(), Player::UpdateHonorFields(), Player::UpdateRating(), Player::UpdateShieldBlockValue(), Player::UpdateSkill(), Player::UpdateSkillPro(), Player::UpdateSkillsForLevel(), Player::UpdateSkillsToMaxSkillsForLevel(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), and npc_ranger_lilatha::WaypointReached().

◆ SetUnitFlag()

void Unit::SetUnitFlag ( UnitFlags  flags)
inline

UnitFlags available in UnitDefines.h.

719{ SetFlag(UNIT_FIELD_FLAGS, flags); }

References Object::SetFlag(), and UNIT_FIELD_FLAGS.

Referenced by BattlegroundAV::AddAVCreature(), Vehicle::AddPassenger(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::AddPortals(), Creature::AllLootRemovedFromCorpse(), npc_doctor::npc_doctorAI::BeginEvent(), boss_jarien::boss_jarien(), boss_sothos::boss_sothos(), GameObject::CastSpell(), Player::Create(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_muru::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::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::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), advisor_baseAI::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_felblood_kaelthas::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(), npc_amanishi_lookout::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_frozen_core::DoAction(), boss_kalecgos::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(), boss_illidan_stormrage::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_anubarak_trial::boss_anubarak_trialAI::EnterEvadeMode(), boss_jaraxxus::boss_jaraxxusAI::EnterEvadeMode(), boss_gormok::boss_gormokAI::EnterEvadeMode(), boss_jormungarAI::EnterEvadeMode(), boss_icehowl::boss_icehowlAI::EnterEvadeMode(), SACDeactivateEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), boss_ingvar_the_plunderer::FeignDeath(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::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::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::InitializeAI(), npc_general_andorov::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), Player::InitStatsForLevel(), boss_kologarn::boss_kologarnAI::JustDied(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustEngagedWith(), boss_mimiron::boss_mimironAI::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_vaelastrasz::boss_vaelAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Mount(), npc_shattered_hand_scout::MoveInLineOfSight(), boss_kaelthas::MoveInLineOfSight(), npc_batrider::npc_batrider(), npc_blade_of_azzinoth::npc_blade_of_azzinoth(), npc_chess_move_trigger::npc_chess_move_trigger(), 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_aura::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(), boss_alar::PretendToDie(), Creature::RefreshSwimmingFlag(), boss_keristrasza::RemovePrison(), npc_grimstone::npc_grimstoneAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_nefarian::Reset(), boss_nightbane::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_kiljaeden::Reset(), npc_zuljin_vortex::Reset(), npc_hallows_end_soh::Reset(), npc_ancient_wisp::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(), 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::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(), npc_netherspite_infernal::SpellHit(), npc_harrison_jones::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(), npc_giant_claw_tentacle::Submerge(), boss_ouro::Submerge(), boss_ahune::Submerge(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_madrigosa::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(), 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()

◆ SetVirtualItem()

void Unit::SetVirtualItem ( uint32  slot,
uint32  itemId 
)
21207{
21208 if (slot >= MAX_EQUIPMENT_ITEMS)
21209 return;
21210
21212}

References MAX_EQUIPMENT_ITEMS, SetUInt32Value(), and UNIT_VIRTUAL_ITEM_SLOT_ID.

Referenced by ScriptedAI::SetEquipmentSlots().

◆ SetVisible()

void Unit::SetVisible ( bool  x)
14284{
14285 if (!x)
14287 else
14289
14291}
@ SEC_GAMEMASTER
Definition Common.h:59

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 Creature::Create(), boss_muru::DamageTaken(), boss_alar::DamageTaken(), spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), boss_archimonde::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::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::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), npc_xt002_heart::npc_xt002_heartAI::JustDied(), 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_madrigosa(), 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::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_archimonde::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::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(), boss_vazruden_the_herald::Reset(), npc_enslaved_netherwing_drake::Reset(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SetData(), Battlefield::ShowNpc(), boss_ionar::boss_ionarAI::Split(), boss_warchief_kargath_bladefist::SummonedCreatureDies(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Update(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::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::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::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.

20586{
20587 if (enable == IsWalking())
20588 return false;
20589
20590 if (enable)
20592 else
20594
20596 return true;
20597}
bool IsWalking() const
Definition Unit.h:1634

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

Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players.

Reimplemented in Player, and Creature.

20665{
20667 return false;
20668
20669 if (enable)
20671 else
20673
20674 return true;
20675}
@ MOVEMENTFLAG_WATERWALKING
Definition UnitDefines.h:393

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_WATERWALKING, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraWaterWalk(), debug_commandscript::HandleDebugMoveflagsCommand(), Player::SetWaterWalking(), and Creature::SetWaterWalking().

◆ SpellBaseDamageBonusDone()

int32 Unit::SpellBaseDamageBonusDone ( SpellSchoolMask  schoolMask)
11982{
11983 int32 DoneAdvertisedBenefit = 0;
11984
11986 for (AuraEffectList::const_iterator i = mDamageDone.begin(); i != mDamageDone.end(); ++i)
11987 if (((*i)->GetMiscValue() & schoolMask) != 0 &&
11988 (*i)->GetSpellInfo()->EquippedItemClass == -1 &&
11989 // -1 == any item class (not wand then)
11990 (*i)->GetSpellInfo()->EquippedItemInventoryTypeMask == 0)
11991 // 0 == any inventory type (not wand then)
11992 DoneAdvertisedBenefit += (*i)->GetAmount();
11993
11994 if (IsPlayer())
11995 {
11996 // Base value
11997 DoneAdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
11998
11999 // Damage bonus from stats
12001 for (AuraEffectList::const_iterator i = mDamageDoneOfStatPercent.begin(); i != mDamageDoneOfStatPercent.end(); ++i)
12002 {
12003 if ((*i)->GetMiscValue() & schoolMask)
12004 {
12005 // stat used stored in miscValueB for this aura
12006 Stats usedStat = Stats((*i)->GetMiscValueB());
12007 DoneAdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
12008 }
12009 }
12010 // ... and attack power
12012 for (AuraEffectList::const_iterator i = mDamageDonebyAP.begin(); i != mDamageDonebyAP.end(); ++i)
12013 if ((*i)->GetMiscValue() & schoolMask)
12014 DoneAdvertisedBenefit += int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount()));
12015 }
12016 return DoneAdvertisedBenefit;
12017}
@ 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:1979

References BASE_ATTACK, CalculatePct(), GetAuraEffectsByType(), Player::GetBaseSpellPowerBonus(), GetStat(), GetTotalAttackPowerValue(), Object::IsPlayer(), SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, and Object::ToPlayer().

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 
)
12020{
12021 int32 TakenAdvertisedBenefit = 0;
12022
12024 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
12025 if (((*i)->GetMiscValue() & schoolMask) != 0)
12026 {
12027 // Xinef: if we have DoT damage type and aura has charges, check if it affects DoTs
12028 // Xinef: required for hemorrhage & rupture / garrote
12029 if (isDoT && (*i)->GetBase()->IsUsingCharges() && !((*i)->GetSpellInfo()->ProcFlags & PROC_FLAG_TAKEN_PERIODIC))
12030 continue;
12031
12032 TakenAdvertisedBenefit += (*i)->GetAmount();
12033 }
12034
12035 return TakenAdvertisedBenefit;
12036}

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)
12747{
12748 int32 AdvertisedBenefit = 0;
12749
12751 for (AuraEffectList::const_iterator i = mHealingDone.begin(); i != mHealingDone.end(); ++i)
12752 if (!(*i)->GetMiscValue() || ((*i)->GetMiscValue() & schoolMask) != 0)
12753 AdvertisedBenefit += (*i)->GetAmount();
12754
12755 // Healing bonus of spirit, intellect and strength
12756 if (IsPlayer())
12757 {
12758 // Base value
12759 AdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
12760
12761 // Healing bonus from stats
12763 for (AuraEffectList::const_iterator i = mHealingDoneOfStatPercent.begin(); i != mHealingDoneOfStatPercent.end(); ++i)
12764 {
12765 // stat used dependent from misc value (stat index)
12766 Stats usedStat = Stats((*i)->GetSpellInfo()->Effects[(*i)->GetEffIndex()].MiscValue);
12767 AdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
12768 }
12769
12770 // ... and attack power
12772 for (AuraEffectList::const_iterator i = mHealingDonebyAP.begin(); i != mHealingDonebyAP.end(); ++i)
12773 if ((*i)->GetMiscValue() & schoolMask)
12774 AdvertisedBenefit += int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount()));
12775 }
12776 return AdvertisedBenefit;
12777}
@ 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::IsPlayer(), SPELL_AURA_MOD_HEALING_DONE, SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT, and Object::ToPlayer().

Referenced by CalculateSpellAmount(), SpellHealingBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellBaseHealingBonusTaken()

int32 Unit::SpellBaseHealingBonusTaken ( SpellSchoolMask  schoolMask)
12780{
12781 int32 AdvertisedBenefit = 0;
12782
12784 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
12785 if (((*i)->GetMiscValue() & schoolMask) != 0)
12786 AdvertisedBenefit += (*i)->GetAmount();
12787
12788 return AdvertisedBenefit;
12789}
@ 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
12326{
12327 // Calculate critical bonus
12328 int32 crit_bonus = damage;
12329 float crit_mod = 0.0f;
12330
12331 switch (spellProto->DmgClass)
12332 {
12333 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12336 crit_bonus += damage;
12337 break;
12338 default:
12339 crit_bonus += damage / 2; // for spells is 50%
12340 break;
12341 }
12342
12343 if (caster)
12344 {
12345 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellProto->GetSchoolMask());
12346
12347 if (victim)
12348 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, victim->GetCreatureTypeMask());
12349
12350 if (crit_bonus != 0 && crit_mod != 0.0f)
12351 AddPct(crit_bonus, crit_mod);
12352
12353 crit_bonus -= damage;
12354
12355 // adds additional damage to critBonus (from talents)
12356 if (Player* modOwner = caster->GetSpellModOwner())
12357 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12358
12359 crit_bonus += damage;
12360 }
12361
12362 return crit_bonus;
12363}

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
12366{
12367 // Calculate critical bonus
12368 int32 crit_bonus;
12369 switch (spellProto->DmgClass)
12370 {
12371 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12374 crit_bonus = damage;
12375 break;
12376 default:
12377 crit_bonus = damage / 2; // for spells is 50%
12378 break;
12379 }
12380
12381 if (caster)
12382 {
12383 if (victim)
12384 {
12385 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
12386 crit_bonus = int32(crit_bonus * caster->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, creatureTypeMask));
12387 }
12388
12389 // adds additional damage to critBonus (from talents)
12390 // xinef: used for death knight death coil
12391 if (Player* modOwner = caster->GetSpellModOwner())
12392 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12393 }
12394
12395 if (crit_bonus > 0)
12396 damage += crit_bonus;
12397
12398 if (caster)
12399 damage = int32(float(damage) * caster->GetTotalAuraMultiplier(SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT));
12400
12401 return damage;
12402}
@ 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 
)
11660{
11661 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11662 return pdamage;
11663
11664 // Some spells don't benefit from done mods
11665 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11666 return pdamage;
11667
11668 // For totems get damage bonus from owner
11669 if (IsCreature())
11670 {
11671 if (IsTotem())
11672 {
11673 if (Unit* owner = GetOwner())
11674 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, effIndex, TotalMod, stack);
11675 }
11676 // Dancing Rune Weapon...
11677 else if (GetEntry() == 27893)
11678 {
11679 if (Unit* owner = GetOwner())
11680 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, TotalMod, stack) / 2;
11681 }
11682 }
11683
11684 // Done total percent damage auras
11685 float ApCoeffMod = 1.0f;
11686 int32 DoneTotal = 0;
11687 float DoneTotalMod = TotalMod ? TotalMod : SpellPctDamageModsDone(victim, spellProto, damagetype);
11688
11689 // Config : RATE_CREATURE_X_SPELLDAMAGE & Do Not Modify Pet/Guardian/Mind Controled Damage
11691 DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank);
11692
11693 // Some spells don't benefit from pct done mods
11694 if (!spellProto->HasAttribute(SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS))
11695 {
11696 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11697 // Add flat bonus from spell damage versus
11699 }
11700
11701 // done scripted mod (take it from owner)
11702 Unit* owner = GetOwner() ? GetOwner() : this;
11703 int32 DoneAdvertisedBenefit = 0;
11704 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11705 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11706 {
11707 if (!(*i)->IsAffectedOnSpell(spellProto))
11708 continue;
11709
11710 switch ((*i)->GetMiscValue())
11711 {
11712 case 4418: // Increased Shock Damage
11713 case 4554: // Increased Lightning Damage
11714 case 4555: // Improved Moonfire
11715 case 5142: // Increased Lightning Damage
11716 case 5147: // Improved Consecration / Libram of Resurgence
11717 case 5148: // Idol of the Shooting Star
11718 case 6008: // Increased Lightning Damage
11719 case 8627: // Totem of Hex
11720 {
11721 DoneAdvertisedBenefit += (*i)->GetAmount();
11722 break;
11723 }
11724 }
11725 }
11726
11727 // Custom scripted damage
11728 switch (spellProto->SpellFamilyName)
11729 {
11730 case SPELLFAMILY_DRUID:
11731 {
11732 // Insect Swarm vs Item - Druid T8 Balance Relic
11733 if (spellProto->SpellFamilyFlags[0] & 0x00200000)
11734 {
11735 if (AuraEffect const* relicAurEff = GetAuraEffect(64950, EFFECT_0))
11736 {
11737 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11738 }
11739 }
11740
11741 // Nourish vs Idol of the Flourishing Life
11742 if (spellProto->SpellFamilyFlags[1] & 0x02000000)
11743 {
11744 if (AuraEffect const* relicAurEff = GetAuraEffect(64949, EFFECT_0))
11745 {
11746 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11747 }
11748 }
11749 break;
11750 }
11752 {
11753 // Sigil of the Vengeful Heart
11754 if (spellProto->SpellFamilyFlags[0] & 0x2000)
11755 {
11756 if (AuraEffect* aurEff = GetAuraEffect(64962, EFFECT_1))
11757 {
11758 AddPct(DoneTotal, aurEff->GetAmount());
11759 }
11760 }
11761
11762 // Impurity
11764 {
11765 AddPct(ApCoeffMod, aurEff->GetAmount());
11766 }
11767
11768 // Blood Boil - bonus for diseased targets
11769 if ((spellProto->SpellFamilyFlags[0] & 0x00040000) && victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0, 0x00000002, GetGUID()))
11770 {
11771 DoneTotal += 95;
11772 ApCoeffMod = 1.5835f;
11773 }
11774 break;
11775 }
11776 default:
11777 break;
11778 }
11779
11780 // Done fixed damage bonus auras
11781 DoneAdvertisedBenefit += SpellBaseDamageBonusDone(spellProto->GetSchoolMask());
11782
11783 // Check for table values
11784 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
11785 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11786 if (bonus)
11787 {
11788 if (damagetype == DOT)
11789 {
11790 coeff = bonus->dot_damage;
11791 if (bonus->ap_dot_bonus > 0)
11792 {
11793 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11795 APbonus += GetTotalAttackPowerValue(attType);
11796 DoneTotal += int32(bonus->ap_dot_bonus * stack * ApCoeffMod * APbonus);
11797 }
11798 }
11799 else
11800 {
11801 coeff = bonus->direct_damage;
11802 if (bonus->ap_bonus > 0)
11803 {
11804 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11806 APbonus += GetTotalAttackPowerValue(attType);
11807 DoneTotal += int32(bonus->ap_bonus * stack * ApCoeffMod * APbonus);
11808 }
11809 }
11810 }
11811
11812 // Default calculation
11813 if (coeff && DoneAdvertisedBenefit)
11814 {
11815 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11816
11817 if (Player* modOwner = GetSpellModOwner())
11818 {
11819 coeff *= 100.0f;
11820 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
11821 coeff /= 100.0f;
11822 }
11823
11824 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
11825 }
11826
11827 float tmpDamage = (float(pdamage) + DoneTotal) * DoneTotalMod;
11828 // apply spellmod to Done damage (flat and pct)
11829 if (Player* modOwner = GetSpellModOwner())
11830 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, tmpDamage);
11831
11832 return uint32(std::max(tmpDamage, 0.0f));
11833}
@ SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS
Definition SharedDefines.h:633
@ SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS
Definition SpellAuraDefines.h:243
@ SPELLMOD_DOT
Definition SpellDefines.h:98
@ SPELLMOD_BONUS_MULTIPLIER
Definition SpellDefines.h:100
float GetSpellDamageMod(int32 Rank)
Definition Creature.cpp:1617
float SpellPctDamageModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition Unit.cpp:11328
float CalculateLevelPenalty(SpellInfo const *spellProto) const
Definition Unit.cpp:3054
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(), SpellInfo::HasAttribute(), SpellInfo::Id, IsControlledByPlayer(), Object::IsCreature(), 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, and Object::ToCreature().

Referenced by spell_warl_seed_of_corruption_aura::CalculateAmount(), 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 
)
11836{
11837 if (!spellProto || damagetype == DIRECT_DAMAGE)
11838 return pdamage;
11839
11840 int32 TakenTotal = 0;
11841 float TakenTotalMod = 1.0f;
11842
11843 // from positive and negative SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
11844 // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085)
11846 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
11847 if (((*i)->GetMiscValue() & spellProto->GetSchoolMask()))
11848 if (spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11849 AddPct(TakenTotalMod, (*i)->GetAmount());
11850
11851 TakenTotalMod = processDummyAuras(TakenTotalMod);
11852
11853 // From caster spells
11854 if (caster)
11855 {
11857 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
11858 if ((*i)->GetCasterGUID() == caster->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
11859 if (spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11860 AddPct(TakenTotalMod, (*i)->GetAmount());
11861 }
11862
11863 if (uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask())
11864 {
11865 int32 modifierMax = 0;
11866 int32 modifierMin = 0;
11868 for (AuraEffectList::const_iterator i = auraEffectList.begin(); i != auraEffectList.end(); ++i)
11869 {
11870 if (!spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11871 continue;
11872
11873 // Only death knight spell with this aura
11874 if ((*i)->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
11875 if (!caster || caster->GetGUID() != (*i)->GetCasterGUID())
11876 continue;
11877
11878 if (mechanicMask & uint32(1 << (*i)->GetMiscValue()))
11879 {
11880 if ((*i)->GetAmount() > 0)
11881 {
11882 if ((*i)->GetAmount() > modifierMax)
11883 modifierMax = (*i)->GetAmount();
11884 }
11885 else if ((*i)->GetAmount() < modifierMin)
11886 modifierMin = (*i)->GetAmount();
11887 }
11888 }
11889
11890 AddPct(TakenTotalMod, modifierMax);
11891 AddPct(TakenTotalMod, modifierMin);
11892 }
11893
11894 int32 TakenAdvertisedBenefit = SpellBaseDamageBonusTaken(spellProto->GetSchoolMask(), damagetype == DOT);
11895
11896 // Check for table values
11897 float coeff = 0;
11898 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11899 if (bonus)
11900 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
11901
11902 // Default calculation
11903 if (TakenAdvertisedBenefit)
11904 {
11905 if (coeff <= 0.0f)
11906 {
11907 if (caster)
11908 coeff = caster->CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
11909 else
11910 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
11911 }
11912
11913 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11914 TakenTotal += int32(TakenAdvertisedBenefit * coeff * factorMod);
11915 }
11916
11917 // No positive taken bonus, custom attr
11918 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
11919 {
11920 TakenTotal = 0;
11921 TakenTotalMod = 1.0f;
11922 }
11923
11924 // xinef: sanctified wrath talent
11925 if (caster && TakenTotalMod < 1.0f && caster->HasIgnoreTargetResistAura())
11926 {
11927 float ignoreModifier = 1.0f - TakenTotalMod;
11928 bool addModifier = false;
11930 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
11931 if ((*j)->GetMiscValue() & spellProto->SchoolMask)
11932 {
11933 ApplyPct(ignoreModifier, (*j)->GetAmount());
11934 addModifier = true;
11935 }
11936
11937 if (addModifier)
11938 TakenTotalMod += ignoreModifier;
11939 }
11940
11941 float tmpDamage = (float(pdamage) + TakenTotal) * TakenTotalMod;
11942
11943 return uint32(std::max(tmpDamage, 0.0f));
11944}
float CalculateDefaultCoefficient(SpellInfo const *spellInfo, DamageEffectType damagetype) const
Definition Unit.cpp:17229

References AddPct(), ApplyPct(), CalculateDefaultCoefficient(), CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, DOT, SpellBonusEntry::dot_damage, SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), Object::GetGUID(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasIgnoreTargetResistAura(), 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(), AuraEffect::HandleProcTriggerDamageAuraProc(), and spell_black_temple_l5_arcane_charge::PrepareSpellScript().

◆ SpellDoneCritChance()

float Unit::SpellDoneCritChance ( Unit const *  ,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
12039{
12040 // Mobs can't crit with spells.
12041 if (IsCreature() && !GetSpellModOwner())
12042 return -100.0f;
12043
12044 // not critting spell
12045 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
12046 return 0.0f;
12047
12048 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
12049 if (!skipEffectCheck && !spellProto->IsCritCapable())
12050 return 0.0f;
12051
12052 float crit_chance = 0.0f;
12053 switch (spellProto->DmgClass)
12054 {
12056 {
12057 if (schoolMask & SPELL_SCHOOL_MASK_NORMAL)
12058 crit_chance = 0.0f;
12059 // For other schools
12060 else if (IsPlayer())
12061 crit_chance = GetFloatValue(static_cast<uint16>(PLAYER_SPELL_CRIT_PERCENTAGE1) + GetFirstSchoolInMask(schoolMask));
12062 else
12063 {
12064 crit_chance = (float)m_baseSpellCritChance;
12066 }
12067 break;
12068 }
12071 {
12072 if (IsPlayer())
12073 {
12074 switch (attackType)
12075 {
12076 case BASE_ATTACK:
12078 break;
12079 case OFF_ATTACK:
12081 break;
12082 case RANGED_ATTACK:
12084 break;
12085 default:
12086 break;
12087 }
12088 }
12089 else
12090 {
12091 crit_chance = 5.0f;
12094 }
12096 break;
12097 }
12098 // values overridden in spellmgr for lifebloom and earth shield
12100 default:
12101 return 0.0f;
12102 }
12103
12104 // percent done
12105 // only players use intelligence for critical chance computations
12106 if (Player* modOwner = GetSpellModOwner())
12107 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRITICAL_CHANCE, crit_chance);
12108
12109 // xinef: can be negative!
12110 return crit_chance;
12111}
@ SPELL_ATTR2_CANT_CRIT
Definition SharedDefines.h:485
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
Definition SpellAuraDefines.h:134
@ SPELLMOD_CRITICAL_CHANCE
Definition SpellDefines.h:83
@ PLAYER_SPELL_CRIT_PERCENTAGE1
Definition UpdateFields.h:354

References BASE_ATTACK, SpellInfo::DmgClass, GetFirstSchoolInMask(), Object::GetFloatValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::Id, Object::IsCreature(), SpellInfo::IsCritCapable(), Object::IsPlayer(), 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, and SPELLMOD_CRITICAL_CHANCE.

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 
)
12497{
12498 // For totems get healing bonus from owner (statue isn't totem in fact)
12499 if (IsCreature() && IsTotem())
12500 if (Unit* owner = GetOwner())
12501 return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, effIndex, TotalMod, stack);
12502
12503 // No bonus healing for potion spells
12504 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12505 return healamount;
12506
12507 float ApCoeffMod = 1.0f;
12508 float DoneTotalMod = TotalMod ? TotalMod : SpellPctHealingModsDone(victim, spellProto, damagetype);
12509 int32 DoneTotal = 0;
12510
12511 // done scripted mod (take it from owner)
12512 Unit* owner = GetOwner() ? GetOwner() : this;
12513 int32 DoneAdvertisedBenefit = 0;
12514 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12515 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12516 {
12517 if (!(*i)->IsAffectedOnSpell(spellProto))
12518 continue;
12519
12520 switch ((*i)->GetMiscValue())
12521 {
12522 case 4415: // Increased Rejuvenation Healing
12523 case 4953:
12524 DoneAdvertisedBenefit += (*i)->GetAmount();
12525 break;
12526 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
12527 DoneAdvertisedBenefit += (*i)->GetAmount();
12528 break;
12529 }
12530 }
12531
12532 switch (spellProto->SpellFamilyName)
12533 {
12535 {
12536 // Impurity
12538 {
12539 AddPct(ApCoeffMod, aurEff->GetAmount());
12540 }
12541 break;
12542 }
12543 default:
12544 break;
12545 }
12546
12547 // Done fixed damage bonus auras
12548 DoneAdvertisedBenefit += SpellBaseHealingBonusDone(spellProto->GetSchoolMask());
12549 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
12550
12551 // Check for table values
12552 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12553 if (bonus)
12554 {
12555 if (damagetype == DOT)
12556 {
12557 coeff = bonus->dot_damage;
12558 if (bonus->ap_dot_bonus > 0)
12559 DoneTotal += int32(bonus->ap_dot_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12560 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12561 }
12562 else
12563 {
12564 coeff = bonus->direct_damage;
12565 if (bonus->ap_bonus > 0)
12566 DoneTotal += int32(bonus->ap_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12567 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12568 }
12569 }
12570 else
12571 {
12572 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12573 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12574 return healamount;
12575 }
12576
12577 // Default calculation
12578 if (DoneAdvertisedBenefit)
12579 {
12580 float factorMod = CalculateLevelPenalty(spellProto) * stack;
12581 if (Player* modOwner = GetSpellModOwner())
12582 {
12583 coeff *= 100.0f;
12584 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12585 coeff /= 100.0f;
12586 }
12587 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
12588 }
12589
12590 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12591 {
12592 switch (spellProto->Effects[i].ApplyAuraName)
12593 {
12594 // Bonus healing does not apply to these spells
12597 DoneTotal = 0;
12598 break;
12599 }
12600 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12601 DoneTotal = 0;
12602 }
12603
12604 // use float as more appropriate for negative values and percent applying
12605 float heal = float(int32(healamount) + DoneTotal) * DoneTotalMod;
12606 // apply spellmod to Done amount
12607
12608 if (Player* modOwner = GetSpellModOwner())
12609 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, heal);
12610
12611 return uint32(std::max(heal, 0.0f));
12612}
@ SPELL_AURA_PERIODIC_HEALTH_FUNNEL
Definition SpellAuraDefines.h:125
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:12746
float SpellPctHealingModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition Unit.cpp:12404

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(), SpellInfo::Id, Object::IsCreature(), 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(), and sSpellMgr.

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 
)
12615{
12616 float TakenTotalMod = 1.0f;
12617 float minval = 0.0f;
12618
12619 // Healing taken percent
12620 if (!sScriptMgr->OnSpellHealingBonusTakenNegativeModifiers(this, caster, spellProto, minval))
12621 {
12623 }
12624
12625 if (minval)
12626 AddPct(TakenTotalMod, minval);
12627
12629 if (maxval)
12630 AddPct(TakenTotalMod, maxval);
12631
12632 // Tenacity increase healing % taken
12633 if (AuraEffect const* Tenacity = GetAuraEffect(58549, 0))
12634 AddPct(TakenTotalMod, Tenacity->GetAmount());
12635
12636 // Healing Done
12637 int32 TakenTotal = 0;
12638
12639 // Taken fixed damage bonus auras
12640 int32 TakenAdvertisedBenefit = SpellBaseHealingBonusTaken(spellProto->GetSchoolMask());
12641
12642 // Nourish cast, glyph of nourish
12643 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[1] & 0x2000000 && caster)
12644 {
12645 bool any = false;
12646 bool hasglyph = caster->GetAuraEffectDummy(62971);
12648 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
12649 {
12650 if (((*i)->GetCasterGUID() == caster->GetGUID()))
12651 {
12652 SpellInfo const* spell = (*i)->GetSpellInfo();
12653 // Rejuvenation, Regrowth, Lifebloom, or Wild Growth
12654 if (!any && spell->SpellFamilyFlags.HasFlag(0x50, 0x4000010, 0))
12655 {
12656 TakenTotalMod *= 1.2f;
12657 any = true;
12658 }
12659
12660 if (hasglyph)
12661 TakenTotalMod += 0.06f;
12662 }
12663 }
12664 }
12665
12666 if (damagetype == DOT)
12667 {
12668 // Healing over time taken percent
12669 float minval_hot = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12670 if (minval_hot)
12671 AddPct(TakenTotalMod, minval_hot);
12672
12673 float maxval_hot = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12674 if (maxval_hot)
12675 AddPct(TakenTotalMod, maxval_hot);
12676 }
12677
12678 // Check for table values
12679 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12680 float coeff = 0;
12681 float factorMod = 1.0f;
12682 if (bonus)
12683 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
12684 else
12685 {
12686 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12687 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12688 {
12689 healamount = uint32(std::max((float(healamount) * TakenTotalMod), 0.0f));
12690 return healamount;
12691 }
12692 }
12693
12694 // Default calculation
12695 if (TakenAdvertisedBenefit)
12696 {
12697 float TakenCoeff = 0.0f;
12698 if (coeff <= 0)
12699 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack) * 1.88f; // As wowwiki says: C = (Cast Time / 3.5) * 1.88 (for healing spells)
12700
12701 factorMod *= CalculateLevelPenalty(spellProto) * int32(stack);
12702 if (Player* modOwner = GetSpellModOwner())
12703 {
12704 coeff *= 100.0f;
12705 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12706 coeff /= 100.0f;
12707 }
12708
12709 TakenTotal += int32(TakenAdvertisedBenefit * (coeff > 0 ? coeff : TakenCoeff) * factorMod);
12710 }
12711
12712 if (caster)
12713 {
12715 for (AuraEffectList::const_iterator i = mHealingGet.begin(); i != mHealingGet.end(); ++i)
12716 if (caster->GetGUID() == (*i)->GetCasterGUID() && (*i)->IsAffectedOnSpell(spellProto))
12717 AddPct(TakenTotalMod, (*i)->GetAmount());
12718 }
12719
12720 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12721 {
12722 switch (spellProto->Effects[i].ApplyAuraName)
12723 {
12724 // Bonus healing does not apply to these spells
12727 TakenTotal = 0;
12728 break;
12729 }
12730 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12731 TakenTotal = 0;
12732 }
12733
12734 // No positive taken bonus, custom attr
12735 if ((spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS) || spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS)) && TakenTotalMod > 1.0f)
12736 {
12737 TakenTotal = 0;
12738 TakenTotalMod = 1.0f;
12739 }
12740
12741 float heal = float(int32(healamount) + TakenTotal) * TakenTotalMod;
12742
12743 return uint32(std::max(heal, 0.0f));
12744}
@ SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS
Definition SharedDefines.h:631
@ 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
int32 GetMaxPositiveAuraModifier(AuraType auratype)
Definition Unit.cpp:5991
int32 GetMaxNegativeAuraModifier(AuraType auratype) const
Definition Unit.cpp:6005
int32 SpellBaseHealingBonusTaken(SpellSchoolMask schoolMask)
Definition Unit.cpp:12779

References AddPct(), CalculateDefaultCoefficient(), CalculateLevelPenalty(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, SpellInfo::Effects, GetAuraEffect(), GetAuraEffectDummy(), GetAuraEffectsByType(), Object::GetGUID(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), SpellInfo::HasAttribute(), flag96::HasFlag(), SpellInfo::Id, MAX_SPELL_EFFECTS, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS, SPELL_AURA_MOD_HEALING_PCT, SPELL_AURA_MOD_HEALING_RECEIVED, SPELL_AURA_MOD_HOT_PCT, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_HEALTH_FUNNEL, SPELL_AURA_PERIODIC_LEECH, SPELL_DAMAGE_CLASS_NONE, SPELL_EFFECT_HEALTH_LEECH, SpellBaseHealingBonusTaken(), SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, 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!
3550{
3551 SpellInfo const* spellInfo = spell->GetSpellInfo();
3552
3553 // Check for immune
3554 if (victim->IsImmunedToSpell(spellInfo, spell))
3555 {
3556 return SPELL_MISS_IMMUNE;
3557 }
3558
3559 // All positive spells can`t miss
3561 if ((spellInfo->IsPositive() || spellInfo->HasEffect(SPELL_EFFECT_DISPEL))
3562 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3563 {
3564 return SPELL_MISS_NONE;
3565 }
3566
3567 // Check for immune
3568 // xinef: check for school immunity only
3569 if (victim->IsImmunedToSchool(spell))
3570 {
3571 return SPELL_MISS_IMMUNE;
3572 }
3573
3574 if (this == victim)
3575 {
3576 return SPELL_MISS_NONE;
3577 }
3578
3579 // Return evade for units in evade mode
3580 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) &&
3582 {
3583 return SPELL_MISS_EVADE;
3584 }
3585
3586 // Try victim reflect spell
3587 if (CanReflect)
3588 {
3589 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3590 Unit::AuraEffectList const& mReflectSpellsSchool = victim->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL);
3591 for (Unit::AuraEffectList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i)
3592 {
3593 if ((*i)->GetMiscValue() & spell->GetSpellSchoolMask())
3594 {
3595 reflectchance += (*i)->GetAmount();
3596 }
3597 }
3598
3599 if (reflectchance > 0 && roll_chance_i(reflectchance))
3600 {
3601 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3602 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3603 return SPELL_MISS_REFLECT;
3604 }
3605 }
3606
3607 switch (spellInfo->DmgClass)
3608 {
3611 return MeleeSpellHitResult(victim, spellInfo);
3613 {
3614 if (spellInfo->SpellFamilyName)
3615 {
3616 return SPELL_MISS_NONE;
3617 }
3618
3619 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3620 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3621 {
3622 if (spellInfo->Effects[i].Effect && spellInfo->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3623 {
3624 if (spellInfo->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3625 {
3626 return SPELL_MISS_NONE;
3627 }
3628 }
3629 }
3630 [[fallthrough]];
3631 }
3633 return MagicSpellHitResult(victim, spellInfo);
3634 }
3635
3636 return SPELL_MISS_NONE;
3637}
@ 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
uint32 DmgClass
Definition SpellInfo.h:389
SpellMissInfo MagicSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition Unit.cpp:3341
SpellMissInfo MeleeSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition Unit.cpp:3168

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, GetAuraEffectsByType(), Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, 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, and Object::ToCreature().

◆ 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!
3485{
3486 // Check for immune
3487 if (victim->IsImmunedToSpell(spell))
3488 return SPELL_MISS_IMMUNE;
3489
3490 // All positive spells can`t miss
3492 if ((spell->IsPositive() || spell->HasEffect(SPELL_EFFECT_DISPEL))
3493 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3494 return SPELL_MISS_NONE;
3495
3496 // Check for immune
3497 // xinef: check for school immunity only
3498 if (victim->IsImmunedToSchool(spell))
3499 return SPELL_MISS_IMMUNE;
3500
3501 if (this == victim)
3502 return SPELL_MISS_NONE;
3503
3504 // Return evade for units in evade mode
3505 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spell->HasAura(SPELL_AURA_CONTROL_VEHICLE)
3506 && !spell->HasAttribute(SPELL_ATTR0_CU_IGNORE_EVADE) && !spell->HasAttribute(SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT))
3507 return SPELL_MISS_EVADE;
3508
3509 // Try victim reflect spell
3510 if (CanReflect)
3511 {
3512 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3513 Unit::AuraEffectList const& mReflectSpellsSchool = victim->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL);
3514 for (Unit::AuraEffectList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i)
3515 if ((*i)->GetMiscValue() & spell->GetSchoolMask())
3516 reflectchance += (*i)->GetAmount();
3517 if (reflectchance > 0 && roll_chance_i(reflectchance))
3518 {
3519 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3520 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3521 return SPELL_MISS_REFLECT;
3522 }
3523 }
3524
3525 switch (spell->DmgClass)
3526 {
3529 return MeleeSpellHitResult(victim, spell);
3531 {
3532 if (spell->SpellFamilyName)
3533 {
3534 return SPELL_MISS_NONE;
3535 }
3536 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3537 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3538 if (spell->Effects[i].Effect && spell->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3539 if (spell->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3540 return SPELL_MISS_NONE;
3541 [[fallthrough]];
3542 }
3544 return MagicSpellHitResult(victim, spell);
3545 }
3546 return SPELL_MISS_NONE;
3547}

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, 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, and Object::ToCreature().

Referenced by Spell::AddUnitTarget(), DealMeleeDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SpellPctDamageModsDone()

float Unit::SpellPctDamageModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
11329{
11330 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11331 return 1.0f;
11332
11333 // Some spells don't benefit from done mods
11334 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11335 return 1.0f;
11336
11337 // For totems get damage bonus from owner
11338 if (IsCreature())
11339 {
11340 if (IsTotem())
11341 {
11342 if (Unit* owner = GetOwner())
11343 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11344 }
11345 // Dancing Rune Weapon...
11346 else if (GetEntry() == 27893)
11347 {
11348 if (Unit* owner = GetOwner())
11349 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11350 }
11351 }
11352
11353 // Done total percent damage auras
11354 float DoneTotalMod = 1.0f;
11355
11357 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
11358 {
11359 // prevent apply mods from weapon specific case to non weapon specific spells (Example: thunder clap and two-handed weapon specialization)
11360 if (spellProto->EquippedItemClass == -1 && (*i)->GetSpellInfo()->EquippedItemClass != -1 &&
11361 !(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && (*i)->GetMiscValue() == SPELL_SCHOOL_MASK_NORMAL)
11362 {
11363 continue;
11364 }
11365
11366 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11367 continue;
11368
11369 if (!sScriptMgr->IsNeedModSpellDamagePercent(this, *i, DoneTotalMod, spellProto))
11370 continue;
11371
11372 if ((*i)->GetMiscValue() & spellProto->GetSchoolMask())
11373 {
11374 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
11375 AddPct(DoneTotalMod, (*i)->GetAmount());
11376 else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
11377 AddPct(DoneTotalMod, (*i)->GetAmount());
11378 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
11379 AddPct(DoneTotalMod, (*i)->GetAmount());
11380 }
11381 }
11382
11383 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11385 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
11386 if ((creatureTypeMask & uint32((*i)->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11387 AddPct(DoneTotalMod, (*i)->GetAmount());
11388
11389 // bonus against aurastate
11391 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
11392 if (victim->HasAuraState(AuraStateType((*i)->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11393 AddPct(DoneTotalMod, (*i)->GetAmount());
11394
11395 // done scripted mod (take it from owner)
11396 Unit* owner = GetOwner() ? GetOwner() : this;
11397 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11398 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11399 {
11400 // Xinef: self cast is ommited (because of Rage of Rivendare)
11401 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11402 continue;
11403
11404 // xinef: Molten Fury should work on all spells
11405 switch ((*i)->GetMiscValue())
11406 {
11407 case 4920: // Molten Fury
11408 case 4919:
11409 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11410 AddPct(DoneTotalMod, (*i)->GetAmount());
11411 break;
11412 }
11413
11414 if (!(*i)->IsAffectedOnSpell(spellProto))
11415 continue;
11416
11417 switch ((*i)->GetMiscValue())
11418 {
11419 case 6917: // Death's Embrace
11420 case 6926:
11421 case 6928:
11422 {
11423 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11424 AddPct(DoneTotalMod, (*i)->GetAmount());
11425 break;
11426 }
11427 // Soul Siphon
11428 case 4992:
11429 case 4993:
11430 {
11431 // effect 1 m_amount
11432 int32 maxPercent = (*i)->GetAmount();
11433 // effect 0 m_amount
11434 int32 stepPercent = CalculateSpellDamage(this, (*i)->GetSpellInfo(), 0);
11435 // count affliction effects and calc additional damage in percentage
11436 int32 modPercent = 0;
11437 AuraApplicationMap const& victimAuras = victim->GetAppliedAuras();
11438 for (AuraApplicationMap::const_iterator itr = victimAuras.begin(); itr != victimAuras.end(); ++itr)
11439 {
11440 Aura const* aura = itr->second->GetBase();
11441 SpellInfo const* m_spell = aura->GetSpellInfo();
11442 if (m_spell->SpellFamilyName != SPELLFAMILY_WARLOCK || !(m_spell->SpellFamilyFlags[1] & 0x0004071B || m_spell->SpellFamilyFlags[0] & 0x8044C402))
11443 continue;
11444 modPercent += stepPercent * aura->GetStackAmount();
11445 if (modPercent >= maxPercent)
11446 {
11447 modPercent = maxPercent;
11448 break;
11449 }
11450 }
11451 AddPct(DoneTotalMod, modPercent);
11452 break;
11453 }
11454 case 6916: // Death's Embrace
11455 case 6925:
11456 case 6927:
11457 if (HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, spellProto, this))
11458 AddPct(DoneTotalMod, (*i)->GetAmount());
11459 break;
11460 case 5481: // Starfire Bonus
11461 {
11462 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x200002, 0, 0))
11463 AddPct(DoneTotalMod, (*i)->GetAmount());
11464 break;
11465 }
11466 // Tundra Stalker
11467 // Merciless Combat
11468 case 7277:
11469 {
11470 // Merciless Combat
11471 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
11472 {
11473 if ((spellProto && spellProto->SpellFamilyFlags[0] & 0x2) || spellProto->SpellFamilyFlags[1] & 0x2 )
11474 if (!victim->HealthAbovePct(35))
11475 AddPct(DoneTotalMod, (*i)->GetAmount());
11476 }
11477 // Tundra Stalker
11478 else
11479 {
11480 // Frost Fever (target debuff)
11481 if (victim->HasAura(55095))
11482 AddPct(DoneTotalMod, (*i)->GetAmount());
11483 break;
11484 }
11485 break;
11486 }
11487 // Rage of Rivendare
11488 case 7293:
11489 {
11491 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
11492 break;
11493 }
11494 // Twisted Faith
11495 case 7377:
11496 {
11498 AddPct(DoneTotalMod, (*i)->GetAmount());
11499 break;
11500 }
11501 // Marked for Death
11502 case 7598:
11503 case 7599:
11504 case 7600:
11505 case 7601:
11506 case 7602:
11507 {
11508 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
11509 AddPct(DoneTotalMod, (*i)->GetAmount());
11510 break;
11511 }
11512 // Dirty Deeds
11513 case 6427:
11514 case 6428:
11515 case 6579:
11516 case 6580:
11517 {
11518 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11519 {
11520 // effect 0 has expected value but in negative state
11521 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
11522 AddPct(DoneTotalMod, bonus);
11523 }
11524 break;
11525 }
11526 }
11527 }
11528
11529 // Custom scripted damage
11530 switch (spellProto->SpellFamilyName)
11531 {
11532 case SPELLFAMILY_MAGE:
11533 // Ice Lance
11534 if (spellProto->SpellIconID == 186)
11535 {
11536 if (victim->HasAuraState(AURA_STATE_FROZEN, spellProto, this))
11537 {
11538 // Glyph of Ice Lance
11539 if (owner->HasAura(56377) && victim->GetLevel() > owner->GetLevel())
11540 DoneTotalMod *= 4.0f;
11541 else
11542 DoneTotalMod *= 3.0f;
11543 }
11544 }
11545
11546 // Torment the weak
11547 if (spellProto->SpellFamilyFlags[0] & 0x20600021 || spellProto->SpellFamilyFlags[1] & 0x9000)
11548 if (victim->HasAuraWithMechanic((1 << MECHANIC_SNARE) | (1 << MECHANIC_SLOW_ATTACK)))
11550 AddPct(DoneTotalMod, aurEff->GetAmount());
11551 break;
11552 case SPELLFAMILY_PRIEST:
11553 // Mind Flay
11554 if (spellProto->SpellFamilyFlags[0] & 0x800000)
11555 {
11556 // Glyph of Shadow Word: Pain
11557 if (AuraEffect* aurEff = GetAuraEffect(55687, 0))
11558 // Increase Mind Flay damage if Shadow Word: Pain present on target
11560 AddPct(DoneTotalMod, aurEff->GetAmount());
11561
11562 // Twisted Faith - Mind Flay part
11564 // Increase Mind Flay damage if Shadow Word: Pain present on target
11566 AddPct(DoneTotalMod, aurEff->GetAmount());
11567 }
11568 // Smite
11569 else if (spellProto->SpellFamilyFlags[0] & 0x80)
11570 {
11571 // Glyph of Smite
11572 if (AuraEffect* aurEff = GetAuraEffect(55692, 0))
11573 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x100000, 0, 0, GetGUID()))
11574 AddPct(DoneTotalMod, aurEff->GetAmount());
11575 }
11576 // Shadow Word: Death
11577 else if (spellProto->SpellFamilyFlags[1] & 0x2)
11578 {
11579 // Glyph of Shadow Word: Death
11580 if (AuraEffect* aurEff = GetAuraEffect(55682, 1))
11582 AddPct(DoneTotalMod, aurEff->GetAmount());
11583 }
11584
11585 break;
11587 // Judgement of Vengeance/Judgement of Corruption
11588 if ((spellProto->SpellFamilyFlags[1] & 0x400000) && spellProto->SpellIconID == 2292)
11589 {
11590 // Get stack of Holy Vengeance/Blood Corruption on the target added by caster
11591 uint32 stacks = 0;
11593 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
11594 if (((*itr)->GetId() == 31803 || (*itr)->GetId() == 53742) && (*itr)->GetCasterGUID() == GetGUID())
11595 {
11596 stacks = (*itr)->GetBase()->GetStackAmount();
11597 break;
11598 }
11599 // + 10% for each application of Holy Vengeance/Blood Corruption on the target
11600 if (stacks)
11601 AddPct(DoneTotalMod, 10 * stacks);
11602 }
11603 break;
11604 case SPELLFAMILY_DRUID:
11605 // Thorns
11606 if (spellProto->SpellFamilyFlags[0] & 0x100)
11607 {
11608 // Brambles
11609 if (AuraEffect* aurEff = GetAuraEffectOfRankedSpell(16836, 0))
11610 AddPct(DoneTotalMod, aurEff->GetAmount());
11611 }
11612 break;
11614 // Fire and Brimstone
11615 if (spellProto->SpellFamilyFlags[1] & 0x00020040)
11617 {
11619 for (AuraEffectList::const_iterator i = mDumyAuras.begin(); i != mDumyAuras.end(); ++i)
11620 if ((*i)->GetSpellInfo()->SpellIconID == 3173)
11621 {
11622 AddPct(DoneTotalMod, (*i)->GetAmount());
11623 break;
11624 }
11625 }
11626 // Drain Soul - increased damage for targets under 25 % HP
11627 if (spellProto->SpellFamilyFlags[0] & 0x00004000)
11628 if (!victim->HealthAbovePct(25))
11629 DoneTotalMod *= 4;
11630 // Shadow Bite (15% increase from each dot)
11631 if (spellProto->SpellFamilyFlags[1] & 0x00400000 && IsPet())
11632 if (uint8 count = victim->GetDoTsByCaster(GetOwnerGUID()))
11633 AddPct(DoneTotalMod, 15 * count);
11634 break;
11635 case SPELLFAMILY_HUNTER:
11636 // Steady Shot
11637 if (spellProto->SpellFamilyFlags[1] & 0x1)
11638 if (AuraEffect* aurEff = GetAuraEffect(56826, 0)) // Glyph of Steady Shot
11639 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_HUNTER, 0x00004000, 0, 0, GetGUID()))
11640 AddPct(DoneTotalMod, aurEff->GetAmount());
11641 break;
11643 // Improved Icy Touch
11644 if (spellProto->SpellFamilyFlags[0] & 0x2)
11646 AddPct(DoneTotalMod, aurEff->GetAmount());
11647
11648 // Glacier Rot
11649 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
11651 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
11652 AddPct(DoneTotalMod, aurEff->GetAmount());
11653 break;
11654 }
11655
11656 return DoneTotalMod;
11657}
@ MECHANIC_SLOW_ATTACK
Definition SharedDefines.h:1333
@ AURA_STATE_HEALTHLESS_20_PERCENT
Definition SharedDefines.h:1293
@ AURA_STATE_CONFLAGRATE
Definition SharedDefines.h:1306
uint32 GetDiseasesByCaster(ObjectGuid casterGUID, uint8 mode=0)
Definition Unit.cpp:5877
bool HasAuraWithMechanic(uint32 mechanicMask) const
Definition Unit.cpp:5848
AuraEffect * GetAuraEffectOfRankedSpell(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:5541
uint32 GetDoTsByCaster(ObjectGuid casterGUID) const
Definition Unit.cpp:5923

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(), Object::GetGUID(), GetLevel(), GetOwner(), GetOwnerGUID(), SpellInfo::GetSchoolMask(), Aura::GetSpellInfo(), Aura::GetStackAmount(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraWithMechanic(), HealthAbovePct(), Object::IsCreature(), IsPet(), IsTotem(), MECHANIC_SLOW_ATTACK, MECHANIC_SNARE, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_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(), and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by AuraEffect::CalculatePeriodicData(), and SpellDamageBonusDone().

◆ SpellPctHealingModsDone()

float Unit::SpellPctHealingModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
12405{
12406 // For totems get healing bonus from owner (statue isn't totem in fact)
12407 if (IsCreature() && IsTotem())
12408 if (Unit* owner = GetOwner())
12409 return owner->SpellPctHealingModsDone(victim, spellProto, damagetype);
12410
12411 // Some spells don't benefit from done mods
12412 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
12413 return 1.0f;
12414
12415 // xinef: Some spells don't benefit from done mods
12416 if (spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS))
12417 return 1.0f;
12418
12419 // No bonus healing for potion spells
12420 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12421 return 1.0f;
12422
12423 float DoneTotalMod = 1.0f;
12424
12425 // Healing done percent
12427 for (auto const& auraEff : mHealingDonePct)
12428 {
12429 if (!sScriptMgr->IsNeedModHealPercent(this, auraEff, DoneTotalMod, spellProto))
12430 continue;
12431
12432 AddPct(DoneTotalMod, auraEff->GetAmount());
12433 }
12434
12435 // done scripted mod (take it from owner)
12436 Unit* owner = GetOwner() ? GetOwner() : this;
12437 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12438 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12439 {
12440 if (!(*i)->IsAffectedOnSpell(spellProto))
12441 continue;
12442
12443 switch ((*i)->GetMiscValue())
12444 {
12445 case 21: // Test of Faith
12446 case 6935:
12447 case 6918:
12448 if (victim->HealthBelowPct(50))
12449 AddPct(DoneTotalMod, (*i)->GetAmount());
12450 break;
12451 case 7798: // Glyph of Regrowth
12452 {
12454 AddPct(DoneTotalMod, (*i)->GetAmount());
12455 break;
12456 }
12457
12458 case 7871: // Glyph of Lesser Healing Wave
12459 {
12460 // xinef: affected by any earth shield
12461 if (victim->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 0, 0x00000400, 0))
12462 AddPct(DoneTotalMod, (*i)->GetAmount());
12463 break;
12464 }
12465 default:
12466 break;
12467 }
12468 }
12469
12470 switch (spellProto->SpellFamilyName)
12471 {
12473 // Talents and glyphs for healing stream totem
12474 if (spellProto->Id == 52042)
12475 {
12476 // Glyph of Healing Stream Totem
12477 if (AuraEffect* dummy = owner->GetAuraEffect(55456, EFFECT_0))
12478 AddPct(DoneTotalMod, dummy->GetAmount());
12479
12480 // Healing Stream totem - Restorative Totems
12481 if (AuraEffect* aurEff = GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 338, 1))
12482 AddPct(DoneTotalMod, aurEff->GetAmount());
12483 }
12484 break;
12485 case SPELLFAMILY_PRIEST:
12486 // T9 HEALING 4P, empowered renew instant heal
12487 if (spellProto->Id == 63544)
12488 if (AuraEffect* aurEff = GetAuraEffect(67202, EFFECT_0))
12489 AddPct(DoneTotalMod, aurEff->GetAmount());
12490 break;
12491 }
12492
12493 return DoneTotalMod;
12494}
@ SPELL_AURA_MOD_HEALING_DONE_PERCENT
Definition SpellAuraDefines.h:199

References AddPct(), EFFECT_0, GetAuraEffect(), GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), SpellInfo::HasAttribute(), HealthBelowPct(), SpellInfo::Id, Object::IsCreature(), 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, and sScriptMgr.

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.
12114{
12115 // not critting spell
12116 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
12117 return 0.0f;
12118
12119 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
12120 if (!skipEffectCheck && !spellProto->IsCritCapable())
12121 return 0.0f;
12122
12123 float crit_chance = doneChance;
12124 switch (spellProto->DmgClass)
12125 {
12127 {
12128 if (!spellProto->IsPositive())
12129 {
12130 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
12131 // xinef: apply max and min only
12133 {
12136 }
12137
12138 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_SPELL);
12139 }
12140 // scripted (increase crit chance ... against ... target by x%
12141 if (caster)
12142 {
12143 AuraEffectList const& mOverrideClassScript = caster->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12144 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12145 {
12146 if (!((*i)->IsAffectedOnSpell(spellProto)))
12147 continue;
12148 int32 modChance = 0;
12149 switch ((*i)->GetMiscValue())
12150 {
12151 // Shatter
12152 case 911:
12153 modChance += 16;
12154 [[fallthrough]];
12155 case 910:
12156 modChance += 17;
12157 [[fallthrough]];
12158 case 849:
12159 modChance += 17;
12160 if (!HasAuraState(AURA_STATE_FROZEN, spellProto, caster))
12161 break;
12162 crit_chance += modChance;
12163 break;
12164 case 7917: // Glyph of Shadowburn
12165 if (HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, caster))
12166 crit_chance += (*i)->GetAmount();
12167 break;
12168 case 7997: // Renewed Hope
12169 case 7998:
12170 if (HasAura(6788))
12171 crit_chance += (*i)->GetAmount();
12172 break;
12173 default:
12174 break;
12175 }
12176 }
12177 // Custom crit by class
12178 switch (spellProto->SpellFamilyName)
12179 {
12180 case SPELLFAMILY_MAGE:
12181 // Glyph of Fire Blast
12182 if (spellProto->SpellFamilyFlags[0] == 0x2 && spellProto->SpellIconID == 12)
12184 if (AuraEffect const* aurEff = caster->GetAuraEffect(56369, EFFECT_0))
12185 crit_chance += aurEff->GetAmount();
12186 break;
12187 case SPELLFAMILY_DRUID:
12188 // Improved Faerie Fire
12190 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 109, 0))
12191 crit_chance += aurEff->GetAmount();
12192
12193 // cumulative effect - don't break
12194
12195 // Starfire
12196 if (spellProto->SpellFamilyFlags[0] & 0x4 && spellProto->SpellIconID == 1485)
12197 {
12198 // Improved Insect Swarm
12199 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 1771, 0))
12201 crit_chance += aurEff->GetAmount();
12202 break;
12203 }
12204 break;
12205 case SPELLFAMILY_ROGUE:
12206 // Shiv-applied poisons can't crit
12207 if (caster->FindCurrentSpellBySpellId(5938))
12208 crit_chance = 0.0f;
12209 break;
12211 // Flash of light
12212 if (spellProto->SpellFamilyFlags[0] & 0x40000000)
12213 {
12214 // Sacred Shield
12215 if (AuraEffect const* aura = GetAuraEffect(58597, 1, GetGUID()))
12216 crit_chance += aura->GetAmount();
12217 break;
12218 }
12219 // Exorcism
12220 else if (spellProto->GetCategory() == 19)
12221 {
12223 return 100.0f;
12224 break;
12225 }
12226 break;
12227 case SPELLFAMILY_SHAMAN:
12228 // Lava Burst
12229 if (spellProto->SpellFamilyFlags[1] & 0x00001000)
12230 {
12231 if (GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0, 0, caster->GetGUID()))
12233 return 100.0f;
12234 break;
12235 }
12236 break;
12237 }
12238 }
12239 break;
12240 }
12242 // Custom crit by class
12243 if (caster)
12244 {
12245 switch (spellProto->SpellFamilyName)
12246 {
12247 case SPELLFAMILY_DRUID:
12248 // Rend and Tear - bonus crit chance for Ferocious Bite on bleeding targets
12249 if (spellProto->SpellFamilyFlags[0] & 0x00800000 && spellProto->SpellIconID == 1680 && HasAuraState(AURA_STATE_BLEEDING))
12250 {
12251 if (AuraEffect const* rendAndTear = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 2859, 1))
12252 crit_chance += rendAndTear->GetAmount();
12253 break;
12254 }
12255 break;
12257 // Victory Rush
12258 if (spellProto->SpellFamilyFlags[1] & 0x100)
12259 {
12260 // Glyph of Victory Rush
12261 if (AuraEffect const* aurEff = caster->GetAuraEffect(58382, 0))
12262 crit_chance += aurEff->GetAmount();
12263 break;
12264 }
12265 break;
12266 }
12267 }
12268
12269 // 100% critical chance against sitting target
12271 {
12272 return 100.0f;
12273 }
12274 [[fallthrough]];
12276 {
12277 // flat aura mods
12278 if (attackType == RANGED_ATTACK)
12280 else
12282
12283 // reduce crit chance from Rating for players
12284 if (attackType != RANGED_ATTACK)
12285 {
12286 // xinef: little hack, crit chance dont require caster to calculate, pass victim
12287 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_MELEE);
12288 }
12289 else
12290 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_RANGED);
12291
12292 // Apply crit chance from defence skill
12293 if (caster)
12294 crit_chance += (int32(caster->GetMaxSkillValueForLevel(this)) - int32(GetDefenseSkillValue(caster))) * 0.04f;
12295
12296 break;
12297 }
12298 // values overridden in spellmgr for lifebloom and earth shield
12300 default:
12301 return 0.0f;
12302 }
12303
12304 if (caster)
12305 {
12307 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
12308 {
12309 if (caster->GetGUID() != (*i)->GetCasterGUID())
12310 continue;
12311
12312 crit_chance += (*i)->GetAmount();
12313 }
12314 }
12315
12316 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
12317 // xinef: should be calculated at the end
12318 if (!spellProto->IsPositive())
12320
12321 // xinef: can be negative!
12322 return crit_chance;
12323}
uint32 const CREATURE_TYPEMASK_DEMON_OR_UNDEAD
Definition SharedDefines.h:2643
@ MECHANIC_KNOCKOUT
Definition SharedDefines.h:1339
@ AURA_STATE_BLEEDING
Definition SharedDefines.h:1310
@ AURA_STATE_FAERIE_FIRE
Definition SharedDefines.h:1304
int32 GetMaxPositiveAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
Definition Unit.cpp:6042
bool HasAttackerSpellCritChanceAura() const
Definition Unit.h:1753
int32 GetMaxNegativeAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition Unit.cpp:6056

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(), Object::GetGUID(), GetMaxNegativeAuraModifierByMiscMask(), GetMaxPositiveAuraModifierByMiscMask(), GetMaxSkillValueForLevel(), getStandState(), GetTotalAuraModifier(), HasAttackerSpellCritChanceAura(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraWithMechanic(), SpellInfo::IsCritCapable(), Object::IsPlayer(), 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, 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:590

References m_reactiveTimer, and REACTIVE_TIMER_START.

Referenced by ProcDamageAndSpellFor().

◆ StopAttackFaction()

void Unit::StopAttackFaction ( uint32  faction_id)
20203{
20204 if (Unit* victim = GetVictim())
20205 {
20206 if (victim->GetFactionTemplateEntry()->faction == faction_id)
20207 {
20208 AttackStop();
20209 if (IsNonMeleeSpellCast(false))
20211
20212 // melee and ranged forced attack cancel
20213 if (IsPlayer())
20215 }
20216 }
20217
20218 AttackerSet const& attackers = getAttackers();
20219 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20220 {
20221 if ((*itr)->GetFactionTemplateEntry()->faction == faction_id)
20222 {
20223 (*itr)->AttackStop();
20224 itr = attackers.begin();
20225 }
20226 else
20227 ++itr;
20228 }
20229
20231
20232 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20233 (*itr)->StopAttackFaction(faction_id);
20234}
void deleteReferencesForFaction(uint32 faction)
Definition HostileRefMgr.cpp:162

References AttackStop(), HostileRefMgr::deleteReferencesForFaction(), getAttackers(), getHostileRefMgr(), GetVictim(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), Object::IsPlayer(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by AuraEffect::HandleForceReaction().

◆ StopAttackingInvalidTarget()

void Unit::StopAttackingInvalidTarget ( )
20237{
20238 AttackerSet const& attackers = getAttackers();
20239 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20240 {
20241 Unit* attacker = (*itr);
20242 if (!attacker->IsValidAttackTarget(this))
20243 {
20244 attacker->AttackStop();
20245 if (attacker->IsPlayer())
20246 {
20248 }
20249
20250 for (Unit* controled : attacker->m_Controlled)
20251 {
20252 if (controled->GetVictim() == this && !controled->IsValidAttackTarget(this))
20253 {
20254 controled->AttackStop();
20255 }
20256 }
20257
20258 itr = attackers.begin();
20259 }
20260 else
20261 {
20262 ++itr;
20263 }
20264 }
20265}

References AttackStop(), getAttackers(), Object::IsPlayer(), IsValidAttackTarget(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by RemoveCharmedBy(), and SetCharmedBy().

◆ StopMoving()

void Unit::StopMoving ( )
16684{
16686
16687 // not need send any packets if not in world or not moving
16688 if (!IsInWorld())
16689 return;
16690
16691 if (movespline->Finalized())
16692 return;
16693
16694 // Update position now since Stop does not start a new movement that can be updated later
16695 if (movespline->HasStarted())
16697
16698 Movement::MoveSplineInit init(this);
16699 init.Stop();
16700}
bool HasStarted() const
Definition MoveSpline.h:129
void UpdateSplinePosition()
Definition Unit.cpp:608

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_alar::ConstructWaypointsAndMove(), 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::DamageTaken(), npc_vrykul_skeleton::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(), boss_janalai::JustEngagedWith(), Player::LeaveBattleground(), SmartAI::MoveAway(), boss_headless_horseman::MovementInform(), boss_kaelthas::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(), boss_felblood_kaelthas::Reset(), 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_harrison_jones::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_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_heigan::boss_heiganAI::StartFightPhase(), SmartAI::StopFollow(), SmartAI::StopPath(), CreatureAI::TriggerAlert(), Pet::Update(), TimedFleeingMovementGenerator::Update(), 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(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), and PetAI::UpdateAI().

◆ StopMovingOnCurrentPos()

void Unit::StopMovingOnCurrentPos ( )
16723{
16725
16726 // not need send any packets if not in world
16727 if (!IsInWorld())
16728 return;
16729
16730 DisableSpline(); // pussywizard: required so Launch() won't recalculate position from previous spline
16731 Movement::MoveSplineInit init(this);
16732 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
16733 init.SetFacing(GetOrientation());
16734 init.Launch();
16735}

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_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_maiev_illidan::DoAction(), boss_alar::DoDiveBomb(), UtherBatteredHiltEvent::Execute(), WorldSession::HandlePetActionHelper(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::HandleSpeedChangeIfNeeded(), 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_janalai::Reset(), boss_skadi::boss_skadiAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), SetRooted(), 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_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), and npc_vortex_ride::npc_vortex_rideAI::UpdateAI().

◆ Talk() [1/2]

void Unit::Talk ( std::string_view  text,
ChatMsg  msgType,
Language  language,
float  textRange,
WorldObject const *  target 
)
virtual
21163{
21164 Acore::CustomChatTextBuilder builder(this, msgType, text, language, target);
21167 Cell::VisitWorldObjects(this, worker, textRange);
21168}
Definition ChatTextBuilder.h:49
Definition GridNotifiers.h:1707
Definition GridNotifiers.h:592
static void VisitWorldObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:175

References Cell::VisitWorldObjects().

Referenced by spell_inoculate_nestlewood_owlkin::HandleEffectRemove(), and spell_the_flag_of_ownership::HandleScript().

◆ Talk() [2/2]

void Unit::Talk ( uint32  textId,
ChatMsg  msgType,
float  textRange,
WorldObject const *  target 
)
virtual
21215{
21216 if (!sObjectMgr->GetBroadcastText(textId))
21217 {
21218 LOG_ERROR("entities.unit", "Unit::Talk: `broadcast_text` (ID: {}) was not found", textId);
21219 return;
21220 }
21221
21222 Acore::BroadcastTextBuilder builder(this, msgType, textId, getGender(), target);
21225 Cell::VisitWorldObjects(this, worker, textRange);
21226}
Definition ChatTextBuilder.h:31

References getGender(), LOG_ERROR, sObjectMgr, and Cell::VisitWorldObjects().

◆ TauntApply()

void Unit::TauntApply ( Unit victim)
14716{
14717 ASSERT(IsCreature());
14718
14719 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14720 return;
14721
14722 if (!CanHaveThreatList())
14723 return;
14724
14725 Creature* creature = ToCreature();
14726
14727 if (creature->HasReactState(REACT_PASSIVE))
14728 return;
14729
14730 Unit* target = GetVictim();
14731 if (target && target == taunter)
14732 return;
14733
14734 SetInFront(taunter);
14735 SetGuidValue(UNIT_FIELD_TARGET, taunter->GetGUID());
14736
14737 if (creature->IsAIEnabled)
14738 creature->AI()->AttackStart(taunter);
14739
14740 //m_ThreatMgr.tauntApply(taunter);
14741}
void SetInFront(WorldObject const *target)
Definition Unit.cpp:20556

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), Object::GetGUID(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), Player::IsGameMaster(), Object::IsPlayer(), REACT_PASSIVE, Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and boss_razorgore::boss_razorgoreAI::OnCharmed().

◆ TauntFadeOut()

void Unit::TauntFadeOut ( Unit taunter)
14746{
14747 ASSERT(IsCreature());
14748
14749 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14750 return;
14751
14752 if (!CanHaveThreatList())
14753 return;
14754
14755 Creature* creature = ToCreature();
14756
14757 if (creature->HasReactState(REACT_PASSIVE))
14758 return;
14759
14760 Unit* target = GetVictim();
14761 if (!target || target != taunter)
14762 return;
14763
14765 {
14766 if (creature->IsAIEnabled)
14768 return;
14769 }
14770
14771 target = creature->SelectVictim(); // might have more taunt auras remaining
14772
14773 if (target && target != taunter)
14774 {
14776 SetInFront(target);
14777 if (creature->IsAIEnabled)
14778 creature->AI()->AttackStart(target);
14779 }
14780}
@ EVADE_REASON_NO_HOSTILES
Definition CreatureAI.h:89
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
Definition CreatureAI.cpp:208
Unit * SelectVictim()
Definition Unit.cpp:14784
bool isThreatListEmpty() const
Definition ThreatMgr.h:224

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), CreatureAI::EnterEvadeMode(), CreatureAI::EVADE_REASON_NO_HOSTILES, Object::GetGUID(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), Player::IsGameMaster(), Object::IsPlayer(), ThreatMgr::isThreatListEmpty(), m_ThreatMgr, REACT_PASSIVE, Creature::SelectVictim(), Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ TextEmote() [1/2]

◆ TextEmote() [2/2]

void Unit::TextEmote ( uint32  textId,
WorldObject const *  target = nullptr,
bool  isBossEmote = false 
)
virtual

Reimplemented in Player.

21239{
21240 Talk(textId, isBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
21241}

References CHAT_MSG_MONSTER_EMOTE, CHAT_MSG_RAID_BOSS_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, and sWorld.

◆ ToPet()

◆ ToTempSummon() [1/2]

TempSummon * Unit::ToTempSummon ( )
inline
702{ if (IsSummon()) return reinterpret_cast<TempSummon*>(this); else return nullptr; }

References IsSummon().

Referenced by CreatureAI::_EnterEvadeMode(), _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(), CreatureAI::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_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(), npc_jenny::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_giant_claw_tentacle::npc_giant_claw_tentacle(), npc_giant_eye_tentacle::npc_giant_eye_tentacle(), npc_midsummer_bonfire::npc_midsummer_bonfire(), 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_jenny::UpdateFollowerAI(), Player::VehicleSpellInitialize(), and npc_frosthound::npc_frosthoundAI::WaypointReached().

◆ ToTempSummon() [2/2]

const TempSummon * Unit::ToTempSummon ( ) const
inline
703{ if (IsSummon()) return reinterpret_cast<const TempSummon*>(this); else return nullptr; }

References IsSummon().

◆ ToTotem()

Totem * Unit::ToTotem ( )
inline
701{ if (IsTotem()) return reinterpret_cast<Totem*>(this); else return nullptr; }
Definition Totem.h:51

References IsTotem().

Referenced by _UnapplyAura(), Spell::EffectDestroyAllTotems(), WorldSession::HandleTotemDestroyed(), SetMinion(), Spell::SummonGuardian(), and TotemAI::UpdateAI().

◆ TriggerAurasProcOnEvent() [1/3]

void Unit::TriggerAurasProcOnEvent ( CalcDamageInfo damageInfo)
16577{
16578 DamageInfo dmgInfo = DamageInfo(damageInfo);
16579 TriggerAurasProcOnEvent(nullptr, nullptr, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, 0, 0, damageInfo.procEx, nullptr, &dmgInfo, nullptr);
16580}
void TriggerAurasProcOnEvent(CalcDamageInfo &damageInfo)
Definition Unit.cpp:16576

References CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::target, and TriggerAurasProcOnEvent().

Referenced by TriggerAurasProcOnEvent(), and TriggerAurasProcOnEvent().

◆ TriggerAurasProcOnEvent() [2/3]

void Unit::TriggerAurasProcOnEvent ( ProcEventInfo eventInfo,
std::list< AuraApplication * > &  procAuras 
)
16602{
16603 for (std::list<AuraApplication*>::iterator itr = aurasTriggeringProc.begin(); itr != aurasTriggeringProc.end(); ++itr)
16604 {
16605 if (!(*itr)->GetRemoveMode())
16606 (*itr)->GetBase()->TriggerProcOnEvent(*itr, eventInfo);
16607 }
16608}

◆ 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 
)
16583{
16584 // prepare data for self trigger
16585 ProcEventInfo myProcEventInfo = ProcEventInfo(this, actionTarget, actionTarget, typeMaskActor, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16586 std::list<AuraApplication*> myAurasTriggeringProc;
16587 GetProcAurasTriggeredOnEvent(myAurasTriggeringProc, myProcAuras, myProcEventInfo);
16588
16589 // prepare data for target trigger
16590 ProcEventInfo targetProcEventInfo = ProcEventInfo(this, actionTarget, this, typeMaskActionTarget, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16591 std::list<AuraApplication*> targetAurasTriggeringProc;
16592 if (typeMaskActionTarget)
16593 GetProcAurasTriggeredOnEvent(targetAurasTriggeringProc, targetProcAuras, targetProcEventInfo);
16594
16595 TriggerAurasProcOnEvent(myProcEventInfo, myAurasTriggeringProc);
16596
16597 if (typeMaskActionTarget)
16598 TriggerAurasProcOnEvent(targetProcEventInfo, targetAurasTriggeringProc);
16599}
void GetProcAurasTriggeredOnEvent(std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
Definition Unit.cpp:16546

References GetProcAurasTriggeredOnEvent(), and TriggerAurasProcOnEvent().

◆ UnsummonAllTotems()

void Unit::UnsummonAllTotems ( bool  onDeath = false)
11250{
11251 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
11252 {
11253 if (!m_SummonSlot[i])
11254 {
11255 continue;
11256 }
11257
11258 if (Creature* OldTotem = GetMap()->GetCreature(m_SummonSlot[i]))
11259 {
11260 if (OldTotem->IsSummon())
11261 {
11262 if (!(onDeath && !IsPlayer() && OldTotem->IsGuardian()))
11263 {
11264 OldTotem->ToTempSummon()->UnSummon();
11265 }
11266 }
11267 }
11268 }
11269}

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.

384{
385 sScriptMgr->OnUnitUpdate(this, p_time);
386
387 // WARNING! Order of execution here is important, do not change.
388 // Spells must be processed with event system BEFORE they go to _UpdateSpells.
389 // Or else we may have some SPELL_STATE_FINISHED spells stalled in pointers, that is bad.
390 WorldObject::Update(p_time);
391
392 if (!IsInWorld())
393 return;
394
395 // pussywizard:
396 if (!IsPlayer() || (!ToPlayer()->IsBeingTeleported() && !bRequestForcedVisibilityUpdate))
397 {
399 {
401 {
403 //ExecuteDelayedUnitRelocationEvent();
405 }
406 else
408 }
410 {
411 if (m_delayed_unit_ai_notify_timer <= p_time)
412 {
415 }
416 else
418 }
419 }
420
421 _UpdateSpells( p_time );
422
423 if (CanHaveThreatList() && GetThreatMgr().isNeedUpdateToClient(p_time))
425
426 // update combat timer only for players and pets (only pets with PetAI)
428 {
429 // Check UNIT_STATE_MELEE_ATTACKING or UNIT_STATE_CHASE (without UNIT_STATE_FOLLOW in this case) so pets can reach far away
430 // targets without stopping half way there and running off.
431 // These flags are reset after target dies or another command is given.
433 {
434 // m_CombatTimer set at aura start and it will be freeze until aura removing
435 if (m_CombatTimer <= p_time)
437 else
438 m_CombatTimer -= p_time;
439 }
440 }
441
444 {
445 while (!extraAttacksTargets.empty())
446 {
447 auto itr = extraAttacksTargets.begin();
448 ObjectGuid targetGuid = itr->first;
449 uint32 count = itr->second;
450 extraAttacksTargets.erase(itr);
451 if (Unit* victim = ObjectAccessor::GetUnit(*this, targetGuid))
452 {
454 || victim->IsWithinMeleeRange(this))
455 {
456 HandleProcExtraAttackFor(victim, count);
457 }
458 }
459 }
461 }
462
463 // not implemented before 3.0.2
464 // xinef: if attack time > 0, reduce by diff
465 // if on next update, attack time < 0 assume player didnt attack - set to 0
466 bool suspendAttackTimer = false;
467 bool suspendRangedAttackTimer = false;
469 {
470 for (Spell* spell : m_currentSpells)
471 {
472 if (spell)
473 {
474 if (spell->GetSpellInfo()->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
475 {
476 if (spell->IsChannelActive())
477 {
478 suspendRangedAttackTimer = true;
479 }
480
481 suspendAttackTimer = true;
482 break;
483 }
484 }
485 }
486 }
487
488 if (!suspendAttackTimer)
489 {
490 if (int32 base_attack = getAttackTimer(BASE_ATTACK))
491 {
492 setAttackTimer(BASE_ATTACK, base_attack > 0 ? base_attack - (int32) p_time : 0);
493 }
494
495 if (int32 off_attack = getAttackTimer(OFF_ATTACK))
496 {
497 setAttackTimer(OFF_ATTACK, off_attack > 0 ? off_attack - (int32) p_time : 0);
498 }
499 }
500
501 if (!suspendRangedAttackTimer)
502 {
503 if (int32 ranged_attack = getAttackTimer(RANGED_ATTACK))
504 {
505 setAttackTimer(RANGED_ATTACK, ranged_attack > 0 ? ranged_attack - (int32)p_time : 0);
506 }
507 }
508
509 // update abilities available only for fraction of time
510 UpdateReactives(p_time);
511
515
516 UpdateSplineMovement(p_time);
517 GetMotionMaster()->UpdateMotion(p_time);
518
520}
@ AURA_STATE_HEALTH_ABOVE_75_PERCENT
Definition SharedDefines.h:1315
bool IsEmpty() const
Definition LinkedList.h:97
std::unordered_set< Unit * > i_objectsForDelayedVisibility
Definition Map.h:236
void UpdateMotion(uint32 diff)
Definition MotionMaster.cpp:104
void _UpdateSpells(uint32 time)
Definition Unit.cpp:3858
void UpdateSplineMovement(uint32 t_diff)
Definition Unit.cpp:576
void UpdateReactives(uint32 p_time)
Definition Unit.cpp:16973
void ExecuteDelayedUnitAINotifyEvent()
Definition Unit.cpp:20545
void HandleProcExtraAttackFor(Unit *victim, uint32 count)
Definition Unit.cpp:2772
void SendThreatListUpdate()
Definition Unit.cpp:20111
virtual void Update(uint32 diff)
Definition Object.cpp:1061

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(), ObjectAccessor::GetUnit(), HandleProcExtraAttackFor(), HasUnitState(), HasUnitTypeMask(), HealthAbovePct(), HealthBelowPct(), Map::i_objectsForDelayedVisibility, InvalidateValuesUpdateCache(), 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_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(), UNIT_MASK_CONTROLABLE_GUARDIAN, UNIT_STATE_CASTING, WorldObject::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)
17203{
17204 if (slot >= MAX_AURAS) // slot not found, return
17205 return;
17206 if (Player* player = ToPlayer())
17207 {
17208 if (player->GetGroup())
17209 {
17210 player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_AURAS);
17211 player->SetAuraUpdateMaskForRaid(slot);
17212 }
17213 }
17214 else if (IsCreature() && IsPet())
17215 {
17216 Pet* pet = ((Pet*)this);
17217 if (pet->isControlled())
17218 {
17219 Unit* owner = GetOwner();
17220 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
17221 {
17223 pet->SetAuraUpdateMaskForRaid(slot);
17224 }
17225 }
17226 }
17227}
@ 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:137

References Player::GetGroup(), GetOwner(), GROUP_UPDATE_FLAG_AURAS, GROUP_UPDATE_FLAG_PET_AURAS, Pet::isControlled(), Object::IsCreature(), IsPet(), Object::IsPlayer(), MAX_AURAS, Pet::SetAuraUpdateMaskForRaid(), Player::SetGroupUpdateFlag(), and Object::ToPlayer().

Referenced by RemoveVisibleAura(), and SetVisibleAura().

◆ UpdateCharmAI()

void Unit::UpdateCharmAI ( )
15822{
15823 if (IsPlayer())
15824 return;
15825
15826 if (i_disabledAI) // disabled AI must be primary AI
15827 {
15828 if (!IsCharmed())
15829 {
15830 delete i_AI;
15832 i_disabledAI = nullptr;
15833 }
15834 }
15835 else
15836 {
15837 if (IsCharmed())
15838 {
15840 if (isPossessed() || IsVehicle())
15841 i_AI = new PossessedAI(ToCreature());
15842 else
15843 i_AI = new PetAI(ToCreature());
15844 }
15845 }
15846}
Definition PetAI.h:47
Definition PassiveAI.h:37

References i_AI, i_disabledAI, IsCharmed(), Object::IsPlayer(), isPossessed(), IsVehicle(), and Object::ToCreature().

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(), ScriptedAI::SetEquipmentSlots(), Creature::UpdateAttackPowerAndDamage(), and Player::UpdateAttackPowerAndDamage().

◆ UpdateHeight()

void Unit::UpdateHeight ( float  newZ)

Only server-side height update, does not broadcast to client.

20105{
20107 if (IsVehicle())
20109}
void RelocatePassengers()
Definition Vehicle.cpp:514

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 ( )
756{
757 m_interruptMask = 0;
758 for (AuraApplicationList::const_iterator i = m_interruptableAuras.begin(); i != m_interruptableAuras.end(); ++i)
759 m_interruptMask |= (*i)->GetBase()->GetSpellInfo()->AuraInterruptFlags;
760
762 if (spell->getState() == SPELL_STATE_CASTING)
763 m_interruptMask |= spell->m_spellInfo->ChannelInterruptFlags;
764}

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.

20097{
20098 SetOrientation(orientation);
20099 if (IsVehicle())
20101}

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.

20059{
20060 if (!Acore::IsValidMapCoord(x, y, z, orientation))
20061 return false;
20062
20063 float old_orientation = GetOrientation();
20064 float current_z = GetPositionZ();
20065 bool turn = (old_orientation != orientation);
20066 bool relocated = (teleport || GetPositionX() != x || GetPositionY() != y || current_z != z);
20067
20068 if (!GetVehicle())
20069 {
20070 uint32 mask = 0;
20071 if (turn) mask |= AURA_INTERRUPT_FLAG_TURNING;
20072 if (relocated) mask |= AURA_INTERRUPT_FLAG_MOVE;
20073 if (mask)
20075 }
20076
20077 if (relocated)
20078 {
20079 if (IsPlayer())
20080 GetMap()->PlayerRelocation(ToPlayer(), x, y, z, orientation);
20081 else
20082 GetMap()->CreatureRelocation(ToCreature(), x, y, z, orientation);
20083 }
20084 else if (turn)
20085 {
20086 UpdateOrientation(orientation);
20087
20088 if (IsPlayer() && ToPlayer()->GetFarSightDistance())
20090 }
20091
20092 return (relocated || turn);
20093}
void PlayerRelocation(Player *, float x, float y, float z, float o)
Definition Map.cpp:843
void CreatureRelocation(Creature *creature, float x, float y, float z, float o)
Definition Map.cpp:865
void UpdateOrientation(float orientation)
Only server-side orientation update, does not broadcast to client.
Definition Unit.cpp:20096
bool IsValidMapCoord(float c)
Definition GridDefines.h:206

References AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, Map::CreatureRelocation(), WorldObject::GetMap(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetVehicle(), Object::IsPlayer(), Acore::IsValidMapCoord(), Map::PlayerRelocation(), RemoveAurasWithInterruptFlags(), Object::ToCreature(), Object::ToPlayer(), UpdateObjectVisibility(), and UpdateOrientation().

Referenced by npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_taldaram::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_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)
16974{
16975 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
16976 {
16977 ReactiveType reactive = ReactiveType(i);
16978
16979 if (!m_reactiveTimer[reactive])
16980 continue;
16981
16982 if (m_reactiveTimer[reactive] <= p_time)
16983 {
16984 m_reactiveTimer[reactive] = 0;
16985
16986 switch (reactive)
16987 {
16988 case REACTIVE_DEFENSE:
16991 break;
16995 break;
16996 case REACTIVE_OVERPOWER:
16998 {
17000 }
17001 break;
17003 if (IsHunterPet())
17005 break;
17006 default:
17007 break;
17008 }
17009 }
17010 else
17011 {
17012 m_reactiveTimer[reactive] -= p_time;
17013 }
17014 }
17015}
ReactiveType
Definition Unit.h:593

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), 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
14302{
14303 int32 main_speed_mod = 0;
14304 float stack_bonus = 1.0f;
14305 float non_stack_bonus = 1.0f;
14306
14307 switch (mtype)
14308 {
14309 // Only apply debuffs
14310 case MOVE_FLIGHT_BACK:
14311 case MOVE_RUN_BACK:
14312 case MOVE_SWIM_BACK:
14313 case MOVE_WALK:
14314 break;
14315 case MOVE_RUN:
14316 {
14317 if (IsMounted()) // Use on mount auras
14318 {
14322 }
14323 else
14324 {
14328 }
14329 break;
14330 }
14331 case MOVE_SWIM:
14332 {
14333 // xinef: check for forced_speed_mod of sea turtle
14335 for (Unit::AuraEffectList::const_iterator itr = swimAuras.begin(); itr != swimAuras.end(); ++itr)
14336 {
14337 // xinef: sea turtle only, it is not affected by any increasing / decreasing effects
14338 if ((*itr)->GetId() == 64731 /*SPELL_SEA_TURTLE*/)
14339 {
14340 SetSpeed(mtype, AddPct(non_stack_bonus, (*itr)->GetAmount()), forced);
14341 return;
14342 }
14343 else if (
14344 // case: increase speed
14345 ((*itr)->GetAmount() > 0 && (*itr)->GetAmount() > main_speed_mod) ||
14346 // case: decrease speed
14347 ((*itr)->GetAmount() < 0 && (*itr)->GetAmount() < main_speed_mod)
14348 )
14349 {
14350 main_speed_mod = (*itr)->GetAmount();
14351 }
14352 }
14353 break;
14354 }
14355 case MOVE_FLIGHT:
14356 {
14357 if (IsCreature() && IsControlledByPlayer()) // not sure if good for pet
14358 {
14361
14362 // for some spells this mod is applied on vehicle owner
14363 int32 owner_speed_mod = 0;
14364
14365 if (Unit* owner = GetCharmer())
14366 owner_speed_mod = owner->GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED);
14367
14368 main_speed_mod = std::max(main_speed_mod, owner_speed_mod);
14369 }
14370 else if (IsMounted())
14371 {
14375 }
14376 else // Use not mount (shapeshift for example) auras (should stack)
14377 {
14381 }
14382
14383 // Update speed for vehicle if available
14384 if (IsPlayer() && GetVehicle())
14386 break;
14387 }
14388 default:
14389 LOG_ERROR("entities.unit", "Unit::UpdateSpeed: Unsupported move type ({})", mtype);
14390 return;
14391 }
14392
14393 // now we ready for speed calculation
14394 float speed = std::max(non_stack_bonus, stack_bonus);
14395 if (main_speed_mod)
14396 AddPct(speed, main_speed_mod);
14397
14398 switch (mtype)
14399 {
14400 case MOVE_RUN:
14401 case MOVE_SWIM:
14402 case MOVE_FLIGHT:
14403 {
14404 // Set creature speed rate
14405 if (IsCreature())
14406 {
14407 if (IsPet() && ToPet()->isControlled() && IsControlledByPlayer())
14408 {
14409 // contant value for player pets
14410 speed *= 1.15f;
14411 }
14412 else
14413 {
14414 speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached
14415 }
14416 }
14417
14418 // Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need
14421 {
14422 if (Creature* creature = ToCreature())
14423 {
14424 uint32 immuneMask = creature->GetCreatureTemplate()->MechanicImmuneMask;
14425 if (immuneMask & (1 << (MECHANIC_SNARE - 1)) || immuneMask & (1 << (MECHANIC_DAZE - 1)))
14426 break;
14427 }
14428
14429 // Use speed from aura
14430 float max_speed = normalization / (IsControlledByPlayer() ? playerBaseMoveSpeed[mtype] : baseMoveSpeed[mtype]);
14431 if (speed > max_speed)
14432 speed = max_speed;
14433 }
14434 break;
14435 }
14436 default:
14437 break;
14438 }
14439
14440 int32 slowFromHealth = 0;
14441 Creature* creature = ToCreature();
14442 // ignore pets, player owned vehicles, and mobs immune to snare
14443 if (creature
14444 && !IsPet()
14445 && !(IsControlledByPlayer() && IsVehicle())
14447 && !(creature->IsDungeonBoss()))
14448 {
14449 // 1.6% for each % under 30.
14450 // use min(0, health-30) so that we don't boost mobs above 30.
14451 slowFromHealth = (int32) std::min(0.0f, (1.66f * (GetHealthPct() - 30.0f)));
14452 }
14453
14454 if (slowFromHealth)
14455 {
14456 AddPct(speed, slowFromHealth);
14457 }
14458
14459 // Apply strongest slow aura mod to speed
14461 if (slow)
14462 AddPct(speed, slow);
14463
14464 if (float minSpeedMod = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MINIMUM_SPEED))
14465 {
14466 float base_speed = (IsCreature() ? ToCreature()->GetCreatureTemplate()->speed_run : 1.0f);
14467 float min_speed = base_speed * (minSpeedMod / 100.0f);
14468 if (speed < min_speed)
14469 speed = min_speed;
14470 }
14471
14472 SetSpeed(mtype, speed, forced);
14473}
@ MECHANIC_DAZE
Definition SharedDefines.h:1352
@ SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED
Definition SpellAuraDefines.h:269
@ SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS
Definition SpellAuraDefines.h:272
@ SPELL_AURA_MOD_INCREASE_SPEED
Definition SpellAuraDefines.h:94
@ SPELL_AURA_MOD_FLIGHT_SPEED_ALWAYS
Definition SpellAuraDefines.h:271
@ SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK
Definition SpellAuraDefines.h:235
@ SPELL_AURA_MOD_SPEED_NOT_STACK
Definition SpellAuraDefines.h:234
@ SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING
Definition SpellAuraDefines.h:273
@ SPELL_AURA_MOD_INCREASE_SWIM_SPEED
Definition SpellAuraDefines.h:121
@ SPELL_AURA_MOD_MINIMUM_SPEED
Definition SpellAuraDefines.h:368
@ SPELL_AURA_MOD_SPEED_ALWAYS
Definition SpellAuraDefines.h:192
@ SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING
Definition SpellAuraDefines.h:274
@ SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS
Definition SpellAuraDefines.h:193
@ SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED
Definition SpellAuraDefines.h:254
void SetSpeed(UnitMoveType mtype, float rate, bool forced=false)
Definition Unit.cpp:14480
float speed_run
Definition CreatureData.h:201

References AddPct(), baseMoveSpeed, GetAuraEffectsByType(), GetCharmer(), Creature::GetCreatureTemplate(), GetHealthPct(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), GetTotalAuraModifier(), GetTotalAuraMultiplier(), GetVehicle(), GetVehicleBase(), Creature::HasMechanicTemplateImmunity(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsDungeonBoss(), IsMounted(), IsPet(), Object::IsPlayer(), 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_ALWAYS, SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING, SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING, 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_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_USE_NORMAL_MOVEMENT_SPEED, Object::ToCreature(), ToPet(), 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
577{
578 if (movespline->Finalized())
579 return;
580
581 // xinef: process movementinform
582 // this code cant be placed inside EscortMovementGenerator, because we cant delete active MoveGen while it is updated
583 SplineHandler handler(this);
584 movespline->updateState(t_diff, handler);
585 // Xinef: Spline was cleared by StopMoving, return
586 if (!movespline->Initialized())
587 {
589 return;
590 }
591
592 bool arrived = movespline->Finalized();
593
594 if (arrived)
595 {
597
598 if (movespline->HasAnimation() && IsCreature() && IsAlive())
600 }
601
602 // pussywizard: update always! not every 400ms, because movement generators need the actual position
603 //m_movesplineTimer.Update(t_diff);
604 //if (m_movesplineTimer.Passed() || arrived)
606}
@ UNIT_BYTES_1_OFFSET_ANIM_TIER
Definition UnitDefines.h:26
uint8 GetAnimationType() const
Definition MoveSpline.h:125
void updateState(int32 difftime, UpdateHandler &handler)
Definition MoveSpline.h:98
bool HasAnimation() const
Definition MoveSpline.h:124
Definition Unit.cpp:556

References DisableSpline(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::GetAnimationType(), Movement::MoveSpline::HasAnimation(), Movement::MoveSpline::Initialized(), IsAlive(), Object::IsCreature(), movespline, Object::SetByteValue(), UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_FIELD_BYTES_1, UpdateSplinePosition(), and Movement::MoveSpline::updateState().

Referenced by Update().

◆ UpdateSplinePosition()

void Unit::UpdateSplinePosition ( )
private
609{
610 //static uint32 const positionUpdateDelay = 400;
611
612 //m_movesplineTimer.Reset(positionUpdateDelay);
614
616 {
618 pos.m_positionX = loc.x;
619 pos.m_positionY = loc.y;
620 pos.m_positionZ = loc.z;
622
623 if (TransportBase* transport = GetDirectTransport())
624 transport->CalculatePassengerPosition(loc.x, loc.y, loc.z, &loc.orientation);
625 }
626
627 // Xinef: if we had spline running update orientation along with position
628 //if (HasUnitState(UNIT_STATE_CANNOT_TURN))
629 // loc.orientation = GetOrientation();
630
631 if (IsPlayer())
632 UpdatePosition(loc.x, loc.y, loc.z, loc.orientation);
633 else
634 ToCreature()->SetPosition(loc.x, loc.y, loc.z, loc.orientation);
635}
void SetPosition(float x, float y, float z, float o)
Definition Creature.cpp:3168
Location ComputePosition() const
Definition MoveSpline.cpp:26
bool onTransport
Definition MoveSpline.h:127
Definition VehicleDefines.h:130
TransportBase * GetDirectTransport() const
Definition Unit.cpp:18800
Position pos
Definition Object.h:303
Definition MoveSpline.h:27
float orientation
Definition MoveSpline.h:33
float m_positionZ
Definition Position.h:57
float m_positionX
Definition Position.h:55
float m_positionY
Definition Position.h:56

References Movement::MoveSpline::ComputePosition(), GetDirectTransport(), Object::IsPlayer(), 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, 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.

21186{
21187 if (!target)
21188 {
21189 return;
21190 }
21191
21193 WorldPacket data;
21194 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, language, this, target, text, 0, "", locale);
21195 target->SendDirectMessage(&data);
21196}
LocaleConstant
Definition Common.h:65
@ CHAT_MSG_MONSTER_WHISPER
Definition SharedDefines.h:3167
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition SharedDefines.h:3194
static std::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:265
LocaleConstant GetSessionDbLocaleIndex() const
Definition WorldSession.h:512

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), and Player::SendDirectMessage().

Referenced by npc_commandscript::HandleNpcWhisperCommand(), spell_lich_king_whisper::HandleScript(), 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.

21244{
21245 if (!target)
21246 {
21247 return;
21248 }
21249
21250 BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId);
21251 if (!bct)
21252 {
21253 LOG_ERROR("entities.unit", "Unit::Whisper: `broadcast_text` was not {} found", textId);
21254 return;
21255 }
21256
21258 WorldPacket data;
21259 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
21260 target->SendDirectMessage(&data);
21261}
Definition ObjectMgr.h:434

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]

void Unit::Yell ( std::string_view  text,
Language  language,
WorldObject const *  target = nullptr 
)
virtual

◆ Yell() [2/2]

void Unit::Yell ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21234{
21235 Talk(textId, CHAT_MSG_MONSTER_YELL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target);
21236}

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

◆ _valuesUpdateCache

ValuesUpdateCache Unit::_valuesUpdateCache
private

◆ 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

◆ 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

uint16 Unit::m_delayed_unit_relocation_timer

Referenced by Unit(), Player::Update(), and Update().

◆ m_Diminishing

◆ m_duringRemoveFromWorld

bool Unit::m_duringRemoveFromWorld
private

◆ m_dynObj

◆ 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

◆ 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

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