diff options
| -rwxr-xr-x | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 160 | 
1 files changed, 86 insertions, 74 deletions
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index dff1689cc0a..f59dc5d40c9 100755 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -419,16 +419,16 @@ int32 AuraEffect::CalculateAmount(Unit* caster)      // check item enchant aura cast      if (!amount && caster)          if (uint64 itemGUID = GetBase()->GetCastItemGUID()) -            if (Player* playerCaster = dynamic_cast<Player*>(caster)) +            if (Player* playerCaster = caster->ToPlayer())                  if (Item *castItem = playerCaster->GetItemByGuid(itemGUID))                      if (castItem->GetItemSuffixFactor())                      { -                        ItemRandomSuffixEntry const *item_rand_suffix = sItemRandomSuffixStore.LookupEntry(abs(castItem->GetItemRandomPropertyId())); +                        ItemRandomSuffixEntry const* item_rand_suffix = sItemRandomSuffixStore.LookupEntry(abs(castItem->GetItemRandomPropertyId()));                          if (item_rand_suffix)                          {                              for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; k++)                              { -                                SpellItemEnchantmentEntry const *pEnchant = sSpellItemEnchantmentStore.LookupEntry(item_rand_suffix->enchant_id[k]); +                                SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(item_rand_suffix->enchant_id[k]);                                  if (pEnchant)                                  {                                      for (int t = 0; t < MAX_ITEM_ENCHANTMENT_EFFECTS; t++) @@ -760,7 +760,7 @@ int32 AuraEffect::CalculateAmount(Unit* caster)          amount += (int32)DoneActualBenefit;      } -    GetBase()->CallScriptEffectCalcAmountHandlers(const_cast<AuraEffect const *>(this), amount, m_canBeRecalculated); +    GetBase()->CallScriptEffectCalcAmountHandlers(const_cast<AuraEffect const*>(this), amount, m_canBeRecalculated);      amount *= GetBase()->GetStackAmount();      return amount;  } @@ -809,7 +809,7 @@ void AuraEffect::CalculatePeriodic(Unit* caster, bool create, bool load)              break;      } -    GetBase()->CallScriptEffectCalcPeriodicHandlers(const_cast<AuraEffect const *>(this), m_isPeriodic, m_amplitude); +    GetBase()->CallScriptEffectCalcPeriodicHandlers(const_cast<AuraEffect const*>(this), m_isPeriodic, m_amplitude);      if (!m_isPeriodic)          return; @@ -945,7 +945,7 @@ void AuraEffect::CalculateSpellMod()          default:              break;      } -    GetBase()->CallScriptEffectCalcSpellModHandlers(const_cast<AuraEffect const *>(this), m_spellmod); +    GetBase()->CallScriptEffectCalcSpellModHandlers(const_cast<AuraEffect const*>(this), m_spellmod);  }  void AuraEffect::ChangeAmount(int32 newAmount, bool mark, bool onStackOrReapply) @@ -1003,15 +1003,15 @@ void AuraEffect::HandleEffect(AuraApplication * aurApp, uint8 mode, bool apply)      // call scripts helping/replacing effect handlers      bool prevented = false;      if (apply) -        prevented = GetBase()->CallScriptEffectApplyHandlers(const_cast<AuraEffect const *>(this), const_cast<AuraApplication const *>(aurApp), (AuraEffectHandleModes)mode); +        prevented = GetBase()->CallScriptEffectApplyHandlers(const_cast<AuraEffect const*>(this), const_cast<AuraApplication const*>(aurApp), (AuraEffectHandleModes)mode);      else -        prevented = GetBase()->CallScriptEffectRemoveHandlers(const_cast<AuraEffect const *>(this), const_cast<AuraApplication const *>(aurApp), (AuraEffectHandleModes)mode); +        prevented = GetBase()->CallScriptEffectRemoveHandlers(const_cast<AuraEffect const*>(this), const_cast<AuraApplication const*>(aurApp), (AuraEffectHandleModes)mode);      // check if script events have removed the aura or if default effect prevention was requested      if ((apply && aurApp->GetRemoveMode()) || prevented)          return; -    (*this.*AuraEffectHandler [GetAuraType()])(const_cast<AuraApplication const *>(aurApp), mode, apply); +    (*this.*AuraEffectHandler [GetAuraType()])(const_cast<AuraApplication const*>(aurApp), mode, apply);      // check if script events have removed the aura or if default effect prevention was requested      if (apply && aurApp->GetRemoveMode()) @@ -1019,9 +1019,9 @@ void AuraEffect::HandleEffect(AuraApplication * aurApp, uint8 mode, bool apply)      // call scripts triggering additional events after apply/remove      if (apply) -        GetBase()->CallScriptAfterEffectApplyHandlers(const_cast<AuraEffect const *>(this), const_cast<AuraApplication const *>(aurApp), (AuraEffectHandleModes)mode); +        GetBase()->CallScriptAfterEffectApplyHandlers(const_cast<AuraEffect const*>(this), const_cast<AuraApplication const*>(aurApp), (AuraEffectHandleModes)mode);      else -        GetBase()->CallScriptAfterEffectRemoveHandlers(const_cast<AuraEffect const *>(this), const_cast<AuraApplication const *>(aurApp), (AuraEffectHandleModes)mode); +        GetBase()->CallScriptAfterEffectRemoveHandlers(const_cast<AuraEffect const*>(this), const_cast<AuraApplication const*>(aurApp), (AuraEffectHandleModes)mode);  }  void AuraEffect::HandleEffect(Unit* target, uint8 mode, bool apply) @@ -1324,7 +1324,7 @@ void AuraEffect::PeriodicTick(AuraApplication * aurApp, Unit* caster) const      }  } -bool AuraEffect::IsAffectedOnSpell(SpellEntry const *spell) const +bool AuraEffect::IsAffectedOnSpell(SpellEntry const* spell) const  {      if (!spell)          return false; @@ -1462,7 +1462,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const              {                  if (itr->second->state == PLAYERSPELL_REMOVED || itr->second->disabled) continue;                  if (itr->first == spellId || itr->first == spellId2) continue; -                SpellEntry const *spellInfo = sSpellStore.LookupEntry(itr->first); +                SpellEntry const* spellInfo = sSpellStore.LookupEntry(itr->first);                  if (!spellInfo || !(spellInfo->Attributes & (SPELL_ATTR0_PASSIVE | SPELL_ATTR0_HIDDEN_CLIENTSIDE))) continue;                  if (spellInfo->Stances & (1<<(GetMiscValue()-1)))                      target->CastSpell(target, itr->first, true, NULL, this); @@ -1470,7 +1470,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const              // Leader of the Pack              if (target->ToPlayer()->HasSpell(17007))              { -                SpellEntry const *spellInfo = sSpellStore.LookupEntry(24932); +                SpellEntry const* spellInfo = sSpellStore.LookupEntry(24932);                  if (spellInfo && spellInfo->Stances & (1<<(GetMiscValue()-1)))                      target->CastSpell(target, 24932, true, NULL, this);              } @@ -1567,7 +1567,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const              target->RemoveAurasDueToSpell(spellId2);          // Improved Barkskin - apply/remove armor bonus due to shapeshift -        if (Player *pl=target->ToPlayer()) +        if (Player* pl=target->ToPlayer())          {              if (pl->HasSpell(63410) || pl->HasSpell(63411))              { @@ -2068,7 +2068,7 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo                      for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr)                      {                          if (itr->second->state == PLAYERSPELL_REMOVED || itr->second->disabled) continue; -                        SpellEntry const *spellInfo = sSpellStore.LookupEntry(itr->first); +                        SpellEntry const* spellInfo = sSpellStore.LookupEntry(itr->first);                          if (spellInfo && spellInfo->SpellFamilyName == SPELLFAMILY_WARRIOR && spellInfo->SpellIconID == 139)                              Rage_val += target->CalculateSpellDamage(target, spellInfo, 0) * 10;                      } @@ -2113,7 +2113,7 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo      if (target->GetTypeId() == TYPEID_PLAYER)      { -        SpellShapeshiftEntry const *shapeInfo = sSpellShapeshiftStore.LookupEntry(form); +        SpellShapeshiftEntry const* shapeInfo = sSpellShapeshiftStore.LookupEntry(form);          // Learn spells for shapeshift form - no need to send action bars or add spells to spellbook          for (uint8 i = 0; i<MAX_SHAPESHIFT_SPELLS; ++i)          { @@ -2533,7 +2533,7 @@ void AuraEffect::HandleAuraModDisarm(AuraApplication const* aurApp, uint8 mode,      if (apply)          target->SetFlag(field, flag); -    // Handle damage modifcation, shapeshifted druids are not affected +    // Handle damage modification, shapeshifted druids are not affected      if (target->GetTypeId() == TYPEID_PLAYER && !target->IsInFeralForm())      {          if (Item *pItem = target->ToPlayer()->GetItemByPos(INVENTORY_SLOT_BAG_0, slot)) @@ -2840,7 +2840,7 @@ void AuraEffect::HandleAuraAllowFlight(AuraApplication const* aurApp, uint8 mode      if (target->GetTypeId() == TYPEID_UNIT)          target->SetFlying(apply); -    if (Player *plr = target->m_movedPlayer) +    if (Player* plr = target->m_movedPlayer)      {          // allow flying          WorldPacket data; @@ -2970,7 +2970,7 @@ void AuraEffect::HandleModThreat(AuraApplication const* aurApp, uint8 mode, bool          return;      Unit* target = aurApp->GetTarget(); -    for (int32 i = 0; i < MAX_SPELL_SCHOOL; ++i) +    for (int8 i = 0; i < MAX_SPELL_SCHOOL; ++i)          if (GetMiscValue() & (1 << i))              ApplyPercentModFloatVar(target->m_threatModifier[i], float(GetAmount()), apply);  } @@ -2986,10 +2986,8 @@ void AuraEffect::HandleAuraModTotalThreat(AuraApplication const* aurApp, uint8 m          return;      Unit* caster = GetCaster(); -    if (!caster || !caster->isAlive()) -        return; - -    target->getHostileRefManager().addTempThreat((float)GetAmount(), apply); +    if (caster && caster->isAlive()) +        target->getHostileRefManager().addTempThreat((float)GetAmount(), apply);  }  void AuraEffect::HandleModTaunt(AuraApplication const* aurApp, uint8 mode, bool apply) const @@ -3241,7 +3239,7 @@ void AuraEffect::HandleAuraModIncreaseFlightSpeed(AuraApplication const* aurApp,          // do not remove unit flag if there are more than this auraEffect of that kind on unit on unit          if (mode & AURA_EFFECT_HANDLE_SEND_FOR_CLIENT_MASK && (apply || (!target->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) && !target->HasAuraType(SPELL_AURA_FLY))))          { -            if (Player *plr = target->m_movedPlayer) +            if (Player* plr = target->m_movedPlayer)              {                  WorldPacket data;                  if (apply) @@ -3377,7 +3375,13 @@ void AuraEffect::HandleModMechanicImmunity(AuraApplication const* aurApp, uint8              break;          case 34471: // The Beast Within          case 19574: // Bestial Wrath -            mechanic = (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT) | (1 << MECHANIC_FEAR) | (1 << MECHANIC_STUN) | (1 << MECHANIC_SLEEP) | (1 << MECHANIC_CHARM) | (1 << MECHANIC_SAPPED) | (1 << MECHANIC_HORROR) | (1 << MECHANIC_POLYMORPH) | (1 << MECHANIC_DISORIENTED) | (1 << MECHANIC_FREEZE) | (1 << MECHANIC_TURN); +            mechanic = (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT) +                | (1 << MECHANIC_FEAR) | (1 << MECHANIC_STUN) +                | (1 << MECHANIC_SLEEP) | (1 << MECHANIC_CHARM) +                | (1 << MECHANIC_SAPPED) | (1 << MECHANIC_HORROR) +                | (1 << MECHANIC_POLYMORPH) | (1 << MECHANIC_DISORIENTED) +                | (1 << MECHANIC_FREEZE) | (1 << MECHANIC_TURN); +              target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_SNARE, apply);              target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_ROOT, apply);              target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_FEAR, apply); @@ -3487,7 +3491,7 @@ void AuraEffect::HandleAuraModSchoolImmunity(AuraApplication const* aurApp, uint          Unit::AuraApplicationMap& Auras = target->GetAppliedAuras();          for (Unit::AuraApplicationMap::iterator iter = Auras.begin(); iter != Auras.end();)          { -            SpellEntry const *spell = iter->second->GetBase()->GetSpellProto(); +            SpellEntry const* spell = iter->second->GetBase()->GetSpellProto();              if ((GetSpellSchoolMask(spell) & school_mask)//Check for school mask                  && CanSpellDispelAura(GetSpellProto(), spell)                  && !iter->second->IsPositive()          //Don't remove positive spells @@ -3543,9 +3547,10 @@ void AuraEffect::HandleAuraModResistanceExclusive(AuraApplication const* aurApp,              int32 amount = target->GetMaxPositiveAuraModifierByMiscMask(SPELL_AURA_MOD_RESISTANCE_EXCLUSIVE, 1<<x, this);              if (amount < GetAmount())              { -                target->HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + x), BASE_VALUE, float(GetAmount() - amount), apply); +                float value = float(GetAmount() - amount); +                target->HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + x), BASE_VALUE, value, apply);                  if (target->GetTypeId() == TYPEID_PLAYER) -                    target->ApplyResistanceBuffModsMod(SpellSchools(x), aurApp->IsPositive(), float(GetAmount() - amount), apply); +                    target->ApplyResistanceBuffModsMod(SpellSchools(x), aurApp->IsPositive(), value, apply);              }          }      } @@ -4466,7 +4471,7 @@ void AuraEffect::HandleModDamagePercentDone(AuraApplication const* aurApp, uint8          return;      if (target->HasItemFitToSpellRequirements(GetSpellProto())) -        aurApp->GetTarget()->ApplyModSignedFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT, GetAmount()/100.0f, apply); +        target->ApplyModSignedFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT, GetAmount() / 100.0f, apply);  }  void AuraEffect::HandleModOffhandDamagePercent(AuraApplication const* aurApp, uint8 mode, bool apply) const @@ -5192,7 +5197,7 @@ void AuraEffect::HandleChannelDeathItem(AuraApplication const* aurApp, uint8 mod          if (!caster || caster->GetTypeId() != TYPEID_PLAYER)              return; -        Player *plCaster = caster->ToPlayer(); +        Player* plCaster = caster->ToPlayer();          Unit* target = aurApp->GetTarget();          if (target->getDeathState() != JUST_DIED) @@ -5356,7 +5361,7 @@ void AuraEffect::HandleAuraConvertRune(AuraApplication const* aurApp, uint8 mode      if (target->GetTypeId() != TYPEID_PLAYER)          return; -    Player *plr = (Player*)target; +    Player* plr = (Player*)target;      if (plr->getClass() != CLASS_DEATH_KNIGHT)          return; @@ -5957,30 +5962,29 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster)              case 65920:              case 65922:              case 65923: +            { +                Unit* permafrostCaster = NULL; +                if (Aura* permafrostAura = target->GetAura(66193)) +                    permafrostCaster = permafrostAura->GetCaster(); +                else if (Aura* permafrostAura = target->GetAura(67855)) +                    permafrostCaster = permafrostAura->GetCaster(); +                else if (Aura* permafrostAura = target->GetAura(67856)) +                    permafrostCaster = permafrostAura->GetCaster(); +                else if (Aura* permafrostAura = target->GetAura(67857)) +                    permafrostCaster = permafrostAura->GetCaster(); + +                if (permafrostCaster)                  { -                    Unit* permafrostCaster = NULL; -                    Aura* permafrostAura = NULL; -                    if (permafrostAura = target->GetAura(66193)) -                        permafrostCaster = permafrostAura->GetCaster(); -                    else if (permafrostAura = target->GetAura(67855)) -                        permafrostCaster = permafrostAura->GetCaster(); -                    else if (permafrostAura = target->GetAura(67856)) -                        permafrostCaster = permafrostAura->GetCaster(); -                    else if (permafrostAura = target->GetAura(67857)) -                        permafrostCaster = permafrostAura->GetCaster(); - -                    if (permafrostCaster) -                    { -                        if (Creature* permafrostCasterCreature = permafrostCaster->ToCreature()) -                            permafrostCasterCreature->DespawnOrUnsummon(3000); +                    if (Creature* permafrostCasterCreature = permafrostCaster->ToCreature()) +                        permafrostCasterCreature->DespawnOrUnsummon(3000); -                        target->CastSpell(target, 66181, false); -                        target->RemoveAllAuras(); -                        if (Creature* targetCreature = target->ToCreature()) -                            targetCreature->DisappearAndDie(); -                    } +                    target->CastSpell(target, 66181, false); +                    target->RemoveAllAuras(); +                    if (Creature* targetCreature = target->ToCreature()) +                        targetCreature->DisappearAndDie();                  }                  break; +            }              // Mana Tide              case 16191:                  target->CastCustomSpell(target, triggerSpellId, &m_amount, NULL, NULL, true, NULL, this); @@ -6015,7 +6019,9 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster)      }      // Reget trigger spell proto -    if (triggeredSpellInfo = sSpellStore.LookupEntry(triggerSpellId)) +    triggeredSpellInfo = sSpellStore.LookupEntry(triggerSpellId); + +    if (triggeredSpellInfo)      {          if (Unit* triggerCaster = GetTriggeredSpellCaster(triggeredSpellInfo, caster, target))          { @@ -6035,7 +6041,7 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster)  void AuraEffect::HandlePeriodicTriggerSpellWithValueAuraTick(Unit* target, Unit* caster) const  {      uint32 triggerSpellId = GetSpellProto()->EffectTriggerSpell[m_effIndex]; -    if (SpellEntry const *triggeredSpellInfo = sSpellStore.LookupEntry(triggerSpellId)) +    if (SpellEntry const* triggeredSpellInfo = sSpellStore.LookupEntry(triggerSpellId))      {          if (Unit* triggerCaster = GetTriggeredSpellCaster(triggeredSpellInfo, caster, target))          { @@ -6059,21 +6065,26 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const          return;      } +    // We use it to fight with invalid data that appears later sometimes. +    SpellEntry const*spellProto = GetSpellProto(); +    const uint32 effIndex = GetEffIndex(); +    uint64 casterGuid = GetCasterGUID(); +      // Consecrate ticks can miss and will not show up in the combat log -    if (GetSpellProto()->Effect[GetEffIndex()] == SPELL_EFFECT_PERSISTENT_AREA_AURA && -        caster->SpellHitResult(target, GetSpellProto(), false) != SPELL_MISS_NONE) +    if (spellProto->Effect[effIndex] == SPELL_EFFECT_PERSISTENT_AREA_AURA && +        caster->SpellHitResult(target, spellProto, false) != SPELL_MISS_NONE)          return;      // some auras remove at specific health level or more      if (GetAuraType() == SPELL_AURA_PERIODIC_DAMAGE)      { -        switch (GetId()) +        switch (spellProto->Id)          {              case 43093: case 31956: case 38801:  // Grievous Wound              case 35321: case 38363: case 39215:  // Gushing Wound                  if (target->IsFullHealth())                  { -                    target->RemoveAurasDueToSpell(GetId()); +                    target->RemoveAurasDueToSpell(spellProto->Id);                      return;                  }                  break; @@ -6082,7 +6093,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const                  uint32 percent = SpellMgr::CalculateSpellEffectAmount(GetSpellProto(), 1, caster);                  if (!target->HealthBelowPct(percent))                  { -                    target->RemoveAurasDueToSpell(GetId()); +                    target->RemoveAurasDueToSpell(spellProto->Id);                      return;                  }                  break; @@ -6099,18 +6110,18 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const      if (GetAuraType() == SPELL_AURA_PERIODIC_DAMAGE)      { -        damage = caster->SpellDamageBonus(target, GetSpellProto(), damage, DOT, GetBase()->GetStackAmount()); +        damage = caster->SpellDamageBonus(target, spellProto, damage, DOT, GetBase()->GetStackAmount());          // Calculate armor mitigation -        if (Unit::IsDamageReducedByArmor(GetSpellSchoolMask(GetSpellProto()), GetSpellProto(), m_effIndex)) +        if (Unit::IsDamageReducedByArmor(GetSpellSchoolMask(spellProto), spellProto, effIndex))          { -            uint32 damageReductedArmor = caster->CalcArmorReducedDamage(target, damage, GetSpellProto()); +            uint32 damageReductedArmor = caster->CalcArmorReducedDamage(target, damage, spellProto);              cleanDamage.mitigated_damage += damage - damageReductedArmor;              damage = damageReductedArmor;          }          // Curse of Agony damage-per-tick calculation -        if (GetSpellProto()->SpellFamilyName == SPELLFAMILY_WARLOCK && (GetSpellProto()->SpellFamilyFlags[0] & 0x400) && GetSpellProto()->SpellIconID == 544) +        if (spellProto->SpellFamilyName == SPELLFAMILY_WARLOCK && (spellProto->SpellFamilyFlags[0] & 0x400) && spellProto->SpellIconID == 544)          {              uint32 totalTick = GetTotalTicks();              // 1..4 ticks, 1/2 from normal tick damage @@ -6122,7 +6133,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const              // 5..8 ticks have normal tick damage          }          // There is a Chance to make a Soul Shard when Drain soul does damage -        if (GetSpellProto()->SpellFamilyName == SPELLFAMILY_WARLOCK && (GetSpellProto()->SpellFamilyFlags[0] & 0x00004000)) +        if (spellProto->SpellFamilyName == SPELLFAMILY_WARLOCK && (spellProto->SpellFamilyFlags[0] & 0x00004000))          {              if (caster->GetTypeId() == TYPEID_PLAYER && caster->ToPlayer()->isHonorOrXPTarget(target))              { @@ -6136,7 +6147,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const                  }              }          } -        if (GetSpellProto()->SpellFamilyName == SPELLFAMILY_GENERIC) +        if (spellProto->SpellFamilyName == SPELLFAMILY_GENERIC)          {              switch (GetId())              { @@ -6162,7 +6173,7 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const      caster->ApplyResilience(target, NULL, &dmg, crit, CR_CRIT_TAKEN_SPELL);      damage = dmg; -    caster->CalcAbsorbResist(target, GetSpellSchoolMask(GetSpellProto()), DOT, damage, &absorb, &resist, m_spellProto); +    caster->CalcAbsorbResist(target, GetSpellSchoolMask(spellProto), DOT, damage, &absorb, &resist, spellProto);      sLog->outDetail("PeriodicTick: %u (TypeId: %u) attacked %u (TypeId: %u) for %u dmg inflicted by %u abs is %u",          GUID_LOPART(GetCasterGUID()), GuidHigh2TypeId(GUID_HIPART(GetCasterGUID())), target->GetGUIDLow(), target->GetTypeId(), damage, GetId(), absorb); @@ -6184,9 +6195,9 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const      SpellPeriodicAuraLogInfo pInfo(this, damage, overkill, absorb, resist, 0.0f, crit);      target->SendPeriodicAuraLog(&pInfo); -    caster->ProcDamageAndSpell(target, procAttacker, procVictim, procEx, damage, BASE_ATTACK, GetSpellProto()); +    caster->ProcDamageAndSpell(target, procAttacker, procVictim, procEx, damage, BASE_ATTACK, spellProto); -    caster->DealDamage(target, damage, &cleanDamage, DOT, GetSpellSchoolMask(GetSpellProto()), GetSpellProto(), true); +    caster->DealDamage(target, damage, &cleanDamage, DOT, GetSpellSchoolMask(spellProto), spellProto, true);  }  void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) const @@ -6442,10 +6453,11 @@ void AuraEffect::HandlePeriodicManaLeechAuraTick(Unit* target, Unit* caster) con      SpellPeriodicAuraLogInfo pInfo(this, drainedAmount, 0, 0, 0, gainMultiplier, false);      target->SendPeriodicAuraLog(&pInfo); -    int32 gainAmount = int32(drainedAmount * gainMultiplier); -    int32 gainedAmount = caster->ModifyPower(powerType, gainAmount); - -    target->AddThreat(caster, float(gainedAmount) * 0.5f, GetSpellSchoolMask(GetSpellProto()), GetSpellProto()); +    if (int32 gainAmount = int32(drainedAmount * gainMultiplier)) +    { +        int32 gainedAmount = caster->ModifyPower(powerType, gainAmount); +        target->AddThreat(caster, float(gainedAmount) * 0.5f, GetSpellSchoolMask(GetSpellProto()), GetSpellProto()); +    }      // spell-specific code      switch(GetId()) @@ -6498,7 +6510,7 @@ void AuraEffect::HandleObsModPowerAuraTick(Unit* target, Unit* caster) const      else          powerType = Powers(GetMiscValue()); -    if (!target->isAlive() || target->GetMaxPower(powerType) == 0) +    if (!target->isAlive() || !target->GetMaxPower(powerType))          return;      if (target->HasUnitState(UNIT_STAT_ISOLATED)) @@ -6529,7 +6541,7 @@ void AuraEffect::HandlePeriodicEnergizeAuraTick(Unit* target, Unit* caster) cons  {      Powers powerType = Powers(GetMiscValue()); -    if (!target->isAlive() || target->GetMaxPower(powerType) == 0) +    if (!target->isAlive() || !target->GetMaxPower(powerType))          return;      if (target->HasUnitState(UNIT_STAT_ISOLATED))  | 
