aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/SpellAuras.cpp24
-rw-r--r--src/game/SpellMgr.h10
-rw-r--r--src/game/Unit.cpp258
3 files changed, 53 insertions, 239 deletions
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index 206abe128bb..49e5c831ace 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -2735,6 +2735,15 @@ void AuraEffect::HandleAuraDummy(bool apply, bool Real, bool changeAmount)
return;
}
break;
+ case SPELLFAMILY_MAGE:
+ // Living Bomb
+ if(m_spellProto->SpellFamilyFlags[1] & 0x20000)
+ {
+ if(caster && (GetParentAura()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL || GetParentAura()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE))
+ caster->CastSpell(m_target, GetAmount(), true);
+ return;
+ }
+ break;
case SPELLFAMILY_WARLOCK:
// Haunt
if(m_spellProto->SpellFamilyFlags[1] & 0x40000)
@@ -2745,13 +2754,16 @@ void AuraEffect::HandleAuraDummy(bool apply, bool Real, bool changeAmount)
return;
}
break;
- case SPELLFAMILY_MAGE:
- // Living Bomb
- if(m_spellProto->SpellFamilyFlags[1] & 0x20000)
+ case SPELLFAMILY_PRIEST:
+ // Vampiric Touch
+ if (m_spellProto->SpellFamilyFlags[1] & 0x0400 && GetParentAura()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL)
{
- if(caster && (GetParentAura()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL || GetParentAura()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE))
- caster->CastSpell(m_target, GetAmount(), true);
- return;
+ if (AuraEffect const * aurEff = GetParentAura()->GetPartAura(1))
+ {
+ int32 damage = aurEff->GetAmount()*4;
+ // backfire damage
+ m_target->CastCustomSpell(m_target, 64085, &damage, NULL, NULL, true, NULL, NULL,GetCasterGUID());
+ }
}
break;
case SPELLFAMILY_HUNTER:
diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h
index 60aa0fd19c8..6ba55bf7572 100644
--- a/src/game/SpellMgr.h
+++ b/src/game/SpellMgr.h
@@ -853,6 +853,16 @@ class SpellMgr
return spell_id;
}
+ uint32 GetSpellWithRank(uint32 spell_id, uint32 rank) const
+ {
+ if(SpellChainNode const* node = GetSpellChainNode(spell_id))
+ {
+ if (rank != node->rank)
+ return GetSpellWithRank(node->rank < rank ? node->next : node->prev, rank);
+ }
+ return spell_id;
+ }
+
uint32 GetPrevSpellInChain(uint32 spell_id) const
{
if(SpellChainNode const* node = GetSpellChainNode(spell_id))
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 120eb98c3d8..dbc5eb3b228 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -1882,8 +1882,8 @@ void Unit::CalcAbsorbResist(Unit *pVictim,SpellSchoolMask schoolMask, DamageEffe
reflectDamage = (aurEff)->GetAmount() * RemainingDamage/100;
reflectSpell = 33619;
reflectTriggeredBy = *i;
+ break;
}
- break;
default:
sLog.outError("Unit::CalcAbsorbResist: unknown Reflective Shield spell %d", aurEff->GetId());
break;
@@ -3930,18 +3930,6 @@ void Unit::RemoveAurasDueToSpellByDispel(uint32 spellId, uint64 casterGUID, Unit
RemoveAuraFromStack(iter, AURA_REMOVE_BY_ENEMY_SPELL);
return;
}
- // Vampiric Touch
- else if (aur->GetSpellProto()->SpellFamilyName == SPELLFAMILY_PRIEST && (aur->GetSpellProto()->SpellFamilyFlags[1] & 0x0400))
- {
- if (AuraEffect const * aurEff = aur->GetPartAura(1))
- {
- int32 damage = aurEff->GetAmount()*4;
- // backfire damage
- dispeler->CastCustomSpell(dispeler, 64085, &damage, NULL, NULL, true, NULL, NULL,GetGUID());
- }
- RemoveAuraFromStack(iter, AURA_REMOVE_BY_ENEMY_SPELL);
- return;
- }
RemoveAuraFromStack(iter, AURA_REMOVE_BY_ENEMY_SPELL);
return;
}
@@ -6282,6 +6270,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger
{
// Improved fire nova totem
case 16544:
+ case 16086:
{
triggered_spell_id = 51880;
break;
@@ -6392,7 +6381,6 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger
basepoints0 = int32(extra_attack_power/14.0f * GetAttackTime(OFF_ATTACK)/1000/2);
triggered_spell_id = 33750;
}
-
else
return false;
@@ -6412,7 +6400,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger
if( !procSpell )
return false;
- float chance;
+ float chance;
if (procSpell->SpellFamilyFlags[0] & 0x1)
{
triggered_spell_id = 40465; // Lightning Bolt
@@ -6550,21 +6538,15 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger
// Lesser Healing Wave need aditional 60% roll
if (procSpell->SpellFamilyFlags[0] & 0x80 && !roll_chance_i(60))
return false;
- // lookup water shield
- AuraEffectList const& vs = GetAurasByType(SPELL_AURA_PROC_TRIGGER_SPELL);
- for(AuraEffectList::const_iterator itr = vs.begin(); itr != vs.end(); ++itr)
+ // Water Shield
+ if (AuraEffect const * aurEff = GetAura(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, 0, 0x00000020))
{
- if( (*itr)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_SHAMAN &&
- (*itr)->GetSpellProto()->SpellFamilyFlags[1] & 0x00000020)
- {
- uint32 spell = (*itr)->GetSpellProto()->EffectTriggerSpell[(*itr)->GetEffIndex()];
- CastSpell(this, spell, true, castItem, triggeredByAura);
- (*itr)->GetParentAura()->DropAuraCharge();
- return true;
- }
+ uint32 spell = aurEff->GetSpellProto()->EffectTriggerSpell[aurEff->GetEffIndex()];
+ CastSpell(this, spell, true, castItem, triggeredByAura);
+ aurEff->GetParentAura()->DropAuraCharge();
+ return true;
}
return false;
- break;
}
// Lightning Overload
if (dummySpell->SpellIconID == 2018) // only this spell have SpellFamily Shaman SpellIconID == 2018 and dummy aura
@@ -6576,38 +6558,13 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger
if( cooldown && GetTypeId()==TYPEID_PLAYER && ((Player*)this)->HasSpellCooldown(dummySpell->Id))
return false;
- uint32 spellId = 0;
- // Every Lightning Bolt and Chain Lightning spell have duplicate vs half damage and zero cost
- switch (procSpell->Id)
- {
- // Lightning Bolt
- case 403: spellId = 45284; break; // Rank 1
- case 529: spellId = 45286; break; // Rank 2
- case 548: spellId = 45287; break; // Rank 3
- case 915: spellId = 45288; break; // Rank 4
- case 943: spellId = 45289; break; // Rank 5
- case 6041: spellId = 45290; break; // Rank 6
- case 10391: spellId = 45291; break; // Rank 7
- case 10392: spellId = 45292; break; // Rank 8
- case 15207: spellId = 45293; break; // Rank 9
- case 15208: spellId = 45294; break; // Rank 10
- case 25448: spellId = 45295; break; // Rank 11
- case 25449: spellId = 45296; break; // Rank 12
- case 49237: spellId = 49239; break; // Rank 13
- case 49238: spellId = 49240; break; // Rank 14
- // Chain Lightning
- case 421: spellId = 45297; break; // Rank 1
- case 930: spellId = 45298; break; // Rank 2
- case 2860: spellId = 45299; break; // Rank 3
- case 10605: spellId = 45300; break; // Rank 4
- case 25439: spellId = 45301; break; // Rank 5
- case 25442: spellId = 45302; break; // Rank 6
- case 49268: spellId = 49270; break; // Rank 7
- case 49269: spellId = 49271; break; // Rank 8
- default:
- sLog.outError("Unit::HandleDummyAuraProc: non handled spell id: %u (LO)", procSpell->Id);
- return false;
- }
+ uint32 spell;
+ if (procSpell->SpellFamilyFlags[0] & 0x2)
+ spell = 45297;
+ else
+ spell = 45284;
+ uint32 spellId = spellmgr.GetSpellWithRank(spell, spellmgr.GetSpellRank(procSpell->Id));
+
// Remove cooldown (Chain Lightning - have Category Recovery time)
if (procSpell->SpellFamilyFlags[0] & 0x2)
((Player*)this)->RemoveSpellCooldown(spellId);
@@ -6628,54 +6585,33 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger
// Static Shock
if(dummySpell->SpellIconID == 3059)
{
- // lookup Lightning Shield
- AuraEffectList const& vs = GetAurasByType(SPELL_AURA_PROC_TRIGGER_SPELL);
- for(AuraEffectList::const_iterator itr = vs.begin(); itr != vs.end(); ++itr)
+ // Lightning Shield
+ if (AuraEffect const * aurEff = GetAura(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, 0x400))
{
- if( (*itr)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_SHAMAN &&
- (*itr)->GetSpellProto()->SpellFamilyFlags[0] & 0x400)
- {
- uint32 spell = 0;
- switch ((*itr)->GetId())
- {
- case 324: spell = 26364; break;
- case 325: spell = 26365; break;
- case 905: spell = 26366; break;
- case 945: spell = 26367; break;
- case 8134: spell = 26369; break;
- case 10431: spell = 26370; break;
- case 10432: spell = 26363; break;
- case 25469: spell = 26371; break;
- case 25472: spell = 26372; break;
- case 49280: spell = 49278; break;
- case 49281: spell = 49279; break;
- default:
- return false;
- }
- CastSpell(target, spell, true, castItem, triggeredByAura);
- (*itr)->GetParentAura()->DropAuraCharge();
- return true;
- }
+ uint32 spell = spellmgr.GetSpellWithRank(26364, spellmgr.GetSpellRank(aurEff->GetId()));
+ CastSpell(target, spell, true, castItem, triggeredByAura);
+ aurEff->GetParentAura()->DropAuraCharge();
+ return true;
}
return false;
- break;
}
break;
}
case SPELLFAMILY_DEATHKNIGHT:
{
// Blood-Caked Strike - Blood-Caked Blade
- if (dummySpell->EffectTriggerSpell[effIndex] == 50463)
+ if (dummySpell->SpellIconID == 138)
{
triggered_spell_id = dummySpell->EffectTriggerSpell[effIndex];
break;
}
- // Blood Aura
+ // Improved Blood Presence
if (dummySpell->SpellIconID == 2636)
{
if (GetTypeId() != TYPEID_PLAYER || !((Player*)this)->isHonorOrXPTarget(pVictim))
return false;
basepoints0 = triggerAmount * damage / 100;
+ // Blood Aura
triggered_spell_id = 53168;
break;
}
@@ -7082,30 +7018,8 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, AuraEffect* trig
switch (auraSpellInfo->SpellFamilyName)
{
case SPELLFAMILY_GENERIC:
- //if (auraSpellInfo->Id==59532) // Abandon Passengers on Poly
- //if (auraSpellInfo->Id==54775) // Abandon Vehicle on Poly
- //if (auraSpellInfo->Id==34082) // Advantaged State (DND)
if (auraSpellInfo->Id == 23780) // Aegis of Preservation (Aegis of Preservation trinket)
trigger_spell_id = 23781;
- //else if (auraSpellInfo->Id==43504) // Alterac Valley OnKill Proc Aura
- //else if (auraSpellInfo->Id == 48876) // Beast's Mark
- //{
- // trigger_spell_id = 48877;
- //}
- //else if (auraSpellInfo->Id == 59237) // Beast's Mark
- //{
- // trigger_spell_id = 59233;
- //}
- //else if (auraSpellInfo->Id==46939) // Black Bow of the Betrayer
- //{
- // trigger_spell_id = 29471; // gain mana
- // 27526; // drain mana if possible
- //}
- //else if (auraSpellInfo->Id==50844) // Blood Mirror
- //else if (auraSpellInfo->Id==54476) // Blood Presence
- //else if (auraSpellInfo->Id==50689) // Blood Presence (Rank 1)
- //else if (auraSpellInfo->Id==37030) // Chaotic Temperament
- //else if (auraSpellInfo->Id==52856) // Charge
else if (auraSpellInfo->Id==43820) // Charm of the Witch Doctor (Amani Charm of the Witch Doctor trinket)
{
// Pct value stored in dummy
@@ -7113,14 +7027,6 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, AuraEffect* trig
target = pVictim;
break;
}
- //else if (auraSpellInfo->Id==41248) // Consuming Strikes
- // trigger_spell_id = 41249;
- //else if (auraSpellInfo->Id==45205) // Copy Offhand Weapon
- //else if (auraSpellInfo->Id==57594) // Copy Ranged Weapon
- //else if (auraSpellInfo->Id==41054) // Copy Weapon
- // trigger_spell_id = 41055;
- //else if (auraSpellInfo->Id==45343) // Dark Flame Aura
- //else if (auraSpellInfo->Id==47300) // Dark Flame Aura
else if (auraSpellInfo->Id==57345) // Darkmoon Card: Greatness
{
float stat = 0.0f;
@@ -7133,65 +7039,8 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, AuraEffect* trig
// spirit
if (GetStat(STAT_SPIRIT) > stat) { trigger_spell_id = 60235;stat = GetStat(STAT_SPIRIT); }
}
- //else if (auraSpellInfo->Id==31255) // Deadly Swiftness (Rank 1)
- //else if (auraSpellInfo->Id==5301) // Defensive State (DND)
- //else if (auraSpellInfo->Id==13358) // Defensive State (DND)
- //else if (auraSpellInfo->Id==16092) // Defensive State (DND)
- //else if (auraSpellInfo->Id==24949) // Defensive State 2 (DND)
- //else if (auraSpellInfo->Id==40329) // Demo Shout Sensor
else if (auraSpellInfo->Id == 33896) // Desperate Defense (Stonescythe Whelp, Stonescythe Alpha, Stonescythe Ambusher)
trigger_spell_id = 33898;
- //else if (auraSpellInfo->Id==18943) // Double Attack
- //else if (auraSpellInfo->Id==19194) // Double Attack
- //else if (auraSpellInfo->Id==19817) // Double Attack
- //else if (auraSpellInfo->Id==19818) // Double Attack
- //else if (auraSpellInfo->Id==22835) // Drunken Rage
- // trigger_spell_id = 14822;
- /*
- else if (auraSpellInfo->SpellIconID==191) // Elemental Response
- {
- switch (auraSpellInfo->Id && auraSpellInfo->AttributesEx==0)
- {
- case 34191:
- case 34329:
- case 34524:
- case 34582:
- case 36733:
- break;
- default:
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u miss posibly Elemental Response",auraSpellInfo->Id);
- return false;
- }
- //This generic aura self-triggers a different spell for each school of magic that lands on the wearer:
- switch (procSpell->School)
- {
- case SPELL_SCHOOL_FIRE: trigger_spell_id = 34192; break;
- case SPELL_SCHOOL_FROST: trigger_spell_id = 34193; break;
- case SPELL_SCHOOL_ARCANE:trigger_spell_id = 34194; break;
- case SPELL_SCHOOL_NATURE:trigger_spell_id = 34195; break;
- case SPELL_SCHOOL_SHADOW:trigger_spell_id = 34196; break;
- case SPELL_SCHOOL_HOLY: trigger_spell_id = 34197; break;
- case SPELL_SCHOOL_NORMAL:trigger_spell_id = 34198; break;
- default:
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u Elemental Response wrong school",auraSpellInfo->Id);
- return false;
- }
- }
- */
- //else if (auraSpellInfo->Id==40364) // Entangling Roots Sensor
- //else if (auraSpellInfo->Id==33207) // Gossip NPC Periodic - Fidget
- //else if (auraSpellInfo->Id==50051) // Ethereal Pet Aura
- //else if (auraSpellInfo->Id==35321) // Gushing Wound
- //else if (auraSpellInfo->Id==38363) // Gushing Wound
- //else if (auraSpellInfo->Id==39215) // Gushing Wound
- //else if (auraSpellInfo->Id==44527) // Hate Monster (Spar Buddy) (30 sec)
- //else if (auraSpellInfo->Id==44819) // Hate Monster (Spar Buddy) (>30% Health)
- //else if (auraSpellInfo->Id==44526) // Hate Monster (Spar) (30 sec)
- //else if (auraSpellInfo->Id==44820) // Hate Monster (Spar) (<30%)
- //else if (auraSpellInfo->Id==49059) // Horde, Hate Monster (Spar Buddy) (>30% Health)
- //else if (auraSpellInfo->Id==40250) // Improved Duration
- //else if (auraSpellInfo->Id==59288) // Infra-Green Shield
- //else if (auraSpellInfo->Id==54072) // Knockback Ball Passive
else if (auraSpellInfo->Id==27522 || auraSpellInfo->Id==40336)
// Mana Drain Trigger
{
@@ -7202,21 +7051,6 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, AuraEffect* trig
CastSpell(pVictim, 27526, true, castItem, triggeredByAura);
return true;
}
- //else if (auraSpellInfo->Id==55580) // Mana Link
- //else if (auraSpellInfo->Id==45903) // Offensive State
- //else if (auraSpellInfo->Id==44326) // Pure Energy Passive
- //else if (auraSpellInfo->Id==43453) // Rune Ward
- //else if (auraSpellInfo->Id== 7137) // Shadow Charge (Rank 1)
- //else if (auraSpellInfo->Id==36576) // Shaleskin (Shaleskin Flayer, Shaleskin Ripper) 30023 trigger
- //else if (auraSpellInfo->Id==34783) // Spell Reflection
- //else if (auraSpellInfo->Id==36096) // Spell Reflection
- //else if (auraSpellInfo->Id==57587) // Steal Ranged ()
- //else if (auraSpellInfo->Id==36207) // Steal Weapon
- //else if (auraSpellInfo->Id== 7377) // Take Immune Periodic Damage <Not Working>
- //else if (auraSpellInfo->Id==35205) // Vanish
- //else if (auraSpellInfo->Id==42730) // Woe Strike
- //else if (auraSpellInfo->Id==59735) // Woe Strike
- //else if (auraSpellInfo->Id==46146) // [PH] Ahune Spanky Hands
break;
case SPELLFAMILY_MAGE:
if (auraSpellInfo->SpellIconID == 2127) // Blazing Speed
@@ -7318,8 +7152,6 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, AuraEffect* trig
return false;
}
}
- //else if (auraSpellInfo->Id==40363)// Entangling Roots ()
- // trigger_spell_id = ????;
break;
}
case SPELLFAMILY_HUNTER:
@@ -7347,22 +7179,6 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, AuraEffect* trig
}
case SPELLFAMILY_PALADIN:
{
- /*
- // Blessed Life
- if (auraSpellInfo->SpellIconID == 2137)
- {
- switch (auraSpellInfo->Id)
- {
- case 31828: // Rank 1
- case 31829: // Rank 2
- case 31830: // Rank 3
- break;
- default:
- sLog.outError("Unit::HandleProcTriggerSpell: Spell %u miss posibly Blessed Life", auraSpellInfo->Id);
- return false;
- }
- }
- */
// Healing Discount
if (auraSpellInfo->Id==37705)
{
@@ -7563,30 +7379,6 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, AuraEffect* trig
return false;
}
- // check if triggering spell can stack with current target's auras (if not - don't proc)
- // don't check if
- // aura is passive (talent's aura)
- // trigger_spell_id's aura is already active (allow to refresh triggered auras)
- // trigger_spell_id's triggeredByAura is already active (for example shaman's shields)
-
- // This is disabled because:
- // TODO: we need better rules here. Enrage should not overwrite death wish, but it should overwrite Wrecking Crew
- // Check if triggered spell is aura spell to reduce unnecessary check
- /*
- AuraMap::iterator i,next;
- uint32 aura_id = 0;
- for (i = m_Auras.begin(); i != m_Auras.end(); i = next)
- {
- next = i;
- ++next;
- if (!(*i).second) continue;
- aura_id = (*i).second->GetSpellProto()->Id;
- if ( IsPassiveSpell(aura_id) || aura_id == trigger_spell_id || aura_id == triggeredByAura->GetSpellProto()->Id ) continue;
- if (spellmgr.IsNoStackSpellDueToSpell(trigger_spell_id, (*i).second->GetSpellProto()->Id, ((*i).second->GetCasterGUID() == GetGUID())))
- return false;
- }
- */
-
// not allow proc extra attack spell at extra attack
if( m_extraAttacks && IsSpellHaveEffect(triggerEntry, SPELL_EFFECT_ADD_EXTRA_ATTACKS) )
return false;