Scripts/BlackTemple: reworked InstanceScript

This commit is contained in:
joschiwald
2013-08-21 12:29:28 +02:00
parent 7a14e366ac
commit 62c7e309ee
11 changed files with 358 additions and 445 deletions

View File

@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -19,36 +18,81 @@
#ifndef BLACK_TEMPLE_H_
#define BLACK_TEMPLE_H_
#define BTScriptName "instance_black_temple"
uint32 const EncounterCount = 9;
enum DataTypes
{
DATA_AKAMA = 1,
DATA_AKAMA_SHADE = 2,
DATA_GURTOGGBLOODBOILEVENT = 3,
DATA_HIGHWARLORDNAJENTUS = 4,
DATA_HIGHWARLORDNAJENTUSEVENT = 5,
DATA_ILLIDANSTORMRAGE = 6,
DATA_ILLIDANSTORMRAGEEVENT = 7,
DATA_ILLIDARICOUNCILEVENT = 8,
DATA_ILLIDARICOUNCIL = 9,
DATA_LADYMALANDE = 10,
DATA_HIGHNETHERMANCERZEREVOR = 11,
DATA_GATHIOSTHESHATTERER = 12,
DATA_VERASDARKSHADOW = 13,
DATA_MOTHERSHAHRAZEVENT = 14,
DATA_RELIQUARYOFSOULSEVENT = 15,
DATA_SHADEOFAKAMA = 16,
DATA_SHADEOFAKAMAEVENT = 17,
DATA_SUPREMUS = 18,
DATA_SUPREMUSEVENT = 19,
DATA_TERONGOREFIENDEVENT = 20,
DATA_GAMEOBJECT_NAJENTUS_GATE = 21,
DATA_GAMEOBJECT_ILLIDAN_GATE = 22,
DATA_GAMEOBJECT_ILLIDAN_DOOR_R = 23,
DATA_GAMEOBJECT_ILLIDAN_DOOR_L = 24,
DATA_GAMEOBJECT_SUPREMUS_DOORS = 25,
DATA_BLOOD_ELF_COUNCIL_VOICE = 26
// Encounter States/Boss GUIDs
DATA_HIGH_WARLORD_NAJENTUS = 0,
DATA_SUPREMUS = 1,
DATA_SHADE_OF_AKAMA = 2,
DATA_TERON_GOREFIEND = 3,
DATA_GURTOGG_BLOODBOIL = 4,
DATA_RELIQUARY_OF_SOULS = 5,
DATA_MOTHER_SHAHRAZ = 6,
DATA_ILLIDARI_COUNCIL = 7,
DATA_ILLIDAN_STORMRAGE = 8,
// Additional Data
DATA_AKAMA_SHADE = 9,
DATA_AKAMA = 10,
DATA_GATHIOS_THE_SHATTERER = 11,
DATA_HIGH_NETHERMANCER_ZEREVOR = 12,
DATA_LADY_MALANDE = 13,
DATA_VERAS_DARKSHADOW = 14,
DATA_BLOOD_ELF_COUNCIL_VOICE = 15,
DATA_GO_ILLIDAN_GATE = 16,
DATA_GO_ILLIDAN_DOOR_R = 17,
DATA_GO_ILLIDAN_DOOR_L = 18
};
#endif
enum CreatureIds
{
NPC_HIGH_WARLORD_NAJENTUS = 22887,
NPC_SUPREMUS = 22898,
NPC_SHADE_OF_AKAMA = 22841,
NPC_AKAMA_SHADE = 23191, // This is the Akama that starts the Shade of Akama encounter.
NPC_AKAMA = 23089, // This is the Akama that starts the Illidan encounter.
NPC_GATHIOS_THE_SHATTERER = 22949,
NPC_HIGH_NETHERMANCER_ZEREVOR = 22950,
NPC_LADY_MALANDE = 22951,
NPC_VERAS_DARKSHADOW = 22952,
NPC_ILLIDARI_COUNCIL = 23426,
NPC_BLOOD_ELF_COUNCIL_VOICE = 23499,
NPC_ILLIDAN_STORMRAGE = 22917
};
enum GameObjectIds
{
GO_NAJENTUS_GATE = 185483,
GO_SUPREMUS_GATE = 185882,
GO_SHADE_OF_AKAMA_DOOR = 185478,
GO_TERON_DOOR_1 = 185480,
GO_TERON_DOOR_2 = 186153,
GO_GURTOGG_DOOR = 185892,
GO_TEMPLE_DOOR = 185479,
GO_MOTHER_SHAHRAZ_DOOR = 185482,
GO_COUNCIL_DOOR_1 = 185481,
GO_COUNCIL_DOOR_2 = 186152,
GO_ILLIDAN_GATE = 185905,
GO_ILLIDAN_DOOR_R = 186261,
GO_ILLIDAN_DOOR_L = 186262
};
template<class AI>
AI* GetBlackTempleAI(Creature* creature)
{
if (InstanceMap* instance = creature->GetMap()->ToInstanceMap())
if (instance->GetInstanceScript())
if (instance->GetScriptId() == sObjectMgr->GetScriptId(BTScriptName))
return new AI(creature);
return NULL;
}
#endif // BLACK_TEMPLE_H_

View File

