mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-16 18:40:28 +00:00
refactor(Scripts/Arcatraz): Modernize Dalliah the Doomsayer script (#14978)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user