Scripts/BlackfathomDepths: Convert bosses to EventMaps/BossAI and clean up instance script

This commit is contained in:
Nyeriah
2015-01-10 02:51:00 -02:00
parent 9c9e5abca3
commit 1852d7d2f7
5 changed files with 131 additions and 158 deletions

View File

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

View File

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

View File

@@ -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()

View File

@@ -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()

View File

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