diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/Spell.cpp | 30 | ||||
-rw-r--r-- | src/game/SpellAuras.cpp | 20 | ||||
-rw-r--r-- | src/game/SpellAuras.h | 1 | ||||
-rw-r--r-- | src/game/SpellMgr.cpp | 21 | ||||
-rw-r--r-- | src/game/SpellMgr.h | 15 | ||||
-rw-r--r-- | src/game/Unit.cpp | 41 |
6 files changed, 81 insertions, 47 deletions
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 73b0f2af528..25fca09f80d 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -1215,15 +1215,14 @@ void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask) if(m_caster->GetTypeId() == TYPEID_UNIT && ((Creature*)m_caster)->AI()) ((Creature*)m_caster)->AI()->SpellHitTarget(unit, m_spellInfo); - if(const std::vector<int32> *spell_triggered = spellmgr.GetSpellLinked(m_spellInfo->Id + 1000000)) + if(m_customAttr & SPELL_ATTR_CU_LINK_HIT) { - for(std::vector<int32>::const_iterator i = spell_triggered->begin(); i != spell_triggered->end(); ++i) - { - if(*i < 0) - unit->RemoveAurasDueToSpell(-(*i)); - else - unit->CastSpell(unit, *i, true, 0, 0, m_caster->GetGUID()); - } + if(const std::vector<int32> *spell_triggered = spellmgr.GetSpellLinked(m_spellInfo->Id + SPELL_LINK_HIT)) + for(std::vector<int32>::const_iterator i = spell_triggered->begin(); i != spell_triggered->end(); ++i) + if(*i < 0) + unit->RemoveAurasDueToSpell(-(*i)); + else + unit->CastSpell(unit, *i, true, 0, 0, m_caster->GetGUID()); } //This is not needed with procflag patch @@ -2291,15 +2290,14 @@ void Spell::cast(bool skipCheck) TakePower(); } - if(const std::vector<int32> *spell_triggered = spellmgr.GetSpellLinked(m_spellInfo->Id)) + if(m_customAttr & SPELL_ATTR_CU_LINK_CAST) { - for(std::vector<int32>::const_iterator i = spell_triggered->begin(); i != spell_triggered->end(); ++i) - { - if(*i < 0) - m_caster->RemoveAurasDueToSpell(-(*i)); - else - m_caster->CastSpell(m_targets.getUnitTarget() ? m_targets.getUnitTarget() : m_caster, *i, true); - } + if(const std::vector<int32> *spell_triggered = spellmgr.GetSpellLinked(m_spellInfo->Id)) + for(std::vector<int32>::const_iterator i = spell_triggered->begin(); i != spell_triggered->end(); ++i) + if(*i < 0) + m_caster->RemoveAurasDueToSpell(-(*i)); + else + m_caster->CastSpell(m_targets.getUnitTarget() ? m_targets.getUnitTarget() : m_caster, *i, true); } SetExecutedCurrently(false); diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 23d334008ed..b74f9f0a8a4 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -240,7 +240,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]= &Aura::HandleNULL, //183 SPELL_AURA_MOD_CRITICAL_THREAT &Aura::HandleNoImmediateEffect, //184 SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst &Aura::HandleNoImmediateEffect, //185 SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst - &Aura::HandleModAttackerSpellHitChance, //186 SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE implemented in Unit::MagicSpellHitResult + &Aura::HandleNoImmediateEffect, //186 SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE implemented in Unit::MagicSpellHitResult &Aura::HandleNoImmediateEffect, //187 SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE implemented in Unit::GetUnitCriticalChance &Aura::HandleNoImmediateEffect, //188 SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE implemented in Unit::GetUnitCriticalChance &Aura::HandleModRating, //189 SPELL_AURA_MOD_RATING @@ -2038,12 +2038,6 @@ void Aura::HandleAuraDummy(bool apply, bool Real) return; } - // electrical storm safe zone - if (GetId() == 44007) - { - m_target->ApplySpellImmune(44007, IMMUNITY_ID, 43657, apply); - return; - } break; } case SPELLFAMILY_MAGE: @@ -6113,15 +6107,3 @@ void Aura::HandleArenaPreparation(bool apply, bool Real) else m_target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PREPARATION); } - -void Aura::HandleModAttackerSpellHitChance(bool apply, bool Real) -{ - if(!Real) - return; - - if(GetId() != 31224) - return; - - //cloak of shadows : flare - m_target->ApplySpellImmune(31224, IMMUNITY_ID, 1543, apply); -}
\ No newline at end of file diff --git a/src/game/SpellAuras.h b/src/game/SpellAuras.h index 1e9a8bd8c63..4912548d5b3 100644 --- a/src/game/SpellAuras.h +++ b/src/game/SpellAuras.h @@ -209,7 +209,6 @@ class TRINITY_DLL_SPEC Aura void HandlePreventFleeing(bool apply, bool Real); void HandleManaShield(bool apply, bool Real); void HandleArenaPreparation(bool apply, bool Real); - void HandleModAttackerSpellHitChance(bool apply, bool Real); virtual ~Aura(); diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index 208f31540dc..53683a6ebdc 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -2266,9 +2266,28 @@ void SpellMgr::LoadSpellLinked() } if(type) //we will find a better way when more types are needed - trigger += 1000000; + { + if(trigger > 0) + trigger += SPELL_LINKED_MAX_SPELLS * type; + else + trigger -= SPELL_LINKED_MAX_SPELLS * type; + } mSpellLinkedMap[trigger].push_back(effect); + if(trigger > 0) + { + switch(type) + { + case 0: mSpellCustomAttr[trigger] |= SPELL_ATTR_CU_LINK_CAST; break; + case 1: mSpellCustomAttr[trigger] |= SPELL_ATTR_CU_LINK_HIT; break; + case 2: mSpellCustomAttr[trigger] |= SPELL_ATTR_CU_LINK_AURA; break; + } + } + else + { + mSpellCustomAttr[-trigger] |= SPELL_ATTR_CU_LINK_REMOVE; + } + ++count; } while( result->NextRow() ); diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h index babad470d5f..747f40c064f 100644 --- a/src/game/SpellMgr.h +++ b/src/game/SpellMgr.h @@ -291,6 +291,16 @@ enum SpellSpecific SPELL_FOOD = 20 }; +#define SPELL_LINKED_MAX_SPELLS 200000 + +enum SpellLinkedType +{ + SPELL_LINK_CAST = 0, // +: cast; -: remove + SPELL_LINK_HIT = 1 * 200000, + SPELL_LINK_AURA = 2 * 200000, // +: aura; -: immune + SPELL_LINK_REMOVE = 0, +}; + SpellSpecific GetSpellSpecific(uint32 spellId); // Different spell properties @@ -703,6 +713,11 @@ inline bool IsProfessionSkill(uint32 skill) #define SPELL_ATTR_CU_AURA_SPELL 0x00000080 #define SPELL_ATTR_CU_DIRECT_DAMAGE 0x00000100 #define SPELL_ATTR_CU_CHARGE 0x00000200 +#define SPELL_ATTR_CU_LINK_CAST 0x00000400 +#define SPELL_ATTR_CU_LINK_HIT 0x00000800 +#define SPELL_ATTR_CU_LINK_AURA 0x00001000 +#define SPELL_ATTR_CU_LINK_REMOVE 0x00002000 + typedef std::vector<uint32> SpellCustomAttribute; diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 748aaa4cab8..a68c93c909c 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -4248,6 +4248,18 @@ bool Unit::AddAura(Aura *Aur) } Aur->ApplyModifier(true,true); + + uint32 id = Aur->GetId(); + if(spellmgr.GetSpellCustomAttr(id) & SPELL_ATTR_CU_LINK_AURA) + { + if(const std::vector<int32> *spell_triggered = spellmgr.GetSpellLinked(id + SPELL_LINK_AURA)) + for(std::vector<int32>::const_iterator itr = spell_triggered->begin(); itr != spell_triggered->end(); ++itr) + if(*itr < 0) + ApplySpellImmune(id, IMMUNITY_ID, *itr, true); + else if(Unit* caster = Aur->GetCaster()) + caster->AddAura(*itr, this); + } + sLog.outDebug("Aura %u now is in use", Aur->GetModifier()->m_auraname); return true; } @@ -4698,15 +4710,24 @@ void Unit::RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode) if(mode != AURA_REMOVE_BY_STACK) { - if(const std::vector<int32> *spell_triggered = spellmgr.GetSpellLinked(-(int32)Aur->GetSpellProto()->Id)) + uint32 id = Aur->GetId(); + if(spellmgr.GetSpellCustomAttr(id) & SPELL_ATTR_CU_LINK_REMOVE) { - for(std::vector<int32>::const_iterator itr = spell_triggered->begin(); itr != spell_triggered->end(); ++itr) - { - if(*itr < 0) - RemoveAurasDueToSpell(-(*itr)); - else if(Unit* caster = Aur->GetCaster()) - CastSpell(this, *itr, true, 0, 0, caster->GetGUID()); - } + if(const std::vector<int32> *spell_triggered = spellmgr.GetSpellLinked(-(int32)id)) + for(std::vector<int32>::const_iterator itr = spell_triggered->begin(); itr != spell_triggered->end(); ++itr) + if(*itr < 0) + RemoveAurasDueToSpell(-(*itr)); + else if(Unit* caster = Aur->GetCaster()) + CastSpell(this, *itr, true, 0, 0, caster->GetGUID()); + } + if(spellmgr.GetSpellCustomAttr(id) & SPELL_ATTR_CU_LINK_AURA) + { + if(const std::vector<int32> *spell_triggered = spellmgr.GetSpellLinked(id + SPELL_LINK_AURA)) + for(std::vector<int32>::const_iterator itr = spell_triggered->begin(); itr != spell_triggered->end(); ++itr) + if(*itr < 0) + ApplySpellImmune(id, IMMUNITY_ID, *itr, false); + else + RemoveAurasDueToSpell(*itr); } } @@ -13249,12 +13270,12 @@ void Unit::AddAura(uint32 spellId, Unit* target) if(target->IsImmunedToSpellEffect(spellInfo->Effect[i], spellInfo->EffectMechanic[i])) continue; - if(spellInfo->EffectImplicitTargetA[i] == TARGET_UNIT_CASTER) + /*if(spellInfo->EffectImplicitTargetA[i] == TARGET_UNIT_CASTER) { Aura *Aur = CreateAura(spellInfo, i, NULL, this, this); AddAura(Aur); } - else + else*/ { Aura *Aur = CreateAura(spellInfo, i, NULL, target, this); target->AddAura(Aur); |