aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
authorJeremy <Golrag@users.noreply.github.com>2023-05-09 05:20:35 +0200
committerGitHub <noreply@github.com>2023-05-09 05:20:35 +0200
commit205aba1ff3a6f1ff92a8b26af646fd25f139c697 (patch)
treea2273ad956ee236dd4044d114759d9e24211468c /src/server/scripts
parentdc284750968d1816cc4271f4c6a6dbcdcdfd3f51 (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.cpp1
-rw-r--r--src/server/scripts/Battlefield/BattlefieldTB.h1
-rw-r--r--src/server/scripts/EasternKingdoms/zone_tol_barad.cpp87
-rw-r--r--src/server/scripts/Northrend/zone_wintergrasp.cpp9
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp116
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);
}