diff options
Diffstat (limited to 'src')
3 files changed, 66 insertions, 19 deletions
diff --git a/src/server/scripts/Outland/BlackTemple/black_temple.h b/src/server/scripts/Outland/BlackTemple/black_temple.h index 0be3a645faf..01ee93ffa1f 100644 --- a/src/server/scripts/Outland/BlackTemple/black_temple.h +++ b/src/server/scripts/Outland/BlackTemple/black_temple.h @@ -49,6 +49,14 @@ enum BTDataTypes DATA_BLOOD_ELF_COUNCIL_VOICE = 15, DATA_GO_ILLIDAN_GATE = 16, + DATA_BLACK_TEMPLE_TRIGGER = 17, + DATA_GO_DEN_OF_MORTAL_DOOR = 18 +}; + +enum TriggerEmotes +{ + EMOTE_HIGH_WARLORD_NAJENTUS_DIED = 0, + EMOTE_DEN_OF_MORTAL_DOOR_OPEN = 1 }; enum BTCreatureIds @@ -72,7 +80,8 @@ enum BTCreatureIds NPC_BLOOD_ELF_COUNCIL_VOICE = 23499, NPC_AKAMA = 23089, // This is the Akama that starts the Illidan encounter. NPC_AKAMA_SHADE = 23191, // This is the Akama that starts the Shade of Akama encounter. - NPC_SUPREMUS_VOLCANO = 23085 + NPC_SUPREMUS_VOLCANO = 23085, + NPC_BLACK_TEMPLE_TRIGGER = 22984 }; enum BTGameObjectIds @@ -84,7 +93,7 @@ enum BTGameObjectIds GO_TERON_DOOR_1 = 185480, GO_TERON_DOOR_2 = 186153, GO_GURTOGG_DOOR = 185892, - GO_TEMPLE_DOOR = 185479, + GO_DEN_OF_MORTAL_DOOR = 185479, GO_MOTHER_SHAHRAZ_DOOR = 185482, GO_COUNCIL_DOOR_1 = 185481, GO_COUNCIL_DOOR_2 = 186152, diff --git a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp index 7a25c91903b..c9d388369d7 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_shade_of_akama.cpp @@ -202,7 +202,9 @@ Position const BrokenWP[18] = { 478.8986f, 370.1895f, 112.7839f } }; -static float const MIDDLE_OF_ROOM = 400.0f; +static float const MIDDLE_OF_ROOM = 400.0f; +static float const FACE_THE_DOOR = 0.08726646f; +static float const FACE_THE_PLATFORM = 3.118662f; class boss_shade_of_akama : public CreatureScript { @@ -224,8 +226,9 @@ public: void Reset() override { + _Reset(); Initialize(); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_STUN); me->SetWalk(true); @@ -235,7 +238,8 @@ public: void EnterEvadeMode(EvadeReason /*why*/) override { - _Reset(); + events.Reset(); + summons.DespawnAll(); for (ObjectGuid const& spawnerGuid : _spawners) if (Creature* spawner = ObjectAccessor::GetCreature(*me, spawnerGuid)) @@ -265,6 +269,7 @@ public: { _isInPhaseOne = false; me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); me->SetWalk(false); events.ScheduleEvent(EVENT_ADD_THREAT, Milliseconds(100)); @@ -449,7 +454,6 @@ public: else if (pointId == AKAMA_INTRO_WAYPOINT) { me->SetWalk(false); - me->SetFacingTo(0.08726646f, true); _events.ScheduleEvent(EVENT_START_SOUL_RETRIEVE, Seconds(1)); } } @@ -484,7 +488,7 @@ public: me->GetMotionMaster()->MovePoint(AKAMA_CHANNEL_WAYPOINT, AkamaWP[0], false); break; case EVENT_SHADE_CHANNEL: - me->SetFacingTo(3.118662f); + me->SetFacingTo(FACE_THE_PLATFORM); DoCastSelf(SPELL_AKAMA_SOUL_CHANNEL); me->setFaction(FACTION_COMBAT); _events.ScheduleEvent(EVENT_FIXATE, Seconds(5)); @@ -501,6 +505,7 @@ public: _events.Repeat(Seconds(3), Seconds(7)); break; case EVENT_START_SOUL_RETRIEVE: + me->SetFacingTo(FACE_THE_DOOR, true); DoCast(SPELL_AKAMA_SOUL_RETRIEVE); _events.ScheduleEvent(EVENT_START_BROKEN_FREE, Seconds(15)); break; diff --git a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp index 25aa505e433..3f2f0efb061 100644 --- a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp +++ b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp @@ -32,11 +32,9 @@ DoorData const doorData[] = { GO_TERON_DOOR_1, DATA_TERON_GOREFIEND, DOOR_TYPE_ROOM }, { GO_TERON_DOOR_2, DATA_TERON_GOREFIEND, DOOR_TYPE_ROOM }, { GO_GURTOGG_DOOR, DATA_GURTOGG_BLOODBOIL, DOOR_TYPE_PASSAGE }, - { GO_TEMPLE_DOOR, DATA_RELIQUARY_OF_SOULS, DOOR_TYPE_PASSAGE }, { GO_MOTHER_SHAHRAZ_DOOR, DATA_MOTHER_SHAHRAZ, DOOR_TYPE_PASSAGE }, { GO_COUNCIL_DOOR_1, DATA_ILLIDARI_COUNCIL, DOOR_TYPE_ROOM }, { GO_COUNCIL_DOOR_2, DATA_ILLIDARI_COUNCIL, DOOR_TYPE_ROOM }, - //{ GO_ILLIDAN_GATE, DATA_GO_ILLIDAN_GATE, DOOR_TYPE_PASSAGE }, { GO_ILLIDAN_DOOR_R, DATA_ILLIDAN_STORMRAGE, DOOR_TYPE_ROOM }, { GO_ILLIDAN_DOOR_L, DATA_ILLIDAN_STORMRAGE, DOOR_TYPE_ROOM }, { 0, 0, DOOR_TYPE_ROOM } // END @@ -74,9 +72,17 @@ ObjectData const creatureData[] = { NPC_LADY_MALANDE, DATA_LADY_MALANDE }, { NPC_VERAS_DARKSHADOW, DATA_VERAS_DARKSHADOW }, { NPC_BLOOD_ELF_COUNCIL_VOICE, DATA_BLOOD_ELF_COUNCIL_VOICE }, + { NPC_BLACK_TEMPLE_TRIGGER, DATA_BLACK_TEMPLE_TRIGGER }, { 0, 0 } // end }; +ObjectData const gameObjectData[] = +{ + { GO_ILLIDAN_GATE, DATA_GO_ILLIDAN_GATE }, + { GO_DEN_OF_MORTAL_DOOR, DATA_GO_DEN_OF_MORTAL_DOOR }, + { 0, 0 } //END +}; + class instance_black_temple : public InstanceMapScript { public: @@ -89,28 +95,55 @@ class instance_black_temple : public InstanceMapScript SetHeaders(DataHeader); SetBossNumber(EncounterCount); LoadDoorData(doorData); - LoadObjectData(creatureData, nullptr); + LoadObjectData(creatureData, gameObjectData); LoadBossBoundaries(boundaries); } void OnGameObjectCreate(GameObject* go) override { - if (go->GetEntry() == GO_ILLIDAN_GATE) - IllidanGateGUID = go->GetGUID(); - InstanceScript::OnGameObjectCreate(go); + if (go->GetEntry() == GO_DEN_OF_MORTAL_DOOR) + if(CheckDenOfMortalDoor()) + go->SetGoState(GO_STATE_ACTIVE); } - ObjectGuid GetGuidData(uint32 type) const override + bool SetBossState(uint32 type, EncounterState state) override { - if (type == DATA_GO_ILLIDAN_GATE) - return IllidanGateGUID; + if (!InstanceScript::SetBossState(type, state)) + return false; + switch (type) + { + case DATA_HIGH_WARLORD_NAJENTUS: + if (state == DONE) + if (Creature* trigger = GetCreature(DATA_BLACK_TEMPLE_TRIGGER)) + trigger->AI()->Talk(EMOTE_HIGH_WARLORD_NAJENTUS_DIED); + break; + case DATA_SHADE_OF_AKAMA: + case DATA_TERON_GOREFIEND: + case DATA_GURTOGG_BLOODBOIL: + case DATA_RELIQUARY_OF_SOULS: + if (state == DONE && CheckDenOfMortalDoor()) + { + if (Creature* trigger = GetCreature(DATA_BLACK_TEMPLE_TRIGGER)) + trigger->AI()->Talk(EMOTE_DEN_OF_MORTAL_DOOR_OPEN); - return InstanceScript::GetGuidData(type); + if(GameObject* go = GetGameObject(DATA_GO_DEN_OF_MORTAL_DOOR)) + go->SetGoState(GO_STATE_ACTIVE); + } + break; + default: + break; + } + return true; } - protected: - ObjectGuid IllidanGateGUID; + bool CheckDenOfMortalDoor() + { + for (DataTypes boss : {DATA_SHADE_OF_AKAMA, DATA_TERON_GOREFIEND, DATA_RELIQUARY_OF_SOULS, DATA_GURTOGG_BLOODBOIL}) + if (GetBossState(boss) != DONE) + return false; + return true; + } }; InstanceScript* GetInstanceScript(InstanceMap* map) const override |