diff options
| author | Jeremy <Golrag@users.noreply.github.com> | 2023-05-09 05:20:35 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-05-09 05:20:35 +0200 |
| commit | 205aba1ff3a6f1ff92a8b26af646fd25f139c697 (patch) | |
| tree | a2273ad956ee236dd4044d114759d9e24211468c /src/server/scripts | |
| parent | dc284750968d1816cc4271f4c6a6dbcdcdfd3f51 (diff) | |
Core/Battlegrounds: Moved AreaSpiritHealer resurrection handling to respective npc flags (#28508)
* UNIT_NPC_FLAG_AREA_SPIRIT_HEALER
* UNIT_NPC_FLAG_2_AREA_SPIRIT_HEALER_INDIVIDUAL
Diffstat (limited to 'src/server/scripts')
| -rw-r--r-- | src/server/scripts/Battlefield/BattlefieldTB.cpp | 1 | ||||
| -rw-r--r-- | src/server/scripts/Battlefield/BattlefieldTB.h | 1 | ||||
| -rw-r--r-- | src/server/scripts/EasternKingdoms/zone_tol_barad.cpp | 87 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/zone_wintergrasp.cpp | 9 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_generic.cpp | 116 |
5 files changed, 150 insertions, 64 deletions
diff --git a/src/server/scripts/Battlefield/BattlefieldTB.cpp b/src/server/scripts/Battlefield/BattlefieldTB.cpp index c49d92eb6bc..9d9902adbe2 100644 --- a/src/server/scripts/Battlefield/BattlefieldTB.cpp +++ b/src/server/scripts/Battlefield/BattlefieldTB.cpp @@ -511,7 +511,6 @@ void BattlefieldTB::OnCreatureCreate(Creature* creature) case NPC_TB_GY_SPIRIT_EAST_SPIRE_H: case NPC_TB_GY_SPIRIT_SOUTH_SPIRE_H: creature->CastSpell(creature, SPELL_TB_SPIRITUAL_IMMUNITY, true); - creature->CastSpell(creature, SPELL_TB_SPIRIT_HEAL_CHANNEL, true); break; default: break; diff --git a/src/server/scripts/Battlefield/BattlefieldTB.h b/src/server/scripts/Battlefield/BattlefieldTB.h index ed274a2e49e..f39e39d690c 100644 --- a/src/server/scripts/Battlefield/BattlefieldTB.h +++ b/src/server/scripts/Battlefield/BattlefieldTB.h @@ -54,7 +54,6 @@ enum TolBaradSpells SPELL_TB_SLOW_FALL = 88473, SPELL_TB_VETERAN = 84655, SPELL_TOWER_ATTACK_BONUS = 82629, - SPELL_TB_SPIRIT_HEAL_CHANNEL = 22011, // this spell replaces m_LastResurrectTimer in Battlefield.cpp? SPELL_TB_SPIRITUAL_IMMUNITY = 95332, // Vehicle diff --git a/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp b/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp index d52d7f89eca..e0da4c64877 100644 --- a/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp +++ b/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp @@ -29,8 +29,6 @@ enum TBSpiritGuide { - SPELL_CHANNEL_SPIRIT_HEAL = 22011, - GOSSIP_OPTION_ID_SLAGWORKS = 0, GOSSIP_OPTION_ID_IRONCLAD_GARRISON = 1, GOSSIP_OPTION_ID_WARDENS_VIGIL = 2, @@ -39,61 +37,44 @@ enum TBSpiritGuide GOSSIP_OPTION_ID_SOUTH_SPIRE = 5, }; -class npc_tb_spirit_guide : public CreatureScript +struct npc_tb_spirit_guide : public ScriptedAI { - public: - npc_tb_spirit_guide() : CreatureScript("npc_tb_spirit_guide") { } - - struct npc_tb_spirit_guideAI : public ScriptedAI - { - npc_tb_spirit_guideAI(Creature* creature) : ScriptedAI(creature) { } - - void UpdateAI(uint32 /*diff*/) override - { - if (!me->HasUnitState(UNIT_STATE_CASTING)) - DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL); - } - - bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override - { - player->PlayerTalkClass->SendCloseGossip(); - - uint32 areaId = 0; - switch (gossipListId) - { - case GOSSIP_OPTION_ID_SLAGWORKS: - areaId = TB_GY_SLAGWORKS; - break; - case GOSSIP_OPTION_ID_IRONCLAD_GARRISON: - areaId = TB_GY_IRONCLAD_GARRISON; - break; - case GOSSIP_OPTION_ID_WARDENS_VIGIL: - areaId = TB_GY_WARDENS_VIGIL; - break; - case GOSSIP_OPTION_ID_EAST_SPIRE: - areaId = TB_GY_EAST_SPIRE; - break; - case GOSSIP_OPTION_ID_WEST_SPIRE: - areaId = TB_GY_WEST_SPIRE; - break; - case GOSSIP_OPTION_ID_SOUTH_SPIRE: - areaId = TB_GY_SOUTH_SPIRE; - break; - default: - return true; - } + npc_tb_spirit_guide(Creature* creature) : ScriptedAI(creature) { } - if (WorldSafeLocsEntry const* safeLoc = sObjectMgr->GetWorldSafeLoc(areaId)) - player->TeleportTo(safeLoc->Loc); - - return false; - } - }; + bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + player->PlayerTalkClass->SendCloseGossip(); - CreatureAI* GetAI(Creature* creature) const override + uint32 areaId = 0; + switch (gossipListId) { - return new npc_tb_spirit_guideAI(creature); + case GOSSIP_OPTION_ID_SLAGWORKS: + areaId = TB_GY_SLAGWORKS; + break; + case GOSSIP_OPTION_ID_IRONCLAD_GARRISON: + areaId = TB_GY_IRONCLAD_GARRISON; + break; + case GOSSIP_OPTION_ID_WARDENS_VIGIL: + areaId = TB_GY_WARDENS_VIGIL; + break; + case GOSSIP_OPTION_ID_EAST_SPIRE: + areaId = TB_GY_EAST_SPIRE; + break; + case GOSSIP_OPTION_ID_WEST_SPIRE: + areaId = TB_GY_WEST_SPIRE; + break; + case GOSSIP_OPTION_ID_SOUTH_SPIRE: + areaId = TB_GY_SOUTH_SPIRE; + break; + default: + return true; } + + if (WorldSafeLocsEntry const* safeLoc = sObjectMgr->GetWorldSafeLoc(areaId)) + player->TeleportTo(safeLoc->Loc); + + return false; + } }; // 85123 - Siege Cannon - selects random target @@ -130,6 +111,6 @@ public: void AddSC_tol_barad() { - new npc_tb_spirit_guide(); + RegisterCreatureAI(npc_tb_spirit_guide); new spell_siege_cannon(); } diff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp index e4a53d4c57f..011414865c7 100644 --- a/src/server/scripts/Northrend/zone_wintergrasp.cpp +++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp @@ -61,9 +61,6 @@ enum Spells SPELL_RIDE_WG_VEHICLE = 60968, SPELL_VEHICLE_TELEPORT = 49759, - - // Spirit guide - SPELL_CHANNEL_SPIRIT_HEAL = 22011, }; enum CreatureIds @@ -192,12 +189,6 @@ struct npc_wg_spirit_guide : public ScriptedAI { npc_wg_spirit_guide(Creature* creature) : ScriptedAI(creature) { } - void UpdateAI(uint32 /*diff*/) override - { - if (!me->HasUnitState(UNIT_STATE_CASTING)) - DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL); - } - bool OnGossipHello(Player* player) override { if (me->IsQuestGiver()) diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index e5346f910bb..3176c5704fa 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -5415,6 +5415,118 @@ private: uint32 _exhaustionSpellId; }; +// AoE resurrections by spirit guides +// 22012 - Spirit Heal +class spell_gen_spirit_heal_aoe : public SpellScript +{ + PrepareSpellScript(spell_gen_spirit_heal_aoe); + + void FilterTargets(std::list<WorldObject*>& targets) + { + Unit* caster = GetCaster(); + targets.remove_if([caster](WorldObject* target) -> bool + { + if (Player* playerTarget = target->ToPlayer()) + return !playerTarget->CanAcceptAreaSpiritHealFrom(caster); + + return true; + }); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gen_spirit_heal_aoe::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ALLY); + } +}; + +// Personal resurrections in battlegrounds +// 156758 - Spirit Heal +class spell_gen_spirit_heal_personal : public AuraScript +{ + static constexpr uint32 SPELL_SPIRIT_HEAL_EFFECT = 156763; + + PrepareAuraScript(spell_gen_spirit_heal_personal); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; + + Player* targetPlayer = GetTarget()->ToPlayer(); + if (!targetPlayer) + return; + + Unit* caster = GetCaster(); + if (!caster) + return; + + if (targetPlayer->CanAcceptAreaSpiritHealFrom(caster)) + caster->CastSpell(targetPlayer, SPELL_SPIRIT_HEAL_EFFECT); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_gen_spirit_heal_personal::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } +}; + +class RecastSpiritHealChannelEvent : public BasicEvent +{ +public: + RecastSpiritHealChannelEvent(Unit* caster) : _caster(caster) { } + + bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) override + { + if (_caster->GetChannelSpellId() == 0) + _caster->CastSpell(nullptr, SPELL_SPIRIT_HEAL_CHANNEL_AOE, false); + + return true; + } + +private: + Unit* _caster; +}; + +// 22011 - Spirit Heal Channel +class spell_gen_spirit_heal_channel : public AuraScript +{ + PrepareAuraScript(spell_gen_spirit_heal_channel); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; + + Unit* target = GetTarget(); + target->m_Events.AddEventAtOffset(new RecastSpiritHealChannelEvent(target), 1s); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_gen_spirit_heal_channel::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } +}; + +// 2584 - Waiting to Resurrect +class spell_gen_waiting_to_resurrect : public AuraScript +{ + PrepareAuraScript(spell_gen_waiting_to_resurrect); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Player* targetPlayer = GetTarget()->ToPlayer(); + if (!targetPlayer) + return; + + targetPlayer->SetAreaSpiritHealer(nullptr); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_gen_waiting_to_resurrect::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } +}; + void AddSC_generic_spell_scripts() { RegisterSpellScript(spell_gen_absorb0_hitlimit1); @@ -5584,4 +5696,8 @@ void AddSC_generic_spell_scripts() RegisterSpellScriptWithArgs(spell_gen_bloodlust, "spell_hun_primal_rage", SPELL_HUNTER_FATIGUED); RegisterSpellScriptWithArgs(spell_gen_bloodlust, "spell_evo_fury_of_the_aspects", SPELL_EVOKER_EXHAUSTION); RegisterSpellScriptWithArgs(spell_gen_bloodlust, "spell_item_bloodlust_drums", SPELL_SHAMAN_EXHAUSTION); + RegisterSpellScript(spell_gen_spirit_heal_aoe); + RegisterSpellScript(spell_gen_spirit_heal_personal); + RegisterSpellScript(spell_gen_spirit_heal_channel); + RegisterSpellScript(spell_gen_waiting_to_resurrect); } |
