diff --git a/data/sql/updates/pending_db_world/rev_1654439260971561400.sql b/data/sql/updates/pending_db_world/rev_1654439260971561400.sql new file mode 100644 index 000000000..d9814f281 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1654439260971561400.sql @@ -0,0 +1,4 @@ +-- +DELETE FROM `spell_script_names` WHERE `spell_id`=24684; +INSERT INTO `spell_script_names` VALUES +(24684,'spell_chain_burn'); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp index 136cd18be..d475bd966 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp @@ -24,19 +24,25 @@ EndScriptData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellScript.h" #include "zulgurub.h" enum Spells { - SPELL_MANABURN = 26046, - SPELL_SLEEP = 24664 + SPELL_SLEEP = 24664, + SPELL_EARTH_SHOCK = 24685, + SPELL_CHAIN_BURN = 24684, + SPELL_SUMMON_NIGHTMARE_ILLUSION_LEFT = 24681, + SPELL_SUMMON_NIGHTMARE_ILLUSION_BACK = 24728, + SPELL_SUMMON_NIGHTMARE_ILLUSION_RIGHT = 24729 }; enum Events { - EVENT_MANABURN = 1, - EVENT_SLEEP = 2, - EVENT_ILLUSIONS = 3 + EVENT_SLEEP = 1, + EVENT_EARTH_SHOCK = 2, + EVENT_CHAIN_BURN = 3, + EVENT_ILLUSIONS = 4 }; class boss_hazzarah : public CreatureScript @@ -48,22 +54,42 @@ public: { boss_hazzarahAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) { } - void Reset() override + void JustSummoned(Creature* summon) override { - _Reset(); - } + summons.Summon(summon); - void JustDied(Unit* /*killer*/) override - { - _JustDied(); + summon->SetCorpseDelay(10); + summon->SetReactState(REACT_PASSIVE); + summon->SetUnitFlag(UNIT_FLAG_DISABLE_MOVE); + summon->SetVisible(false); + summon->m_Events.AddEventAtOffset([summon]() + { + summon->SetVisible(true); + }, 2s); + + summon->m_Events.AddEventAtOffset([summon]() + { + summon->RemoveUnitFlag(UNIT_FLAG_DISABLE_MOVE); + summon->SetReactState(REACT_AGGRESSIVE); + summon->SetInCombatWithZone(); + }, 3500ms); } void EnterCombat(Unit* /*who*/) override { _EnterCombat(); - events.ScheduleEvent(EVENT_MANABURN, urand(4000, 10000)); - events.ScheduleEvent(EVENT_SLEEP, urand(10000, 18000)); - events.ScheduleEvent(EVENT_ILLUSIONS, urand(10000, 18000)); + events.ScheduleEvent(EVENT_SLEEP, 12s, 15s); + events.ScheduleEvent(EVENT_EARTH_SHOCK, 8s, 18s); + events.ScheduleEvent(EVENT_CHAIN_BURN, 12s, 28s); + events.ScheduleEvent(EVENT_ILLUSIONS, 16s, 24s); + } + + bool CanAIAttack(Unit const* target) const override + { + if (me->GetThreatMgr().getThreatList().size() > 1 && me->GetThreatMgr().getOnlineContainer().getMostHated()->getTarget() == target) + return !target->HasAura(SPELL_SLEEP); + + return true; } void UpdateAI(uint32 diff) override @@ -80,27 +106,26 @@ public: { switch (eventId) { - case EVENT_MANABURN: - DoCastVictim(SPELL_MANABURN, true); - events.ScheduleEvent(EVENT_MANABURN, urand(8000, 16000)); - break; case EVENT_SLEEP: DoCastVictim(SPELL_SLEEP, true); - events.ScheduleEvent(EVENT_SLEEP, urand(12000, 20000)); + events.ScheduleEvent(EVENT_SLEEP, 24s, 32s); + return; + case EVENT_EARTH_SHOCK: + DoCastVictim(SPELL_EARTH_SHOCK); + events.ScheduleEvent(EVENT_EARTH_SHOCK, 8s, 18s); + break; + case EVENT_CHAIN_BURN: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, [&](Unit* u) { return u && !u->IsPet() && u->getPowerType() == POWER_MANA; })) + { + DoCast(target, SPELL_CHAIN_BURN, false); + } + events.ScheduleEvent(EVENT_CHAIN_BURN, 12s, 28s); break; case EVENT_ILLUSIONS: - // We will summon 3 illusions that will spawn on a random gamer and attack this gamer - // We will just use one model for the beginning - for (uint8 i = 0; i < 3; ++i) - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - { - Creature* Illusion = me->SummonCreature(NPC_NIGHTMARE_ILLUSION, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); - if (Illusion) - Illusion->AI()->AttackStart(target); - } - } - events.ScheduleEvent(EVENT_ILLUSIONS, urand(15000, 25000)); + DoCastSelf(SPELL_SUMMON_NIGHTMARE_ILLUSION_LEFT, true); + DoCastSelf(SPELL_SUMMON_NIGHTMARE_ILLUSION_BACK, true); + DoCastSelf(SPELL_SUMMON_NIGHTMARE_ILLUSION_RIGHT, true); + events.ScheduleEvent(EVENT_ILLUSIONS, 16s, 24s); break; default: break; @@ -117,7 +142,28 @@ public: } }; +class spell_chain_burn : public SpellScript +{ + PrepareSpellScript(spell_chain_burn); + + void FilterTargets(std::list& targets) + { + Unit* caster = GetCaster(); + targets.remove_if([caster](WorldObject* target) -> bool + { + Unit* unit = target->ToUnit(); + return !unit || unit->getPowerType() != POWER_MANA || caster->GetVictim() == unit; + }); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_chain_burn::FilterTargets, EFFECT_0, TARGET_UNIT_TARGET_ENEMY); + } +}; + void AddSC_boss_hazzarah() { new boss_hazzarah(); + RegisterSpellScript(spell_chain_burn); }