diff options
5 files changed, 678 insertions, 0 deletions
diff --git a/sql/updates/world/master/2025_02_01_02_world.sql b/sql/updates/world/master/2025_02_01_02_world.sql new file mode 100644 index 00000000000..8ae789db4c3 --- /dev/null +++ b/sql/updates/world/master/2025_02_01_02_world.sql @@ -0,0 +1,123 @@ +SET @CGUID := 5000557; +SET @SPAWNGROUP := 1264; + +UPDATE `creature` SET `StringId`='npc_auchenai_defender_intro' WHERE `guid`= 5000442; -- Auchenai Defender + +UPDATE `creature_template` SET `ScriptName` = 'npc_auchindoun_soulbinder_tuulani' WHERE `entry`=79248; -- Soulbinder Tuulani +UPDATE `creature_template` SET `ScriptName` = 'npc_auchindoun_auchenai_defender' WHERE `entry`=77693; -- Auchenai Defender + +-- Texts +DELETE FROM `creature_text` WHERE `CreatureID` IN (77693, 79248); +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(77693, 0, 0, 'Nyami awaits you in the western ritual chamber, champions.', 12, 0, 100, 0, 0, 0, 83111, 0, 'Auchenai Defender to Player'), +(79248, 0, 0, 'Good! We must have arrived before Teron\'gor and Gul\'dan!', 12, 0, 100, 3, 0, 44644, 81528, 0, 'Soulbinder Tuulani to Player'), +(79248, 1, 0, 'Nyami is working to bolster the defenses against their assault - follow me, we will report to her.', 12, 0, 100, 1, 0, 44654, 81529, 0, 'Soulbinder Tuulani to Player'), +(79248, 2, 0, 'Beautiful, isn\'t it? Just think - you\'re one of the first outsiders to see inside Auchindoun.', 12, 0, 100, 6, 0, 44655, 81530, 0, 'Soulbinder Tuulani to Player'), +(79248, 3, 0, 'Strange... why is the door sealed? No matter...', 12, 0, 100, 6, 0, 44656, 81531, 0, 'Soulbinder Tuulani to Player'), +(79248, 4, 0, 'Let us proceed.', 12, 0, 100, 25, 0, 44657, 81532, 0, 'Soulbinder Tuulani'), +(79248, 5, 0, 'The Vindicators and Exarchs of the past. Heroes all - their souls still remain with us here.', 12, 0, 100, 25, 0, 44658, 81533, 0, 'Soulbinder Tuulani'); + +-- Waypoints +SET @ENTRY := 79248; +SET @PATHOFFSET := 0; +SET @PATH := @ENTRY * 100 + @PATHOFFSET; +DELETE FROM `waypoint_path` WHERE `PathId`= @PATH; +INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Comment`) VALUES +(@PATH, 1, 0, 'Soulbinder Tuulani path to holy barrier'); + +DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH; +INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES +(@PATH, 0, 1581.05, 2953.418, 35.2387, NULL, 0), +(@PATH, 1, 1599.741, 2952.971, 35.23116, NULL, 0), +(@PATH, 2, 1617.514, 2953.21, 35.22284, NULL, 6486), +(@PATH, 3, 1649.21, 2953.6, 34.80952, NULL, 0), +(@PATH, 4, 1654.767, 2960.552, 34.27824, NULL, 0), +(@PATH, 5, 1658.876, 2968.664, 35.31583, NULL, 0), +(@PATH, 6, 1660.462, 2981.102, 34.7626, NULL, 0), +(@PATH, 7, 1663.101, 2997.4, 34.76278, NULL, 0), +(@PATH, 8, 1664.323, 3002.953, 34.89674, NULL, 0); + +SET @ENTRY := 79248; +SET @PATHOFFSET := 1; +SET @PATH := @ENTRY * 100 + @PATHOFFSET; +DELETE FROM `waypoint_path` WHERE `PathId`= @PATH; +INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Comment`) VALUES +(@PATH, 1, 0, 'Soulbinder Tuulani path to first boss'); + +DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH; +INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES +(@PATH, 0, 1666.299, 3032.361, 35.15017, NULL, 0), +(@PATH, 1, 1677.693, 3045.896, 35.1377, NULL, 0), +(@PATH, 2, 1681.016, 3064.814, 35.13763, NULL, 0), +(@PATH, 3, 1683.851, 3078.6, 35.13764, NULL, 0), +(@PATH, 4, 1694.418, 3081.378, 35.13764, NULL, 0), +(@PATH, 5, 1697.734, 3086.925, 35.13764, NULL, 7960), +(@PATH, 6, 1718.639, 3116.199, 35.13764, NULL, 0), +(@PATH, 7, 1728.587, 3128.338, 35.13763, NULL, 0), +(@PATH, 8, 1747.014, 3144.337, 35.13762, NULL, 0), +(@PATH, 9, 1775.142, 3162.625, 35.13763, NULL, 0), +(@PATH, 10, 1789.036, 3174.038, 35.13765, NULL, 0), +(@PATH, 11, 1798.358, 3179.212, 35.13763, NULL, 0), +(@PATH, 12, 1806.295, 3182.313, 35.11731, 3.70009, 0); + +-- Conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` = 160415; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ConditionStringValue1`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 160415, 0, 2, 51, 0, 5, 79417, 0, '', 0, 0, 0, '', 'Spell \'Tuulani Unlock Visual\' can only hit \'Invisible Stalker\''); + +-- Spells +UPDATE `spell_target_position` SET `PositionX`=1855.673583984375, `PositionY`=3198.618896484375, `VerifiedBuild`=54988 WHERE (`ID`=178799 AND `EffectIndex`=0); -- Spell: 178799 (Grimrail Depot) Efffect: 252 (SPELL_EFFECT_TELEPORT_UNITS) + +DELETE FROM `spell_script_names` WHERE `spell_id` IN (157762, 178800); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(157762, 'spell_auchindoun_halo'), +(178800, 'spell_auchindoun_grimrail_depot_scene_selector'); + +-- Areatrigger +DELETE FROM `areatrigger_scripts` WHERE `entry` IN (9973, 10072, 9974, 10280); +INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES +(9973, 'at_auchindoun_entrance'), +(10072, 'at_auchindoun_auchenai_defender_intro'), +(9974, 'at_auchindoun_barrier'), +(10280, 'at_auchindoun_soulbinder_nyami_scene'); + +UPDATE `areatrigger_create_properties` SET `ScriptName`= 'at_auchindoun_npc_reaction' WHERE `Id` = 1725; + +-- Scene +DELETE FROM `scene_template` WHERE `SceneId`=913; +INSERT INTO `scene_template` (`SceneId`, `Flags`, `ScriptPackageID`, `Encrypted`, `ScriptName`) VALUES +(913, 17, 1365, 0, 'scene_auchindoun_soulbinder_nyami'); + +-- Phase +DELETE FROM `phase_name` WHERE `ID`=4346; +INSERT INTO `phase_name` (`ID`, `Name`) VALUES +(4346, 'Auchindoun Instance Scene'); + +DELETE FROM `phase_area` WHERE `AreaId`=6912 AND `PhaseId`=4346; +INSERT INTO `phase_area` (`AreaId`, `PhaseId`, `Comment`) VALUES +(6912, 4346, 'Auchindoun Instance See Scene'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=26 AND `SourceGroup`=4346; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ConditionStringValue1`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(26, 4346, 0, 0, 0, 56, 0, 31506, 0, 0, '', 0, 0, 0, '', 'Apply Phase 4346 if PlayerCondition 31506 is satisfied'); + +-- Spawngroup +DELETE FROM `creature` WHERE `guid` = @CGUID; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnDifficulties`, `PhaseId`, `PhaseGroup`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curHealthPct`, `MovementType`, `npcflag`, `unit_flags`, `unit_flags2`, `unit_flags3`, `VerifiedBuild`) VALUES +(@CGUID, 79248, 1182, 6912, 6912, '1,2,8,23', 0, 0, 0, 1, 1859.0208740234375, 3197.3203125, 29.50753593444824218, 0.019564647227525711, 7200, 0, 0, 100, 0, NULL, NULL, NULL, NULL, 54904); -- Soulbinder Tuulani (Area: Auchindoun - Difficulty: Normal) CreateObject1 (Auras: 154840 - Void Stasis) + +DELETE FROM `creature_addon` WHERE `guid` = @CGUID; +INSERT INTO `creature_addon` (`guid`, `PathId`, `mount`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvpFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES +(@CGUID, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 5, '154840'); -- Soulbinder Tuulani - 154840 - Void Stasis - + +DELETE FROM `spawn_group` WHERE `groupId`=@SPAWNGROUP; +INSERT INTO `spawn_group` (`groupId`, `spawnType`, `spawnId`) VALUES +(@SPAWNGROUP, 0, @CGUID); + +DELETE FROM `spawn_group_template` WHERE `groupId`=@SPAWNGROUP; +INSERT INTO `spawn_group_template` (`groupId`, `groupName`, `groupFlags`) VALUES +(@SPAWNGROUP, 'Auchindoun - Soulbinder Tuulani Imprisoned', 4); + +DELETE FROM `instance_template` WHERE `map`=1182; +INSERT INTO `instance_template` (`map`, `parent`, `script`) VALUES +(1182, 0, 'instance_auchindoun'); diff --git a/src/server/scripts/Draenor/Auchindoun/auchindoun.cpp b/src/server/scripts/Draenor/Auchindoun/auchindoun.cpp new file mode 100644 index 00000000000..6bbf61e3903 --- /dev/null +++ b/src/server/scripts/Draenor/Auchindoun/auchindoun.cpp @@ -0,0 +1,410 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * 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 + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "AreaTrigger.h" +#include "AreaTriggerAI.h" +#include "GameObject.h" +#include "InstanceScript.h" +#include "Map.h" +#include "MotionMaster.h" +#include "ObjectAccessor.h" +#include "PhasingHandler.h" +#include "Player.h" +#include "ScriptedCreature.h" +#include "ScriptMgr.h" +#include "SpellScript.h" +#include "TaskScheduler.h" +#include "auchindoun.h" + +enum AuchindounSpells +{ + SPELL_HALO_HEAL = 157795, + SPELL_TUULANI_UNLOCK_VISUAL = 160415, + SPELL_GRIMRAIL_DEPOT_SCENE = 178747, + SPELL_GRIMRAIL_DEPOT_SELECTOR = 178800, + SPELL_GRIMRAIL_DEPOT_TELEPORT = 178799, + SPELL_GRIMRAIL_DEPOT_REMOVE_AURA = 178746 + + // SPELL_INSTANCE_BOOTSTRAPPER = 171344 // This spell appears in a lot of sniffs, but the purpose is unknown +}; + +enum AuchindounActions +{ + ACTION_TUULANI_INTRO = 1, + ACTION_TUULANI_BREAK_BARRIER, + ACTION_AUCHENAI_DEFENDER_TALK +}; + +enum AuchindounTexts +{ + // Auchenai Defender + SAY_NYAMI_AWAITS = 0, + + // Soulbinder Tuulani + SAY_WELCOME_1 = 0, + SAY_WELCOME_2 = 1, + SAY_WELCOME_3 = 2, + SAY_BREAK_BARRIER_1 = 3, + SAY_BREAK_BARRIER_2 = 4, + SAY_HEROES_SOULS = 5 +}; + +enum AuchindounMisc +{ + // Waypoint + PATH_BARRIER = 7924800, + PATH_MOVE_TO_BOSS = 7924801, + + POINT_TALK = 2, + POINT_BARRIER = 8, + + POINT_SOULS = 5, + + // Spawngroups + SPAWNGROUP_TUULANI_IMPRISONED = 1264 +}; + +// 9973 - Areatrigger +class at_auchindoun_entrance : public OnlyOnceAreaTriggerScript +{ +public: + at_auchindoun_entrance() : OnlyOnceAreaTriggerScript("at_auchindoun_entrance") { } + + bool TryHandleOnce(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + { + if (InstanceScript* instance = player->GetInstanceScript()) + { + if (Creature* tuulani = instance->GetCreature(DATA_SOULBINDER_TUULANI)) + tuulani->AI()->DoAction(ACTION_TUULANI_INTRO); + } + return true; + } +}; + +// 10072 - Areatrigger +class at_auchindoun_auchenai_defender_intro : public OnlyOnceAreaTriggerScript +{ +public: + at_auchindoun_auchenai_defender_intro() : OnlyOnceAreaTriggerScript("at_auchindoun_auchenai_defender_intro") { } + + bool TryHandleOnce(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + { + if (Creature* auchenaiDefender = player->FindNearestCreatureWithOptions(30.0f, { .StringId = "npc_auchenai_defender_intro" })) + auchenaiDefender->AI()->DoAction(ACTION_AUCHENAI_DEFENDER_TALK); + + return true; + } +}; + +// 9974 - Areatrigger +// Not OnlyOnce because players can trigger this AT before Tuulani reaches the barrier +class at_auchindoun_barrier : public AreaTriggerScript +{ +public: + at_auchindoun_barrier() : AreaTriggerScript("at_auchindoun_barrier") { } + + bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + { + if (InstanceScript* instance = player->GetInstanceScript()) + { + if (Creature* tuulani = instance->GetCreature(DATA_SOULBINDER_TUULANI)) + tuulani->AI()->DoAction(ACTION_TUULANI_BREAK_BARRIER); + } + return true; + } +}; + +// 10280 - Areatrigger +class at_auchindoun_soulbinder_nyami_scene : public OnlyOnceAreaTriggerScript +{ +public: + at_auchindoun_soulbinder_nyami_scene() : OnlyOnceAreaTriggerScript("at_auchindoun_soulbinder_nyami_scene") { } + + bool TryHandleOnce(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override + { + player->CastSpell(player, SPELL_GRIMRAIL_DEPOT_SELECTOR, true); + + if (InstanceScript* instance = player->GetInstanceScript()) + { + if (Creature* tuulani = instance->GetCreature(DATA_SOULBINDER_TUULANI)) + tuulani->DespawnOrUnsummon(); + } + return true; + } +}; + +// 77693 - Auchenai Defender +struct npc_auchindoun_auchenai_defender : public ScriptedAI +{ + npc_auchindoun_auchenai_defender(Creature* creature) : ScriptedAI(creature) { } + + void DoAction(int32 action) override + { + if (action == ACTION_AUCHENAI_DEFENDER_TALK) + { + me->SetStandState(UNIT_STAND_STATE_STAND); + + _scheduler.Schedule(1s + 300ms, [this](TaskContext /*task*/) + { + me->SetFacingTo(3.8194849f); + Talk(SAY_NYAMI_AWAITS); + }); + } + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + +private: + TaskScheduler _scheduler; +}; + +// 79248 - Soulbinder Tuulani +struct npc_auchindoun_soulbinder_tuulani : public ScriptedAI +{ + npc_auchindoun_soulbinder_tuulani(Creature* creature) : ScriptedAI(creature), _isAtBarrier(false), _actionStarted(false) { } + + void DoAction(int32 action) override + { + if (action == ACTION_TUULANI_INTRO) + { + Talk(SAY_WELCOME_1); + + _scheduler.Schedule(4s + 300ms, [this](TaskContext task) + { + Talk(SAY_WELCOME_2); + + task.Schedule(6s, [this](TaskContext /*task*/) + { + me->GetMotionMaster()->MovePath(PATH_BARRIER, false); + }); + }); + } + else if (action == ACTION_TUULANI_BREAK_BARRIER) + { + if (!_isAtBarrier || _actionStarted) + return; + + _actionStarted = true; + + Talk(SAY_BREAK_BARRIER_1); + + _scheduler.Schedule(3s, [this](TaskContext task) + { + DoCast(SPELL_TUULANI_UNLOCK_VISUAL); + + task.Schedule(4s, [this](TaskContext task) + { + if (GameObject* holyBarrier = me->GetInstanceScript()->GetGameObject(DATA_HOLY_BARRIER)) + holyBarrier->SetGoState(GO_STATE_ACTIVE); + + task.Schedule(2s + 300ms, [this](TaskContext task) + { + Talk(SAY_BREAK_BARRIER_2); + + task.Schedule(1s + 300ms, [this](TaskContext /*task*/) + { + me->GetMotionMaster()->MovePath(PATH_MOVE_TO_BOSS, false); + }); + }); + }); + }); + } + } + + void WaypointReached(uint32 waypointId, uint32 pathId) override + { + if (pathId == PATH_BARRIER) + { + switch (waypointId) + { + case POINT_TALK: + { + _scheduler.Schedule(500ms, [this](TaskContext /*task*/) + { + Talk(SAY_WELCOME_3); + }); + break; + } + case POINT_BARRIER: + { + _isAtBarrier = true; + break; + } + default: + break; + } + } + else if (pathId == PATH_MOVE_TO_BOSS) + { + if (waypointId == POINT_SOULS) + { + _scheduler.Schedule(500ms, [this](TaskContext /*task*/) + { + me->SetFacingTo(1.727875f); + Talk(SAY_HEROES_SOULS); + }); + } + } + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + +private: + TaskScheduler _scheduler; + bool _isAtBarrier; + bool _actionStarted; +}; + +// 155647 - NPC Reaction +struct at_auchindoun_npc_reaction : AreaTriggerAI +{ + at_auchindoun_npc_reaction(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { } + + void OnUnitEnter(Unit* unit) override + { + if (!unit->IsCreature() || unit->GetEmoteState() == EMOTE_STATE_READY1H_ALLOW_MOVEMENT || unit->GetEntry() == NPC_SOULBINDER_TUULANI) + return; + + _scheduler.Schedule(1500ms, [this, unitGUID = unit->GetGUID()](TaskContext task) + { + Creature* auchenaiDefender = ObjectAccessor::GetCreature(*at, unitGUID); + if (!auchenaiDefender) + return; + + if (Unit* caster = at->GetCaster()) + auchenaiDefender->SetFacingToObject(caster); + auchenaiDefender->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE); + + task.Schedule(4s, [this, unitGUID](TaskContext /*task*/) + { + Creature* auchenaiDefender = ObjectAccessor::GetCreature(*at, unitGUID); + if (!auchenaiDefender) + return; + + auchenaiDefender->SetFacingTo(auchenaiDefender->GetHomePosition().GetOrientation()); + }); + }); + } + + void OnUpdate(uint32 diff) override + { + _scheduler.Update(diff); + } + +private: + TaskScheduler _scheduler; +}; + +// 157762 - Halo +class spell_auchindoun_halo : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_HALO_HEAL }); + } + + void HandleHit(SpellEffIndex /*effIndex*/) const + { + if (!GetHitUnit()->IsCreature()) + return; + + GetCaster()->CastSpell(GetHitUnit(), SPELL_HALO_HEAL, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_auchindoun_halo::HandleHit, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// 178800 - Grimrail Depot +class spell_auchindoun_grimrail_depot_scene_selector : public SpellScript +{ + void HandleDummy(SpellEffIndex /*effIndex*/) const + { + GetCaster()->CastSpell(GetHitUnit(), SPELL_GRIMRAIL_DEPOT_SCENE, true); + // GetCaster()->CastSpell(GetHitUnit(), SPELL_INSTANCE_BOOTSTRAPPER, false); + } + + void HandleEvent(SpellEffIndex /*effIndex*/) const + { + if (InstanceScript* instance = GetCaster()->GetInstanceScript()) + instance->SendEncounterUnit(ENCOUNTER_FRAME_PHASE_SHIFT_CHANGED, nullptr); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_auchindoun_grimrail_depot_scene_selector::HandleDummy, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHit += SpellEffectFn(spell_auchindoun_grimrail_depot_scene_selector::HandleEvent, EFFECT_1, SPELL_EFFECT_SEND_EVENT); + } +}; + +// 178747 - Grimrail Depot +class scene_auchindoun_soulbinder_nyami : public SceneScript +{ +public: + scene_auchindoun_soulbinder_nyami() : SceneScript("scene_auchindoun_soulbinder_nyami") { } + + static void HandleScene(Player* player) + { + player->ClearUnitState(UNIT_STATE_ROOT); + player->CastSpell(player, SPELL_GRIMRAIL_DEPOT_TELEPORT, true); + player->CastSpell(player, SPELL_GRIMRAIL_DEPOT_REMOVE_AURA, TRIGGERED_FULL_MASK); + PhasingHandler::OnConditionChange(player); + + Map* map = player->GetMap(); + if (!map->IsSpawnGroupActive(SPAWNGROUP_TUULANI_IMPRISONED)) + map->SpawnGroupSpawn(SPAWNGROUP_TUULANI_IMPRISONED); + } + + void OnSceneStart(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override + { + player->AddUnitState(UNIT_STATE_ROOT); + } + + void OnSceneComplete(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override + { + HandleScene(player); + } + + void OnSceneCancel(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override + { + HandleScene(player); + } +}; + +void AddSC_auchindoun() +{ + new at_auchindoun_entrance(); + new at_auchindoun_auchenai_defender_intro(); + new at_auchindoun_barrier(); + new at_auchindoun_soulbinder_nyami_scene(); + + RegisterAuchindounCreatureAI(npc_auchindoun_auchenai_defender); + RegisterAuchindounCreatureAI(npc_auchindoun_soulbinder_tuulani); + RegisterAreaTriggerAI(at_auchindoun_npc_reaction); + RegisterSpellScript(spell_auchindoun_halo); + RegisterSpellScript(spell_auchindoun_grimrail_depot_scene_selector); + + new scene_auchindoun_soulbinder_nyami(); +} diff --git a/src/server/scripts/Draenor/Auchindoun/auchindoun.h b/src/server/scripts/Draenor/Auchindoun/auchindoun.h new file mode 100644 index 00000000000..9383fe3aa0b --- /dev/null +++ b/src/server/scripts/Draenor/Auchindoun/auchindoun.h @@ -0,0 +1,66 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * 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 + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef _Auchindoun_h__ +#define _Auchindoun_h__ + +#include "CreatureAIImpl.h" + +constexpr char const* DataHeader = "Auchindoun"; +constexpr char const* AuchindounScriptName = "instance_auchindoun"; + +constexpr uint32 EncounterCount = 4; + +enum AuchindounDataTypes +{ + // Encounters + DATA_VIGILANT_KAATHAR = 0, + DATA_SOULBINDER_NYAMI = 1, + DATA_AZZAKEL = 2, + DATA_TERONGOR = 3, + + DATA_SOULBINDER_TUULANI, + + // GameObjects + DATA_HOLY_BARRIER, +}; + +enum AuchindounCreatureIds +{ + // Bosses + BOSS_VIGILANT_KAATHAR = 75839, + BOSS_SOULBINDER_NYAMI = 76177, + BOSS_AZZAKEL = 75927, + BOSS_TERONGOR = 77734, + + NPC_SOULBINDER_TUULANI = 79248 +}; + +enum AuchindounGameobjectIds +{ + GO_HOLY_BARRIER = 230398 +}; + +template <class AI, class T> +inline AI* GetAuchindounAI(T* obj) +{ + return GetInstanceAI<AI>(obj, AuchindounScriptName); +} + +#define RegisterAuchindounCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetAuchindounAI) + +#endif // _Auchindoun_h__ diff --git a/src/server/scripts/Draenor/Auchindoun/instance_auchindoun.cpp b/src/server/scripts/Draenor/Auchindoun/instance_auchindoun.cpp new file mode 100644 index 00000000000..8f5fc172a4a --- /dev/null +++ b/src/server/scripts/Draenor/Auchindoun/instance_auchindoun.cpp @@ -0,0 +1,71 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * 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 + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "InstanceScript.h" +#include "ScriptMgr.h" +#include "auchindoun.h" + +constexpr ObjectData creatureData[] = +{ + { BOSS_VIGILANT_KAATHAR, DATA_VIGILANT_KAATHAR }, + { BOSS_SOULBINDER_NYAMI, DATA_SOULBINDER_NYAMI }, + { BOSS_AZZAKEL, DATA_AZZAKEL }, + { BOSS_TERONGOR, DATA_TERONGOR }, + { NPC_SOULBINDER_TUULANI, DATA_SOULBINDER_TUULANI }, + { 0, 0 } // END +}; + +constexpr ObjectData objectData[] = +{ + { GO_HOLY_BARRIER, DATA_HOLY_BARRIER }, + { 0, 0 } // END +}; + +constexpr DungeonEncounterData encounters[] = +{ + { DATA_VIGILANT_KAATHAR, {{ 1678 }} }, + { DATA_SOULBINDER_NYAMI, {{ 1685 }} }, + { DATA_AZZAKEL, {{ 1686 }} }, + { DATA_TERONGOR, {{ 1714 }} } +}; + +class instance_auchindoun : public InstanceMapScript +{ +public: + instance_auchindoun() : InstanceMapScript("instance_auchindoun", 1182) { } + + struct instance_auchindoun_InstanceMapScript : public InstanceScript + { + instance_auchindoun_InstanceMapScript(InstanceMap* map) : InstanceScript(map) + { + SetHeaders(DataHeader); + SetBossNumber(EncounterCount); + LoadObjectData(creatureData, objectData); + LoadDungeonEncounterData(encounters); + } + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const override + { + return new instance_auchindoun_InstanceMapScript(map); + } +}; + +void AddSC_instance_auchindoun() +{ + new instance_auchindoun(); +} diff --git a/src/server/scripts/Draenor/draenor_script_loader.cpp b/src/server/scripts/Draenor/draenor_script_loader.cpp index b913ee77253..a9ea6c61bd0 100644 --- a/src/server/scripts/Draenor/draenor_script_loader.cpp +++ b/src/server/scripts/Draenor/draenor_script_loader.cpp @@ -20,6 +20,10 @@ void AddSC_assault_on_the_dark_portal(); void AddSC_draenor_shadowmoon_valley(); void AddSC_garrison_generic(); +// Auchindoun +void AddSC_instance_auchindoun(); +void AddSC_auchindoun(); + // The name of this function should match: // void Add${NameOfDirectory}Scripts() void AddDraenorScripts() @@ -27,4 +31,8 @@ void AddDraenorScripts() AddSC_assault_on_the_dark_portal(); AddSC_draenor_shadowmoon_valley(); AddSC_garrison_generic(); + + // Auchindoun + AddSC_instance_auchindoun(); + AddSC_auchindoun(); } |