diff --git a/data/sql/updates/pending_db_world/rev_1781665996127369421.sql b/data/sql/updates/pending_db_world/rev_1781665996127369421.sql new file mode 100644 index 000000000..28ba4d037 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1781665996127369421.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE (`spell_id` = 50051); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(50051, 'spell_gen_ethereal_pet_aura'); diff --git a/src/server/scripts/Pet/pet_generic.cpp b/src/server/scripts/Pet/pet_generic.cpp index e7ca2c8bb..3d5168c33 100644 --- a/src/server/scripts/Pet/pet_generic.cpp +++ b/src/server/scripts/Pet/pet_generic.cpp @@ -63,9 +63,10 @@ struct npc_pet_gen_soul_trader_beacon : public ScriptedAI Player* GetOwner() const { return ObjectAccessor::GetPlayer(*me, ownerGUID); } - void SpellHitTarget(Unit* target, SpellInfo const* spellInfo) override + void SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) override { - if (spellInfo->Id == SPELL_STEAL_ESSENCE_VISUAL && target == me) + // Handle the kill notification from the owner's kill aura (spell 50051) + if (spellInfo->Id == SPELL_OWNER_KILLED_INFORM) { Talk(1); events.ScheduleEvent(EVENT_ADD_TOKEN, 3s); @@ -83,7 +84,10 @@ struct npc_pet_gen_soul_trader_beacon : public ScriptedAI break; case EVENT_ADD_TOKEN: me->RemoveAurasDueToSpell(SPELL_EMOTE_STATE_SWIM_RUN); - me->CastSpell(me, SPELL_CREATE_TOKEN, true); + // Cast the token creation spell on the player owner, not on the pet + if (Player* owner = GetOwner()) + me->CastSpell(owner, SPELL_CREATE_TOKEN, true); + Talk(2); break; } diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index a9038eeba..2bb2d19da 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -4543,6 +4543,58 @@ class spell_gen_eject_passenger : public SpellScript } }; +// 50051 - Ethereal Pet Aura (Soultrader Beacon) +// Triggers when the owner kills an opponent, applying spell 50050 (SPELL_OWNER_KILLED_INFORM) to notify the pet +class spell_gen_ethereal_pet_aura : public AuraScript +{ + PrepareAuraScript(spell_gen_ethereal_pet_aura); + + enum EtherealSoulTrader + { + NPC_ETHEREAL_SOUL_TRADER = 27914, + SPELL_OWNER_KILLED_INFORM = 50050, + SPELL_STEAL_ESSENCE_VISUAL = 50101, + }; + + bool CheckProc(ProcEventInfo& eventInfo) + { + Unit* procTarget = eventInfo.GetProcTarget(); + if (!procTarget) + return false; + + // Only trigger on players killing creatures that are not grey mobs + int32 levelDiff = int32(GetTarget()->GetLevel()) - int32(procTarget->GetLevel()); + return levelDiff <= 9; + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* procTarget = eventInfo.GetProcTarget(); + if (!procTarget) + return; + + // Get all Ethereal Soul-Trader minions owned by this player + std::list minionList; + GetUnitOwner()->GetAllMinionsByEntry(minionList, NPC_ETHEREAL_SOUL_TRADER); + + for (Creature* minion : minionList) + { + // Cast the laser beam visual from the pet to the killed mob + minion->CastSpell(procTarget, SPELL_STEAL_ESSENCE_VISUAL); + // Notify the pet AI that a valid kill occurred (triggers the pet's SpellHit handler) + minion->CastSpell(minion, SPELL_OWNER_KILLED_INFORM, true); + } + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_gen_ethereal_pet_aura::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_gen_ethereal_pet_aura::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } +}; + /* 37727 - Touch of Darkness 37851 - Tag Greater Felfire Diemetradon 37917 - Arcano-Cloak @@ -6263,6 +6315,7 @@ void AddSC_generic_spell_scripts() RegisterSpellScript(spell_gen_whisper_gulch_yogg_saron_whisper); RegisterSpellScript(spell_gen_eject_all_passengers); RegisterSpellScript(spell_gen_eject_passenger); + RegisterSpellScript(spell_gen_ethereal_pet_aura); RegisterSpellScript(spell_gen_charmed_unit_spell_cooldown); RegisterSpellScript(spell_contagion_of_rot); RegisterSpellScript(spell_gen_holiday_buff_food);