@@ -96,7 +96,7 @@ public:
void Reset() OVERRIDE
{
if (instance)
instance->SetData(DATA_GURTOGGBLOODBOILEVENT, NOT_STARTED);
instance->SetBossState(DATA_GURTOGG_BLOODBOIL, NOT_STARTED);
TargetGUID = 0;
@@ -124,7 +124,7 @@ public:
DoZoneInCombat();
Talk(SAY_AGGRO);
if (instance)
instance->SetData(DATA_GURTOGGBLOODBOILEVENT, IN_PROGRESS);
instance->SetBossState(DATA_GURTOGG_BLOODBOIL, IN_PROGRESS);
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
@@ -135,7 +135,7 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
if (instance)
instance->SetData(DATA_GURTOGGBLOODBOILEVENT, DONE);
instance->SetBossState(DATA_GURTOGG_BLOODBOIL, DONE);
Talk(SAY_DEATH);
}

View File

@@ -543,9 +543,9 @@ public:
if (!instance)
return;
instance->SetData(DATA_ILLIDANSTORMRAGEEVENT, DONE); // Completed
instance->SetBossState(DATA_ILLIDAN_STORMRAGE, DONE);
for (uint8 i = DATA_GAMEOBJECT_ILLIDAN_DOOR_R; i < DATA_GAMEOBJECT_ILLIDAN_DOOR_L + 1; ++i)
for (uint8 i = DATA_GO_ILLIDAN_DOOR_R; i < DATA_GO_ILLIDAN_DOOR_L + 1; ++i)
instance->HandleGameObject(instance->GetData64(i), true);
}
@@ -1369,12 +1369,12 @@ public:
WalkCount = 0;
if (instance)
{
instance->SetData(DATA_ILLIDANSTORMRAGEEVENT, NOT_STARTED);
instance->SetBossState(DATA_ILLIDAN_STORMRAGE, NOT_STARTED);
IllidanGUID = instance->GetData64(DATA_ILLIDANSTORMRAGE);
GateGUID = instance->GetData64(DATA_GAMEOBJECT_ILLIDAN_GATE);
DoorGUID[0] = instance->GetData64(DATA_GAMEOBJECT_ILLIDAN_DOOR_R);
DoorGUID[1] = instance->GetData64(DATA_GAMEOBJECT_ILLIDAN_DOOR_L);
IllidanGUID = instance->GetData64(DATA_ILLIDAN_STORMRAGE);
GateGUID = instance->GetData64(DATA_GO_ILLIDAN_GATE);
DoorGUID[0] = instance->GetData64(DATA_GO_ILLIDAN_DOOR_R);
DoorGUID[1] = instance->GetData64(DATA_GO_ILLIDAN_DOOR_L);
if (JustCreated) // close all doors at create
{
@@ -1463,7 +1463,7 @@ public:
if (!instance)
return;
instance->SetData(DATA_ILLIDANSTORMRAGEEVENT, IN_PROGRESS);
instance->SetBossState(DATA_ILLIDAN_STORMRAGE, IN_PROGRESS);
for (uint8 i = 0; i < 2; ++i)
instance->HandleGameObject(DoorGUID[i], false);
if (Creature* illidan = ObjectAccessor::GetCreature(*me, IllidanGUID))
@@ -1691,7 +1691,7 @@ public:
{
if (Check_Timer <= diff)
{
if (instance && instance->GetData(DATA_ILLIDARICOUNCILEVENT) == DONE)
if (instance && instance->GetBossState(DATA_ILLIDARI_COUNCIL) == DONE)
me->SetVisible(true);
Check_Timer = 5000;
@@ -1800,7 +1800,7 @@ public:
void boss_illidan_stormrage::boss_illidan_stormrageAI::Reset()
{
if (instance)
instance->SetData(DATA_ILLIDANSTORMRAGEEVENT, NOT_STARTED);
instance->SetBossState(DATA_ILLIDAN_STORMRAGE, NOT_STARTED);
if (AkamaGUID)
{
@@ -2164,7 +2164,7 @@ public:
void Reset() OVERRIDE
{
if (instance)
IllidanGUID = instance->GetData64(DATA_ILLIDANSTORMRAGE);
IllidanGUID = instance->GetData64(DATA_ILLIDAN_STORMRAGE);
else
IllidanGUID = 0;

View File

@@ -114,7 +114,7 @@ public:
void Reset() OVERRIDE
{
if (instance)
instance->SetData(DATA_MOTHERSHAHRAZEVENT, NOT_STARTED);
instance->SetBossState(DATA_MOTHER_SHAHRAZ, NOT_STARTED);
for (uint8 i = 0; i<3; ++i)
TargetGUID[i] = 0;
@@ -137,7 +137,7 @@ public:
void EnterCombat(Unit* /*who*/) OVERRIDE
{
if (instance)
instance->SetData(DATA_MOTHERSHAHRAZEVENT, IN_PROGRESS);
instance->SetBossState(DATA_MOTHER_SHAHRAZ, IN_PROGRESS);
DoZoneInCombat();
Talk(SAY_AGGRO);
@@ -151,7 +151,7 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
if (instance)
instance->SetData(DATA_MOTHERSHAHRAZEVENT, DONE);
instance->SetBossState(DATA_MOTHER_SHAHRAZ, DONE);
Talk(SAY_DEATH);
}

View File

@@ -159,14 +159,13 @@ public:
void Reset() OVERRIDE
{
if (instance)
instance->SetData(DATA_RELIQUARYOFSOULSEVENT, NOT_STARTED);
instance->SetBossState(DATA_RELIQUARY_OF_SOULS, NOT_STARTED);
if (EssenceGUID)
{
if (Creature* Essence = Unit::GetCreature(*me, EssenceGUID))
{
Essence->DespawnOrUnsummon();
}
if (Creature* essence = ObjectAccessor::GetCreature(*me, EssenceGUID))
essence->DespawnOrUnsummon();
EssenceGUID = 0;
}
@@ -178,7 +177,6 @@ public:
}
void MoveInLineOfSight(Unit* who) OVERRIDE
{
if (!who)
return;
@@ -200,7 +198,7 @@ public:
me->AddThreat(who, 10000.0f);
DoZoneInCombat();
if (instance)
instance->SetData(DATA_RELIQUARYOFSOULSEVENT, IN_PROGRESS);
instance->SetBossState(DATA_RELIQUARY_OF_SOULS, IN_PROGRESS);
Phase = 1;
Counter = 0;
@@ -246,7 +244,7 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
if (instance)
instance->SetData(DATA_RELIQUARYOFSOULSEVENT, DONE);
instance->SetBossState(DATA_RELIQUARY_OF_SOULS, DONE);
}
void UpdateAI(uint32 diff) OVERRIDE

View File

@@ -200,7 +200,7 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
if (instance)
instance->SetData(DATA_SHADEOFAKAMAEVENT, DONE);
instance->SetBossState(DATA_SHADE_OF_AKAMA, DONE);
}
void EnterCombat(Unit* /*who*/) OVERRIDE {}
@@ -343,7 +343,7 @@ public:
{
HasKilledAkamaAndReseting = true;
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
instance->SetData(DATA_SHADEOFAKAMAEVENT, NOT_STARTED);
instance->SetBossState(DATA_SHADE_OF_AKAMA, NOT_STARTED);
me->RemoveAllAurasExceptType(SPELL_AURA_DUMMY);
me->DeleteThreatList();
me->CombatStop();
@@ -351,15 +351,15 @@ public:
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
combatStarted = false;
if (Creature* Akama = Unit::GetCreature((*me), akamaGUID))
if (Creature* Akama = ObjectAccessor::GetCreature(*me, akamaGUID))
Akama->DespawnOrUnsummon();
for (std::list<uint64>::const_iterator itr = Channelers.begin(); itr != Channelers.end(); ++itr)
if (Creature* Channeler = (Unit::GetCreature(*me, *itr)))
if (Creature* Channeler = ObjectAccessor::GetCreature(*me, *itr))
Channeler->DespawnOrUnsummon();
for (std::list<uint64>::const_iterator itr = Spawners.begin(); itr != Spawners.end(); ++itr)
if (Creature* Spawner = (Unit::GetCreature(*me, *itr)))
if (Creature* Spawner = ObjectAccessor::GetCreature(*me, *itr))
Spawner->AI()->SetData(SETDATA_DATA, SETDATA_DESPAWN_ALL_SPAWNS);
events.ScheduleEvent(EVENT_FIND_CHANNELERS_SPAWNERS, 10000);
@@ -485,8 +485,8 @@ public:
case EVENT_SHADE_START:
if (instance)
{
ShadeGUID = instance->GetData64(DATA_SHADEOFAKAMA);
instance->SetData(DATA_SHADEOFAKAMAEVENT, IN_PROGRESS);
ShadeGUID = instance->GetData64(DATA_SHADE_OF_AKAMA);
instance->SetBossState(DATA_SHADE_OF_AKAMA, IN_PROGRESS);
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
me->RemoveAura(SPELL_STEALTH);
me->SetWalk(true);
@@ -622,7 +622,7 @@ public:
break;
case EVENT_GET_SHADE_GUID:
if (instance)
ShadeGUID = instance->GetData64(DATA_SHADEOFAKAMA);
ShadeGUID = instance->GetData64(DATA_SHADE_OF_AKAMA);
break;
default:
break;
@@ -768,7 +768,7 @@ public:
if (instance)
{
akamaGUID = instance->GetData64(DATA_AKAMA_SHADE);
shadeGUID = instance->GetData64(DATA_SHADEOFAKAMA);
shadeGUID = instance->GetData64(DATA_SHADE_OF_AKAMA);
}
}

View File

@@ -31,7 +31,7 @@ EndScriptData */
enum Supremus
{
EMOTE_NEW_TARGET = 0,
EMOTE_PUNCH_GROUND = 1, //Talk(EMOTE_PUNCH_GROUND);
EMOTE_PUNCH_GROUND = 1,
EMOTE_GROUND_CRACK = 2,
//Spells
@@ -110,11 +110,7 @@ public:
if (instance)
{
if (me->IsAlive())
{
instance->SetData(DATA_SUPREMUSEVENT, NOT_STARTED);
//ToggleDoors(true);
}
//else ToggleDoors(false);
instance->SetBossState(DATA_SUPREMUS, NOT_STARTED);
}
phase = 0;
@@ -126,7 +122,7 @@ public:
void EnterCombat(Unit* /*who*/) OVERRIDE
{
if (instance)
instance->SetData(DATA_SUPREMUSEVENT, IN_PROGRESS);
instance->SetBossState(DATA_SUPREMUS, IN_PROGRESS);
ChangePhase();
events.ScheduleEvent(EVENT_BERSERK, 900000, GCD_CAST);
@@ -163,10 +159,8 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
if (instance)
{
instance->SetData(DATA_SUPREMUSEVENT, DONE);
instance->HandleGameObject(instance->GetData64(DATA_GAMEOBJECT_SUPREMUS_DOORS), true);
}
instance->SetBossState(DATA_SUPREMUS, DONE);
summons.DespawnAll();
}

View File

@@ -247,7 +247,7 @@ public:
void Reset() OVERRIDE
{
if (instance)
instance->SetData(DATA_TERONGOREFIENDEVENT, NOT_STARTED);
instance->SetBossState(DATA_TERON_GOREFIEND, NOT_STARTED);
IncinerateTimer = urand(20000, 31000);
SummonDoomBlossomTimer = 12000;
@@ -276,7 +276,7 @@ public:
if (me->IsWithinDistInMap(who, VISIBLE_RANGE) && me->IsWithinLOSInMap(who))
{
if (instance)
instance->SetData(DATA_TERONGOREFIENDEVENT, IN_PROGRESS);
instance->SetBossState(DATA_TERON_GOREFIEND, IN_PROGRESS);
me->GetMotionMaster()->Clear(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
@@ -298,7 +298,7 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
if (instance)
instance->SetData(DATA_TERONGOREFIENDEVENT, DONE);
instance->SetBossState(DATA_TERON_GOREFIEND, DONE);
Talk(SAY_DEATH);
}

View File

@@ -100,7 +100,7 @@ public:
SpineTargetGUID = 0;
if (instance)
instance->SetData(DATA_HIGHWARLORDNAJENTUSEVENT, NOT_STARTED);
instance->SetBossState(DATA_HIGH_WARLORD_NAJENTUS, NOT_STARTED);
}
void KilledUnit(Unit* /*victim*/) OVERRIDE
@@ -112,7 +112,7 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
if (instance)
instance->SetData(DATA_HIGHWARLORDNAJENTUSEVENT, DONE);
instance->SetBossState(DATA_HIGH_WARLORD_NAJENTUS, DONE);
Talk(SAY_DEATH);
}
@@ -130,7 +130,7 @@ public:
void EnterCombat(Unit* /*who*/) OVERRIDE
{
if (instance)
instance->SetData(DATA_HIGHWARLORDNAJENTUSEVENT, IN_PROGRESS);
instance->SetBossState(DATA_HIGH_WARLORD_NAJENTUS, IN_PROGRESS);
Talk(SAY_AGGRO);
DoZoneInCombat();
@@ -228,7 +228,7 @@ public:
bool OnGossipHello(Player* player, GameObject* go) OVERRIDE
{
if (InstanceScript* instance = go->GetInstanceScript())
if (Creature* Najentus = Unit::GetCreature(*go, instance->GetData64(DATA_HIGHWARLORDNAJENTUS)))
if (Creature* Najentus = ObjectAccessor::GetCreature(*go, instance->GetData64(DATA_HIGH_WARLORD_NAJENTUS)))
if (CAST_AI(boss_najentus::boss_najentusAI, Najentus->AI())->RemoveImpalingSpine())
{
player->CastSpell(player, SPELL_CREATE_NAJENTUS_SPINE, true);

View File

@@ -157,10 +157,10 @@ public:
{
if (InstanceScript* instance = me->GetInstanceScript())
{
Council[0] = instance->GetData64(DATA_GATHIOSTHESHATTERER);
Council[1] = instance->GetData64(DATA_VERASDARKSHADOW);
Council[2] = instance->GetData64(DATA_LADYMALANDE);
Council[3] = instance->GetData64(DATA_HIGHNETHERMANCERZEREVOR);
Council[0] = instance->GetData64(DATA_GATHIOS_THE_SHATTERER);
Council[1] = instance->GetData64(DATA_VERAS_DARKSHADOW);
Council[2] = instance->GetData64(DATA_LADY_MALANDE);
Council[3] = instance->GetData64(DATA_HIGH_NETHERMANCER_ZEREVOR);
} else TC_LOG_ERROR(LOG_FILTER_TSCR, ERROR_INST_DATA);
}
@@ -265,8 +265,8 @@ public:
if (instance)
{
instance->SetData(DATA_ILLIDARICOUNCILEVENT, NOT_STARTED);
if (Creature* VoiceTrigger = (Unit::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE))))
instance->SetBossState(DATA_ILLIDARI_COUNCIL, NOT_STARTED);
if (Creature* VoiceTrigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE)))
VoiceTrigger->AI()->EnterEvadeMode();
}
@@ -289,13 +289,13 @@ public:
if (target && target->IsAlive())
{
Council[0] = instance->GetData64(DATA_GATHIOSTHESHATTERER);
Council[1] = instance->GetData64(DATA_HIGHNETHERMANCERZEREVOR);
Council[2] = instance->GetData64(DATA_LADYMALANDE);
Council[3] = instance->GetData64(DATA_VERASDARKSHADOW);
Council[0] = instance->GetData64(DATA_GATHIOS_THE_SHATTERER);
Council[1] = instance->GetData64(DATA_HIGH_NETHERMANCER_ZEREVOR);
Council[2] = instance->GetData64(DATA_LADY_MALANDE);
Council[3] = instance->GetData64(DATA_VERAS_DARKSHADOW);
// Start the event for the Voice Trigger
if (Creature* VoiceTrigger = (Unit::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE))))
if (Creature* VoiceTrigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE)))
{
CAST_AI(npc_blood_elf_council_voice_trigger::npc_blood_elf_council_voice_triggerAI, VoiceTrigger->AI())->LoadCouncilGUIDs();
CAST_AI(npc_blood_elf_council_voice_trigger::npc_blood_elf_council_voice_triggerAI, VoiceTrigger->AI())->EventStarted = true;
@@ -305,13 +305,13 @@ public:
{
if (Council[i])
{
Unit* member = Unit::GetUnit(*me, Council[i]);
if (member && member->IsAlive())
member->ToCreature()->AI()->AttackStart(target);
if (Creature* member = ObjectAccessor::GetCreature(*me, Council[i]))
if (member->IsAlive())
member->AI()->AttackStart(target);
}
}
instance->SetData(DATA_ILLIDARICOUNCILEVENT, IN_PROGRESS);
instance->SetBossState(DATA_ILLIDARI_COUNCIL, IN_PROGRESS);
EventBegun = true;
}
@@ -330,9 +330,9 @@ public:
{
if (instance)
{
if (Creature* VoiceTrigger = (Unit::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE))))
if (Creature* VoiceTrigger = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BLOOD_ELF_COUNCIL_VOICE)))
VoiceTrigger->DealDamage(VoiceTrigger, VoiceTrigger->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
instance->SetData(DATA_ILLIDARICOUNCILEVENT, DONE);
instance->SetBossState(DATA_ILLIDARI_COUNCIL, DONE);
//me->SummonCreature(AKAMAID, 746.466980f, 304.394989f, 311.90208f, 6.272870f, TEMPSUMMON_DEAD_DESPAWN, 0);
}
me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
@@ -403,9 +403,8 @@ struct boss_illidari_councilAI : public ScriptedAI
{
if (instance)
{
Creature* Controller = (Unit::GetCreature(*me, instance->GetData64(DATA_ILLIDARICOUNCIL)));
if (Controller)
CAST_AI(npc_illidari_council::npc_illidari_councilAI, Controller->AI())->StartEvent(who);
if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ILLIDARI_COUNCIL)))
CAST_AI(npc_illidari_council::npc_illidari_councilAI, controller->AI())->StartEvent(who);
}
else
{
@@ -461,10 +460,10 @@ struct boss_illidari_councilAI : public ScriptedAI
return;
}
Council[0] = instance->GetData64(DATA_LADYMALANDE);
Council[1] = instance->GetData64(DATA_HIGHNETHERMANCERZEREVOR);
Council[2] = instance->GetData64(DATA_GATHIOSTHESHATTERER);
Council[3] = instance->GetData64(DATA_VERASDARKSHADOW);
Council[0] = instance->GetData64(DATA_LADY_MALANDE);
Council[1] = instance->GetData64(DATA_HIGH_NETHERMANCER_ZEREVOR);
Council[2] = instance->GetData64(DATA_GATHIOS_THE_SHATTERER);
Council[3] = instance->GetData64(DATA_VERAS_DARKSHADOW);
LoadedGUIDs = true;
}

