diff options
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 99 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 23 | 
2 files changed, 97 insertions, 25 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index b2308313eab..2dcac43b828 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -103,21 +103,63 @@ static bool isAlwaysTriggeredAura[TOTAL_AURAS];  // Prepare lists  static bool procPrepared = InitTriggerAuraData(); -DamageInfo::DamageInfo(Unit* _attacker, Unit* _victim, uint32 _damage, SpellInfo const* _spellInfo, SpellSchoolMask _schoolMask, DamageEffectType _damageType) -: m_attacker(_attacker), m_victim(_victim), m_damage(_damage), m_spellInfo(_spellInfo), m_schoolMask(_schoolMask), -m_damageType(_damageType), m_attackType(BASE_ATTACK) +DamageInfo::DamageInfo(Unit* attacker, Unit* victim, uint32 damage, SpellInfo const* spellInfo, SpellSchoolMask schoolMask, DamageEffectType damageType, WeaponAttackType attackType) +    : m_attacker(attacker), m_victim(victim), m_damage(damage), m_spellInfo(spellInfo), m_schoolMask(schoolMask), m_damageType(damageType), m_attackType(attackType), +    m_absorb(0), m_resist(0), m_block(0), m_hitMask(0)  { -    m_absorb = 0; -    m_resist = 0; -    m_block = 0;  } -DamageInfo::DamageInfo(CalcDamageInfo& dmgInfo) -: m_attacker(dmgInfo.attacker), m_victim(dmgInfo.target), m_damage(dmgInfo.damage), m_spellInfo(NULL), m_schoolMask(SpellSchoolMask(dmgInfo.damageSchoolMask)), -m_damageType(DIRECT_DAMAGE), m_attackType(dmgInfo.attackType) + +DamageInfo::DamageInfo(CalcDamageInfo const& dmgInfo) +    : m_attacker(dmgInfo.attacker), m_victim(dmgInfo.target), m_damage(dmgInfo.damage), m_spellInfo(nullptr), m_schoolMask(SpellSchoolMask(dmgInfo.damageSchoolMask)), +    m_damageType(DIRECT_DAMAGE), m_attackType(dmgInfo.attackType), m_absorb(dmgInfo.absorb), m_resist(dmgInfo.resist), m_block(dmgInfo.blocked_amount), m_hitMask(0) +{ +    switch (dmgInfo.TargetState) +    { +        case VICTIMSTATE_IS_IMMUNE: +            m_hitMask |= PROC_HIT_IMMUNE; +            break; +        case VICTIMSTATE_BLOCKS: +            m_hitMask |= PROC_HIT_FULL_BLOCK; +            break; +    } + +    if (m_absorb) +        m_hitMask |= PROC_HIT_ABSORB; + +    if (dmgInfo.HitInfo & HITINFO_FULL_RESIST) +        m_hitMask |= PROC_HIT_FULL_RESIST; + +    if (m_block) +        m_hitMask |= PROC_HIT_BLOCK; + +    switch (dmgInfo.hitOutCome) +    { +        case MELEE_HIT_MISS: +            m_hitMask |= PROC_HIT_MISS; +            break; +        case MELEE_HIT_DODGE: +            m_hitMask |= PROC_HIT_DODGE; +            break; +        case MELEE_HIT_PARRY: +            m_hitMask |= PROC_HIT_PARRY; +            break; +        case MELEE_HIT_EVADE: +            m_hitMask |= PROC_HIT_EVADE; +            break; +        default: +            break; +    } +} + +DamageInfo::DamageInfo(SpellNonMeleeDamage const& spellNonMeleeDamage, DamageEffectType damageType, WeaponAttackType attackType) +    : m_attacker(spellNonMeleeDamage.attacker), m_victim(spellNonMeleeDamage.target), m_damage(spellNonMeleeDamage.damage), +    m_spellInfo(sSpellMgr->GetSpellInfo(spellNonMeleeDamage.SpellID)), m_schoolMask(SpellSchoolMask(spellNonMeleeDamage.schoolMask)), m_damageType(damageType), +    m_attackType(attackType), m_absorb(spellNonMeleeDamage.absorb), m_resist(spellNonMeleeDamage.resist), m_block(spellNonMeleeDamage.blocked), m_hitMask(0)  { -    m_absorb = 0; -    m_resist = 0; -    m_block = 0; +    if (spellNonMeleeDamage.blocked) +        m_hitMask |= PROC_HIT_BLOCK; +    if (spellNonMeleeDamage.absorb) +        m_hitMask |= PROC_HIT_ABSORB;  }  void DamageInfo::ModifyDamage(int32 amount) @@ -131,6 +173,7 @@ void DamageInfo::AbsorbDamage(uint32 amount)      amount = std::min(amount, GetDamage());      m_absorb += amount;      m_damage -= amount; +    m_hitMask |= PROC_HIT_ABSORB;  }  void DamageInfo::ResistDamage(uint32 amount) @@ -138,6 +181,8 @@ void DamageInfo::ResistDamage(uint32 amount)      amount = std::min(amount, GetDamage());      m_resist += amount;      m_damage -= amount; +    if (!m_damage) +        m_hitMask |= PROC_HIT_FULL_RESIST;  }  void DamageInfo::BlockDamage(uint32 amount) @@ -145,6 +190,32 @@ void DamageInfo::BlockDamage(uint32 amount)      amount = std::min(amount, GetDamage());      m_block += amount;      m_damage -= amount; +    m_hitMask |= PROC_HIT_BLOCK; +    if (!m_damage) +        m_hitMask |= PROC_HIT_FULL_BLOCK; +} + +uint32 DamageInfo::GetHitMask() const +{ +    return m_hitMask; +} + +HealInfo::HealInfo(Unit* healer, Unit* target, uint32 heal, SpellInfo const* spellInfo, SpellSchoolMask schoolMask) +    : _healer(healer), _target(target), _heal(heal), _absorb(0), _spellInfo(spellInfo), _schoolMask(schoolMask), _hitMask(0) +{ +} + +void HealInfo::AbsorbHeal(uint32 amount) +{ +    amount = std::min(amount, GetHeal()); +    _absorb += amount; +    _heal -= amount; +    _hitMask |= PROC_HIT_ABSORB; +} + +uint32 HealInfo::GetHitMask() const +{ +    return _hitMask;  }  ProcEventInfo::ProcEventInfo(Unit* actor, Unit* actionTarget, Unit* procTarget, @@ -1679,7 +1750,7 @@ void Unit::CalcAbsorbResist(Unit* victim, SpellSchoolMask schoolMask, DamageEffe      if (!victim || !victim->IsAlive() || !damage)          return; -    DamageInfo dmgInfo = DamageInfo(this, victim, damage, spellInfo, schoolMask, damagetype); +    DamageInfo dmgInfo = DamageInfo(this, victim, damage, spellInfo, schoolMask, damagetype, BASE_ATTACK);      uint32 spellResistance = CalcSpellResistance(victim, schoolMask, spellInfo);      dmgInfo.ResistDamage(CalculatePct(damage, spellResistance)); @@ -13829,7 +13900,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u      Unit* actor = isVictim ? target : this;      Unit* actionTarget = !isVictim ? target : this; -    DamageInfo damageInfo = DamageInfo(actor, actionTarget, damage, procSpell, procSpell ? SpellSchoolMask(procSpell->SchoolMask) : SPELL_SCHOOL_MASK_NORMAL, SPELL_DIRECT_DAMAGE); +    DamageInfo damageInfo = DamageInfo(actor, actionTarget, damage, procSpell, procSpell ? SpellSchoolMask(procSpell->SchoolMask) : SPELL_SCHOOL_MASK_NORMAL, SPELL_DIRECT_DAMAGE, attType);      HealInfo healInfo = HealInfo(actor, actionTarget, damage, procSpell, procSpell ? SpellSchoolMask(procSpell->SchoolMask) : SPELL_SCHOOL_MASK_NORMAL);      ProcEventInfo eventInfo = ProcEventInfo(actor, actionTarget, target, procFlag, 0, 0, procExtra, nullptr, &damageInfo, &healInfo); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index f036968f9bd..1a782c3e89f 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -863,9 +863,11 @@ private:      uint32 m_absorb;      uint32 m_resist;      uint32 m_block; +    uint32 m_hitMask;  public: -    explicit DamageInfo(Unit* _attacker, Unit* _victim, uint32 _damage, SpellInfo const* _spellInfo, SpellSchoolMask _schoolMask, DamageEffectType _damageType); -    explicit DamageInfo(CalcDamageInfo& dmgInfo); +    DamageInfo(Unit* attacker, Unit* victim, uint32 damage, SpellInfo const* spellInfo, SpellSchoolMask schoolMask, DamageEffectType damageType, WeaponAttackType attackType); +    explicit DamageInfo(CalcDamageInfo const& dmgInfo); +    DamageInfo(SpellNonMeleeDamage const& spellNonMeleeDamage, DamageEffectType damageType, WeaponAttackType attackType);      void ModifyDamage(int32 amount);      void AbsorbDamage(uint32 amount); @@ -882,9 +884,11 @@ public:      uint32 GetAbsorb() const { return m_absorb; }      uint32 GetResist() const { return m_resist; }      uint32 GetBlock() const { return m_block; } + +    uint32 GetHitMask() const;  }; -class HealInfo +class TC_GAME_API HealInfo  {  private:      Unit* const _healer; @@ -893,17 +897,12 @@ private:      uint32 _absorb;      SpellInfo const* const _spellInfo;      SpellSchoolMask const _schoolMask; +    uint32 _hitMask;  public: -    explicit HealInfo(Unit* healer, Unit* target, uint32 heal, SpellInfo const* spellInfo, SpellSchoolMask schoolMask) -        : _healer(healer), _target(target), _heal(heal), _absorb(0), _spellInfo(spellInfo), _schoolMask(schoolMask) { } +    explicit HealInfo(Unit* healer, Unit* target, uint32 heal, SpellInfo const* spellInfo, SpellSchoolMask schoolMask); -    void AbsorbHeal(uint32 amount) -    { -        amount = std::min(amount, GetHeal()); -        _absorb += amount; -        _heal -= amount; -    } +    void AbsorbHeal(uint32 amount);      Unit* GetHealer() const { return _healer; }      Unit* GetTarget() const { return _target; } @@ -911,6 +910,8 @@ public:      uint32 GetAbsorb() const { return _absorb; }      SpellInfo const* GetSpellInfo() const { return _spellInfo; };      SpellSchoolMask GetSchoolMask() const { return _schoolMask; }; + +    uint32 GetHitMask() const;  };  class TC_GAME_API ProcEventInfo  | 
