diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/server/game/Entities/Player/Player.cpp | 6 | ||||
| -rwxr-xr-x | src/server/game/Entities/Player/Player.h | 2 | ||||
| -rwxr-xr-x | src/server/game/Spells/Spell.cpp | 9 |
3 files changed, 15 insertions, 2 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index f2419957699..10b0e148925 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -19226,7 +19226,7 @@ void Player::AddSpellMod(SpellModifier* mod, bool apply) } // Restore spellmods in case of failed cast -void Player::RestoreSpellMods(Spell * spell) +void Player::RestoreSpellMods(Spell *spell, uint32 ownerAuraId) { if (!spell || spell->m_appliedMods.empty()) return; @@ -19241,6 +19241,10 @@ void Player::RestoreSpellMods(Spell * spell) if (!mod->ownerAura || !mod->ownerAura->GetCharges()) continue; + // Restore only specific owner aura mods + if (ownerAuraId && (ownerAuraId != mod->ownerAura->GetSpellProto()->Id)) + continue; + // check if mod affected this spell Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(mod->ownerAura); if (iterMod == spell->m_appliedMods.end()) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index babc2f87f06..5cec55fcfe5 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1605,7 +1605,7 @@ class Player : public Unit, public GridObject<Player> bool IsAffectedBySpellmod(SpellEntry const *spellInfo, SpellModifier *mod, Spell * spell = NULL); template <class T> T ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell * spell = NULL); void RemoveSpellMods(Spell * spell); - void RestoreSpellMods(Spell * spell); + void RestoreSpellMods(Spell *spell, uint32 ownerAuraId=0); void DropModCharge(SpellModifier * mod, Spell * spell); void SetSpellModTakingSpell(Spell* spell, bool apply); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 7f287015cb8..bd9f466fb86 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1198,7 +1198,16 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target) // Do not take combo points on dodge and miss if (m_needComboPoints && m_targets.getUnitTargetGUID() == target->targetGUID) if (missInfo != SPELL_MISS_NONE) + { m_needComboPoints = false; + // Restore spell mods for a miss/dodge/parry Cold Blood + // TODO: check how broad this rule should be + if (m_caster->GetTypeId() == TYPEID_PLAYER) + if ((missInfo == SPELL_MISS_MISS) || + (missInfo == SPELL_MISS_DODGE) || + (missInfo == SPELL_MISS_PARRY)) + m_caster->ToPlayer()->RestoreSpellMods(this, 14177); + } // Trigger info was not filled in spell::preparedatafortriggersystem - we do it now if (canEffectTrigger && !procAttacker && !procVictim) |
