aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp542
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp358
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp197
3 files changed, 506 insertions, 591 deletions
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
index bc16abd998f..ef5189f2eb5 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
@@ -99,195 +99,184 @@ Position const PosMandokir[2] =
{ -12197.86f, -1949.392f, 130.2745f, 0.0f }
};
-class boss_mandokir : public CreatureScript
+struct boss_mandokir : public BossAI
{
- public:
- boss_mandokir() : CreatureScript("boss_mandokir") { }
-
- struct boss_mandokirAI : public BossAI
+ boss_mandokir(Creature* creature) : BossAI(creature, DATA_MANDOKIR)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _killCount = 0;
+ }
+
+ void Reset() override
+ {
+ if (me->GetPositionZ() > 140.0f)
{
- boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR)
- {
- Initialize();
- }
-
- void Initialize()
- {
- _killCount = 0;
- }
-
- void Reset() override
- {
- if (me->GetPositionZ() > 140.0f)
- {
- _Reset();
- Initialize();
- me->SetImmuneToAll(true);
- events.ScheduleEvent(EVENT_CHECK_START, 1s);
- if (Creature* speaker = instance->GetCreature(DATA_VILEBRANCH_SPEAKER))
- if (!speaker->IsAlive())
- speaker->Respawn(true);
- }
- summons.DespawnAll();
- me->Mount(MODEL_OHGAN_MOUNT);
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- summons.DespawnEntry(NPC_CHAINED_SPIRT);
- instance->SetBossState(DATA_MANDOKIR, DONE);
- instance->SaveToDB();
- }
-
- void JustReachedHome() override
- {
- me->SetImmuneToAll(false);
- }
-
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- events.ScheduleEvent(EVENT_OVERPOWER, 7s, 9s);
- events.ScheduleEvent(EVENT_MORTAL_STRIKE, 12s, 18s);
- events.ScheduleEvent(EVENT_WHIRLWIND, 24s, 30s);
- events.ScheduleEvent(EVENT_WATCH_PLAYER, 13s, 15s);
- events.ScheduleEvent(EVENT_CHARGE_PLAYER, 33s, 38s);
- me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
- Talk(SAY_AGGRO);
- me->Dismount();
-
- // Summon Ohgan (Spell missing) TEMP HACK
- me->SummonCreature(NPC_OHGAN, me->GetPositionX() - 3, me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 35s);
- // Summon Chained Spirits
- for (int i = 0; i < CHAINED_SPIRT_COUNT; ++i)
- me->SummonCreature(NPC_CHAINED_SPIRT, PosSummonChainedSpirits[i], TEMPSUMMON_CORPSE_DESPAWN);
-
- DoZoneInCombat();
- }
-
- void KilledUnit(Unit* victim) override
- {
- if (victim->GetTypeId() != TYPEID_PLAYER)
- return;
+ _Reset();
+ Initialize();
+ me->SetImmuneToAll(true);
+ events.ScheduleEvent(EVENT_CHECK_START, 1s);
+ if (Creature* speaker = instance->GetCreature(DATA_VILEBRANCH_SPEAKER))
+ if (!speaker->IsAlive())
+ speaker->Respawn(true);
+ }
+ summons.DespawnAll();
+ me->Mount(MODEL_OHGAN_MOUNT);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ summons.DespawnEntry(NPC_CHAINED_SPIRT);
+ instance->SetBossState(DATA_MANDOKIR, DONE);
+ instance->SaveToDB();
+ }
+
+ void JustReachedHome() override
+ {
+ me->SetImmuneToAll(false);
+ }
+
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ events.ScheduleEvent(EVENT_OVERPOWER, 7s, 9s);
+ events.ScheduleEvent(EVENT_MORTAL_STRIKE, 12s, 18s);
+ events.ScheduleEvent(EVENT_WHIRLWIND, 24s, 30s);
+ events.ScheduleEvent(EVENT_WATCH_PLAYER, 13s, 15s);
+ events.ScheduleEvent(EVENT_CHARGE_PLAYER, 33s, 38s);
+ me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
+ Talk(SAY_AGGRO);
+ me->Dismount();
+
+ // Summon Ohgan (Spell missing) TEMP HACK
+ me->SummonCreature(NPC_OHGAN, me->GetPositionX() - 3, me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 35s);
+ // Summon Chained Spirits
+ for (int i = 0; i < CHAINED_SPIRT_COUNT; ++i)
+ me->SummonCreature(NPC_CHAINED_SPIRT, PosSummonChainedSpirits[i], TEMPSUMMON_CORPSE_DESPAWN);
+
+ DoZoneInCombat();
+ }
+
+ void KilledUnit(Unit* victim) override
+ {
+ if (victim->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ if (++_killCount == 3)
+ {
+ Talk(SAY_DING_KILL);
+ if (Creature* jindo = instance->GetCreature(DATA_JINDO))
+ if (jindo->IsAlive())
+ jindo->AI()->Talk(SAY_GRATS_JINDO);
+ DoCast(me, SPELL_LEVEL_UP, true);
+ _killCount = 0;
+ }
+ }
- if (++_killCount == 3)
- {
- Talk(SAY_DING_KILL);
- if (Creature* jindo = instance->GetCreature(DATA_JINDO))
- if (jindo->IsAlive())
- jindo->AI()->Talk(SAY_GRATS_JINDO);
- DoCast(me, SPELL_LEVEL_UP, true);
- _killCount = 0;
- }
- }
+ void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override
+ {
+ if (summon->GetEntry() == NPC_OHGAN)
+ {
+ DoCast(me, SPELL_FRENZY);
+ Talk(SAY_OHGAN_DEAD);
+ }
+ }
- void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override
+ void MovementInform(uint32 type, uint32 id) override
+ {
+ if (type == WAYPOINT_MOTION_TYPE)
+ {
+ me->SetWalk(false);
+ if (id == POINT_MANDOKIR_END)
{
- if (summon->GetEntry() == NPC_OHGAN)
- {
- DoCast(me, SPELL_FRENZY);
- Talk(SAY_OHGAN_DEAD);
- }
+ me->SetHomePosition(PosMandokir[1]);
+ me->GetMotionMaster()->MoveTargetedHome();
+ instance->SetBossState(DATA_MANDOKIR, NOT_STARTED);
}
+ }
+ }
- void MovementInform(uint32 type, uint32 id) override
- {
- if (type == WAYPOINT_MOTION_TYPE)
- {
- me->SetWalk(false);
- if (id == POINT_MANDOKIR_END)
- {
- me->SetHomePosition(PosMandokir[1]);
- me->GetMotionMaster()->MoveTargetedHome();
- instance->SetBossState(DATA_MANDOKIR, NOT_STARTED);
- }
- }
- }
+ void UpdateAI(uint32 diff) override
+ {
+ events.Update(diff);
- void UpdateAI(uint32 diff) override
+ if (!UpdateVictim())
+ {
+ if (instance->GetBossState(DATA_MANDOKIR) == NOT_STARTED || instance->GetBossState(DATA_MANDOKIR) == SPECIAL)
{
- events.Update(diff);
-
- if (!UpdateVictim())
- {
- if (instance->GetBossState(DATA_MANDOKIR) == NOT_STARTED || instance->GetBossState(DATA_MANDOKIR) == SPECIAL)
- {
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_CHECK_START:
- if (instance->GetBossState(DATA_MANDOKIR) == SPECIAL)
- {
- me->GetMotionMaster()->MovePoint(0, PosMandokir[1]);
- events.ScheduleEvent(EVENT_STARTED, 6s);
- }
- else
- events.ScheduleEvent(EVENT_CHECK_START, 1s);
- break;
- case EVENT_STARTED:
- me->SetImmuneToAll(false);
- me->GetMotionMaster()->MovePath(PATH_MANDOKIR, false);
- break;
- default:
- break;
- }
- }
- }
- return;
- }
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
- case EVENT_OVERPOWER:
- DoCastVictim(SPELL_OVERPOWER, true);
- events.ScheduleEvent(EVENT_OVERPOWER, 6s, 12s);
- break;
- case EVENT_MORTAL_STRIKE:
- if (me->GetVictim() && me->EnsureVictim()->HealthBelowPct(50))
- DoCastVictim(SPELL_MORTAL_STRIKE, true);
- events.ScheduleEvent(EVENT_MORTAL_STRIKE, 12s, 18s);
- break;
- case EVENT_WHIRLWIND:
- DoCast(me, SPELL_WHIRLWIND);
- events.ScheduleEvent(EVENT_WHIRLWIND, 22s, 26s);
- break;
- case EVENT_WATCH_PLAYER:
- if (Unit* player = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
+ case EVENT_CHECK_START:
+ if (instance->GetBossState(DATA_MANDOKIR) == SPECIAL)
{
- DoCast(player, SPELL_WATCH);
- Talk(SAY_WATCH, player);
+ me->GetMotionMaster()->MovePoint(0, PosMandokir[1]);
+ events.ScheduleEvent(EVENT_STARTED, 6s);
}
- events.ScheduleEvent(EVENT_WATCH_PLAYER, 12s, 15s);
+ else
+ events.ScheduleEvent(EVENT_CHECK_START, 1s);
break;
- case EVENT_CHARGE_PLAYER:
- DoCast(SelectTarget(SelectTargetMethod::Random, 0, 40, true), SPELL_CHARGE);
- events.ScheduleEvent(EVENT_CHARGE_PLAYER, 22s, 30s);
+ case EVENT_STARTED:
+ me->SetImmuneToAll(false);
+ me->GetMotionMaster()->MovePath(PATH_MANDOKIR, false);
break;
default:
break;
}
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
}
-
- DoMeleeAttackIfReady();
}
+ return;
+ }
- private:
- uint8 _killCount;
- };
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- CreatureAI* GetAI(Creature* creature) const override
+ while (uint32 eventId = events.ExecuteEvent())
{
- return GetZulGurubAI<boss_mandokirAI>(creature);
+ switch (eventId)
+ {
+ case EVENT_OVERPOWER:
+ DoCastVictim(SPELL_OVERPOWER, true);
+ events.ScheduleEvent(EVENT_OVERPOWER, 6s, 12s);
+ break;
+ case EVENT_MORTAL_STRIKE:
+ if (me->GetVictim() && me->EnsureVictim()->HealthBelowPct(50))
+ DoCastVictim(SPELL_MORTAL_STRIKE, true);
+ events.ScheduleEvent(EVENT_MORTAL_STRIKE, 12s, 18s);
+ break;
+ case EVENT_WHIRLWIND:
+ DoCast(me, SPELL_WHIRLWIND);
+ events.ScheduleEvent(EVENT_WHIRLWIND, 22s, 26s);
+ break;
+ case EVENT_WATCH_PLAYER:
+ if (Unit* player = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
+ {
+ DoCast(player, SPELL_WATCH);
+ Talk(SAY_WATCH, player);
+ }
+ events.ScheduleEvent(EVENT_WATCH_PLAYER, 12s, 15s);
+ break;
+ case EVENT_CHARGE_PLAYER:
+ DoCast(SelectTarget(SelectTargetMethod::Random, 0, 40, true), SPELL_CHARGE);
+ events.ScheduleEvent(EVENT_CHARGE_PLAYER, 22s, 30s);
+ break;
+ default:
+ break;
+ }
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
+
+ DoMeleeAttackIfReady();
+ }
+
+private:
+ uint8 _killCount;
};
// Ohgan
@@ -297,52 +286,41 @@ enum OhganSpells
SPELL_SUNDERARMOR = 24317
};
-class npc_ohgan : public CreatureScript
+struct npc_ohgan : public ScriptedAI
{
- public:
- npc_ohgan() : CreatureScript("npc_ohgan") { }
-
- struct npc_ohganAI : public ScriptedAI
+ npc_ohgan(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _sunderArmorTimer = 5000;
+ }
+
+ void Reset() override
+ {
+ Initialize();
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (_sunderArmorTimer <= diff)
{
- npc_ohganAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- }
-
- void Initialize()
- {
- _sunderArmorTimer = 5000;
- }
-
- void Reset() override
- {
- Initialize();
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- if (_sunderArmorTimer <= diff)
- {
- DoCastVictim(SPELL_SUNDERARMOR, true);
- _sunderArmorTimer = urand(10000, 15000);
- }
- else
- _sunderArmorTimer -= diff;
-
- DoMeleeAttackIfReady();
- }
+ DoCastVictim(SPELL_SUNDERARMOR, true);
+ _sunderArmorTimer = urand(10000, 15000);
+ }
+ else
+ _sunderArmorTimer -= diff;
- private:
- uint32 _sunderArmorTimer;
- };
+ DoMeleeAttackIfReady();
+ }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetZulGurubAI<npc_ohganAI>(creature);
- }
+private:
+ uint32 _sunderArmorTimer;
};
enum VilebranchSpells
@@ -351,105 +329,83 @@ enum VilebranchSpells
SPELL_CLEAVE = 15284
};
-class npc_vilebranch_speaker : public CreatureScript
+struct npc_vilebranch_speaker : public ScriptedAI
{
- public:
- npc_vilebranch_speaker() : CreatureScript("npc_vilebranch_speaker") { }
-
- struct npc_vilebranch_speakerAI : public ScriptedAI
+ npc_vilebranch_speaker(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _demoralizingShoutTimer = urand(2000, 4000);
+ _cleaveTimer = urand(5000, 8000);
+ }
+
+ void Reset() override
+ {
+ Initialize();
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ _instance->SetBossState(DATA_MANDOKIR, SPECIAL);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ // Return since we have no target
+ if (!UpdateVictim())
+ return;
+
+ if (_demoralizingShoutTimer <= diff)
{
- npc_vilebranch_speakerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
- {
- Initialize();
- }
-
- void Initialize()
- {
- _demoralizingShoutTimer = urand(2000, 4000);
- _cleaveTimer = urand(5000, 8000);
- }
-
- void Reset() override
- {
- Initialize();
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- _instance->SetBossState(DATA_MANDOKIR, SPECIAL);
- }
-
- void UpdateAI(uint32 diff) override
- {
- // Return since we have no target
- if (!UpdateVictim())
- return;
-
- if (_demoralizingShoutTimer <= diff)
- {
- DoCast(me, SPELL_DEMORALIZING_SHOUT);
- _demoralizingShoutTimer = urand(22000, 30000);
- }
- else
- _demoralizingShoutTimer -= diff;
-
- if (_cleaveTimer <= diff)
- {
- DoCastVictim(SPELL_CLEAVE, true);
- _cleaveTimer = urand(6000, 9000);
- }
- else
- _cleaveTimer -= diff;
-
- DoMeleeAttackIfReady();
- }
-
- private:
- uint32 _demoralizingShoutTimer;
- uint32 _cleaveTimer;
- InstanceScript* _instance;
- };
+ DoCast(me, SPELL_DEMORALIZING_SHOUT);
+ _demoralizingShoutTimer = urand(22000, 30000);
+ }
+ else
+ _demoralizingShoutTimer -= diff;
- CreatureAI* GetAI(Creature* creature) const override
+ if (_cleaveTimer <= diff)
{
- return GetZulGurubAI<npc_vilebranch_speakerAI>(creature);
+ DoCastVictim(SPELL_CLEAVE, true);
+ _cleaveTimer = urand(6000, 9000);
}
+ else
+ _cleaveTimer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+
+private:
+ uint32 _demoralizingShoutTimer;
+ uint32 _cleaveTimer;
+ InstanceScript* _instance;
};
// 24314 - Threatening Gaze
-class spell_threatening_gaze : public SpellScriptLoader
+class spell_threatening_gaze : public AuraScript
{
- public:
- spell_threatening_gaze() : SpellScriptLoader("spell_threatening_gaze") { }
-
- class spell_threatening_gaze_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_threatening_gaze_AuraScript);
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (Unit* caster = GetCaster())
- if (Unit* target = GetTarget())
- if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH)
- caster->CastSpell(target, SPELL_WATCH_CHARGE);
- }
-
- void Register() override
- {
- OnEffectRemove += AuraEffectRemoveFn(spell_threatening_gaze_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
- };
-
- AuraScript* GetAuraScript() const override
- {
- return new spell_threatening_gaze_AuraScript();
- }
+ PrepareAuraScript(spell_threatening_gaze);
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Unit* caster = GetCaster())
+ if (Unit* target = GetTarget())
+ if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH)
+ caster->CastSpell(target, SPELL_WATCH_CHARGE);
+ }
+
+ void Register() override
+ {
+ OnEffectRemove += AuraEffectRemoveFn(spell_threatening_gaze::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
};
void AddSC_boss_mandokir()
{
- new boss_mandokir();
- new npc_ohgan();
- new npc_vilebranch_speaker();
- new spell_threatening_gaze();
+ RegisterZulGurubCreatureAI(boss_mandokir);
+ RegisterZulGurubCreatureAI(npc_ohgan);
+ RegisterZulGurubCreatureAI(npc_vilebranch_speaker);
+ RegisterSpellScript(spell_threatening_gaze);
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
index f319766306e..042e1419b46 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp
@@ -78,231 +78,201 @@ enum Misc
float const DamageIncrease = 35.0f;
float const DamageDecrease = 100.f / (1.f + DamageIncrease / 100.f) - 100.f;
-class boss_marli : public CreatureScript
+struct boss_marli : public BossAI
{
- public: boss_marli() : CreatureScript("boss_marli") { }
+ boss_marli(Creature* creature) : BossAI(creature, DATA_MARLI) { }
- struct boss_marliAI : public BossAI
- {
- boss_marliAI(Creature* creature) : BossAI(creature, DATA_MARLI) { }
-
- void Reset() override
- {
- if (events.IsInPhase(PHASE_THREE))
- me->ApplyStatPctModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, DamageDecrease); // hack
+ void Reset() override
+ {
+ if (events.IsInPhase(PHASE_THREE))
+ me->ApplyStatPctModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, DamageDecrease); // hack
- std::list<GameObject*> eggs;
- me->GetGameObjectListWithEntryInGrid(eggs, GOB_SPIDER_EGG);
- for (GameObject* egg : eggs)
- {
- egg->Respawn();
- egg->UpdateObjectVisibility(true);
- }
+ std::list<GameObject*> eggs;
+ me->GetGameObjectListWithEntryInGrid(eggs, GOB_SPIDER_EGG);
+ for (GameObject* egg : eggs)
+ {
+ egg->Respawn();
+ egg->UpdateObjectVisibility(true);
+ }
- summons.DespawnAll();
- _Reset();
- }
+ summons.DespawnAll();
+ _Reset();
+ }
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- Talk(SAY_DEATH);
- }
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- events.ScheduleEvent(EVENT_SPAWN_START_SPIDERS, 1s, 0, PHASE_ONE);
- Talk(SAY_AGGRO);
- }
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ events.ScheduleEvent(EVENT_SPAWN_START_SPIDERS, 1s, 0, PHASE_ONE);
+ Talk(SAY_AGGRO);
+ }
- void JustSummoned(Creature* creature) override
- {
- creature->AI()->AttackStart(SelectTarget(SelectTargetMethod::Random, 0, 0.f, true));
- summons.Summon(creature);
- }
+ void JustSummoned(Creature* creature) override
+ {
+ creature->AI()->AttackStart(SelectTarget(SelectTargetMethod::Random, 0, 0.f, true));
+ summons.Summon(creature);
+ }
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- events.Update(diff);
+ events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- while (uint32 eventId = events.ExecuteEvent())
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_SPAWN_START_SPIDERS:
+ Talk(SAY_SPIDER_SPAWN);
+ DoCastAOE(SPELL_HATCH_EGGS);
+ events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12s, 0, PHASE_TWO);
+ events.ScheduleEvent(EVENT_TRANSFORM, 45s, 0, PHASE_TWO);
+ events.ScheduleEvent(EVENT_POISON_VOLLEY, 15s);
+ events.ScheduleEvent(EVENT_HATCH_SPIDER_EGG, 30s);
+ events.ScheduleEvent(EVENT_TRANSFORM, 45s, 0, PHASE_TWO);
+ events.SetPhase(PHASE_TWO);
+ break;
+ case EVENT_POISON_VOLLEY:
+ DoCastVictim(SPELL_POISON_VOLLEY, true);
+ events.ScheduleEvent(EVENT_POISON_VOLLEY, 10s, 20s);
+ break;
+ case EVENT_ASPECT_OF_MARLI:
+ DoCastVictim(SPELL_ASPECT_OF_MARLI, true);
+ events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 13s, 18s, 0, PHASE_TWO);
+ break;
+ case EVENT_HATCH_SPIDER_EGG:
+ me->CastSpell(me, SPELL_HATCH_SPIDER_EGG);
+ events.ScheduleEvent(EVENT_HATCH_SPIDER_EGG, 12s, 17s);
+ break;
+ case EVENT_TRANSFORM:
{
- switch (eventId)
+ Talk(SAY_TRANSFORM);
+ DoCast(me, SPELL_SPIDER_FORM); // SPELL_AURA_TRANSFORM
+ /*
+ CreatureTemplate const* cinfo = me->GetCreatureTemplate();
+ me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35)));
+ me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35)));
+ me->UpdateDamagePhysical(BASE_ATTACK);
+ */
+ me->ApplyStatPctModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, DamageIncrease); // hack
+ DoCastVictim(SPELL_ENVOLWINGWEB);
+ if (GetThreat(me->GetVictim()))
+ ModifyThreatByPercent(me->GetVictim(), -100);
+ events.ScheduleEvent(EVENT_CHARGE_PLAYER, 1500ms, 0, PHASE_THREE);
+ events.ScheduleEvent(EVENT_TRANSFORM_BACK, 25s, 0, PHASE_THREE);
+ events.CancelEvent(EVENT_HATCH_SPIDER_EGG);
+ events.SetPhase(PHASE_THREE);
+ break;
+ }
+ case EVENT_CHARGE_PLAYER:
+ {
+ Unit* target = nullptr;
+ int i = 0;
+ while (i++ < 3) // max 3 tries to get a random target with power_mana
{
- case EVENT_SPAWN_START_SPIDERS:
- Talk(SAY_SPIDER_SPAWN);
- DoCastAOE(SPELL_HATCH_EGGS);
- events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12s, 0, PHASE_TWO);
- events.ScheduleEvent(EVENT_TRANSFORM, 45s, 0, PHASE_TWO);
- events.ScheduleEvent(EVENT_POISON_VOLLEY, 15s);
- events.ScheduleEvent(EVENT_HATCH_SPIDER_EGG, 30s);
- events.ScheduleEvent(EVENT_TRANSFORM, 45s, 0, PHASE_TWO);
- events.SetPhase(PHASE_TWO);
- break;
- case EVENT_POISON_VOLLEY:
- DoCastVictim(SPELL_POISON_VOLLEY, true);
- events.ScheduleEvent(EVENT_POISON_VOLLEY, 10s, 20s);
- break;
- case EVENT_ASPECT_OF_MARLI:
- DoCastVictim(SPELL_ASPECT_OF_MARLI, true);
- events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 13s, 18s, 0, PHASE_TWO);
- break;
- case EVENT_HATCH_SPIDER_EGG:
- me->CastSpell(me, SPELL_HATCH_SPIDER_EGG);
- events.ScheduleEvent(EVENT_HATCH_SPIDER_EGG, 12s, 17s);
- break;
- case EVENT_TRANSFORM:
- {
- Talk(SAY_TRANSFORM);
- DoCast(me, SPELL_SPIDER_FORM); // SPELL_AURA_TRANSFORM
- /*
- CreatureTemplate const* cinfo = me->GetCreatureTemplate();
- me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35)));
- me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35)));
- me->UpdateDamagePhysical(BASE_ATTACK);
- */
- me->ApplyStatPctModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, DamageIncrease); // hack
- DoCastVictim(SPELL_ENVOLWINGWEB);
- if (GetThreat(me->GetVictim()))
- ModifyThreatByPercent(me->GetVictim(), -100);
- events.ScheduleEvent(EVENT_CHARGE_PLAYER, 1500ms, 0, PHASE_THREE);
- events.ScheduleEvent(EVENT_TRANSFORM_BACK, 25s, 0, PHASE_THREE);
- events.CancelEvent(EVENT_HATCH_SPIDER_EGG);
- events.SetPhase(PHASE_THREE);
- break;
- }
- case EVENT_CHARGE_PLAYER:
- {
- Unit* target = nullptr;
- int i = 0;
- while (i++ < 3) // max 3 tries to get a random target with power_mana
- {
- target = SelectTarget(SelectTargetMethod::Random, 1, 100, true); // not aggro leader
- if (target && target->GetPowerType() == POWER_MANA)
- break;
- }
- if (target)
- {
- DoCast(target, SPELL_CHARGE);
- AttackStart(target);
- }
- events.ScheduleEvent(EVENT_CHARGE_PLAYER, 8s, 0, PHASE_THREE);
- break;
- }
- case EVENT_TRANSFORM_BACK:
- {
- me->RemoveAura(SPELL_SPIDER_FORM);
- /*
- CreatureTemplate const* cinfo = me->GetCreatureTemplate();
- me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 1)));
- me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 1)));
- me->UpdateDamagePhysical(BASE_ATTACK);
- */
- me->ApplyStatPctModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, DamageDecrease); // hack
- events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12s, 0, PHASE_TWO);
- events.ScheduleEvent(EVENT_TRANSFORM, 45s, 0, PHASE_TWO);
- events.ScheduleEvent(EVENT_POISON_VOLLEY, 15s);
- events.ScheduleEvent(EVENT_HATCH_SPIDER_EGG, 12s, 17s);
- events.ScheduleEvent(EVENT_TRANSFORM, 35s, 60s, 0, PHASE_TWO);
- events.SetPhase(PHASE_TWO);
- break;
- }
- default:
+ target = SelectTarget(SelectTargetMethod::Random, 1, 100, true); // not aggro leader
+ if (target && target->GetPowerType() == POWER_MANA)
break;
}
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ if (target)
+ {
+ DoCast(target, SPELL_CHARGE);
+ AttackStart(target);
+ }
+ events.ScheduleEvent(EVENT_CHARGE_PLAYER, 8s, 0, PHASE_THREE);
+ break;
}
-
- DoMeleeAttackIfReady();
+ case EVENT_TRANSFORM_BACK:
+ {
+ me->RemoveAura(SPELL_SPIDER_FORM);
+ /*
+ CreatureTemplate const* cinfo = me->GetCreatureTemplate();
+ me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 1)));
+ me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 1)));
+ me->UpdateDamagePhysical(BASE_ATTACK);
+ */
+ me->ApplyStatPctModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, DamageDecrease); // hack
+ events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12s, 0, PHASE_TWO);
+ events.ScheduleEvent(EVENT_TRANSFORM, 45s, 0, PHASE_TWO);
+ events.ScheduleEvent(EVENT_POISON_VOLLEY, 15s);
+ events.ScheduleEvent(EVENT_HATCH_SPIDER_EGG, 12s, 17s);
+ events.ScheduleEvent(EVENT_TRANSFORM, 35s, 60s, 0, PHASE_TWO);
+ events.SetPhase(PHASE_TWO);
+ break;
+ }
+ default:
+ break;
}
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetZulGurubAI<boss_marliAI>(creature);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
+
+ DoMeleeAttackIfReady();
+ }
};
-class gob_spider_egg : public GameObjectScript
+struct gob_spider_egg : public GameObjectAI
{
- public: gob_spider_egg() : GameObjectScript("gob_spider_egg") { }
-
- struct gob_spider_eggAI : public GameObjectAI
- {
- gob_spider_eggAI(GameObject* gob) : GameObjectAI(gob), _instance(gob->GetInstanceScript()) { }
-
- void JustSummoned(Creature* creature) override
- {
- if (Creature * marli = _instance->GetCreature(DATA_MARLI))
- marli->AI()->JustSummoned(creature);
+ gob_spider_egg(GameObject* gob) : GameObjectAI(gob), _instance(gob->GetInstanceScript()) { }
- me->SetRespawnCompatibilityMode(true);
- }
- private:
- InstanceScript* const _instance;
- };
+ void JustSummoned(Creature* creature) override
+ {
+ if (Creature * marli = _instance->GetCreature(DATA_MARLI))
+ marli->AI()->JustSummoned(creature);
- GameObjectAI* GetAI(GameObject* gob) const override
- {
- return GetZulGurubAI<gob_spider_eggAI>(gob);
- }
+ me->SetRespawnCompatibilityMode(true);
+ }
+private:
+ InstanceScript* const _instance;
};
// Spawn of Marli
-class npc_spawn_of_marli : public CreatureScript
+struct npc_spawn_of_marli : public ScriptedAI
{
- public: npc_spawn_of_marli() : CreatureScript("npc_spawn_of_marli") { }
-
- struct npc_spawn_of_marliAI : public ScriptedAI
- {
- npc_spawn_of_marliAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- }
-
- void Initialize()
- {
- _levelUpTimer = 3000;
- }
-
- void Reset() override
- {
- Initialize();
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
+ npc_spawn_of_marli(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
- if (_levelUpTimer <= diff)
- {
- DoCast(me, SPELL_LEVELUP);
- _levelUpTimer = 3000;
- }
- else
- _levelUpTimer -= diff;
+ void Initialize()
+ {
+ _levelUpTimer = 3000;
+ }
- DoMeleeAttackIfReady();
- }
+ void Reset() override
+ {
+ Initialize();
+ }
- private:
- uint32 _levelUpTimer;
- };
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- CreatureAI* GetAI(Creature* creature) const override
+ if (_levelUpTimer <= diff)
{
- return GetZulGurubAI<npc_spawn_of_marliAI>(creature);
+ DoCast(me, SPELL_LEVELUP);
+ _levelUpTimer = 3000;
}
+ else
+ _levelUpTimer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+
+private:
+ uint32 _levelUpTimer;
};
// 24083 - Hatch Eggs
@@ -324,8 +294,8 @@ class spell_hatch_spiders : public SpellScript
void AddSC_boss_marli()
{
- new boss_marli();
- new npc_spawn_of_marli();
- new gob_spider_egg();
+ RegisterZulGurubCreatureAI(boss_marli);
+ RegisterZulGurubCreatureAI(npc_spawn_of_marli);
+ RegisterZulGurubGameObjectAI(gob_spider_egg);
RegisterSpellScript(spell_hatch_spiders);
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp
index e6d3e8c0b0b..f2288fc45de 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp
@@ -30,130 +30,119 @@ enum Misc
EQUIP_ID_MAIN_HAND = 0 // was item display id 31818, but this id does not exist
};
-class boss_renataki : public CreatureScript
+struct boss_renataki : public BossAI
{
- public:
- boss_renataki() : CreatureScript("boss_renataki") { }
+ boss_renataki(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _invisibleTimer = urand(8000, 18000);
+ _ambushTimer = 3000;
+ _visibleTimer = 4000;
+ _aggroTimer = urand(15000, 25000);
+ _thousandBladesTimer = urand(4000, 8000);
+ _invisible = false;
+ _ambushed = false;
+ }
+
+ void Reset() override
+ {
+ _Reset();
+ Initialize();
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (_invisibleTimer <= diff)
+ {
+ me->InterruptSpell(CURRENT_GENERIC_SPELL);
+ SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
+ me->SetDisplayId(11686);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ _invisible = true;
+ _invisibleTimer = urand(15000, 30000);
+ }
+ else
+ _invisibleTimer -= diff;
- struct boss_renatakiAI : public BossAI
+ if (_invisible)
{
- boss_renatakiAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS)
+ if (_ambushTimer <= diff)
{
- Initialize();
- }
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
+ {
+ DoTeleportTo(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ());
+ DoCast(target, SPELL_AMBUSH);
+ }
- void Initialize()
- {
- _invisibleTimer = urand(8000, 18000);
+ _ambushed = true;
_ambushTimer = 3000;
- _visibleTimer = 4000;
- _aggroTimer = urand(15000, 25000);
- _thousandBladesTimer = urand(4000, 8000);
- _invisible = false;
- _ambushed = false;
}
+ else
+ _ambushTimer -= diff;
+ }
- void Reset() override
+ if (_ambushed)
+ {
+ if (_visibleTimer <= diff)
{
- _Reset();
- Initialize();
+ me->InterruptSpell(CURRENT_GENERIC_SPELL);
+ me->SetDisplayId(15268);
+ SetEquipmentSlots(false, EQUIP_ID_MAIN_HAND, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ _invisible = false;
+ _visibleTimer = 4000;
}
+ else
+ _visibleTimer -= diff;
+ }
- void UpdateAI(uint32 diff) override
+ // Resetting some aggro so he attacks other gamers
+ if (!_invisible)
+ {
+ if (_aggroTimer <= diff)
{
- if (!UpdateVictim())
- return;
-
- if (_invisibleTimer <= diff)
- {
- me->InterruptSpell(CURRENT_GENERIC_SPELL);
- SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
- me->SetDisplayId(11686);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- _invisible = true;
- _invisibleTimer = urand(15000, 30000);
- }
- else
- _invisibleTimer -= diff;
-
- if (_invisible)
- {
- if (_ambushTimer <= diff)
- {
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
- {
- DoTeleportTo(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ());
- DoCast(target, SPELL_AMBUSH);
- }
-
- _ambushed = true;
- _ambushTimer = 3000;
- }
- else
- _ambushTimer -= diff;
- }
-
- if (_ambushed)
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
{
- if (_visibleTimer <= diff)
- {
- me->InterruptSpell(CURRENT_GENERIC_SPELL);
- me->SetDisplayId(15268);
- SetEquipmentSlots(false, EQUIP_ID_MAIN_HAND, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- _invisible = false;
- _visibleTimer = 4000;
- }
- else
- _visibleTimer -= diff;
+ if (GetThreat(me->GetVictim()))
+ ModifyThreatByPercent(me->GetVictim(), -50);
+ AttackStart(target);
}
- // Resetting some aggro so he attacks other gamers
- if (!_invisible)
- {
- if (_aggroTimer <= diff)
- {
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
- {
- if (GetThreat(me->GetVictim()))
- ModifyThreatByPercent(me->GetVictim(), -50);
- AttackStart(target);
- }
-
- _aggroTimer = urand(7000, 20000);
- }
- else
- _aggroTimer -= diff;
-
- if (_thousandBladesTimer <= diff)
- {
- DoCastVictim(SPELL_THOUSANDBLADES);
- _thousandBladesTimer = urand(7000, 12000);
- }
- else
- _thousandBladesTimer -= diff;
- }
-
- DoMeleeAttackIfReady();
+ _aggroTimer = urand(7000, 20000);
}
+ else
+ _aggroTimer -= diff;
- private:
- uint32 _invisibleTimer;
- uint32 _ambushTimer;
- uint32 _visibleTimer;
- uint32 _aggroTimer;
- uint32 _thousandBladesTimer;
- bool _invisible;
- bool _ambushed;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetZulGurubAI<boss_renatakiAI>(creature);
+ if (_thousandBladesTimer <= diff)
+ {
+ DoCastVictim(SPELL_THOUSANDBLADES);
+ _thousandBladesTimer = urand(7000, 12000);
+ }
+ else
+ _thousandBladesTimer -= diff;
}
+
+ DoMeleeAttackIfReady();
+ }
+
+private:
+ uint32 _invisibleTimer;
+ uint32 _ambushTimer;
+ uint32 _visibleTimer;
+ uint32 _aggroTimer;
+ uint32 _thousandBladesTimer;
+ bool _invisible;
+ bool _ambushed;
};
void AddSC_boss_renataki()
{
- new boss_renataki();
+ RegisterZulGurubCreatureAI(boss_renataki);
}