From c0c4ef393e780701184d4de316afc834984a4f7b Mon Sep 17 00:00:00 2001
From: UltraNix <80540499+UltraNix@users.noreply.github.com>
Date: Wed, 14 Sep 2022 03:30:37 +0200
Subject: [PATCH] fix(Scripts/TempleOfAhnQiraj): Obsidian Eradicator. (#12733)
---
.../rev_1660466530277163800.sql | 9 ++
.../TempleOfAhnQiraj/temple_of_ahnqiraj.cpp | 93 +++++++++++++++++++
2 files changed, 102 insertions(+)
create mode 100644 data/sql/updates/pending_db_world/rev_1660466530277163800.sql
diff --git a/data/sql/updates/pending_db_world/rev_1660466530277163800.sql b/data/sql/updates/pending_db_world/rev_1660466530277163800.sql
new file mode 100644
index 000000000..676377815
--- /dev/null
+++ b/data/sql/updates/pending_db_world/rev_1660466530277163800.sql
@@ -0,0 +1,9 @@
+--
+UPDATE `creature_template` SET `ScriptName`='npc_obsidian_eradicator', `AiName`='' WHERE `entry`=15262;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=15262 AND `source_type`=0;
+
+DELETE FROM `spell_script_names` WHERE `spell_id`=25671;
+INSERT INTO `spell_script_names` VALUES
+(25671,'spell_drain_mana');
+
+UPDATE `creature_template` SET `unit_flags2`=0 WHERE `entry`=15262;
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp
index 925a943c7..bdabb840b 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.cpp
@@ -15,6 +15,8 @@
* with this program. If not, see .
*/
+#include "MapReference.h"
+#include "Player.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
@@ -38,6 +40,10 @@ enum Spells
SPELL_SUMMON_LARGE_OBSIDIAN_CHUNK = 27630, // Server-side
+ SPELL_SHOCK_BLAST = 26458,
+ SPELL_DRAIN_MANA = 25671,
+ SPELL_DRAIN_MANA_VISUAL = 26639,
+
TALK_ENRAGE = 0
};
@@ -183,8 +189,95 @@ class spell_aggro_drones : public SpellScript
}
};
+struct npc_obsidian_eradicator : public ScriptedAI
+{
+ npc_obsidian_eradicator(Creature* creature) : ScriptedAI(creature)
+ {
+ }
+
+ void Reset() override
+ {
+ _scheduler.CancelAll();
+ me->SetPower(POWER_MANA, 0);
+ _targets.clear();
+ }
+
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _scheduler.Schedule(3500ms, [this](TaskContext context)
+ {
+ if (_targets.empty())
+ {
+ Map::PlayerList const& players = me->GetMap()->GetPlayers();
+ for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
+ {
+ if (Player* player = itr->GetSource())
+ {
+ if (player->IsAlive() && !player->IsGameMaster() && !player->IsSpectator() && player->GetPower(POWER_MANA) > 0)
+ {
+ _targets.push_back(player);
+ }
+ }
+ }
+
+ Acore::Containers::RandomResize(_targets, 10);
+ }
+
+ for (Unit* target : _targets)
+ {
+ DoCast(target, SPELL_DRAIN_MANA, true);
+ }
+
+ if (me->GetPowerPct(POWER_MANA) >= 100.f)
+ {
+ DoCastAOE(SPELL_SHOCK_BLAST, true);
+ }
+
+ context.Repeat(3500ms);
+ });
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ {
+ return;
+ }
+
+ _scheduler.Update(diff,
+ std::bind(&ScriptedAI::DoMeleeAttackIfReady, this));
+ }
+
+private:
+ TaskScheduler _scheduler;
+ std::list _targets;
+};
+
+class spell_drain_mana : public SpellScript
+{
+ PrepareSpellScript(spell_drain_mana);
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ if (Unit* caster = GetCaster())
+ {
+ if (Unit* target = GetHitUnit())
+ {
+ target->CastSpell(caster, SPELL_DRAIN_MANA_VISUAL, true);
+ }
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_drain_mana::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+};
+
void AddSC_temple_of_ahnqiraj()
{
RegisterTempleOfAhnQirajCreatureAI(npc_anubisath_defender);
RegisterSpellScript(spell_aggro_drones);
+ RegisterTempleOfAhnQirajCreatureAI(npc_obsidian_eradicator);
+ RegisterSpellScript(spell_drain_mana);
}