From 99cc42851173bcc431aabc3ccbbedd442313ba1b Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Thu, 7 Oct 2021 13:58:46 -0300 Subject: [PATCH] =?UTF-8?q?fix(Core/Spells):=20Improved=20Drain=20Soul=20t?= =?UTF-8?q?riggering=20from=20every=20target=20=E2=80=A6=20(#8144)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ...that dies and not just the one affected by Drain Soul and move the Drain Soul code to spell scripts - TC Ports: https://github.com/TrinityCore/TrinityCore/commit/d9743c984f11069bddab9d7f006293c18a400765#diff-ea612aafadff90005e88b243eb000369be9e5cb6f8dc85a008d31e42b156e0ec and https://github.com/TrinityCore/TrinityCore/commit/2b1b36f5617ac10dc373410b69957eadb2766453#diff-ea612aafadff90005e88b243eb000369be9e5cb6f8dc85a008d31e42b156e0ec --- .../rev_1632872192462777000.sql | 5 + src/server/game/Entities/Unit/Unit.cpp | 22 +---- .../game/Spells/Auras/SpellAuraEffects.cpp | 34 ------- src/server/scripts/Spells/spell_warlock.cpp | 95 ++++++++++++++++++- 4 files changed, 100 insertions(+), 56 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1632872192462777000.sql diff --git a/data/sql/updates/pending_db_world/rev_1632872192462777000.sql b/data/sql/updates/pending_db_world/rev_1632872192462777000.sql new file mode 100644 index 000000000..71f0e03d8 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1632872192462777000.sql @@ -0,0 +1,5 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1632872192462777000'); + +DELETE FROM `spell_script_names` WHERE `spell_id` = -1120 AND `ScriptName` = 'spell_warl_drain_soul'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(-1120, 'spell_warl_drain_soul'); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 20043a623..27d5995a9 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -8409,28 +8409,8 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg break; case SPELLFAMILY_WARLOCK: { - // Drain Soul - if (auraSpellInfo->SpellFamilyFlags[0] & 0x4000) - { - // Improved Drain Soul - Unit::AuraEffectList const& mAddFlatModifier = GetAuraEffectsByType(SPELL_AURA_DUMMY); - for (Unit::AuraEffectList::const_iterator i = mAddFlatModifier.begin(); i != mAddFlatModifier.end(); ++i) - { - if ((*i)->GetMiscValue() == SPELLMOD_CHANCE_OF_SUCCESS && (*i)->GetSpellInfo()->SpellIconID == 113) - { - int32 value2 = CalculateSpellDamage(this, (*i)->GetSpellInfo(), 2); - basepoints0 = int32(CalculatePct(GetMaxPower(POWER_MANA), value2)); - // Drain Soul - CastCustomSpell(this, 18371, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura); - break; - } - } - // Not remove charge (aura removed on death in any cases) - // Need for correct work Drain Soul SPELL_AURA_CHANNEL_DEATH_ITEM aura - return false; - } // Nether Protection - else if (auraSpellInfo->SpellIconID == 1985) + if (auraSpellInfo->SpellIconID == 1985) { if (!procSpell) return false; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 539d368c4..a3fba370e 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5431,7 +5431,6 @@ void AuraEffect::HandleChannelDeathItem(AuraApplication const* aurApp, uint8 mod return; Player* plCaster = caster->ToPlayer(); - Unit* target = aurApp->GetTarget(); // Item amount if (GetAmount() <= 0) @@ -5440,24 +5439,6 @@ void AuraEffect::HandleChannelDeathItem(AuraApplication const* aurApp, uint8 mod if (GetSpellInfo()->Effects[m_effIndex].ItemType == 0) return; - // Soul Shard - if (GetSpellInfo()->Effects[m_effIndex].ItemType == 6265) - { - // Soul Shard only from units that grant XP or honor - if (!plCaster->isHonorOrXPTarget(target) || - (target->GetTypeId() == TYPEID_UNIT && !target->ToCreature()->isTappedBy(plCaster))) - return; - - // If this is Drain Soul, check for Glyph of Drain Soul - if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_WARLOCK && (GetSpellInfo()->SpellFamilyFlags[0] & 0x00004000)) - { - // Glyph of Drain Soul - chance to create an additional Soul Shard - if (AuraEffect* aur = caster->GetAuraEffect(58070, 0)) - if (roll_chance_i(aur->GetMiscValue())) - caster->CastSpell(caster, 58068, true, 0, aur); // We _could_ simply do ++count here, but Blizz does it this way :) - } - } - //Adding items uint32 noSpaceForCount = 0; uint32 count = m_amount; @@ -6308,21 +6289,6 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const damage += (damage + 1) / 2; // +1 prevent 0.5 damage possible lost at 1..4 ticks // 5..8 ticks have normal tick damage } - // There is a Chance to make a Soul Shard when Drain soul does damage - if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_WARLOCK && (GetSpellInfo()->SpellFamilyFlags[0] & 0x00004000)) - { - if (caster && caster->GetTypeId() == TYPEID_PLAYER && caster->ToPlayer()->isHonorOrXPTarget(target)) - { - if (roll_chance_i(20)) - { - caster->CastSpell(caster, 43836, true, 0, this); - // Glyph of Drain Soul - chance to create an additional Soul Shard - if (AuraEffect* aur = caster->GetAuraEffect(58070, 0)) - if (roll_chance_i(aur->GetMiscValue())) - caster->CastSpell(caster, 58068, true, 0, aur); - } - } - } } else // xinef: ceil obtained value, it may happen that 10 ticks for 10% damage may not kill owner damage = uint32(ceil(CalculatePct(target->GetMaxHealth(), damage))); diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 8d6ec7ba8..a44cc4246 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -30,6 +30,8 @@ enum WarlockSpells { + SPELL_WARLOCK_DRAIN_SOUL_R1 = 1120, + SPELL_WARLOCK_CREATE_SOULSHARD = 43836, SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT = 18662, SPELL_WARLOCK_DEMONIC_CIRCLE_SUMMON = 48018, SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT = 48020, @@ -40,6 +42,8 @@ enum WarlockSpells SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER = 54509, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP = 54444, SPELL_WARLOCK_FEL_SYNERGY_HEAL = 54181, + SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_AURA = 58070, + SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_PROC = 58068, SPELL_WARLOCK_GLYPH_OF_SHADOWFLAME = 63311, SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE = 56216, SPELL_WARLOCK_HAUNT = 48181, @@ -54,7 +58,9 @@ enum WarlockSpells SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2 = 32553, SPELL_WARLOCK_SOULSHATTER = 32835, SPELL_WARLOCK_SIPHON_LIFE_HEAL = 63106, - SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL = 31117 + SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL = 31117, + SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_R1 = 18213, + SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_PROC = 18371 }; enum WarlockSpellIcons @@ -1367,6 +1373,92 @@ public: } }; +// -1120 - Drain Soul +class spell_warl_drain_soul : public SpellScriptLoader +{ +public: + spell_warl_drain_soul() : SpellScriptLoader("spell_warl_drain_soul") { } + + class spell_warl_drain_soul_AuraScript : public AuraScript + { + PrepareAuraScript(spell_warl_drain_soul_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_R1, + SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_PROC, + SPELL_WARLOCK_CREATE_SOULSHARD, + SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_AURA, + SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_PROC + }); + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + // Drain Soul's proc tries to happen each time the warlock lands a killing blow on a unit while channeling. + // Make sure that the dying unit is afflicted by the caster's Drain Soul debuff in order to avoid a false positive. + + Unit* caster = GetCaster(); + Unit* victim = eventInfo.GetProcTarget(); + + if (caster && victim) + { + return victim->GetAuraApplicationOfRankedSpell(SPELL_WARLOCK_DRAIN_SOUL_R1, caster->GetGUID()) != 0; + } + + return false; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* caster = eventInfo.GetActor(); + // Improved Drain Soul. + if (Aura const* impDrainSoul = caster->GetAuraOfRankedSpell(SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_R1, caster->GetGUID())) + { + int32 amount = CalculatePct(caster->GetMaxPower(POWER_MANA), impDrainSoul->GetSpellInfo()->Effects[EFFECT_2].CalcValue()); + caster->CastCustomSpell(SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_PROC, SPELLVALUE_BASE_POINT0, amount, caster, true, nullptr, aurEff, caster->GetGUID()); + } + } + + void HandleTick(AuraEffect const* aurEff) + { + Unit* caster = GetCaster(); + Unit* target = GetTarget(); + + if (caster && caster->GetTypeId() == TYPEID_PLAYER && caster->ToPlayer()->isHonorOrXPTarget(target)) + { + if (roll_chance_i(20)) + { + caster->CastSpell(caster, SPELL_WARLOCK_CREATE_SOULSHARD, aurEff); + // Glyph of Drain Soul - chance to create an additional Soul Shard. + if (AuraEffect* aur = caster->GetAuraEffect(SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_AURA, EFFECT_0)) + { + if (roll_chance_i(aur->GetMiscValue())) + { + caster->CastSpell(caster, SPELL_WARLOCK_CREATE_SOULSHARD, aur); + } + } + } + } + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_warl_drain_soul_AuraScript::CheckProc); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_drain_soul_AuraScript::HandleTick, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); + OnEffectProc += AuraEffectProcFn(spell_warl_drain_soul_AuraScript::HandleProc, EFFECT_2, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_warl_drain_soul_AuraScript(); + } +}; void AddSC_warlock_spell_scripts() { // Ours @@ -1399,4 +1491,5 @@ void AddSC_warlock_spell_scripts() new spell_warl_siphon_life(); new spell_warl_soulshatter(); new spell_warl_unstable_affliction(); + new spell_warl_drain_soul(); }