refactor(Scripts/MagistersTerrace): Clean up instance script (#17346)

This commit is contained in:
Skjalf
2023-09-25 06:11:12 -03:00
committed by GitHub
parent 13a9de1083
commit f0c4ab3c95
6 changed files with 44 additions and 134 deletions
@@ -105,7 +105,7 @@ public:
events.Reset(); events.Reset();
summons.DespawnAll(); summons.DespawnAll();
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false); me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false);
instance->SetData(DATA_KAELTHAS_EVENT, NOT_STARTED); instance->SetBossState(DATA_KAELTHAS, NOT_STARTED);
me->SetImmuneToAll(false); me->SetImmuneToAll(false);
} }
@@ -125,12 +125,17 @@ public:
void JustDied(Unit*) override void JustDied(Unit*) override
{ {
instance->SetData(DATA_KAELTHAS_EVENT, DONE); instance->SetBossState(DATA_KAELTHAS, DONE);
if (GameObject* orb = instance->GetGameObject(DATA_ESCAPE_ORB))
{
orb->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
}
} }
void JustEngagedWith(Unit* /*who*/) override void JustEngagedWith(Unit* /*who*/) override
{ {
instance->SetData(DATA_KAELTHAS_EVENT, IN_PROGRESS); instance->SetBossState(DATA_KAELTHAS, IN_PROGRESS);
me->SetInCombatWithZone(); me->SetInCombatWithZone();
events.ScheduleEvent(EVENT_SPELL_FIREBALL, 0); events.ScheduleEvent(EVENT_SPELL_FIREBALL, 0);
@@ -105,7 +105,7 @@ public:
{ {
PlayersKilled = SAY_PLAYER_KILLED; PlayersKilled = SAY_PLAYER_KILLED;
HelpersKilled = SAY_HELPER_DIED; HelpersKilled = SAY_HELPER_DIED;
instance->SetData(DATA_DELRISSA_EVENT, NOT_STARTED); instance->SetBossState(DATA_DELRISSA, NOT_STARTED);
summons.Respawn(); summons.Respawn();
me->SetLootMode(0); me->SetLootMode(0);
@@ -141,7 +141,7 @@ public:
{ {
me->loot.clear(); me->loot.clear();
me->loot.FillLoot(me->GetCreatureTemplate()->lootid, LootTemplates_Creature, me->GetLootRecipient(), false, false, 1, me); me->loot.FillLoot(me->GetCreatureTemplate()->lootid, LootTemplates_Creature, me->GetLootRecipient(), false, false, 1, me);
instance->SetData(DATA_DELRISSA_EVENT, DONE); instance->SetBossState(DATA_DELRISSA, DONE);
me->SetDynamicFlag(UNIT_DYNFLAG_LOOTABLE); me->SetDynamicFlag(UNIT_DYNFLAG_LOOTABLE);
} }
++HelpersKilled; ++HelpersKilled;
@@ -151,7 +151,7 @@ public:
{ {
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
summons.DoZoneInCombat(); summons.DoZoneInCombat();
instance->SetData(DATA_DELRISSA_EVENT, IN_PROGRESS); instance->SetBossState(DATA_DELRISSA, IN_PROGRESS);
events.ScheduleEvent(EVENT_SPELL_FLASH_HEAL, 15000); events.ScheduleEvent(EVENT_SPELL_FLASH_HEAL, 15000);
events.ScheduleEvent(EVENT_SPELL_RENEW, 10000); events.ScheduleEvent(EVENT_SPELL_RENEW, 10000);
@@ -177,7 +177,7 @@ public:
Talk(SAY_DEATH); Talk(SAY_DEATH);
if (HelpersKilled == MAX_ACTIVE_HELPERS + 1) if (HelpersKilled == MAX_ACTIVE_HELPERS + 1)
instance->SetData(DATA_DELRISSA_EVENT, DONE); instance->SetBossState(DATA_DELRISSA, DONE);
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
@@ -106,7 +106,7 @@ public:
events.Reset(); events.Reset();
summons.DespawnAll(); summons.DespawnAll();
SpawnCrystals(); SpawnCrystals();
instance->SetData(DATA_SELIN_EVENT, NOT_STARTED); instance->SetBossState(DATA_SELIN_FIREHEART, NOT_STARTED);
CrystalGUID.Clear(); CrystalGUID.Clear();
me->SetPower(POWER_MANA, 0); me->SetPower(POWER_MANA, 0);
} }
@@ -114,7 +114,7 @@ public:
void JustEngagedWith(Unit* /*who*/) override void JustEngagedWith(Unit* /*who*/) override
{ {
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
instance->SetData(DATA_SELIN_EVENT, IN_PROGRESS); instance->SetBossState(DATA_SELIN_FIREHEART, IN_PROGRESS);
events.ScheduleEvent(EVENT_SPELL_DRAIN_LIFE, 2500, 1); events.ScheduleEvent(EVENT_SPELL_DRAIN_LIFE, 2500, 1);
events.ScheduleEvent(EVENT_SPELL_FEL_EXPLOSION, 2000); events.ScheduleEvent(EVENT_SPELL_FEL_EXPLOSION, 2000);
@@ -134,7 +134,7 @@ public:
{ {
Talk(SAY_DEATH); Talk(SAY_DEATH);
instance->SetData(DATA_SELIN_EVENT, DONE); // Encounter complete! instance->SetBossState(DATA_SELIN_FIREHEART, DONE); // Encounter complete!
summons.DespawnAll(); summons.DespawnAll();
} }
@@ -87,7 +87,7 @@ public:
summons.DespawnAll(); summons.DespawnAll();
IntervalHealthAmount = 1; IntervalHealthAmount = 1;
instance->SetData(DATA_VEXALLUS_EVENT, NOT_STARTED); instance->SetBossState(DATA_VEXALLUS, NOT_STARTED);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENERGY_FEEDBACK); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENERGY_FEEDBACK);
} }
@@ -100,14 +100,14 @@ public:
void JustDied(Unit* /*killer*/) override void JustDied(Unit* /*killer*/) override
{ {
summons.DespawnAll(); summons.DespawnAll();
instance->SetData(DATA_VEXALLUS_EVENT, DONE); instance->SetBossState(DATA_VEXALLUS, DONE);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENERGY_FEEDBACK); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENERGY_FEEDBACK);
} }
void JustEngagedWith(Unit* /*who*/) override void JustEngagedWith(Unit* /*who*/) override
{ {
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
instance->SetData(DATA_VEXALLUS_EVENT, IN_PROGRESS); instance->SetBossState(DATA_VEXALLUS, IN_PROGRESS);
events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 8000); events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 8000);
events.ScheduleEvent(EVENT_SPELL_ARCANE_SHOCK, 5000); events.ScheduleEvent(EVENT_SPELL_ARCANE_SHOCK, 5000);
@@ -26,6 +26,21 @@ ObjectData const creatureData[] =
{ 0, 0 } { 0, 0 }
}; };
ObjectData const gameobjectData[] =
{
{ GO_ESCAPE_ORB, DATA_ESCAPE_ORB },
{ 0, 0, }
};
DoorData const doorData[] =
{
{ GO_SELIN_DOOR, DATA_SELIN_FIREHEART, DOOR_TYPE_PASSAGE },
{ GO_SELIN_ENCOUNTER_DOOR, DATA_SELIN_FIREHEART, DOOR_TYPE_ROOM },
{ GO_VEXALLUS_DOOR, DATA_VEXALLUS, DOOR_TYPE_PASSAGE },
{ GO_DELRISSA_DOOR, DATA_DELRISSA, DOOR_TYPE_PASSAGE },
{ 0, 0, DOOR_TYPE_ROOM } // END
};
Position const KalecgosSpawnPos = { 164.3747f, -397.1197f, 2.151798f, 1.66219f }; Position const KalecgosSpawnPos = { 164.3747f, -397.1197f, 2.151798f, 1.66219f };
class instance_magisters_terrace : public InstanceMapScript class instance_magisters_terrace : public InstanceMapScript
@@ -38,47 +53,16 @@ public:
instance_magisters_terrace_InstanceMapScript(Map* map) : InstanceScript(map) instance_magisters_terrace_InstanceMapScript(Map* map) : InstanceScript(map)
{ {
SetHeaders(DataHeader); SetHeaders(DataHeader);
LoadObjectData(creatureData, nullptr); SetBossNumber(MAX_ENCOUNTER);
LoadObjectData(creatureData, gameobjectData);
LoadDoorData(doorData);
} }
uint32 Encounter[MAX_ENCOUNTER];
ObjectGuid VexallusDoorGUID;
ObjectGuid SelinDoorGUID;
ObjectGuid SelinEncounterDoorGUID;
ObjectGuid DelrissaDoorGUID;
ObjectGuid KaelDoorGUID;
ObjectGuid EscapeOrbGUID; ObjectGuid EscapeOrbGUID;
ObjectGuid DelrissaGUID; ObjectGuid DelrissaGUID;
ObjectGuid KaelGUID; ObjectGuid KaelGUID;
void Initialize() override
{
memset(&Encounter, 0, sizeof(Encounter));
}
bool IsEncounterInProgress() const override
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (Encounter[i] == IN_PROGRESS)
return true;
return false;
}
uint32 GetData(uint32 identifier) const override
{
switch (identifier)
{
case DATA_SELIN_EVENT:
case DATA_VEXALLUS_EVENT:
case DATA_DELRISSA_EVENT:
case DATA_KAELTHAS_EVENT:
return Encounter[identifier];
}
return 0;
}
void ProcessEvent(WorldObject* /*obj*/, uint32 eventId) override void ProcessEvent(WorldObject* /*obj*/, uint32 eventId) override
{ {
if (eventId == EVENT_SPAWN_KALECGOS) if (eventId == EVENT_SPAWN_KALECGOS)
@@ -97,37 +81,6 @@ public:
} }
} }
void SetData(uint32 identifier, uint32 data) override
{
switch (identifier)
{
case DATA_SELIN_EVENT:
HandleGameObject(SelinDoorGUID, data == DONE);
HandleGameObject(SelinEncounterDoorGUID, data != IN_PROGRESS);
Encounter[identifier] = data;
break;
case DATA_VEXALLUS_EVENT:
if (data == DONE)
HandleGameObject(VexallusDoorGUID, true);
Encounter[identifier] = data;
break;
case DATA_DELRISSA_EVENT:
if (data == DONE)
HandleGameObject(DelrissaDoorGUID, true);
Encounter[identifier] = data;
break;
case DATA_KAELTHAS_EVENT:
HandleGameObject(KaelDoorGUID, data != IN_PROGRESS);
if (data == DONE)
if (GameObject* escapeOrb = instance->GetGameObject(EscapeOrbGUID))
escapeOrb->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
Encounter[identifier] = data;
break;
}
SaveToDB();
}
void OnCreatureCreate(Creature* creature) override void OnCreatureCreate(Creature* creature) override
{ {
switch (creature->GetEntry()) switch (creature->GetEntry())
@@ -148,60 +101,11 @@ public:
InstanceScript::OnCreatureCreate(creature); InstanceScript::OnCreatureCreate(creature);
} }
void OnGameObjectCreate(GameObject* go) override
{
switch (go->GetEntry())
{
case GO_SELIN_DOOR:
if (GetData(DATA_SELIN_EVENT) == DONE)
HandleGameObject(ObjectGuid::Empty, true, go);
SelinDoorGUID = go->GetGUID();
break;
case GO_SELIN_ENCOUNTER_DOOR:
SelinEncounterDoorGUID = go->GetGUID();
break;
case GO_VEXALLUS_DOOR:
if (GetData(DATA_VEXALLUS_EVENT) == DONE)
HandleGameObject(ObjectGuid::Empty, true, go);
VexallusDoorGUID = go->GetGUID();
break;
case GO_DELRISSA_DOOR:
if (GetData(DATA_DELRISSA_EVENT) == DONE)
HandleGameObject(ObjectGuid::Empty, true, go);
DelrissaDoorGUID = go->GetGUID();
break;
case GO_KAEL_DOOR:
KaelDoorGUID = go->GetGUID();
break;
case GO_ESCAPE_ORB:
if (GetData(DATA_KAELTHAS_EVENT) == DONE)
go->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE);
EscapeOrbGUID = go->GetGUID();
break;
}
}
// @todo: Use BossStates. This is for code compatibility
void ReadSaveDataMore(std::istringstream& data) override
{
data >> Encounter[1];
data >> Encounter[2];
data >> Encounter[3];
}
void WriteSaveDataMore(std::ostringstream& data) override
{
data << Encounter[0] << ' ' << Encounter[1] << ' ' << Encounter[2] << ' ' << Encounter[3];
}
ObjectGuid GetGuidData(uint32 identifier) const override ObjectGuid GetGuidData(uint32 identifier) const override
{ {
switch (identifier) if (identifier == NPC_DELRISSA)
{ {
case NPC_DELRISSA: return DelrissaGUID;
return DelrissaGUID;
} }
return ObjectGuid::Empty; return ObjectGuid::Empty;
@@ -28,13 +28,14 @@
enum MTData enum MTData
{ {
DATA_SELIN_EVENT = 0, DATA_SELIN_FIREHEART = 0,
DATA_VEXALLUS_EVENT = 1, DATA_VEXALLUS = 1,
DATA_DELRISSA_EVENT = 2, DATA_DELRISSA = 2,
DATA_KAELTHAS_EVENT = 3, DATA_KAELTHAS = 3,
MAX_ENCOUNTER = 4, MAX_ENCOUNTER = 4,
DATA_KALECGOS = 5 DATA_KALECGOS = 5,
DATA_ESCAPE_ORB = 6
}; };
enum MTCreatures enum MTCreatures