/* * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "CreatureScript.h" #include "ScriptedCreature.h" #include "SpellScript.h" #include "SpellScriptLoader.h" #include "zulgurub.h" enum Spells { SPELL_FROSTBREATH = 16099, SPELL_MASSIVEGEYSER = 22421, SPELL_SLAM = 24326, SPELL_THRASH = 3417, // Triggers 3391 SPELL_SPLASH = 24593 }; enum Misc { GAMEOBJECT_MUDSKUNK_LURE = 180346 }; struct boss_gahzranka : public BossAI { boss_gahzranka(Creature* creature) : BossAI(creature, DATA_GAHZRANKA) {} void IsSummonedBy(WorldObject* /*summoner*/) override { me->GetMotionMaster()->MoveWaypoint(me->GetEntry() * 10, false); } void JustEngagedWith(Unit* /*who*/) override { _JustEngagedWith(); me->AddAura(SPELL_THRASH, me); ScheduleTimedEvent(8s, [&] { DoCastVictim(SPELL_FROSTBREATH); }, 8s, 20s); ScheduleTimedEvent(25s, [&] { DoCastVictim(SPELL_MASSIVEGEYSER); }, 22s, 32s); ScheduleTimedEvent(15s, [&] { DoCastVictim(SPELL_SLAM, true); }, 12s, 20s); } }; class spell_gahzranka_slam : public SpellScript { PrepareSpellScript(spell_gahzranka_slam); void FilterTargets(std::list& targets) { if (Unit* caster = GetCaster()) _wipeThreat = targets.size() < caster->GetThreatMgr().GetThreatListSize(); } void HandleWipeThreat(SpellEffIndex /*effIndex*/) { if (_wipeThreat) if (Unit* caster = GetCaster()) if (Unit* target = GetHitUnit()) caster->GetThreatMgr().ModifyThreatByPercent(target, -100); } void Register() override { OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gahzranka_slam::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); OnEffectHitTarget += SpellEffectFn(spell_gahzranka_slam::HandleWipeThreat, EFFECT_1, SPELL_EFFECT_KNOCK_BACK); } private: bool _wipeThreat = false; }; class spell_pagles_point_cast : public SpellScript { PrepareSpellScript(spell_pagles_point_cast); void OnEffect(SpellEffIndex /*effIndex*/) { if (Unit* caster = GetCaster()) { if (InstanceScript* instanceScript = caster->GetInstanceScript()) { if (!instanceScript->GetData(DATA_GAHZRANKA) && !caster->FindNearestCreature(NPC_GAHZRANKA, 50.0f)) { caster->m_Events.AddEventAtOffset([caster]() { if (GameObject* lure = caster->SummonGameObject(GAMEOBJECT_MUDSKUNK_LURE, -11688.5f, -1737.74f, 10.409842f, 1.f, 0.f, 0.f, 0.f, 0.f, 30 * IN_MILLISECONDS)) { lure->DespawnOrUnsummon(5s); caster->m_Events.AddEventAtOffset([caster]() { if (!caster->FindNearestCreature(NPC_GAHZRANKA, 50.0f)) { caster->CastSpell(caster, SPELL_SPLASH, true); caster->SummonCreature(NPC_GAHZRANKA, -11688.5f, -1723.74f, -5.78f, 0.f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5 * DAY * IN_MILLISECONDS); } }, 5s); } }, 2s); } } } } void Register() override { OnEffectLaunch += SpellEffectFn(spell_pagles_point_cast::OnEffect, EFFECT_1, SPELL_EFFECT_SEND_EVENT); } }; void AddSC_boss_gahzranka() { RegisterZulGurubCreatureAI(boss_gahzranka); RegisterSpellScript(spell_gahzranka_slam); RegisterSpellScript(spell_pagles_point_cast); }