View File

@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -16,382 +15,261 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* ScriptData
SDName: Instance_Black_Temple
SD%Complete: 100
SDComment: Instance Data Scripts and functions to acquire mobs and set encounter status for use in various Black Temple Scripts
SDCategory: Black Temple
EndScriptData */
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "black_temple.h"
#include "Player.h"
/* Black Temple encounters:
0 - High Warlord Naj'entus event
1 - Supremus Event
2 - Shade of Akama Event
3 - Teron Gorefiend Event
4 - Gurtogg Bloodboil Event
5 - Reliquary Of Souls Event
6 - Mother Shahraz Event
7 - Illidari Council Event
8 - Illidan Stormrage Event
*/
DoorData const doorData[] =
{
{ GO_NAJENTUS_GATE, DATA_HIGH_WARLORD_NAJENTUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
{ GO_NAJENTUS_GATE, DATA_SUPREMUS, DOOR_TYPE_ROOM, BOUNDARY_NONE },
{ GO_SUPREMUS_GATE, DATA_SUPREMUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
{ GO_SHADE_OF_AKAMA_DOOR, DATA_SHADE_OF_AKAMA, DOOR_TYPE_ROOM, BOUNDARY_NONE },
{ GO_TERON_DOOR_1, DATA_TERON_GOREFIEND, DOOR_TYPE_ROOM, BOUNDARY_NONE },
{ GO_TERON_DOOR_2, DATA_TERON_GOREFIEND, DOOR_TYPE_ROOM, BOUNDARY_NONE },
{ GO_GURTOGG_DOOR, DATA_GURTOGG_BLOODBOIL, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
{ GO_TEMPLE_DOOR, DATA_RELIQUARY_OF_SOULS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
{ GO_MOTHER_SHAHRAZ_DOOR, DATA_MOTHER_SHAHRAZ, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
{ GO_COUNCIL_DOOR_1, DATA_ILLIDARI_COUNCIL, DOOR_TYPE_ROOM, BOUNDARY_NONE },
{ GO_COUNCIL_DOOR_2, DATA_ILLIDARI_COUNCIL, DOOR_TYPE_ROOM, BOUNDARY_NONE },
{ 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
};
class instance_black_temple : public InstanceMapScript
{
public:
instance_black_temple() : InstanceMapScript("instance_black_temple", 564) { }
public:
instance_black_temple() : InstanceMapScript(BTScriptName, 564) { }
InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
{
return new instance_black_temple_InstanceMapScript(map);
}
struct instance_black_temple_InstanceMapScript : public InstanceScript
{
instance_black_temple_InstanceMapScript(Map* map) : InstanceScript(map) {}
uint32 m_auiEncounter[EncounterCount];
std::string str_data;
uint64 Najentus;
uint64 Akama; // This is the Akama that starts the Illidan encounter.
uint64 Akama_Shade; // This is the Akama that starts the Shade of Akama encounter.
uint64 ShadeOfAkama;
uint64 Supremus;
uint64 LadyMalande;
uint64 GathiosTheShatterer;
uint64 HighNethermancerZerevor;
uint64 VerasDarkshadow;
uint64 IllidariCouncil;
uint64 BloodElfCouncilVoice;
uint64 IllidanStormrage;
uint64 NajentusGate;
uint64 MainTempleDoors;
uint64 ShadeOfAkamaDoor;
uint64 CommonDoor;//Teron
uint64 TeronDoor;
uint64 GuurtogDoor;
uint64 MotherDoor;
uint64 TempleDoor;//Befor mother
uint64 CouncilDoor;
uint64 SimpleDoor;//council
uint64 IllidanGate;
uint64 IllidanDoor[2];
void Initialize() OVERRIDE
struct instance_black_temple_InstanceMapScript : public InstanceScript
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
Najentus = 0;
Akama = 0;
Akama_Shade = 0;
ShadeOfAkama = 0;
Supremus = 0;
LadyMalande = 0;
GathiosTheShatterer = 0;
HighNethermancerZerevor = 0;
VerasDarkshadow = 0;
IllidariCouncil = 0;
BloodElfCouncilVoice = 0;
IllidanStormrage = 0;
NajentusGate = 0;
MainTempleDoors = 0;
ShadeOfAkamaDoor = 0;
CommonDoor = 0; // teron
TeronDoor = 0;
GuurtogDoor = 0;
MotherDoor = 0;
TempleDoor = 0;
SimpleDoor = 0; // Bycouncil
CouncilDoor = 0;
IllidanGate = 0;
IllidanDoor[0] = 0;
IllidanDoor[1] = 0;
}
bool IsEncounterInProgress() const OVERRIDE
{
for (uint8 i = 0; i < EncounterCount; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
return true;
return false;
}
Player* GetPlayerInMap()
{
Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
instance_black_temple_InstanceMapScript(Map* map) : InstanceScript(map)
{
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
NajentusGUID = 0;
SupremusGUID = 0;
ShadeOfAkamaGUID = 0;
AkamaShadeGUID = 0;
AkamaGUID = 0;
GathiosTheShattererGUID = 0;
HighNethermancerZerevorGUID = 0;
LadyMalandeGUID = 0;
VerasDarkshadowGUID = 0;
IllidariCouncilGUID = 0;
BloodElfCouncilVoiceGUID = 0;
IllidanStormrageGUID = 0;
IllidanGateGUID = 0;
memset(IllidanDoorGUIDs, 0, 2 * sizeof(uint64));
}
void OnCreatureCreate(Creature* creature) OVERRIDE
{
switch (creature->GetEntry())
{
if (Player* player = itr->GetSource())
return player;
case NPC_HIGH_WARLORD_NAJENTUS:
NajentusGUID = creature->GetGUID();
break;
case NPC_SUPREMUS:
SupremusGUID = creature->GetGUID();
break;
case NPC_SHADE_OF_AKAMA:
ShadeOfAkamaGUID = creature->GetGUID();
break;
case NPC_AKAMA_SHADE:
AkamaShadeGUID = creature->GetGUID();
break;
case NPC_AKAMA:
AkamaGUID = creature->GetGUID();
break;
case NPC_GATHIOS_THE_SHATTERER:
GathiosTheShattererGUID = creature->GetGUID();
break;
case NPC_HIGH_NETHERMANCER_ZEREVOR:
HighNethermancerZerevorGUID = creature->GetGUID();
break;
case NPC_LADY_MALANDE:
LadyMalandeGUID = creature->GetGUID();
break;
case NPC_VERAS_DARKSHADOW:
VerasDarkshadowGUID = creature->GetGUID();
break;
case NPC_ILLIDARI_COUNCIL:
IllidariCouncilGUID = creature->GetGUID();
break;
case NPC_BLOOD_ELF_COUNCIL_VOICE:
BloodElfCouncilVoiceGUID = creature->GetGUID();
break;
case NPC_ILLIDAN_STORMRAGE:
IllidanStormrageGUID = creature->GetGUID();
break;
default:
break;
}
}
TC_LOG_DEBUG(LOG_FILTER_TSCR, "Instance Black Temple: GetPlayerInMap, but PlayerList is empty!");
return NULL;
}
void OnCreatureCreate(Creature* creature) OVERRIDE
{
switch (creature->GetEntry())
void OnGameObjectCreate(GameObject* go) OVERRIDE
{
case 22887: Najentus = creature->GetGUID(); break;
case 23089: Akama = creature->GetGUID(); break;
case 23191: Akama_Shade = creature->GetGUID(); break;
case 22841: ShadeOfAkama = creature->GetGUID(); break;
case 22898: Supremus = creature->GetGUID(); break;
case 22917: IllidanStormrage = creature->GetGUID(); break;
case 22949: GathiosTheShatterer = creature->GetGUID(); break;
case 22950: HighNethermancerZerevor = creature->GetGUID(); break;
case 22951: LadyMalande = creature->GetGUID(); break;
case 22952: VerasDarkshadow = creature->GetGUID(); break;
case 23426: IllidariCouncil = creature->GetGUID(); break;
case 23499: BloodElfCouncilVoice = creature->GetGUID(); break;
}
}
void OnGameObjectCreate(GameObject* go) OVERRIDE
{
switch (go->GetEntry())
{
case 185483:
NajentusGate = go->GetGUID(); // Gate past Naj'entus (at the entrance to Supermoose's courtyards)
if (m_auiEncounter[0] == DONE)
HandleGameObject(0, true, go);
break;
case 185882:
MainTempleDoors = go->GetGUID(); // Main Temple Doors - right past Supermoose (Supremus)
if (m_auiEncounter[1] == DONE)
HandleGameObject(0, true, go);
break;
case 185478:
ShadeOfAkamaDoor = go->GetGUID();
break;
case 185480:
CommonDoor = go->GetGUID();
if (m_auiEncounter[3] == DONE)
HandleGameObject(0, true, go);
break;
case 186153:
TeronDoor = go->GetGUID();
if (m_auiEncounter[3] == DONE)
HandleGameObject(0, true, go);
break;
case 185892:
GuurtogDoor = go->GetGUID();
if (m_auiEncounter[4] == DONE)
HandleGameObject(0, true, go);
break;
case 185479:
TempleDoor = go->GetGUID();
if (m_auiEncounter[5] == DONE)
HandleGameObject(0, true, go);
break;
case 185482:
MotherDoor = go->GetGUID();
if (m_auiEncounter[6] == DONE)
HandleGameObject(0, true, go);
break;
case 185481:
CouncilDoor = go->GetGUID();
if (m_auiEncounter[7] == DONE)
HandleGameObject(0, true, go);
break;
case 186152:
SimpleDoor = go->GetGUID();
if (m_auiEncounter[7] == DONE)
HandleGameObject(0, true, go);
break;
case 185905:
IllidanGate = go->GetGUID(); // Gate leading to Temple Summit
break;
case 186261:
IllidanDoor[0] = go->GetGUID(); // Right door at Temple Summit
break;
case 186262:
IllidanDoor[1] = go->GetGUID(); // Left door at Temple Summit
break;
}
}
uint64 GetData64(uint32 identifier) const OVERRIDE
{
switch (identifier)
{
case DATA_HIGHWARLORDNAJENTUS: return Najentus;
case DATA_AKAMA: return Akama;
case DATA_AKAMA_SHADE: return Akama_Shade;
case DATA_SHADEOFAKAMA: return ShadeOfAkama;
case DATA_SUPREMUS: return Supremus;
case DATA_ILLIDANSTORMRAGE: return IllidanStormrage;
case DATA_GATHIOSTHESHATTERER: return GathiosTheShatterer;
case DATA_HIGHNETHERMANCERZEREVOR: return HighNethermancerZerevor;
case DATA_LADYMALANDE: return LadyMalande;
case DATA_VERASDARKSHADOW: return VerasDarkshadow;
case DATA_ILLIDARICOUNCIL: return IllidariCouncil;
case DATA_GAMEOBJECT_NAJENTUS_GATE: return NajentusGate;
case DATA_GAMEOBJECT_ILLIDAN_GATE: return IllidanGate;
case DATA_GAMEOBJECT_ILLIDAN_DOOR_R: return IllidanDoor[0];
case DATA_GAMEOBJECT_ILLIDAN_DOOR_L: return IllidanDoor[1];
case DATA_GAMEOBJECT_SUPREMUS_DOORS: return MainTempleDoors;
case DATA_BLOOD_ELF_COUNCIL_VOICE: return BloodElfCouncilVoice;
switch (go->GetEntry())
{
case GO_NAJENTUS_GATE:
case GO_SUPREMUS_GATE:
case GO_SHADE_OF_AKAMA_DOOR:
case GO_TERON_DOOR_1:
case GO_TERON_DOOR_2:
case GO_GURTOGG_DOOR:
case GO_TEMPLE_DOOR:
case GO_MOTHER_SHAHRAZ_DOOR:
case GO_COUNCIL_DOOR_1:
case GO_COUNCIL_DOOR_2:
AddDoor(go, true);
break;
case GO_ILLIDAN_GATE:
IllidanGateGUID = go->GetGUID();
break;
case GO_ILLIDAN_DOOR_R:
IllidanDoorGUIDs[0] = go->GetGUID();
break;
case GO_ILLIDAN_DOOR_L:
IllidanDoorGUIDs[1] = go->GetGUID();
break;
default:
break;
}
}
return 0;
}
void SetData(uint32 type, uint32 data) OVERRIDE
{
switch (type)
void OnGameObjectRemove(GameObject* go) OVERRIDE
{
case DATA_HIGHWARLORDNAJENTUSEVENT:
if (data == DONE)
HandleGameObject(NajentusGate, true);
m_auiEncounter[0] = data;
break;
case DATA_SUPREMUSEVENT:
if (data == DONE)
HandleGameObject(NajentusGate, true);
m_auiEncounter[1] = data;
break;
case DATA_SHADEOFAKAMAEVENT:
if (data == IN_PROGRESS)
HandleGameObject(ShadeOfAkamaDoor, false);
else
HandleGameObject(ShadeOfAkamaDoor, true);
m_auiEncounter[2] = data;
break;
case DATA_TERONGOREFIENDEVENT:
if (data == IN_PROGRESS)
switch (go->GetEntry())
{
HandleGameObject(TeronDoor, false);
HandleGameObject(CommonDoor, false);
case GO_NAJENTUS_GATE:
case GO_SUPREMUS_GATE:
case GO_SHADE_OF_AKAMA_DOOR:
case GO_TERON_DOOR_1:
case GO_TERON_DOOR_2:
case GO_GURTOGG_DOOR:
case GO_TEMPLE_DOOR:
case GO_MOTHER_SHAHRAZ_DOOR:
case GO_COUNCIL_DOOR_1:
case GO_COUNCIL_DOOR_2:
AddDoor(go, false);
break;
default:
break;
}
else
{
HandleGameObject(TeronDoor, true);
HandleGameObject(CommonDoor, true);
}
m_auiEncounter[3] = data;
break;
case DATA_GURTOGGBLOODBOILEVENT:
if (data == DONE)
HandleGameObject(GuurtogDoor, true);
m_auiEncounter[4] = data;
break;
case DATA_RELIQUARYOFSOULSEVENT:
if (data == DONE)
HandleGameObject(TempleDoor, true);
m_auiEncounter[5] = data;
break;
case DATA_MOTHERSHAHRAZEVENT:
if (data == DONE)
HandleGameObject(MotherDoor, true);
m_auiEncounter[6] = data;
break;
case DATA_ILLIDARICOUNCILEVENT:
if (data == IN_PROGRESS)
{
HandleGameObject(CouncilDoor, false);
HandleGameObject(SimpleDoor, false);
}
else
{
HandleGameObject(CouncilDoor, true);
HandleGameObject(SimpleDoor, true);
}
m_auiEncounter[7] = data;
break;
case DATA_ILLIDANSTORMRAGEEVENT:
m_auiEncounter[8] = data;
break;
}
if (data == DONE)
uint64 GetData64(uint32 type) const OVERRIDE
{
switch (type)
{
case DATA_HIGH_WARLORD_NAJENTUS:
return NajentusGUID;
case DATA_SUPREMUS:
return SupremusGUID;
case DATA_SHADE_OF_AKAMA:
return ShadeOfAkamaGUID;
case DATA_AKAMA_SHADE:
return AkamaShadeGUID;
case DATA_AKAMA:
return AkamaGUID;
case DATA_GATHIOS_THE_SHATTERER:
return GathiosTheShattererGUID;
case DATA_HIGH_NETHERMANCER_ZEREVOR:
return HighNethermancerZerevorGUID;
case DATA_LADY_MALANDE:
return LadyMalandeGUID;
case DATA_VERAS_DARKSHADOW:
return VerasDarkshadowGUID;
case DATA_ILLIDARI_COUNCIL:
return IllidariCouncilGUID;
case DATA_BLOOD_ELF_COUNCIL_VOICE:
return BloodElfCouncilVoiceGUID;
case DATA_ILLIDAN_STORMRAGE:
return IllidanStormrageGUID;
case DATA_GO_ILLIDAN_GATE:
return IllidanGateGUID;
case DATA_GO_ILLIDAN_DOOR_R:
return IllidanDoorGUIDs[0];
case DATA_GO_ILLIDAN_DOOR_L:
return IllidanDoorGUIDs[1];
default:
break;
}
return 0;
}
std::string GetSaveData() OVERRIDE
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' '
<< m_auiEncounter[2] << ' ' << m_auiEncounter[3] << ' ' << m_auiEncounter[4]
<< ' ' << m_auiEncounter[5] << ' ' << m_auiEncounter[6] << ' ' << m_auiEncounter[7]
<< ' ' << m_auiEncounter[8];
saveStream << "B T " << GetBossSaveData();
str_data = saveStream.str();
SaveToDB();
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
}
uint32 GetData(uint32 type) const OVERRIDE
{
switch (type)
void Load(char const* str) OVERRIDE
{
case DATA_HIGHWARLORDNAJENTUSEVENT: return m_auiEncounter[0];
case DATA_SUPREMUSEVENT: return m_auiEncounter[1];
case DATA_SHADEOFAKAMAEVENT: return m_auiEncounter[2];
case DATA_TERONGOREFIENDEVENT: return m_auiEncounter[3];
case DATA_GURTOGGBLOODBOILEVENT: return m_auiEncounter[4];
case DATA_RELIQUARYOFSOULSEVENT: return m_auiEncounter[5];
case DATA_MOTHERSHAHRAZEVENT: return m_auiEncounter[6];
case DATA_ILLIDARICOUNCILEVENT: return m_auiEncounter[7];
case DATA_ILLIDANSTORMRAGEEVENT: return m_auiEncounter[8];
if (!str)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(str);
char dataHead1, dataHead2;
std::istringstream loadStream(str);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'B' && dataHead2 == 'T')
{
for (uint32 i = 0; i < EncounterCount; ++i)
{
uint32 tmpState;
loadStream >> tmpState;
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
tmpState = NOT_STARTED;
SetBossState(i, EncounterState(tmpState));
}
}
else
OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
}
return 0;
}
protected:
uint64 NajentusGUID;
uint64 SupremusGUID;
uint64 ShadeOfAkamaGUID;
uint64 AkamaShadeGUID;
uint64 AkamaGUID;
std::string GetSaveData() OVERRIDE
uint64 GathiosTheShattererGUID;
uint64 HighNethermancerZerevorGUID;
uint64 LadyMalandeGUID;
uint64 VerasDarkshadowGUID;
uint64 IllidariCouncilGUID;
uint64 BloodElfCouncilVoiceGUID;
uint64 IllidanStormrageGUID;
uint64 IllidanGateGUID;
uint64 IllidanDoorGUIDs[2];
};
InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
{
return str_data;
return new instance_black_temple_InstanceMapScript(map);
}
void Load(const char* in) OVERRIDE
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
std::istringstream loadStream(in);
loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2]
>> m_auiEncounter[3] >> m_auiEncounter[4] >> m_auiEncounter[5] >> m_auiEncounter[6]
>> m_auiEncounter[7] >> m_auiEncounter[8];
for (uint8 i = 0; i < EncounterCount; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
m_auiEncounter[i] = NOT_STARTED;
OUT_LOAD_INST_DATA_COMPLETE;
}
};
};
void AddSC_instance_black_temple()