diff --git a/sql/updates/world/custom/custom_2019_04_18_00_world.sql b/sql/updates/world/custom/custom_2019_04_18_00_world.sql new file mode 100644 index 0000000000..c929a2f15c --- /dev/null +++ b/sql/updates/world/custom/custom_2019_04_18_00_world.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`= 'spell_warl_seed_of_corruption_aoe'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(87385, 'spell_warl_seed_of_corruption_aoe'); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 0e0298d6e8..4da1497ec4 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1963,6 +1963,9 @@ class TC_GAME_API Player : public Unit, public GridObject void UpdateWeaponsSkillsToMaxSkillsForLevel(); // for .levelup void ModifySkillBonus(uint32 skillid, int32 val, bool talent); + void SetLastSoulburnSpell(SpellInfo const* spell) { m_lastSoulburnSpell = spell; } + SpellInfo const* GetLastSoulburnSpell() const { return m_lastSoulburnSpell; } + /*********************************************************/ /*** PVP SYSTEM ***/ /*********************************************************/ @@ -2676,6 +2679,8 @@ class TC_GAME_API Player : public Unit, public GridObject std::array, MAX_CUF_PROFILES> _CUFProfiles; + SpellInfo const* m_lastSoulburnSpell; + private: // internal common parts for CanStore/StoreItem functions InventoryResult CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemPosCountVec& dest, ItemTemplate const* pProto, uint32& count, bool swap, Item* pSrcItem) const; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index eafe699799..204a60e168 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -7211,6 +7211,14 @@ float Unit::GetUnitSpellCriticalChance(Unit* victim, SpellInfo const* spellProto break; } break; + case SPELLFAMILY_WARLOCK: + { + // Searing Pain - Soulburn bonus + if (spellProto->SpellFamilyFlags[0] & 0x00000100) + if (HasAura(74434)) + return 100.0f; + break; + } } } break; diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 08472a6ffb..404eb2776c 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -1035,6 +1035,12 @@ class spell_warl_seed_of_corruption : public AuraScript { PrepareAuraScript(spell_warl_seed_of_corruption); + bool Load() override + { + _affectedBySoulburn = false; + return true; + } + bool Validate(SpellInfo const* /*spellInfo*/) override { return ValidateSpellInfo( @@ -1045,27 +1051,75 @@ class spell_warl_seed_of_corruption : public AuraScript }); } - void OnAuraRemoveHandler(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + void HandleSoulburnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - Unit* caster = GetCaster(); + Unit* unit = GetCaster(); + Player* caster = unit->ToPlayer(); + if (!caster) + return; + + if (caster->GetLastSoulburnSpell() == GetSpellInfo()) + { + _affectedBySoulburn = true; + caster->SetLastSoulburnSpell(nullptr); + } + } + + void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + Unit* unit = GetCaster(); + Player* caster = unit->ToPlayer(); + Unit* target = GetTarget(); if (!caster) return; if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH) { - caster->CastSpell(GetTarget(), SPELL_WARLOCK_SEED_OF_CORRUPTION_TRIGGERED, true, nullptr, aurEff); - caster->CastSpell(GetTarget(), SPELL_WARLOCK_SEED_OF_CORRUPTION_VISUAL, true, nullptr, aurEff); + if (_affectedBySoulburn) + { + caster->CastSpell(caster, SPELL_WARLOCK_SOUL_SHARD, true, nullptr, aurEff); + caster->CastSpell(target, SPELL_WARLOCK_SEED_OF_CORRUPTION_TRIGGERED, true, nullptr, aurEff); + } + else + caster->CastSpell(target, SPELL_WARLOCK_SEED_OF_CORRUPTION_TRIGGERED, true); - //if (AuraEffect* dummy = caster->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_SOULBURN_SEED_OF_CORRUPTION, EFFECT_0)) - // caster->CastSpell(caster, SPELL_WARLOCK_SOUL_SHARD, true, nullptr, aurEff); + target->CastSpell(target, SPELL_WARLOCK_SEED_OF_CORRUPTION_VISUAL, true); } - // else if (AuraEffect* dummy = caster->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_SOULBURN_SEED_OF_CORRUPTION, EFFECT_0)) - //caster->CastSpell(target, SPELL_WARLOCK_CORRUPTION_TRIGGERED, true, nullptr, aurEff); } void Register() override { - AfterEffectRemove += AuraEffectRemoveFn(spell_warl_seed_of_corruption::OnAuraRemoveHandler, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectApply += AuraEffectApplyFn(spell_warl_seed_of_corruption::HandleSoulburnApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_warl_seed_of_corruption::HandleRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } +private: + bool _affectedBySoulburn; +}; + +// 87385 - Seed of Corruption (explosion damage) +class spell_warl_seed_of_corruption_aoe : public SpellScript +{ + PrepareSpellScript(spell_warl_seed_of_corruption_aoe); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_WARLOCK_CORRUPTION_TRIGGERED, + SPELL_WARLOCK_SEED_OF_CORRUPTION + }); + } + + void HandleHit(SpellEffIndex /*effIndex*/) + { + if (GetSpell()->IsTriggeredByAura(sSpellMgr->AssertSpellInfo(SPELL_WARLOCK_SEED_OF_CORRUPTION))) + if (Unit* caster = GetCaster()) + caster->CastSpell(GetHitUnit(), SPELL_WARLOCK_CORRUPTION_TRIGGERED, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_warl_seed_of_corruption_aoe::HandleHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); } }; @@ -1676,16 +1730,23 @@ class spell_warl_soulburn : public AuraScript }); } + bool CheckProc(ProcEventInfo& eventInfo) + { + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo || GetTarget()->GetTypeId() != TYPEID_PLAYER) + return false; + + return true; + } + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { Unit* target = GetTarget(); target->RemoveAurasDueToSpell(SPELL_WARLOCK_SOULBURN_DUMMY_SEED_OF_CORRUPTION); - SpellInfo const* spell = eventInfo.GetSpellInfo(); - if (!spell) - return; + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); - switch (spell->Id) + switch (spellInfo->Id) { case SPELL_WARLOCK_HEALTHSTONE: target->CastSpell(target, SPELL_WARLOCK_SOULBURN_HEALTHSTONE, true, nullptr, aurEff); @@ -1697,7 +1758,7 @@ class spell_warl_soulburn : public AuraScript target->CastSpell(target, SPELL_WARLOCK_SOULBURN_SEARING_PAIN, true, nullptr, aurEff); break; case SPELL_WARLOCK_SEED_OF_CORRUPTION: - // todo: handle me + target->ToPlayer()->SetLastSoulburnSpell(spellInfo); break; default: break; @@ -1717,6 +1778,7 @@ class spell_warl_soulburn : public AuraScript void Register() override { + DoCheckProc += AuraCheckProcFn(spell_warl_soulburn::CheckProc); OnEffectProc += AuraEffectProcFn(spell_warl_soulburn::HandleProc, EFFECT_0, SPELL_AURA_ADD_PCT_MODIFIER); AfterEffectApply += AuraEffectApplyFn(spell_warl_soulburn::HandleSeedOfCorruptionDummyApply, EFFECT_0, SPELL_AURA_ADD_PCT_MODIFIER, AURA_EFFECT_HANDLE_REAL); AfterEffectRemove += AuraEffectRemoveFn(spell_warl_soulburn::HandleSeedOfCorruptionDummyRemove, EFFECT_0, SPELL_AURA_ADD_PCT_MODIFIER, AURA_EFFECT_HANDLE_REAL); @@ -1750,6 +1812,7 @@ void AddSC_warlock_spell_scripts() new spell_warl_nether_ward_overrride(); new spell_warl_seduction(); RegisterAuraScript(spell_warl_seed_of_corruption); + RegisterSpellScript(spell_warl_seed_of_corruption_aoe); new spell_warl_shadow_trance_proc(); new spell_warl_shadow_ward(); RegisterAuraScript(spell_warl_soulburn);