diff options
-rw-r--r-- | src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp | 307 | ||||
-rw-r--r-- | src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp | 335 |
2 files changed, 294 insertions, 348 deletions
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp index 7bddbf8dcae..3375b16e579 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp @@ -77,193 +77,172 @@ Position const SpawnBat[6] = { -12293.6220f, -1380.2640f, 144.8304f, 5.483f } }; -class boss_jeklik : public CreatureScript +struct boss_jeklik : public BossAI { - public: boss_jeklik() : CreatureScript("boss_jeklik") { } - - struct boss_jeklikAI : public BossAI + boss_jeklik(Creature* creature) : BossAI(creature, DATA_JEKLIK) { } + + void Reset() override + { + _Reset(); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + Talk(SAY_AGGRO); + events.SetPhase(PHASE_ONE); + + events.ScheduleEvent(EVENT_CHARGE_JEKLIK, 20s, 0, PHASE_ONE); + events.ScheduleEvent(EVENT_SONIC_BURST, 8s, 0, PHASE_ONE); + events.ScheduleEvent(EVENT_SCREECH, 13s, 0, PHASE_ONE); + events.ScheduleEvent(EVENT_SPAWN_BATS, 60s, 0, PHASE_ONE); + + me->SetCanFly(true); + DoCast(me, SPELL_BAT_FORM); + } + + void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) override + { + if (events.IsInPhase(PHASE_ONE) && !HealthAbovePct(50)) { - boss_jeklikAI(Creature* creature) : BossAI(creature, DATA_JEKLIK) { } - - void Reset() override - { - _Reset(); - } - - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); - } - - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - Talk(SAY_AGGRO); - events.SetPhase(PHASE_ONE); + me->RemoveAurasDueToSpell(SPELL_BAT_FORM); + me->SetCanFly(false); + ResetThreatList(); + events.SetPhase(PHASE_TWO); + events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 6s, 0, PHASE_TWO); + events.ScheduleEvent(EVENT_MIND_FLAY, 11s, 0, PHASE_TWO); + events.ScheduleEvent(EVENT_CHAIN_MIND_FLAY, 26s, 0, PHASE_TWO); + events.ScheduleEvent(EVENT_GREATER_HEAL, 50s, 0, PHASE_TWO); + events.ScheduleEvent(EVENT_SPAWN_FLYING_BATS, 10s, 0, PHASE_TWO); + } + } - events.ScheduleEvent(EVENT_CHARGE_JEKLIK, 20s, 0, PHASE_ONE); - events.ScheduleEvent(EVENT_SONIC_BURST, 8s, 0, PHASE_ONE); - events.ScheduleEvent(EVENT_SCREECH, 13s, 0, PHASE_ONE); - events.ScheduleEvent(EVENT_SPAWN_BATS, 60s, 0, PHASE_ONE); + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - me->SetCanFly(true); - DoCast(me, SPELL_BAT_FORM); - } + events.Update(diff); - void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) override - { - if (events.IsInPhase(PHASE_ONE) && !HealthAbovePct(50)) - { - me->RemoveAurasDueToSpell(SPELL_BAT_FORM); - me->SetCanFly(false); - ResetThreatList(); - events.SetPhase(PHASE_TWO); - events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 6s, 0, PHASE_TWO); - events.ScheduleEvent(EVENT_MIND_FLAY, 11s, 0, PHASE_TWO); - events.ScheduleEvent(EVENT_CHAIN_MIND_FLAY, 26s, 0, PHASE_TWO); - events.ScheduleEvent(EVENT_GREATER_HEAL, 50s, 0, PHASE_TWO); - events.ScheduleEvent(EVENT_SPAWN_FLYING_BATS, 10s, 0, PHASE_TWO); - } - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void UpdateAI(uint32 diff) override + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_CHARGE_JEKLIK: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.f, true)) { - case EVENT_CHARGE_JEKLIK: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.f, true)) - { - DoCast(target, SPELL_CHARGE); - AttackStart(target); - } - events.ScheduleEvent(EVENT_CHARGE_JEKLIK, 15s, 30s, 0, PHASE_ONE); - break; - case EVENT_SONIC_BURST: - DoCastVictim(SPELL_SONICBURST); - events.ScheduleEvent(EVENT_SONIC_BURST, 8s, 13s, 0, PHASE_ONE); - break; - case EVENT_SCREECH: - DoCastVictim(SPELL_SCREECH); - events.ScheduleEvent(EVENT_SCREECH, 18s, 26s, 0, PHASE_ONE); - break; - case EVENT_SPAWN_BATS: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.f, true)) - for (uint8 i = 0; i < 6; ++i) - if (TempSummon* bat = me->SummonCreature(NPC_BLOODSEEKER_BAT, SpawnBat[i], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15s)) - bat->AI()->AttackStart(target); - events.ScheduleEvent(EVENT_SPAWN_BATS, 1min, 0, PHASE_ONE); - break; - case EVENT_SHADOW_WORD_PAIN: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.f, true)) - DoCast(target, SPELL_SHADOW_WORD_PAIN); - events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 12s, 18s, 0, PHASE_TWO); - break; - case EVENT_MIND_FLAY: - DoCastVictim(SPELL_MIND_FLAY); - events.ScheduleEvent(EVENT_MIND_FLAY, 16s, 0, PHASE_TWO); - break; - case EVENT_CHAIN_MIND_FLAY: - me->InterruptNonMeleeSpells(false); - DoCastVictim(SPELL_CHAIN_MIND_FLAY); - events.ScheduleEvent(EVENT_CHAIN_MIND_FLAY, 15s, 30s, 0, PHASE_TWO); - break; - case EVENT_GREATER_HEAL: - me->InterruptNonMeleeSpells(false); - DoCast(me, SPELL_GREATERHEAL); - events.ScheduleEvent(EVENT_GREATER_HEAL, 25s, 35s, 0, PHASE_TWO); - break; - case EVENT_SPAWN_FLYING_BATS: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.f, true)) - if (TempSummon* flyingBat = me->SummonCreature(NPC_FRENZIED_BAT, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ() + 15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15s)) - flyingBat->AI()->AttackStart(target); - events.ScheduleEvent(EVENT_SPAWN_FLYING_BATS, 10s, 15s, 0, PHASE_TWO); - break; - default: - break; + DoCast(target, SPELL_CHARGE); + AttackStart(target); } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); + events.ScheduleEvent(EVENT_CHARGE_JEKLIK, 15s, 30s, 0, PHASE_ONE); + break; + case EVENT_SONIC_BURST: + DoCastVictim(SPELL_SONICBURST); + events.ScheduleEvent(EVENT_SONIC_BURST, 8s, 13s, 0, PHASE_ONE); + break; + case EVENT_SCREECH: + DoCastVictim(SPELL_SCREECH); + events.ScheduleEvent(EVENT_SCREECH, 18s, 26s, 0, PHASE_ONE); + break; + case EVENT_SPAWN_BATS: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.f, true)) + for (uint8 i = 0; i < 6; ++i) + if (TempSummon* bat = me->SummonCreature(NPC_BLOODSEEKER_BAT, SpawnBat[i], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15s)) + bat->AI()->AttackStart(target); + events.ScheduleEvent(EVENT_SPAWN_BATS, 1min, 0, PHASE_ONE); + break; + case EVENT_SHADOW_WORD_PAIN: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.f, true)) + DoCast(target, SPELL_SHADOW_WORD_PAIN); + events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 12s, 18s, 0, PHASE_TWO); + break; + case EVENT_MIND_FLAY: + DoCastVictim(SPELL_MIND_FLAY); + events.ScheduleEvent(EVENT_MIND_FLAY, 16s, 0, PHASE_TWO); + break; + case EVENT_CHAIN_MIND_FLAY: + me->InterruptNonMeleeSpells(false); + DoCastVictim(SPELL_CHAIN_MIND_FLAY); + events.ScheduleEvent(EVENT_CHAIN_MIND_FLAY, 15s, 30s, 0, PHASE_TWO); + break; + case EVENT_GREATER_HEAL: + me->InterruptNonMeleeSpells(false); + DoCast(me, SPELL_GREATERHEAL); + events.ScheduleEvent(EVENT_GREATER_HEAL, 25s, 35s, 0, PHASE_TWO); + break; + case EVENT_SPAWN_FLYING_BATS: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.f, true)) + if (TempSummon* flyingBat = me->SummonCreature(NPC_FRENZIED_BAT, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ() + 15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15s)) + flyingBat->AI()->AttackStart(target); + events.ScheduleEvent(EVENT_SPAWN_FLYING_BATS, 10s, 15s, 0, PHASE_TWO); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetZulGurubAI<boss_jeklikAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } }; // Flying Bat -class npc_batrider : public CreatureScript +struct npc_batrider : public ScriptedAI { - public: - npc_batrider() : CreatureScript("npc_batrider") { } - - struct npc_batriderAI : public ScriptedAI + npc_batrider(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } + + void Initialize() + { + _bombTimer = 2000; + } + + void Reset() override + { + Initialize(); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + } + + void JustEngagedWith(Unit* /*who*/) override { } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + if (_bombTimer <= diff) { - npc_batriderAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } - - void Initialize() - { - _bombTimer = 2000; - } - - void Reset() override - { - Initialize(); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - } - - void JustEngagedWith(Unit* /*who*/) override { } - - void UpdateAI(uint32 diff) override + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.f, true)) { - if (!UpdateVictim()) - return; - - if (_bombTimer <= diff) - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.f, true)) - { - DoCast(target, SPELL_BOMB); - _bombTimer = 5000; - } - } - else - _bombTimer -= diff; - - DoMeleeAttackIfReady(); + DoCast(target, SPELL_BOMB); + _bombTimer = 5000; } + } + else + _bombTimer -= diff; - private: - uint32 _bombTimer; - }; + DoMeleeAttackIfReady(); + } - CreatureAI* GetAI(Creature* creature) const override - { - return GetZulGurubAI<npc_batriderAI>(creature); - } +private: + uint32 _bombTimer; }; void AddSC_boss_jeklik() { - new boss_jeklik(); - new npc_batrider(); + RegisterZulGurubCreatureAI(boss_jeklik); + RegisterZulGurubCreatureAI(npc_batrider); } diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp index ce1661520fd..40bdb512409 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp @@ -67,213 +67,180 @@ Position const Formation[] = { -11580.5996f, -1254.7900f, 77.6298f, 0.0f } }; -class boss_jindo : public CreatureScript +struct boss_jindo : public BossAI { - public: - boss_jindo() : CreatureScript("boss_jindo") { } - - struct boss_jindoAI : public BossAI + boss_jindo(Creature* creature) : BossAI(creature, DATA_JINDO) { } + + void Reset() override + { + _Reset(); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_BRAIN_WASH_TOTEM, 20s); + events.ScheduleEvent(EVENT_POWERFULL_HEALING_WARD, 15s); + events.ScheduleEvent(EVENT_HEX, 8s); + events.ScheduleEvent(EVENT_DELUSIONS_OF_JINDO, 10s); + events.ScheduleEvent(EVENT_TELEPORT, 5s); + Talk(SAY_AGGRO); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) { - boss_jindoAI(Creature* creature) : BossAI(creature, DATA_JINDO) { } - - void Reset() override - { - _Reset(); - } - - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - } - - void JustEngagedWith(Unit* who) override + switch (eventId) { - BossAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_BRAIN_WASH_TOTEM, 20s); - events.ScheduleEvent(EVENT_POWERFULL_HEALING_WARD, 15s); - events.ScheduleEvent(EVENT_HEX, 8s); - events.ScheduleEvent(EVENT_DELUSIONS_OF_JINDO, 10s); - events.ScheduleEvent(EVENT_TELEPORT, 5s); - Talk(SAY_AGGRO); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + case EVENT_BRAIN_WASH_TOTEM: + DoCast(me, SPELL_BRAIN_WASH_TOTEM); + events.ScheduleEvent(EVENT_BRAIN_WASH_TOTEM, 18s, 26s); + break; + case EVENT_POWERFULL_HEALING_WARD: + DoCast(me, SPELL_POWERFULL_HEALING_WARD); + events.ScheduleEvent(EVENT_POWERFULL_HEALING_WARD, 14s, 20s); + break; + case EVENT_HEX: + if (Unit* target = me->GetVictim()) { - case EVENT_BRAIN_WASH_TOTEM: - DoCast(me, SPELL_BRAIN_WASH_TOTEM); - events.ScheduleEvent(EVENT_BRAIN_WASH_TOTEM, 18s, 26s); - break; - case EVENT_POWERFULL_HEALING_WARD: - DoCast(me, SPELL_POWERFULL_HEALING_WARD); - events.ScheduleEvent(EVENT_POWERFULL_HEALING_WARD, 14s, 20s); - break; - case EVENT_HEX: - if (Unit* target = me->GetVictim()) - { - DoCast(target, SPELL_HEX, true); - if (GetThreat(target)) - ModifyThreatByPercent(target, -80); - } - events.ScheduleEvent(EVENT_HEX, 12s, 20s); - break; - case EVENT_DELUSIONS_OF_JINDO: - // Casting the delusion curse with a shade so shade will attack the same target with the curse. - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) - { - DoCast(target, SPELL_SHADE_OF_JINDO, true); - DoCast(target, SPELL_DELUSIONS_OF_JINDO); - } - events.ScheduleEvent(EVENT_DELUSIONS_OF_JINDO, 4s, 12s); - break; - case EVENT_TELEPORT: - // Teleports a random player and spawns 9 Sacrificed Trolls to attack player - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) - { - DoTeleportPlayer(target, TeleportLoc.GetPositionX(), TeleportLoc.GetPositionY(), TeleportLoc.GetPositionZ(), TeleportLoc.GetOrientation()); - if (GetThreat(me->GetVictim())) - ModifyThreatByPercent(target, -100); - - // Summon a formation of trolls - for (uint8 i = 0; i < 10; ++i) - if (TempSummon* sacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, Formation[i], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15s)) - sacrificedTroll->AI()->AttackStart(target); - } - events.ScheduleEvent(EVENT_TELEPORT, 15s, 23s); - break; - default: - break; + DoCast(target, SPELL_HEX, true); + if (GetThreat(target)) + ModifyThreatByPercent(target, -80); } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); + events.ScheduleEvent(EVENT_HEX, 12s, 20s); + break; + case EVENT_DELUSIONS_OF_JINDO: + // Casting the delusion curse with a shade so shade will attack the same target with the curse. + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) + { + DoCast(target, SPELL_SHADE_OF_JINDO, true); + DoCast(target, SPELL_DELUSIONS_OF_JINDO); + } + events.ScheduleEvent(EVENT_DELUSIONS_OF_JINDO, 4s, 12s); + break; + case EVENT_TELEPORT: + // Teleports a random player and spawns 9 Sacrificed Trolls to attack player + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) + { + DoTeleportPlayer(target, TeleportLoc.GetPositionX(), TeleportLoc.GetPositionY(), TeleportLoc.GetPositionZ(), TeleportLoc.GetOrientation()); + if (GetThreat(me->GetVictim())) + ModifyThreatByPercent(target, -100); + + // Summon a formation of trolls + for (uint8 i = 0; i < 10; ++i) + if (TempSummon* sacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, Formation[i], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15s)) + sacrificedTroll->AI()->AttackStart(target); + } + events.ScheduleEvent(EVENT_TELEPORT, 15s, 23s); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetZulGurubAI<boss_jindoAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } }; // Healing Ward -class npc_healing_ward : public CreatureScript +struct npc_healing_ward : public ScriptedAI { - public: - npc_healing_ward() : CreatureScript("npc_healing_ward") { } - - struct npc_healing_wardAI : public ScriptedAI + npc_healing_ward(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) + { + Initialize(); + creature->SetReactState(REACT_PASSIVE); + } + + void Initialize() + { + _healTimer = 2000; + } + + void Reset() override + { + Initialize(); + } + + void AttackStart(Unit* /*victim*/) override { } + + void UpdateAI(uint32 diff) override + { + // Heal_Timer + if (_healTimer <= diff) { - npc_healing_wardAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) - { - Initialize(); - creature->SetReactState(REACT_PASSIVE); - } - - void Initialize() - { - _healTimer = 2000; - } - - void Reset() override - { - Initialize(); - } - - void AttackStart(Unit* /*victim*/) override { } - - void UpdateAI(uint32 diff) override - { - // Heal_Timer - if (_healTimer <= diff) - { - if (Creature* jindo = _instance->GetCreature(DATA_JINDO)) - DoCast(jindo, SPELL_HEAL); - _healTimer = 3000; - } - else - _healTimer -= diff; - } - - private: - uint32 _healTimer; - InstanceScript* _instance; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetZulGurubAI<npc_healing_wardAI>(creature); + if (Creature* jindo = _instance->GetCreature(DATA_JINDO)) + DoCast(jindo, SPELL_HEAL); + _healTimer = 3000; } + else + _healTimer -= diff; + } + +private: + uint32 _healTimer; + InstanceScript* _instance; }; // Shade of Jindo -class npc_shade_of_jindo : public CreatureScript +struct npc_shade_of_jindo : public ScriptedAI { - public: - npc_shade_of_jindo() : CreatureScript("npc_shade_of_jindo") { } - - struct npc_shade_of_jindoAI : public ScriptedAI + npc_shade_of_jindo(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } + + void Initialize() + { + _shadowShockTimer = 1000; + } + + void Reset() override + { + Initialize(); + DoCast(me, SPELL_INVISIBLE, true); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + // ShadowShock_Timer + if (_shadowShockTimer <= diff) { - npc_shade_of_jindoAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } - - void Initialize() - { - _shadowShockTimer = 1000; - } - - void Reset() override - { - Initialize(); - DoCast(me, SPELL_INVISIBLE, true); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - // ShadowShock_Timer - if (_shadowShockTimer <= diff) - { - DoCastVictim(SPELL_SHADOWSHOCK); - _shadowShockTimer = 2000; - } - else - _shadowShockTimer -= diff; - - DoMeleeAttackIfReady(); - } + DoCastVictim(SPELL_SHADOWSHOCK); + _shadowShockTimer = 2000; + } + else + _shadowShockTimer -= diff; - private: - uint32 _shadowShockTimer; - }; + DoMeleeAttackIfReady(); + } - CreatureAI* GetAI(Creature* creature) const override - { - return GetZulGurubAI<npc_shade_of_jindoAI>(creature); - } +private: + uint32 _shadowShockTimer; }; void AddSC_boss_jindo() { - new boss_jindo(); - new npc_healing_ward(); - new npc_shade_of_jindo(); + RegisterZulGurubCreatureAI(boss_jindo); + RegisterZulGurubCreatureAI(npc_healing_ward); + RegisterZulGurubCreatureAI(npc_shade_of_jindo); } |