mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Scripts/BlackfathomDepths: Convert bosses to EventMaps/BossAI and clean up instance script
This commit is contained in:
@@ -21,6 +21,8 @@
|
||||
|
||||
#define DataHeader "BFD"
|
||||
|
||||
uint32 const EncounterCount = 3;
|
||||
|
||||
enum Data64
|
||||
{
|
||||
DATA_SHRINE1,
|
||||
@@ -37,7 +39,6 @@ enum Data
|
||||
{
|
||||
TYPE_GELIHAST,
|
||||
TYPE_KELRIS,
|
||||
TYPE_SHRINE,
|
||||
TYPE_AKU_MAI,
|
||||
DATA_FIRE,
|
||||
DATA_EVENT
|
||||
|
||||
@@ -28,7 +28,7 @@ enum Spells
|
||||
enum Events
|
||||
{
|
||||
EVENT_POISON_CLOUD = 1,
|
||||
EVENT_FRENZIED_RAGE = 2
|
||||
EVENT_FRENZIED_RAGE,
|
||||
};
|
||||
|
||||
class boss_aku_mai : public CreatureScript
|
||||
@@ -56,13 +56,17 @@ public:
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
events.ScheduleEvent(EVENT_POISON_CLOUD, urand(5000, 9000));
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_POISON_CLOUD, urand(5000, 9000));
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
void DamageTaken(Unit* /*atacker*/, uint32 &damage) override
|
||||
{
|
||||
_JustDied();
|
||||
if (!IsEnraged && me->HealthBelowPctDamaged(30, damage))
|
||||
{
|
||||
DoCast(me, SPELL_FRENZIED_RAGE);
|
||||
IsEnraged = true;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -72,25 +76,15 @@ public:
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (!IsEnraged && HealthBelowPct(30))
|
||||
events.ScheduleEvent(EVENT_FRENZIED_RAGE, 100);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
if (eventId == EVENT_POISON_CLOUD)
|
||||
{
|
||||
case EVENT_POISON_CLOUD:
|
||||
DoCastVictim(SPELL_POISON_CLOUD);
|
||||
events.ScheduleEvent(EVENT_POISON_CLOUD, urand(25000, 50000));
|
||||
break;
|
||||
case EVENT_FRENZIED_RAGE:
|
||||
DoCast(me, SPELL_FRENZIED_RAGE);
|
||||
IsEnraged = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
DoCastVictim(SPELL_POISON_CLOUD);
|
||||
events.ScheduleEvent(EVENT_POISON_CLOUD, urand(25000, 50000));
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
@@ -100,7 +94,7 @@ public:
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return new boss_aku_maiAI(creature);
|
||||
return GetInstanceAI<boss_aku_maiAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -21,7 +21,12 @@
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_NET = 6533
|
||||
SPELL_NET = 6533
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_THROW_NET = 1
|
||||
};
|
||||
|
||||
class boss_gelihast : public CreatureScript
|
||||
@@ -29,42 +34,14 @@ class boss_gelihast : public CreatureScript
|
||||
public:
|
||||
boss_gelihast() : CreatureScript("boss_gelihast") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
struct boss_gelihastAI : public BossAI
|
||||
{
|
||||
return GetInstanceAI<boss_gelihastAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_gelihastAI : public ScriptedAI
|
||||
{
|
||||
boss_gelihastAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
netTimer = urand(2000, 4000);
|
||||
}
|
||||
|
||||
uint32 netTimer;
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
instance->SetData(TYPE_GELIHAST, NOT_STARTED);
|
||||
}
|
||||
boss_gelihastAI(Creature* creature) : BossAI(creature, TYPE_GELIHAST) { }
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
instance->SetData(TYPE_GELIHAST, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
instance->SetData(TYPE_GELIHAST, DONE);
|
||||
_EnterCombat();
|
||||
events.ScheduleEvent(EVENT_THROW_NET, urand(2000, 4000));
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -72,15 +49,25 @@ public:
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (netTimer < diff)
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
DoCastVictim(SPELL_NET);
|
||||
netTimer = urand(4000, 7000);
|
||||
} else netTimer -= diff;
|
||||
if (eventId == EVENT_THROW_NET)
|
||||
{
|
||||
DoCastVictim(SPELL_NET);
|
||||
events.ScheduleEvent(EVENT_THROW_NET, urand(4000, 7000));
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetInstanceAI<boss_gelihastAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_gelihast()
|
||||
|
||||
@@ -21,12 +21,21 @@
|
||||
|
||||
enum Spells
|
||||
{
|
||||
SPELL_MIND_BLAST = 15587,
|
||||
SPELL_SLEEP = 8399,
|
||||
SPELL_MIND_BLAST = 15587,
|
||||
SPELL_SLEEP = 8399,
|
||||
};
|
||||
|
||||
SAY_AGGRO = 0,
|
||||
SAY_SLEEP = 1,
|
||||
SAY_DEATH = 2
|
||||
enum Texts
|
||||
{
|
||||
SAY_AGGRO = 0,
|
||||
SAY_SLEEP = 1,
|
||||
SAY_DEATH = 2
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_MIND_BLAST = 1,
|
||||
EVENT_SLEEP
|
||||
};
|
||||
|
||||
class boss_kelris : public CreatureScript
|
||||
@@ -34,40 +43,16 @@ class boss_kelris : public CreatureScript
|
||||
public:
|
||||
boss_kelris() : CreatureScript("boss_kelris") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
struct boss_kelrisAI : public BossAI
|
||||
{
|
||||
return GetInstanceAI<boss_kelrisAI>(creature);
|
||||
}
|
||||
|
||||
struct boss_kelrisAI : public ScriptedAI
|
||||
{
|
||||
boss_kelrisAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
mindBlastTimer = urand(2000, 5000);
|
||||
sleepTimer = urand(9000, 12000);
|
||||
}
|
||||
|
||||
uint32 mindBlastTimer;
|
||||
uint32 sleepTimer;
|
||||
|
||||
InstanceScript* instance;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
instance->SetData(TYPE_KELRIS, NOT_STARTED);
|
||||
}
|
||||
boss_kelrisAI(Creature* creature) : BossAI(creature, TYPE_KELRIS) { }
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
{
|
||||
_EnterCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
instance->SetData(TYPE_KELRIS, IN_PROGRESS);
|
||||
events.ScheduleEvent(EVENT_MIND_BLAST, urand(2000, 5000));
|
||||
events.ScheduleEvent(EVENT_SLEEP, urand(9000, 12000));
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
@@ -81,25 +66,40 @@ public:
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (mindBlastTimer < diff)
|
||||
{
|
||||
DoCastVictim(SPELL_MIND_BLAST);
|
||||
mindBlastTimer = urand(7000, 9000);
|
||||
} else mindBlastTimer -= diff;
|
||||
events.Update(diff);
|
||||
|
||||
if (sleepTimer < diff)
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
switch (eventId)
|
||||
{
|
||||
Talk(SAY_SLEEP);
|
||||
DoCast(target, SPELL_SLEEP);
|
||||
case EVENT_MIND_BLAST:
|
||||
DoCastVictim(SPELL_MIND_BLAST);
|
||||
events.ScheduleEvent(EVENT_MIND_BLAST, urand(7000, 9000));
|
||||
break;
|
||||
case EVENT_SLEEP:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
|
||||
{
|
||||
Talk(SAY_SLEEP);
|
||||
DoCast(target, SPELL_SLEEP);
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SLEEP, urand(15000, 20000));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
sleepTimer = urand(15000, 20000);
|
||||
} else sleepTimer -= diff;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetInstanceAI<boss_kelrisAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_kelris()
|
||||
|
||||
@@ -27,14 +27,6 @@ EndScriptData */
|
||||
#include "InstanceScript.h"
|
||||
#include "blackfathom_deeps.h"
|
||||
|
||||
#define MAX_ENCOUNTER 4
|
||||
|
||||
/* Encounter 0 = Gelihast
|
||||
Encounter 1 = Twilight Lord Kelris
|
||||
Encounter 2 = Shrine event
|
||||
Encounter 3 = Aku'Mai
|
||||
*/
|
||||
|
||||
const Position LorgusPosition[4] =
|
||||
{
|
||||
{ -458.500610f, -38.343079f, -33.474445f, 0.0f },
|
||||
@@ -67,25 +59,12 @@ public:
|
||||
instance_blackfathom_deeps_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
SetHeaders(DataHeader);
|
||||
memset(&encounter, 0, sizeof(encounter));
|
||||
SetBossNumber(EncounterCount);
|
||||
|
||||
countFires = 0;
|
||||
deathTimes = 0;
|
||||
}
|
||||
|
||||
ObjectGuid twilightLordKelrisGUID;
|
||||
ObjectGuid shrine1GUID;
|
||||
ObjectGuid shrine2GUID;
|
||||
ObjectGuid shrine3GUID;
|
||||
ObjectGuid shrine4GUID;
|
||||
ObjectGuid shrineOfGelihastGUID;
|
||||
ObjectGuid altarOfTheDeepsGUID;
|
||||
ObjectGuid mainDoorGUID;
|
||||
|
||||
uint8 encounter[MAX_ENCOUNTER];
|
||||
uint8 countFires;
|
||||
uint8 deathTimes;
|
||||
|
||||
void OnCreatureCreate(Creature* creature) override
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
@@ -117,16 +96,16 @@ public:
|
||||
break;
|
||||
case GO_SHRINE_OF_GELIHAST:
|
||||
shrineOfGelihastGUID = go->GetGUID();
|
||||
if (encounter[0] != DONE)
|
||||
if (GetBossState(TYPE_GELIHAST) != DONE)
|
||||
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
break;
|
||||
case GO_ALTAR_OF_THE_DEEPS:
|
||||
altarOfTheDeepsGUID = go->GetGUID();
|
||||
if (encounter[3] != DONE)
|
||||
if (GetBossState(TYPE_AKU_MAI) != DONE)
|
||||
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
break;
|
||||
case GO_AKU_MAI_DOOR:
|
||||
if (encounter[2] == DONE)
|
||||
if (GetBossState(TYPE_AKU_MAI) == DONE)
|
||||
HandleGameObject(ObjectGuid::Empty, true, go);
|
||||
mainDoorGUID = go->GetGUID();
|
||||
break;
|
||||
@@ -137,21 +116,6 @@ public:
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_GELIHAST:
|
||||
encounter[0] = data;
|
||||
if (data == DONE)
|
||||
if (GameObject* go = instance->GetGameObject(shrineOfGelihastGUID))
|
||||
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
break;
|
||||
case TYPE_AKU_MAI:
|
||||
encounter[3] = data;
|
||||
if (data == DONE)
|
||||
if (GameObject* go = instance->GetGameObject(altarOfTheDeepsGUID))
|
||||
{
|
||||
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
go->SummonCreature(NPC_MORRIDUNE, SpawnsLocation[4], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
|
||||
}
|
||||
break;
|
||||
case DATA_FIRE:
|
||||
countFires = data;
|
||||
switch (countFires)
|
||||
@@ -159,10 +123,8 @@ public:
|
||||
case 1:
|
||||
if (GameObject* go = instance->GetGameObject(shrine1GUID))
|
||||
{
|
||||
go->SummonCreature(NPC_AKU_MAI_SNAPJAW, SpawnsLocation[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
|
||||
go->SummonCreature(NPC_AKU_MAI_SNAPJAW, SpawnsLocation[1], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
|
||||
go->SummonCreature(NPC_AKU_MAI_SNAPJAW, SpawnsLocation[2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
|
||||
go->SummonCreature(NPC_AKU_MAI_SNAPJAW, SpawnsLocation[3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
go->SummonCreature(NPC_AKU_MAI_SNAPJAW, SpawnsLocation[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
@@ -187,10 +149,8 @@ public:
|
||||
case 4:
|
||||
if (GameObject* go = instance->GetGameObject(shrine1GUID))
|
||||
{
|
||||
go->SummonCreature(NPC_BARBED_CRUSTACEAN, SpawnsLocation[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
|
||||
go->SummonCreature(NPC_BARBED_CRUSTACEAN, SpawnsLocation[1], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
|
||||
go->SummonCreature(NPC_BARBED_CRUSTACEAN, SpawnsLocation[2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
|
||||
go->SummonCreature(NPC_BARBED_CRUSTACEAN, SpawnsLocation[3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
go->SummonCreature(NPC_BARBED_CRUSTACEAN, SpawnsLocation[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -203,18 +163,37 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 type, EncounterState state) override
|
||||
{
|
||||
if (!InstanceScript::SetBossState(type, state))
|
||||
return false;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_GELIHAST:
|
||||
if (state == DONE)
|
||||
if (GameObject* go = instance->GetGameObject(shrineOfGelihastGUID))
|
||||
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
break;
|
||||
case TYPE_AKU_MAI:
|
||||
if (state == DONE)
|
||||
if (GameObject* go = instance->GetGameObject(altarOfTheDeepsGUID))
|
||||
{
|
||||
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
go->SummonCreature(NPC_MORRIDUNE, SpawnsLocation[4], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const override
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_GELIHAST:
|
||||
return encounter[0];
|
||||
case TYPE_KELRIS:
|
||||
return encounter[1];
|
||||
case TYPE_SHRINE:
|
||||
return encounter[2];
|
||||
case TYPE_AKU_MAI:
|
||||
return encounter[3];
|
||||
case DATA_FIRE:
|
||||
return countFires;
|
||||
case DATA_EVENT:
|
||||
@@ -246,6 +225,18 @@ public:
|
||||
|
||||
return ObjectGuid::Empty;
|
||||
}
|
||||
|
||||
private:
|
||||
ObjectGuid twilightLordKelrisGUID;
|
||||
ObjectGuid shrine1GUID;
|
||||
ObjectGuid shrine2GUID;
|
||||
ObjectGuid shrine3GUID;
|
||||
ObjectGuid shrine4GUID;
|
||||
ObjectGuid shrineOfGelihastGUID;
|
||||
ObjectGuid altarOfTheDeepsGUID;
|
||||
ObjectGuid mainDoorGUID;
|
||||
uint8 countFires;
|
||||
uint8 deathTimes;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user