//handle SPELL_AURA_ADD_TARGET_TRIGGER auras Unit::AuraList const& targetTriggers = m_caster->GetAurasByType(SPELL_AURA_ADD_TARGET_TRIGGER); for(Unit::AuraList::const_iterator i = targetTriggers.begin(); i != targetTriggers.end(); ++i) { const SpellEntry *AuraSpell = (*i)->GetSpellProto(); uint32 index = (*i)->GetEffIndex(); if (IsAffectedBy(AuraSpell, index)) { int32 chance = 0; // Calculate chance at that moment (can be depend for exampe from combo points) m_caster->CalculateSpellDamageAndDuration(&chance, NULL, AuraSpell, (*i)->GetEffIndex(), AuraSpell->EffectBasePoints[index]); for(std::list::iterator iunit= m_targetUnitGUIDs[index].begin();iunit != m_targetUnitGUIDs[index].end();++iunit) { // check m_caster->GetGUID() let load auras at login and speedup most often case Unit* unit = m_caster->GetGUID()==*iunit ? m_caster : ObjectAccessor::GetUnit(*m_caster,*iunit); if (unit && unit->isAlive() && roll_chance_i(chance)) m_caster->CastSpell(unit, AuraSpell->EffectTriggerSpell[index], true, NULL, (*i)); } } } void Player::resetComboPointsIfNeed(const SpellEntry *spellInfo) { bool needClearCombo = false; // Check use combo points in damage calculations int comboDamage = spellInfo->EffectPointsPerComboPoint[0] + spellInfo->EffectPointsPerComboPoint[1] + spellInfo->EffectPointsPerComboPoint[2]; if(comboDamage != 0 && m_attacking && (m_attacking->GetGUID() == GetComboTarget())) needClearCombo = true; // Check in duration calculations int32 minduration = GetDuration(spellInfo); int32 maxduration = GetMaxDuration(spellInfo); if( minduration != -1 && minduration != maxduration ) needClearCombo = true; // overpower - need reset combopoints if(spellInfo->SpellFamilyName == SPELLFAMILY_WARRIOR && spellInfo->SpellFamilyFlags == 0x4) needClearCombo = true; // Reset if need if (needClearCombo) ClearComboPoints(); }