refactor(Scripts/Arcatraz): Modernize Dalliah the Doomsayer script (#14978)

This commit is contained in:
Skjalf
2023-02-12 17:46:18 -03:00
committed by GitHub
parent d0cb8d226e
commit d1b4481dd7
4 changed files with 127 additions and 195 deletions

View File

@@ -72,10 +72,17 @@ enum SpellIds
SPELL_SOUL_STEAL = 36782
};
enum Texts
{
SAY_RIVAL_DIED = 6 // Soccothrates & Delliah
};
template <class AI, class T>
inline AI* GetArcatrazAI(T* obj)
{
return GetInstanceAI<AI>(obj, ArcatrazScriptName);
}
#define RegisterArcatrazCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetArcatrazAI)
#endif // ARCATRAZ_H

View File

@@ -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<boss_dalliah_the_doomsayerAI>(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);
}

View File

@@ -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;
}

View File

@@ -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;
};