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); }