diff options
-rw-r--r-- | sql/updates/1018_wrold.sql | 6 | ||||
-rw-r--r-- | sql/world_spell_full.sql | 6 | ||||
-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 |
8 files changed, 91 insertions, 49 deletions
diff --git a/sql/updates/1018_wrold.sql b/sql/updates/1018_wrold.sql new file mode 100644 index 00000000000..ca298faa8f3 --- /dev/null +++ b/sql/updates/1018_wrold.sql @@ -0,0 +1,6 @@ +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` IN (31224,41292,44007,44867); +INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES +(31224, -1543, 2, 'Cloak of Shadows - Flare'), +(41292, 42017, 2, 'Aura of Suffering'), +(44007, -43657, 2, 'Storm Eye Safe Zone Immune'), +(44867, -46019, 2, 'Spectral Exhaustion - Teleport: Spectral Realm');
\ No newline at end of file diff --git a/sql/world_spell_full.sql b/sql/world_spell_full.sql index 9e18dd4d194..1c71285a593 100644 --- a/sql/world_spell_full.sql +++ b/sql/world_spell_full.sql @@ -15,6 +15,7 @@ CREATE TABLE `spell_linked_spell` ( INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES -- class +(31224, -1543, 2, 'Cloak of Shadows - Flare'), (15237, 23455, 0, 'Holy Nova (rank1)'), (15430, 23458, 0, 'Holy Nova (rank2)'), (15431, 23459, 0, 'Holy Nova (rank3)'), @@ -37,6 +38,7 @@ INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comm -- Zul'aman (44008, 45265, 1, 'Static Disruption Visual'), (43648, 44007, 1, 'Storm Eye Safe Zone'), +(44007, -43657, 2, 'Storm Eye Safe Zone Immune'), (43658, 43653, 0, 'Electrical Arc Visual'), (43658, 43654, 0, 'Electrical Arc Visual'), (43658, 43655, 0, 'Electrical Arc Visual'), @@ -52,8 +54,7 @@ INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comm (39908, 40017, 1, 'Eye Blast'), (40604, 40616, 1, 'Fel Rage Aura'), (40616, 41625, 1, 'Fel Rage Aura'), -(41292, 42017, 1, 'Aura of Suffering'), -(-41292, -42017, 0, 'Aura of Suffering'), +(41292, 42017, 2, 'Aura of Suffering'), -- sunwell (44869, 44866, 1, 'Spectral Blast Portal'), # (44869, 46648, 1, 'Spectral Blast Visual'), cause severe lag seems should be casted by go @@ -62,6 +63,7 @@ INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comm # (46021, 44852, 1, 'Spectral Realm Aura'), 44852 makes boss friendly to you (-46021, 46020, 0, 'Teleport: Normal Realm'), (46020, 44867, 1, 'Spectral Exhaustion'), +(44867, -46019, 2, 'Spectral Exhaustion - Teleport: Spectral Realm'), (45661, 45665, 1, 'Encapsulate'), (45347, -45348, 1, 'Remove Flame Touched'), (45348, -45347, 1, 'Remove Dark Touched'), 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); |