diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h index 9625baee4..a95acaf31 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h @@ -72,10 +72,17 @@ enum SpellIds SPELL_SOUL_STEAL = 36782 }; +enum Texts +{ + SAY_RIVAL_DIED = 6 // Soccothrates & Delliah +}; + template inline AI* GetArcatrazAI(T* obj) { return GetInstanceAI(obj, ArcatrazScriptName); } +#define RegisterArcatrazCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetArcatrazAI) + #endif // ARCATRAZ_H diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp index 92858c621..72c315a62 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp @@ -42,143 +42,107 @@ enum Spells SPELL_SHADOW_WAVE = 39016 }; -enum Events +struct boss_dalliah_the_doomsayer : public BossAI { - EVENT_GIFT_OF_THE_DOOMSAYER = 1, - EVENT_WHIRLWIND = 2, - EVENT_HEAL = 3, - EVENT_SHADOW_WAVE = 4, - EVENT_ME_FIRST = 5, - EVENT_SOCCOTHRATES_DEATH = 6, - EVENT_CHECK_HEALTH = 7, -}; + boss_dalliah_the_doomsayer(Creature* creature) : BossAI(creature, DATA_DALLIAH), _percentHealthCheck(false) { } -class boss_dalliah_the_doomsayer : public CreatureScript -{ -public: - boss_dalliah_the_doomsayer() : CreatureScript("boss_dalliah_the_doomsayer") { } - - struct boss_dalliah_the_doomsayerAI : public BossAI + void Reset() override { - boss_dalliah_the_doomsayerAI(Creature* creature) : BossAI(creature, DATA_DALLIAH) { } - - void Reset() override - { - _Reset(); - events2.Reset(); - me->SetImmuneToAll(false); - } - - void InitializeAI() override - { - BossAI::InitializeAI(); - if (instance->GetBossState(DATA_SOCCOTHRATES) != DONE) - me->SetImmuneToAll(true); - } - - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); - - if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SOCCOTHRATES))) - if (soccothrates->IsAlive() && !soccothrates->IsInCombat()) - soccothrates->AI()->SetData(1, 1); - } - - void EnterCombat(Unit* /*who*/) override - { - _EnterCombat(); - Talk(SAY_AGGRO); - - events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, urand(1000, 4000)); - events.ScheduleEvent(EVENT_WHIRLWIND, urand(7000, 9000)); - events.ScheduleEvent(EVENT_ME_FIRST, 6000); - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - - if (IsHeroic()) - events.ScheduleEvent(EVENT_SHADOW_WAVE, urand(11000, 16000)); - } - - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void SetData(uint32 /*type*/, uint32 data) override - { - if (data == 1) - events2.ScheduleEvent(EVENT_SOCCOTHRATES_DEATH, 6000); - } - - void UpdateAI(uint32 diff) override - { - events2.Update(diff); - switch (events2.ExecuteEvent()) - { - case EVENT_SOCCOTHRATES_DEATH: - Talk(SAY_SOCCOTHRATES_DEATH); - break; - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_GIFT_OF_THE_DOOMSAYER: - me->CastSpell(me->GetVictim(), SPELL_GIFT_OF_THE_DOOMSAYER, false); - events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, urand(16000, 21000)); - break; - case EVENT_WHIRLWIND: - me->CastSpell(me, SPELL_WHIRLWIND, false); - Talk(SAY_WHIRLWIND); - events.ScheduleEvent(EVENT_WHIRLWIND, urand(19000, 21000)); - events.ScheduleEvent(EVENT_HEAL, 6000); - break; - case EVENT_HEAL: - me->CastSpell(me, SPELL_HEAL, false); - Talk(SAY_HEAL); - break; - case EVENT_SHADOW_WAVE: - me->CastSpell(me->GetVictim(), SPELL_SHADOW_WAVE, false); - events.ScheduleEvent(EVENT_SHADOW_WAVE, urand(11000, 16000)); - break; - case EVENT_ME_FIRST: - if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SOCCOTHRATES))) - if (soccothrates->IsAlive() && !soccothrates->IsInCombat()) - soccothrates->AI()->Talk(SAY_AGGRO_DALLIAH_FIRST); - break; - case EVENT_CHECK_HEALTH: - if (HealthBelowPct(25)) - { - if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SOCCOTHRATES))) - soccothrates->AI()->Talk(SAY_DALLIAH_25_PERCENT); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - break; - } - - DoMeleeAttackIfReady(); - } - - private: - EventMap events2; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetArcatrazAI(creature); + _Reset(); + _percentHealthCheck = false; + me->SetImmuneToAll(false); } + + void InitializeAI() override + { + BossAI::InitializeAI(); + + if (instance->GetBossState(DATA_SOCCOTHRATES) != DONE) + { + me->SetImmuneToAll(true); + } + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + + if (Creature* soccothrates = instance->GetCreature(DATA_SOCCOTHRATES)) + { + if (soccothrates->IsAlive() && !soccothrates->IsInCombat()) + { + soccothrates->AI()->Talk(SAY_RIVAL_DIED, 6s); + } + } + } + + void EnterCombat(Unit* /*who*/) override + { + _EnterCombat(); + Talk(SAY_AGGRO); + + if (Creature* soccothrates = instance->GetCreature(DATA_SOCCOTHRATES)) + { + if (soccothrates->IsAlive() && !soccothrates->IsInCombat()) + { + soccothrates->AI()->Talk(SAY_AGGRO_DALLIAH_FIRST, 6s); + } + } + + scheduler.Schedule(1s, 4s, [this](TaskContext context) + { + DoCastVictim(SPELL_GIFT_OF_THE_DOOMSAYER); + context.Repeat(16s, 21s); + }).Schedule(7s, 9s, [this](TaskContext context) + { + Talk(SAY_WHIRLWIND); + DoCastAOE(SPELL_WHIRLWIND); + context.Repeat(19s, 21s); + + scheduler.Schedule(7s, [this](TaskContext) + { + Talk(SAY_HEAL); + DoCastSelf(SPELL_HEAL); + }); + }); + + if (IsHeroic()) + { + scheduler.Schedule(11s, 16s, [this](TaskContext context) + { + DoCastVictim(SPELL_SHADOW_WAVE); + context.Repeat(11s, 16s); + }); + } + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellSchoolMask /*damageSchoolMask*/) override + { + if (me->HealthBelowPctDamaged(25, damage) && !_percentHealthCheck) + { + if (Creature* soccothrates = instance->GetCreature(DATA_SOCCOTHRATES)) + { + soccothrates->AI()->Talk(SAY_DALLIAH_25_PERCENT); + } + + _percentHealthCheck = true; + } + } + + void KilledUnit(Unit* victim) override + { + if (victim->IsPlayer()) + { + Talk(SAY_SLAY); + } + } + +private: + bool _percentHealthCheck; }; void AddSC_boss_dalliah_the_doomsayer() { - new boss_dalliah_the_doomsayer(); + RegisterArcatrazCreatureAI(boss_dalliah_the_doomsayer); } diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp index 47c695435..86b95aeb2 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp @@ -64,10 +64,9 @@ enum Events EVENT_PREFIGHT_8 = 10, EVENT_PREFIGHT_9 = 11, EVENT_ME_FIRST = 12, - EVENT_DALLIAH_DEATH = 13, - EVENT_CHECK_HEALTH = 14, - EVENT_SPELL_CHARGE = 15, - EVENT_FELFIRE = 16, + EVENT_CHECK_HEALTH = 13, + EVENT_SPELL_CHARGE = 14, + EVENT_FELFIRE = 15, }; class boss_wrath_scryer_soccothrates : public CreatureScript @@ -102,9 +101,13 @@ public: _JustDied(); Talk(SAY_DEATH); - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) + if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH)) + { if (dalliah->IsAlive() && !dalliah->IsInCombat()) - dalliah->AI()->SetData(1, 1); + { + dalliah->AI()->Talk(SAY_RIVAL_DIED + 1, 6s); + } + } } void EnterCombat(Unit* /*who*/) override @@ -134,19 +137,13 @@ public: } } - void SetData(uint32 /*type*/, uint32 data) override - { - if (data == 1) - events2.RescheduleEvent(EVENT_DALLIAH_DEATH, 6000); - } - void UpdateAI(uint32 diff) override { events2.Update(diff); switch (events2.ExecuteEvent()) { case EVENT_PREFIGHT_1: - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) + if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH)) dalliah->AI()->Talk(SAY_DALLIAH_CONVO_1); events2.ScheduleEvent(EVENT_PREFIGHT_2, 3000); break; @@ -155,7 +152,7 @@ public: events2.ScheduleEvent(EVENT_PREFIGHT_3, 3000); break; case EVENT_PREFIGHT_3: - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) + if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH)) dalliah->AI()->Talk(SAY_DALLIAH_CONVO_2); events2.ScheduleEvent(EVENT_PREFIGHT_4, 6000); break; @@ -164,7 +161,7 @@ public: events2.ScheduleEvent(EVENT_PREFIGHT_5, 2000); break; case EVENT_PREFIGHT_5: - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) + if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH)) dalliah->AI()->Talk(SAY_DALLIAH_CONVO_3); events2.ScheduleEvent(EVENT_PREFIGHT_6, 3000); break; @@ -173,7 +170,7 @@ public: events2.ScheduleEvent(EVENT_PREFIGHT_7, 2000); break; case EVENT_PREFIGHT_7: - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) + if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH)) dalliah->GetMotionMaster()->MovePoint(0, 118.6048f, 96.84852f, 22.44115f); events2.ScheduleEvent(EVENT_PREFIGHT_8, 4000); break; @@ -182,7 +179,7 @@ public: events2.ScheduleEvent(EVENT_PREFIGHT_9, 4000); break; case EVENT_PREFIGHT_9: - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) + if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH)) { dalliah->SetFacingToObject(me); dalliah->SetImmuneToAll(false); @@ -192,9 +189,6 @@ public: me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 4.725722f); } break; - case EVENT_DALLIAH_DEATH: - Talk(SAY_DALLIAH_DEATH); - break; } if (!UpdateVictim()) @@ -230,14 +224,14 @@ public: me->CastSpell(me, SPELL_FELFIRE, true); break; case EVENT_ME_FIRST: - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) + if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH)) if (dalliah->IsAlive() && !dalliah->IsInCombat()) dalliah->AI()->Talk(SAY_AGGRO_SOCCOTHRATES_FIRST); break; case EVENT_CHECK_HEALTH: if (HealthBelowPct(25)) { - if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_DALLIAH))) + if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH)) dalliah->AI()->Talk(SAY_SOCCOTHRATES_25_PERCENT); break; } diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp index 45492b0e5..271be09d4 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp @@ -26,6 +26,13 @@ DoorData const doorData[] = { 0, 0, DOOR_TYPE_ROOM } // END }; +ObjectData const creatureData[] = +{ + { NPC_DALLIAH, DATA_DALLIAH }, + { NPC_SOCCOTHRATES, DATA_SOCCOTHRATES }, + { NPC_MELLICHAR, DATA_WARDEN_MELLICHAR } +}; + class instance_arcatraz : public InstanceMapScript { public: @@ -38,22 +45,7 @@ public: SetHeaders(DataHeader); SetBossNumber(MAX_ENCOUTER); LoadDoorData(doorData); - } - - void OnCreatureCreate(Creature* creature) override - { - switch (creature->GetEntry()) - { - case NPC_DALLIAH: - DalliahGUID = creature->GetGUID(); - break; - case NPC_SOCCOTHRATES: - SoccothratesGUID = creature->GetGUID(); - break; - case NPC_MELLICHAR: - MellicharGUID = creature->GetGUID(); - break; - } + LoadObjectData(creatureData, nullptr); } void OnGameObjectCreate(GameObject* go) override @@ -87,19 +79,6 @@ public: } } - void OnGameObjectRemove(GameObject* go) override - { - switch (go->GetEntry()) - { - case GO_CONTAINMENT_CORE_SECURITY_FIELD_ALPHA: - case GO_CONTAINMENT_CORE_SECURITY_FIELD_BETA: - AddDoor(go, false); - break; - default: - break; - } - } - void SetData(uint32 type, uint32 data) override { switch (type) @@ -111,25 +90,16 @@ public: case DATA_WARDEN_5: if (data < FAIL) HandleGameObject(StasisPodGUIDs[type - DATA_WARDEN_1], data == IN_PROGRESS); - if (Creature* warden = instance->GetCreature(MellicharGUID)) + if (Creature* warden = GetCreature(DATA_WARDEN_MELLICHAR)) warden->AI()->SetData(type, data); break; } } - uint32 GetData(uint32 /*type*/) const override - { - return 0; - } - ObjectGuid GetGuidData(uint32 data) const override { switch (data) { - case DATA_DALLIAH: - return DalliahGUID; - case DATA_SOCCOTHRATES: - return SoccothratesGUID; case DATA_WARDENS_SHIELD: return WardensShieldGUID; } @@ -156,10 +126,7 @@ public: } protected: - ObjectGuid DalliahGUID; - ObjectGuid SoccothratesGUID; ObjectGuid StasisPodGUIDs[5]; - ObjectGuid MellicharGUID; ObjectGuid WardensShieldGUID; };