diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/Player.cpp | 2 | ||||
-rw-r--r-- | src/game/Spell.cpp | 28 | ||||
-rw-r--r-- | src/game/Spell.h | 1 | ||||
-rw-r--r-- | src/game/SpellEffects.cpp | 23 | ||||
-rw-r--r-- | src/game/Unit.cpp | 2 |
5 files changed, 29 insertions, 27 deletions
diff --git a/src/game/Player.cpp b/src/game/Player.cpp index b7d9865729c..e8b7aa6c8d1 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -16896,7 +16896,7 @@ void Player::RemoveSpellMods(Spell const* spell) if (mod && mod->charges == -1 && (mod->lastAffected == spell || mod->lastAffected==NULL)) { - RemoveAurasDueToSpell(mod->spellId, AURA_REMOVE_BY_EXPIRE); + RemoveAurasDueToSpell(mod->spellId, 0, AURA_REMOVE_BY_EXPIRE); if (m_spellMods[i].empty()) break; else diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 691aa35d774..41d01772c50 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -307,6 +307,7 @@ Spell::Spell( Unit* Caster, SpellEntry const *info, bool triggered, uint64 origi m_triggeringContainer = triggeringContainer; m_referencedFromCurrentSpell = false; m_executedCurrently = false; + m_needComboPoints = NeedsComboPoints(m_spellInfo); m_delayStart = 0; m_delayAtDamageCount = 0; @@ -945,6 +946,10 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target) if (target->reflectResult == SPELL_MISS_NONE) // If reflected spell hit caster -> do all effect on him DoSpellHitOnUnit(m_caster, mask); } + // Do not take combo points on dodge + if (m_needComboPoints && m_targets.getUnitTargetGUID() == target->targetGUID) + if( missInfo != SPELL_MISS_NONE && missInfo != SPELL_MISS_MISS) + m_needComboPoints = false; /*else //TODO: This is a hack. need fix { uint32 tempMask = 0; @@ -2184,6 +2189,10 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect* triggeredByAura // Prepare data for triggers prepareDataForTriggerSystem(); + // Set combo point requirement + if (m_IsTriggeredSpell || m_CastItem || m_caster->GetTypeId()!=TYPEID_PLAYER) + m_needComboPoints = false; + // calculate cast time (calculated after first CheckCast check to prevent charge counting for first CheckCast fail) m_casttime = GetSpellCastTime(m_spellInfo, this); @@ -2418,23 +2427,8 @@ void Spell::handle_immediate() // process immediate effects (items, ground, etc.) also initialize some variables _handle_immediate_phase(); - bool checkCp = - !m_IsTriggeredSpell && !m_CastItem - && NeedsComboPoints(m_spellInfo) - && m_caster->GetTypeId()==TYPEID_PLAYER; - bool comboPoints = false; for(std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit) - { DoAllEffectOnTarget(&(*ihit)); - // Take combo points after effects handling (combo points are used in effect handling) - if(checkCp) - if(ihit->targetGUID == m_targets.getUnitTargetGUID() - && (ihit->missCondition == SPELL_MISS_NONE || ihit->missCondition == SPELL_MISS_MISS)) - comboPoints=true; - } - // Take for real after all targets are processed - if (comboPoints) - ((Player*)m_caster)->ClearComboPoints(); for(std::list<GOTargetInfo>::iterator ihit= m_UniqueGOTargetInfo.begin();ihit != m_UniqueGOTargetInfo.end();++ihit) DoAllEffectOnTarget(&(*ihit)); @@ -2552,6 +2546,10 @@ void Spell::_handle_immediate_phase() void Spell::_handle_finish_phase() { + // Take for real after all targets are processed + if (m_needComboPoints) + ((Player*)m_caster)->ClearComboPoints(); + // spell log if(m_needSpellLog) SendLogExecute(); diff --git a/src/game/Spell.h b/src/game/Spell.h index e75bfb31eb9..45a3a123bae 100644 --- a/src/game/Spell.h +++ b/src/game/Spell.h @@ -508,6 +508,7 @@ class Spell bool m_referencedFromCurrentSpell; // mark as references to prevent deleted and access by dead pointers bool m_executedCurrently; // mark as executed to prevent deleted and access by dead pointers bool m_needSpellLog; // need to send spell log? + bool m_needComboPoints; uint8 m_applyMultiplierMask; // by effect: damage multiplier needed? float m_damageMultipliers[3]; // by effect: damage multiplier diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index de3ecea7387..d01e992ed90 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -4074,14 +4074,14 @@ void Spell::SpellDamageWeaponDmg(uint32 i) { if (m_caster->GetTypeId()!=TYPEID_PLAYER) return; + SpellEntry const *spellInfo = NULL; uint32 stack = 0; - int32 maxStack = 0; + if (AuraEffect * aur = unitTarget->GetAura(SPELL_AURA_MOD_RESISTANCE,SPELLFAMILY_WARRIOR,SPELLFAMILYFLAG_WARRIOR_SUNDERARMOR, 0, 0, m_caster->GetGUID())) { aur->GetParentAura()->RefreshAura(); + spellInfo = aur->GetSpellProto(); stack = aur->GetParentAura()->GetStackAmount(); - maxStack = aur->GetSpellProto()->StackAmount; - break; } for(int j = 0; j < 3; j++) @@ -4093,7 +4093,7 @@ void Spell::SpellDamageWeaponDmg(uint32 i) } } - if(stack < maxStack) + if(!spellInfo) { // get highest rank of the Sunder Armor spell const PlayerSpellMap& sp_list = ((Player*)m_caster)->GetSpellMap(); @@ -4103,19 +4103,22 @@ void Spell::SpellDamageWeaponDmg(uint32 i) if(!itr->second->active || itr->second->disabled || itr->second->state == PLAYERSPELL_REMOVED) continue; - SpellEntry const *spellInfo = sSpellStore.LookupEntry(itr->first); - if (!spellInfo) + SpellEntry const *spellProto = sSpellStore.LookupEntry(itr->first); + if (!spellProto) continue; - if (spellInfo->SpellFamilyFlags.IsEqual(SPELLFAMILYFLAG_WARRIOR_SUNDERARMOR) - && spellInfo->Id != m_spellInfo->Id - && spellInfo->SpellFamilyName == SPELLFAMILY_WARRIOR) + if (spellProto->SpellFamilyFlags[0] & SPELLFAMILYFLAG_WARRIOR_SUNDERARMOR + && spellProto->Id != m_spellInfo->Id + && spellProto->SpellFamilyName == SPELLFAMILY_WARRIOR) { - m_caster->CastSpell(unitTarget, spellInfo, true); + spellInfo = spellProto; break; } } } + if (!spellInfo) + break; + m_caster->CastSpell(unitTarget, spellInfo, true); if (stack) spell_bonus += stack * CalculateDamage(2, unitTarget); } diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 0ba580d77ab..f41637b6c75 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -4020,7 +4020,7 @@ void Unit::RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit else damage[i]=NULL; } - int32 dur = 2*MINUTE*IN_MILISECONDS > aur->GetAuraDuration() ? 2*MINUTE*IN_MILISECONDS : aur->GetAuraDuration(); + int32 dur = 2*MINUTE*IN_MILISECONDS < aur->GetAuraDuration() ? 2*MINUTE*IN_MILISECONDS : aur->GetAuraDuration(); Aura * new_aur = new Aura(aur->GetSpellProto(),aur->GetEffectMask(), NULL, stealer, stealer, NULL); new_aur->SetLoadedState(aur->GetCasterGUID(), dur, dur, aur->GetAuraCharges(), aur->GetStackAmount(), &damage[0]); |