From e0c88e3764f617da79b2abeef3545187d0bddbfe Mon Sep 17 00:00:00 2001 From: Aqua Deus <95978183+aquadeus@users.noreply.github.com> Date: Sun, 1 Feb 2026 00:08:58 +0100 Subject: [PATCH] Scripts/EyeOfAzshara: Implement King Deepbeard encounter (#31420) --- .../world/master/2026_01_31_16_world.sql | 68 ++++ src/server/game/Spells/SpellMgr.cpp | 12 + .../EyeOfAzshara/boss_king_deepbeard.cpp | 296 ++++++++++++++++++ .../BrokenIsles/EyeOfAzshara/eye_of_azshara.h | 62 ++++ .../EyeOfAzshara/instance_eye_of_azshara.cpp | 81 +++++ .../broken_isles_script_loader.cpp | 8 + 6 files changed, 527 insertions(+) create mode 100644 sql/updates/world/master/2026_01_31_16_world.sql create mode 100644 src/server/scripts/BrokenIsles/EyeOfAzshara/boss_king_deepbeard.cpp create mode 100644 src/server/scripts/BrokenIsles/EyeOfAzshara/eye_of_azshara.h create mode 100644 src/server/scripts/BrokenIsles/EyeOfAzshara/instance_eye_of_azshara.cpp diff --git a/sql/updates/world/master/2026_01_31_16_world.sql b/sql/updates/world/master/2026_01_31_16_world.sql new file mode 100644 index 0000000000..05d6cf1d55 --- /dev/null +++ b/sql/updates/world/master/2026_01_31_16_world.sql @@ -0,0 +1,68 @@ +-- Creature +DELETE FROM `creature_template_difficulty` WHERE (`Entry`=97916 AND `DifficultyID` IN (23, 2)); +INSERT INTO `creature_template_difficulty` (`Entry`, `DifficultyID`, `LevelScalingDeltaMin`, `LevelScalingDeltaMax`, `ContentTuningID`, `StaticFlags1`, `StaticFlags2`, `StaticFlags3`, `StaticFlags4`, `StaticFlags5`, `StaticFlags6`, `StaticFlags7`, `StaticFlags8`, `VerifiedBuild`) VALUES +(97916, 23, 2, 2, 629, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 63906), -- 97916 (Quake) - +(97916, 2, 2, 2, 628, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 64154); -- 97916 (Quake) - + +UPDATE `creature_template_difficulty` SET `HealthScalingExpansion`=6, `HealthModifier`=2, `CreatureDifficultyID`=98421, `TypeFlags`=0x400, `TypeFlags2`=128 WHERE (`Entry`=97916 AND `DifficultyID`=23); -- Quake +UPDATE `creature_template_difficulty` SET `ContentTuningID`=629, `StaticFlags1`=0x10000000, `VerifiedBuild`=63906 WHERE (`Entry`=91797 AND `DifficultyID`=0); -- 91797 (King Deepbeard) - CanSwim +UPDATE `creature_template_difficulty` SET `ContentTuningID`=628, `VerifiedBuild`=64154 WHERE (`Entry`=91797 AND `DifficultyID`=0); -- 91797 (King Deepbeard) - CanSwim +UPDATE `creature_template_difficulty` SET `LevelScalingDeltaMin`=0, `VerifiedBuild`=64154 WHERE (`Entry`=91797 AND `DifficultyID`=2); -- 91797 (King Deepbeard) - CanSwim + +UPDATE `creature_template` SET `faction`=14, `speed_walk`=1.60000002384185791, `speed_run`=0.571428596973419189, `BaseAttackTime`=2000, `unit_flags`=0x2000000, `unit_flags3`=0x80001, `AIName`='SmartAI' WHERE `entry`=97916; -- Quake +UPDATE `creature_template` SET `ScriptName`='boss_king_deepbeard' WHERE `entry`=91797; + +-- Instance +DELETE FROM `instance_template` WHERE `map`=1456; +INSERT INTO `instance_template` (`map`, `parent`, `script`) VALUES +(1456, 0, 'instance_eye_of_azshara'); + +-- Spells +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_king_deepbeard_ground_slam', 'spell_king_deepbeard_gaseous_bubbles'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(193093, 'spell_king_deepbeard_ground_slam'), +(193018, 'spell_king_deepbeard_gaseous_bubbles'); + +-- Areatrigger +DELETE FROM `areatrigger_template` WHERE `Id`= 9683; +INSERT INTO `areatrigger_template` (`Id`, `IsCustom`, `VerifiedBuild`) VALUES +(9683, 0, 62438); + +DELETE FROM `areatrigger_create_properties` WHERE (`IsCustom`=0 AND `Id` = 4968); +INSERT INTO `areatrigger_create_properties` (`Id`, `IsCustom`, `AreaTriggerId`, `IsAreatriggerCustom`, `Flags`, `MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`, `AnimId`, `AnimKitId`, `DecalPropertiesId`, `SpellForVisuals`, `TimeToTargetScale`, `Speed`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `ScriptName`, `VerifiedBuild`) VALUES +(4968, 0, 9683, 0, 6, 0, 0, 0, 0, -1, 0, 0, NULL, 20000, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 'at_king_deepbeard_call_the_seas', 63906); -- Spell: 193054 (Call the Seas) + +-- Conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=193051; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ConditionStringValue1`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 193051, 0, 0, 51, 0, 5, 97844, 0, '', 0, 0, 0, '', 'Spell \'Call the Seas\' can only hit \'Call the Seas\''); + +-- SAI +DELETE FROM `smart_scripts` WHERE `entryorguid`=97916 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(97916, 0, 0, 1, '', 11, 0, 100, 0, 0, 0, 0, 0, 0, '', 8, 0, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Quake - On Respawn - Set ReactState - React Passive'), +(97916, 0, 1, 2, '', 61, 0, 100, 0, 0, 0, 0, 0, 0, '', 11, 193175, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Quake - On Respawn - Cast \'Quake\''), +(97916, 0, 2, 0, '', 61, 0, 100, 1, 0, 0, 0, 0, 0, '', 11, 193159, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Quake - On Respawn - Cast \'Quake\''), +(97916, 0, 3, 0, '8,23', 11, 0, 100, 0, 0, 0, 0, 0, 0, '', 11, 193167, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Quake (Difficulties Mythic and M+) - On Respawn - Cast \'Aftershock\''); + +-- Texts +DELETE FROM `creature_text` WHERE `CreatureID`=91797; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(91797, 0, 0, 'You killed my son! Your punishment is death!', 14, 0, 50, 0, 0, 54317, 102316, 0, 'King Deepbeard to Player'), +(91797, 0, 1, 'You weaklings will drown beneath these waves!', 14, 0, 50, 0, 0, 54316, 102315, 0, 'King Deepbeard to Player'), +(91797, 1, 0, 'How long can you hold your breath, I wonder?', 14, 0, 100, 0, 0, 54312, 102305, 0, 'King Deepbeard'), +(91797, 2, 0, 'Before the crashing waves come the quake!', 14, 0, 33, 0, 0, 54314, 102307, 0, 'King Deepbeard'), +(91797, 2, 1, 'Pity you cannot survive without air!', 14, 0, 33, 0, 0, 54313, 102306, 0, 'King Deepbeard'), +(91797, 2, 2, 'The earth trembles before the rising tide!', 14, 0, 33, 0, 0, 54315, 102308, 0, 'King Deepbeard'), +(91797, 3, 0, '|TInterface\\Icons\\spell_frost_summonwaterelemental:20|t%s begins to cast |cFFFF0000|Hspell:193051|h[Call the Seas]|h|r!', 41, 0, 100, 0, 0, 54164, 99824, 0, 'King Deepbeard'), +(91797, 4, 0, 'The ocean will sweep you away!', 14, 0, 50, 0, 0, 54164, 102302, 0, 'King Deepbeard'), +(91797, 4, 1, 'Seas! Obey my command!', 14, 0, 50, 0, 0, 54310, 102303, 0, 'King Deepbeard'), +(91797, 5, 0, '%s goes into a frenzy!', 16, 0, 100, 0, 0, 54311, 38630, 0, 'King Deepbeard'), +(91797, 6, 0, 'BUURRRP', 14, 0, 100, 0, 0, 54311, 102304, 0, 'King Deepbeard'), +(91797, 7, 0, 'I failed... but my Queen will NOT.', 14, 0, 25, 0, 0, 54319, 102312, 0, 'King Deepbeard to Player'), +(91797, 7, 1, 'You haven\'t won. She is almost here...', 14, 0, 25, 0, 0, 54318, 102311, 0, 'King Deepbeard to Player'), +(91797, 7, 2, 'The oceans rest... but the wind still rises against you.', 14, 0, 25, 0, 0, 54320, 102309, 0, 'King Deepbeard to Player'), +(91797, 7, 3, 'Gaaah... The winds will finish you, intruders.', 14, 0, 25, 0, 0, 54322, 102310, 0, 'King Deepbeard to Player'), +(91797, 8, 0, 'Blood repays blood.', 14, 0, 50, 0, 0, 54329, 102314, 0, 'King Deepbeard'), +(91797, 8, 1, 'Justice for the son you murdered!', 14, 0, 50, 0, 0, 54326, 102313, 0, 'King Deepbeard'), +(91797, 9, 0, 'This was as inevitable as the tides, fools.', 14, 0, 100, 0, 0, 54332, 102317, 0, 'King Deepbeard'); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index ce58745679..b9f70feaf8 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -4764,6 +4764,18 @@ void SpellMgr::LoadSpellInfoCorrections() // ENDOF BLACK ROOK HOLD SPELLS + // + // EYE OF AZSHARA SPELLS + // + + // Gaseous Bubbles + ApplySpellFix({ 193018 }, [](SpellInfo* spellInfo) + { + spellInfo->Attributes |= SPELL_ATTR0_AURA_IS_DEBUFF; + }); + + // ENDOF EYE OF AZSHARA SPELLS + // // ANTORUS THE BURNING THRONE SPELLS // diff --git a/src/server/scripts/BrokenIsles/EyeOfAzshara/boss_king_deepbeard.cpp b/src/server/scripts/BrokenIsles/EyeOfAzshara/boss_king_deepbeard.cpp new file mode 100644 index 0000000000..ecc6600db9 --- /dev/null +++ b/src/server/scripts/BrokenIsles/EyeOfAzshara/boss_king_deepbeard.cpp @@ -0,0 +1,296 @@ +/* + * 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 . + */ + +#include "AreaTrigger.h" +#include "AreaTriggerAI.h" +#include "Creature.h" +#include "GridNotifiersImpl.h" +#include "InstanceScript.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellAuras.h" +#include "SpellScript.h" +#include "eye_of_azshara.h" + +enum KingDeepbeardSpells +{ + SPELL_CALL_THE_SEAS = 193051, + SPELL_CALL_THE_SEAS_AT = 193054, + SPELL_CALL_THE_SEAS_DAMAGE = 193055, + SPELL_GASEOUS_BUBBLES = 193018, + SPELL_GASEOUS_EXPLOSION = 193047, + SPELL_GROUND_SLAM = 193093, + SPELL_GROUND_SLAM_MISSILE = 193056, + SPELL_QUAKE = 193152, + SPELL_FRENZY = 197550 +}; + +enum KingDeepbeardEvents +{ + EVENT_ENERGIZE = 1, + EVENT_CALL_THE_SEAS, + EVENT_GASEOUS_BUBBLES, + EVENT_GROUND_SLAM +}; + +enum KingDeepbeardTexts +{ + SAY_AGGRO = 0, + SAY_GASEOUS_BUBBLES = 1, + SAY_QUAKE = 2, + SAY_CALL_THE_SEAS_WARNING = 3, + SAY_CALL_THE_SEAS = 4, + SAY_FRENZY_WARNING = 5, + SAY_FRENZY = 6, + SAY_DEATH = 7, + SAY_SLAY = 8, + SAY_WIPE = 9 +}; + +enum KingDeepbeardMisc +{ + NPC_CALL_THE_SEAS = 97844, + NPC_QUAKE = 97916, +}; + +// 91797 - King Deepbeard +struct boss_king_deepbeard : public BossAI +{ + boss_king_deepbeard(Creature* creature) : BossAI(creature, DATA_KING_DEEPBEARD) { } + + void JustAppeared() override + { + me->SetPower(me->GetPowerType(), 30); + } + + void KilledUnit(Unit* victim) override + { + if (!victim->IsPlayer()) + return; + + Talk(SAY_SLAY); + } + + void RemoveQuakes() + { + std::list quakes; + Trinity::AllCreaturesOfEntryInRange checker(me, NPC_QUAKE, 200.0f); + Trinity::CreatureListSearcher searcher(me, quakes, checker); + Cell::VisitAllObjects(me, searcher, 200.0f); + + if (quakes.empty()) + return; + + for (Creature* quake : quakes) + quake->DespawnOrUnsummon(); + } + + void RemoveCallTheSeas() + { + std::list callTheSeas; + Trinity::AllCreaturesOfEntryInRange checker(me, NPC_CALL_THE_SEAS, 200.0f); + Trinity::CreatureListSearcher searcher(me, callTheSeas, checker); + Cell::VisitAllObjects(me, searcher, 200.0f); + + if (callTheSeas.empty()) + return; + + for (Creature* callTheSea : callTheSeas) + callTheSea->RemoveAurasDueToSpell(SPELL_CALL_THE_SEAS_AT); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + instance->SetBossState(DATA_KING_DEEPBEARD, DONE); + Talk(SAY_DEATH); + + RemoveQuakes(); + RemoveCallTheSeas(); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + instance->SetBossState(DATA_KING_DEEPBEARD, FAIL); + + Talk(SAY_WIPE); + + RemoveQuakes(); + RemoveCallTheSeas(); + + _EnterEvadeMode(); + _DespawnAtEvade(); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1); + instance->SetBossState(DATA_KING_DEEPBEARD, IN_PROGRESS); + + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_ENERGIZE, 1s); + events.ScheduleEvent(EVENT_CALL_THE_SEAS, 20500ms); + events.ScheduleEvent(EVENT_GASEOUS_BUBBLES, 12800ms); + events.ScheduleEvent(EVENT_GROUND_SLAM, 6s); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override + { + if (me->HealthBelowPctDamaged(30, damage) && !me->HasAura(SPELL_FRENZY)) + { + Talk(SAY_FRENZY_WARNING); + Talk(SAY_FRENZY); + DoCastSelf(SPELL_FRENZY); + } + } + + void UpdateAI(uint32 diff) override + { + scheduler.Update(diff); + + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_ENERGIZE: + { + if (me->GetPower(me->GetPowerType()) == 100) + { + Talk(SAY_QUAKE); + DoCast(SPELL_QUAKE); + events.RescheduleEvent(EVENT_ENERGIZE, 1500ms); + } + else + { + me->SetPower(me->GetPowerType(), me->GetPower(me->GetPowerType()) + 5); + events.Repeat(1s); + } + break; + } + case EVENT_CALL_THE_SEAS: + { + Talk(SAY_CALL_THE_SEAS_WARNING); + Talk(SAY_CALL_THE_SEAS); + DoCastSelf(SPELL_CALL_THE_SEAS); + events.Repeat(30400ms); + break; + } + case EVENT_GASEOUS_BUBBLES: + { + Talk(SAY_GASEOUS_BUBBLES); + DoCastAOE(SPELL_GASEOUS_BUBBLES); + events.Repeat(32800ms, 35300ms); + break; + } + case EVENT_GROUND_SLAM: + { + DoCastVictim(SPELL_GROUND_SLAM); + events.Repeat(21800ms); + break; + } + default: + break; + } + } + } +}; + +// 193093 - Ground Slam +class spell_king_deepbeard_ground_slam : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_GROUND_SLAM_MISSILE }); + } + + void OnPrecast() override + { + GetCaster()->CastSpell(GetExplTargetUnit()->GetPosition(), SPELL_GROUND_SLAM_MISSILE, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + } + + void Register() override { } +}; + +// 193018 - Gaseous Bubbles +class spell_king_deepbeard_gaseous_bubbles : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_GASEOUS_EXPLOSION }); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; + + Unit* target = GetTarget(); + target->CastSpell(target, SPELL_GASEOUS_EXPLOSION, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_king_deepbeard_gaseous_bubbles::OnRemove, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL); + } +}; + +// 193054 - Call the Seas +// Id - 4968 +struct at_king_deepbeard_call_the_seas : AreaTriggerAI +{ + using AreaTriggerAI::AreaTriggerAI; + + void OnUnitEnter(Unit* unit) override + { + Unit* caster = at->GetCaster(); + if (!caster) + return; + + if (!unit->IsPlayer()) + return; + + caster->CastSpell(unit, SPELL_CALL_THE_SEAS_DAMAGE, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + } + + void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override + { + unit->RemoveAurasDueToSpell(SPELL_CALL_THE_SEAS_DAMAGE); + } +}; + +void AddSC_boss_king_deepbeard() +{ + RegisterEyeOfAzsharaCreatureAI(boss_king_deepbeard); + + RegisterSpellScript(spell_king_deepbeard_ground_slam); + RegisterSpellScript(spell_king_deepbeard_gaseous_bubbles); + + RegisterAreaTriggerAI(at_king_deepbeard_call_the_seas); +} diff --git a/src/server/scripts/BrokenIsles/EyeOfAzshara/eye_of_azshara.h b/src/server/scripts/BrokenIsles/EyeOfAzshara/eye_of_azshara.h new file mode 100644 index 0000000000..5de92b453a --- /dev/null +++ b/src/server/scripts/BrokenIsles/EyeOfAzshara/eye_of_azshara.h @@ -0,0 +1,62 @@ +/* + * 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 . + */ + +#ifndef DEF_EYE_OF_AZSHARA_H_ +#define DEF_EYE_OF_AZSHARA_H_ + +#include "CreatureAIImpl.h" + +#define DataHeader "EyeOfAzshara" +#define EOAScriptName "instance_eye_of_azshara" + +uint32 const EncounterCount = 5; + +enum EOADataTypes +{ + // Encounters + DATA_WARLORD_PARJESH = 0, + DATA_LADY_HATECOIL, + DATA_KING_DEEPBEARD, + DATA_SERPENTRIX, + DATA_WRATH_OF_AZSHARA +}; + +enum EOACreatureIds +{ + // Bosses + BOSS_WARLORD_PARJESH = 91784, + BOSS_LADY_HATECOIL = 91789, + BOSS_KING_DEEPBEARD = 91797, + BOSS_SERPENTRIX = 91808, + BOSS_WRATH_OF_AZSHARA = 96028 +}; + +enum EOAGameObjectIds +{ + GO_WATER_DOOR_1 = 246983, + GO_WATER_DOOR_2 = 246982 +}; + +template +inline AI* GetEyeOfAzsharaAI(T* obj) +{ + return GetInstanceAI(obj, EOAScriptName); +} + +#define RegisterEyeOfAzsharaCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetEyeOfAzsharaAI) + +#endif // DEF_EYE_OF_AZSHARA_H_ diff --git a/src/server/scripts/BrokenIsles/EyeOfAzshara/instance_eye_of_azshara.cpp b/src/server/scripts/BrokenIsles/EyeOfAzshara/instance_eye_of_azshara.cpp new file mode 100644 index 0000000000..26fb853459 --- /dev/null +++ b/src/server/scripts/BrokenIsles/EyeOfAzshara/instance_eye_of_azshara.cpp @@ -0,0 +1,81 @@ +/* + * 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 . + */ + +#include "AreaBoundary.h" +#include "InstanceScript.h" +#include "ScriptMgr.h" +#include "eye_of_azshara.h" + +BossBoundaryData const boundaries = +{ + { DATA_KING_DEEPBEARD, new CircleBoundary(Position(-3448.65f, 4161.68f, 29.18f), 68.0f) } +}; + +ObjectData const creatureData[] = +{ + { BOSS_WARLORD_PARJESH, DATA_WARLORD_PARJESH }, + { BOSS_LADY_HATECOIL, DATA_LADY_HATECOIL }, + { BOSS_KING_DEEPBEARD, DATA_KING_DEEPBEARD }, + { BOSS_SERPENTRIX, DATA_SERPENTRIX }, + { BOSS_WRATH_OF_AZSHARA, DATA_WRATH_OF_AZSHARA }, + { 0, 0 } // END +}; + +DoorData const doorData[] = +{ + { GO_WATER_DOOR_1, DATA_KING_DEEPBEARD, EncounterDoorBehavior::OpenWhenNotInProgress }, + { GO_WATER_DOOR_2, DATA_KING_DEEPBEARD, EncounterDoorBehavior::OpenWhenNotInProgress }, + { 0, 0, EncounterDoorBehavior::OpenWhenNotInProgress } // END +}; + +DungeonEncounterData const encounters[] = +{ + { DATA_WARLORD_PARJESH, {{ 1810 }} }, + { DATA_LADY_HATECOIL, {{ 1811 }} }, + { DATA_KING_DEEPBEARD, {{ 1812 }} }, + { DATA_SERPENTRIX, {{ 1813 }} }, + { DATA_WRATH_OF_AZSHARA, {{ 1814 }} } +}; + +class instance_eye_of_azshara : public InstanceMapScript +{ +public: + instance_eye_of_azshara() : InstanceMapScript(EOAScriptName, 1456) { } + + struct AddSC_instance_eye_of_azshara_InstanceMapScript : public InstanceScript + { + AddSC_instance_eye_of_azshara_InstanceMapScript(InstanceMap* map) : InstanceScript(map) + { + SetHeaders(DataHeader); + SetBossNumber(EncounterCount); + LoadObjectData(creatureData, nullptr); + LoadDoorData(doorData); + LoadDungeonEncounterData(encounters); + LoadBossBoundaries(boundaries); + } + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const override + { + return new AddSC_instance_eye_of_azshara_InstanceMapScript(map); + } +}; + +void AddSC_instance_eye_of_azshara() +{ + new instance_eye_of_azshara(); +} diff --git a/src/server/scripts/BrokenIsles/broken_isles_script_loader.cpp b/src/server/scripts/BrokenIsles/broken_isles_script_loader.cpp index 4ef15d6972..25c5c70e7c 100644 --- a/src/server/scripts/BrokenIsles/broken_isles_script_loader.cpp +++ b/src/server/scripts/BrokenIsles/broken_isles_script_loader.cpp @@ -36,6 +36,10 @@ void AddSC_instance_black_rook_hold(); void AddSC_boss_rokmora(); void AddSC_instance_neltharions_lair(); +// Eye of Azshara +void AddSC_boss_king_deepbeard(); +void AddSC_instance_eye_of_azshara(); + // Orderhalls void AddSC_orderhall_warrior(); void AddSC_orderhall_rogue(); @@ -63,6 +67,10 @@ void AddBrokenIslesScripts() AddSC_boss_rokmora(); AddSC_instance_neltharions_lair(); + // Eye of Azshara + AddSC_boss_king_deepbeard(); + AddSC_instance_eye_of_azshara(); + // Orderhalls AddSC_orderhall_warrior(); AddSC_orderhall_rogue();