aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAqua Deus <95978183+aquadeus@users.noreply.github.com>2025-07-26 15:19:32 +0200
committerGitHub <noreply@github.com>2025-07-26 15:19:32 +0200
commit43644e4c296dc2036c4cea81854e79c76d81de81 (patch)
treefba242063eca9b512278d425fdcb68c047c2104b
parent6c51b005c26d57ff70cc479e71a6e227f717e1fd (diff)
Scripts/ReturnToKarazhan: Implement The Curator encounter (#31146)
-rw-r--r--sql/updates/world/master/2025_07_26_00_world.sql87
-rw-r--r--src/server/scripts/EasternKingdoms/ReturnToKarazhan/boss_the_curator_rtk.cpp327
-rw-r--r--src/server/scripts/EasternKingdoms/ReturnToKarazhan/instance_return_to_karazhan.cpp10
-rw-r--r--src/server/scripts/EasternKingdoms/ReturnToKarazhan/return_to_karazhan.h10
-rw-r--r--src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp2
5 files changed, 433 insertions, 3 deletions
diff --git a/sql/updates/world/master/2025_07_26_00_world.sql b/sql/updates/world/master/2025_07_26_00_world.sql
new file mode 100644
index 00000000000..b3737ceb62c
--- /dev/null
+++ b/sql/updates/world/master/2025_07_26_00_world.sql
@@ -0,0 +1,87 @@
+SET @CGUID := 6005878;
+SET @SPAWNGROUP := 1268;
+
+-- Creature
+DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+2;
+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`, `MovementType`, `npcflag`, `unit_flags`, `unit_flags2`, `unit_flags3`, `VerifiedBuild`) VALUES
+(@CGUID+0, 116804, 1651, 8443, 8443, '23,2,8', '0', 0, 0, 0, -11140.375, -1886.9410400390625, 165.8487396240234375, 3.765622377395629882, 7200, 0, 0, 0, NULL, NULL, NULL, NULL, 61609), -- Scene Actor (Area: Karazhan - Difficulty: Mythic) CreateObject2
+(@CGUID+1, 115491, 1651, 8443, 8443, '23,2,8', '0', 0, 0, 0, -11168.97265625, -1911.078125, 165.8487548828125, 6.273388862609863281, 7200, 0, 0, 0, NULL, NULL, NULL, NULL, 61609), -- Medivh (Area: Karazhan - Difficulty: Mythic) CreateObject2 (Auras: 229485 - Vision)
+(@CGUID+2, 114462, 1651, 8443, 8443, '23,2,8', '0', 0, 0, 0, -11164.689453125, -1912.8975830078125, 165.8487396240234375, 1.612735271453857421, 7200, 0, 0, 0, NULL, NULL, NULL, NULL, 61609); -- The Curator (Area: Karazhan - Difficulty: Mythic) CreateObject2 (Auras: 229609 - Vision)
+
+UPDATE `creature_template` SET `ScriptName`='boss_the_curator_rtk' WHERE `entry`=114247;
+UPDATE `creature_template` SET `faction`=16, `BaseAttackTime`=2000, `unit_flags2`=0x800, `unit_flags3`=0x80000, `AIName`='SmartAI' WHERE `entry`=114249; -- Volatile Energy
+UPDATE `creature_template` SET `unit_flags3`=0x1000001 WHERE `entry`=116804; -- Scene Actor
+UPDATE `creature_template` SET `unit_flags`=0x300, `unit_flags2`=0x800 WHERE `entry`=114462; -- The Curator
+UPDATE `creature_template` SET `unit_flags2`=0x800 WHERE `entry` IN (116124, 115491); -- Medivh
+
+DELETE FROM `creature_template_addon` WHERE `entry` IN (114462, 115491, 114249);
+INSERT INTO `creature_template_addon` (`entry`, `PathId`, `mount`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvpFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
+(114249, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '227268'), -- 114249 (Volatile Energy) - Volatile Energy Passive
+(114462, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 4, '229609'), -- 114462 (The Curator) - Vision
+(115491, 0, 0, 0, 0, 0, 1, 0, 0, 4817, 0, 0, 4, '229485'); -- 115491 (Medivh) - Vision
+
+-- Difficulty
+DELETE FROM `creature_template_difficulty` WHERE (`DifficultyID`=23 AND `Entry` IN (114462,115491));
+INSERT INTO `creature_template_difficulty` (`Entry`, `DifficultyID`, `LevelScalingDeltaMin`, `LevelScalingDeltaMax`, `ContentTuningID`, `StaticFlags1`, `StaticFlags2`, `StaticFlags3`, `StaticFlags4`, `StaticFlags5`, `StaticFlags6`, `StaticFlags7`, `StaticFlags8`, `VerifiedBuild`) VALUES
+(114462, 23, 0, 0, 629, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 61609), -- 114462 (The Curator) -
+(115491, 23, 0, 0, 629, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 61609); -- 115491 (Medivh) -
+
+UPDATE `creature_template_difficulty` SET `HealthScalingExpansion`=6, `HealthModifier`=13.75, `CreatureDifficultyID`=119052, `TypeFlags`=0x4 WHERE (`Entry`=115491 AND `DifficultyID`=23); -- Medivh
+UPDATE `creature_template_difficulty` SET `HealthScalingExpansion`=6, `HealthModifier`=44, `ManaModifier`=20, `CreatureDifficultyID`=117838, `TypeFlags`=0x24 WHERE (`Entry`=114462 AND `DifficultyID`=23); -- The Curator
+UPDATE `creature_template_difficulty` SET `LevelScalingDeltaMin`=1, `LevelScalingDeltaMax`=1, `ContentTuningID`=629, `VerifiedBuild`=61609 WHERE (`Entry`=114249 AND `DifficultyID`=23); -- 114249 (Volatile Energy) -
+
+DELETE FROM `creature_summon_groups` WHERE `summonerId`=114247;
+INSERT INTO `creature_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `position_x`, `position_y`, `position_z`, `orientation`, `summonType`, `summonTime`, `Comment`) VALUES
+(114247, 0, 0, 116804, -11140.375, -1886.9410400390625, 165.8487396240234375, 3.765622377395629882, 8, 0, 'The Curator - Summon group on death'),
+(114247, 0, 0, 114462, -11164.689453125, -1912.8975830078125, 165.8487396240234375, 1.612735271453857421, 8, 0, 'The Curator - Summon group on death'),
+(114247, 0, 0, 115491, -11168.97265625, -1911.078125, 165.8487548828125, 6.273388862609863281, 8, 0, 'The Curator - Summon group on death');
+
+-- Spells
+DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_the_curator_rtk_summon_volatile_energy_selector', 'spell_the_curator_rtk_power_discharge_selector', 'spell_the_curator_rtk_arc_lightning_selector', 'spell_the_curator_rtk_static_charge_selector', 'spell_the_curator_rtk_overload');
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(234416, 'spell_the_curator_rtk_summon_volatile_energy_selector'),
+(227278, 'spell_the_curator_rtk_power_discharge_selector'),
+(227269, 'spell_the_curator_rtk_arc_lightning_selector'),
+(228735, 'spell_the_curator_rtk_static_charge_selector'),
+(227256, 'spell_the_curator_rtk_overload');
+
+-- Areatriggers
+DELETE FROM `areatrigger_create_properties` WHERE (`IsCustom`=0 AND `Id` = 8780);
+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
+(8780, 0, 12848, 0, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 'at_the_curator_rtk_power_discharge', 61609); -- Spell: 227289 (Power Discharge)
+
+DELETE FROM `areatrigger_template` WHERE (`IsCustom`=0 AND `Id` = 12848);
+INSERT INTO `areatrigger_template` (`Id`, `IsCustom`, `Flags`, `VerifiedBuild`) VALUES
+(12848, 0, 0, 61609);
+
+-- Texts
+DELETE FROM `creature_text` WHERE `CreatureID` IN (115491, 114462, 114247);
+INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
+(115491, 0, 0, 'Now you\'re ready to oversee the tower\'s protection in my absence.', 12, 0, 100, 1, 0, 78197, 124000, 0, 'Medivh'),
+(115491, 1, 0, 'Hmm, I must remember to shut you down from time to time. Overuse might cause you to become... erratic.', 12, 0, 100, 25, 0, 78198, 124002, 0, 'Medivh'),
+(114462, 0, 0, 'Defense protocols activated.', 14, 0, 100, 0, 0, 78201, 124001, 0, 'Curator to Medivh'),
+(114247, 0, 0, 'Welcome to the-- TERMINATE INTRUDERS!', 14, 0, 100, 0, 0, 77229, 123421, 0, 'The Curator'),
+(114247, 0, 1, 'The Menagerie is for-- ERADICATE! ERADICATE!', 14, 0, 100, 0, 0, 77181, 123138, 0, 'The Curator'),
+(114247, 1, 0, 'Countermeasures deployed.', 12, 0, 100, 0, 0, 77224, 123423, 0, 'The Curator'),
+(114247, 1, 1, 'DETERRENT ACTIVATED!', 12, 0, 100, 0, 0, 77227, 123424, 0, 'The Curator'),
+(114247, 2, 0, 'Overload in progress. Prepare for-- PURGE! PURGE! PURGE!', 12, 0, 100, 0, 0, 77183, 123140, 0, 'The Curator'),
+(114247, 3, 0, 'EXTERMINATED!', 12, 0, 100, 0, 0, 77184, 123141, 0, 'The Curator'),
+(114247, 3, 1, 'Attention guests: DIE! DIE! DIE!', 12, 0, 100, 0, 0, 77185, 123142, 0, 'The Curator'),
+(114247, 4, 0, 'Curator is no longer op... er... ation... al.', 14, 0, 100, 0, 0, 77182, 123139, 0, 'The Curator'),
+(114247, 4, 1, 'System... failure... im... mi... nent...', 14, 0, 100, 0, 0, 77228, 123422, 0, 'The Curator');
+
+-- SAI
+DELETE FROM `smart_scripts` WHERE `entryorguid`=114249 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
+(114249, 0, 0, 0, '', 0, 0, 100, 0, 0, 1000, 6000, 6000, 0, '', 85, 228735, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Volatile Energy - In combat (6 seconds) - Cast "Static Charge"');
+
+-- Spawngroup
+DELETE FROM `spawn_group` WHERE `groupId`=@SPAWNGROUP;
+INSERT INTO `spawn_group` (`groupId`, `spawnType`, `spawnId`) VALUES
+(@SPAWNGROUP, 0, @CGUID+0),
+(@SPAWNGROUP, 0, @CGUID+1),
+(@SPAWNGROUP, 0, @CGUID+2);
+
+DELETE FROM `spawn_group_template` WHERE `groupId`=@SPAWNGROUP;
+INSERT INTO `spawn_group_template` (`groupId`, `groupName`, `groupFlags`) VALUES
+(@SPAWNGROUP, 'Karazhan - The Curator outro', 4);
diff --git a/src/server/scripts/EasternKingdoms/ReturnToKarazhan/boss_the_curator_rtk.cpp b/src/server/scripts/EasternKingdoms/ReturnToKarazhan/boss_the_curator_rtk.cpp
new file mode 100644
index 00000000000..7c4673fdb98
--- /dev/null
+++ b/src/server/scripts/EasternKingdoms/ReturnToKarazhan/boss_the_curator_rtk.cpp
@@ -0,0 +1,327 @@
+/*
+ * 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 "InstanceScript.h"
+#include "ScriptedCreature.h"
+#include "ScriptMgr.h"
+#include "SpellAuras.h"
+#include "SpellAuraEffects.h"
+#include "SpellScript.h"
+#include "return_to_karazhan.h"
+
+enum TheCuratorRTKSpells
+{
+ SPELL_COSMETIC_MANA_DRAIN = 228840,
+ SPELL_SUMMON_VOLATILE_ENERGY = 227267,
+ SPELL_SUMMON_VOLATILE_ENERGY_SELECTOR = 234416,
+ SPELL_POWER_DISCHARGE = 227279,
+ SPELL_POWER_DISCHARGE_AREATRIGGER = 227289,
+ SPELL_POWER_DISCHARGE_DAMAGE = 227465,
+ SPELL_POWER_DISCHARGE_SELECTOR = 227278,
+ SPELL_EVOCATION = 227254,
+ SPELL_OVERLOAD = 227256,
+ SPELL_OVERLOAD_DAMAGE = 227257,
+ SPELL_ARC_LIGHTNING_DAMAGE = 227270,
+ SPELL_STATIC_CHARGE = 228736
+};
+
+enum TheCuratorRTKEvents
+{
+ EVENT_VOLATILE_ENERGY = 1,
+ EVENT_POWER_DISCHARGE,
+ EVENT_CHECK_MANA,
+};
+
+enum TheCuratorRTKTexts
+{
+ SAY_AGGRO = 0,
+ SAY_VOLATILE_ENERGY = 1,
+ SAY_EVOCATION = 2,
+ SAY_SLAY = 3,
+ SAY_DEAD = 4
+};
+
+enum TheCuratorRTKMisc
+{
+ SUMMON_GROUP_MEDIVH_SCENE = 0
+};
+
+// 114247 - The Curator
+struct boss_the_curator_rtk : public BossAI
+{
+ boss_the_curator_rtk(Creature* creature) : BossAI(creature, DATA_THE_CURATOR_RTK) { }
+
+ void RemoveAreaTriggers() const
+ {
+ for (AreaTrigger* powerDischarge : me->GetAreaTriggers(SPELL_POWER_DISCHARGE_AREATRIGGER))
+ powerDischarge->Remove();
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
+ _JustDied();
+ Talk(SAY_DEAD);
+ RemoveAreaTriggers();
+
+ me->SummonCreatureGroup(SUMMON_GROUP_MEDIVH_SCENE);
+ }
+
+ void EnterEvadeMode(EvadeReason /*why*/) override
+ {
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
+ summons.DespawnAll();
+ RemoveAreaTriggers();
+ _EnterEvadeMode();
+ _DespawnAtEvade();
+ }
+
+ void KilledUnit(Unit* victim) override
+ {
+ if (!victim->IsPlayer())
+ return;
+
+ Talk(SAY_SLAY);
+ }
+
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ Talk(SAY_AGGRO);
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
+
+ DoCastSelf(SPELL_COSMETIC_MANA_DRAIN);
+
+ events.ScheduleEvent(EVENT_VOLATILE_ENERGY, 5s);
+ events.ScheduleEvent(EVENT_POWER_DISCHARGE, 12s);
+ events.ScheduleEvent(EVENT_CHECK_MANA, 500ms);
+ }
+
+ void OnChannelFinished(SpellInfo const* spell) override
+ {
+ if (spell->Id != SPELL_EVOCATION)
+ return;
+
+ DoCastSelf(SPELL_OVERLOAD);
+ DoCastSelf(SPELL_COSMETIC_MANA_DRAIN);
+ events.ScheduleEvent(EVENT_VOLATILE_ENERGY, 9200ms);
+ events.ScheduleEvent(EVENT_POWER_DISCHARGE, 12s);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_VOLATILE_ENERGY:
+ {
+ Talk(SAY_VOLATILE_ENERGY);
+ DoCastSelf(SPELL_SUMMON_VOLATILE_ENERGY_SELECTOR);
+ events.Repeat(9700ms);
+ break;
+ }
+ case EVENT_POWER_DISCHARGE:
+ {
+ DoCastSelf(SPELL_POWER_DISCHARGE_SELECTOR);
+ events.Repeat(12s);
+ break;
+ }
+ case EVENT_CHECK_MANA:
+ {
+ if (me->GetPower(POWER_MANA) <= 0)
+ {
+ Talk(SAY_EVOCATION);
+ me->RemoveAurasDueToSpell(SPELL_COSMETIC_MANA_DRAIN);
+ DoCastSelf(SPELL_EVOCATION);
+ me->SetReactState(REACT_PASSIVE);
+ events.CancelEvent(EVENT_VOLATILE_ENERGY);
+ events.CancelEvent(EVENT_POWER_DISCHARGE);
+ }
+ events.Repeat(500ms);
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ }
+ }
+};
+
+// 234416 - Summon Volatile Energy
+class spell_the_curator_rtk_summon_volatile_energy_selector : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_SUMMON_VOLATILE_ENERGY });
+ }
+
+ void HandleHitTarget(SpellEffIndex /*effIndex*/) const
+ {
+ GetCaster()->CastSpell(GetHitUnit(), SPELL_SUMMON_VOLATILE_ENERGY, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringSpell = GetSpell()
+ });
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_the_curator_rtk_summon_volatile_energy_selector::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 227278 - Power Discharge
+class spell_the_curator_rtk_power_discharge_selector : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_POWER_DISCHARGE });
+ }
+
+ void HandleHitTarget(SpellEffIndex /*effIndex*/) const
+ {
+ GetCaster()->CastSpell(GetHitUnit(), SPELL_POWER_DISCHARGE, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringSpell = GetSpell()
+ });
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_the_curator_rtk_power_discharge_selector::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 227269 - Arc Lightning
+class spell_the_curator_rtk_arc_lightning_selector : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_ARC_LIGHTNING_DAMAGE });
+ }
+
+ void HandleHitTarget(SpellEffIndex /*effIndex*/) const
+ {
+ GetCaster()->CastSpell(GetHitUnit(), SPELL_ARC_LIGHTNING_DAMAGE, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringSpell = GetSpell()
+ });
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_the_curator_rtk_arc_lightning_selector::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 228735 - Static Charge
+class spell_the_curator_rtk_static_charge_selector : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_STATIC_CHARGE });
+ }
+
+ void HandleHitTarget(SpellEffIndex /*effIndex*/) const
+ {
+ GetCaster()->CastSpell(GetHitUnit(), SPELL_STATIC_CHARGE, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringSpell = GetSpell()
+ });
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_the_curator_rtk_static_charge_selector::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 227256 - Overload
+class spell_the_curator_rtk_overload : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_OVERLOAD_DAMAGE });
+ }
+
+ void HandleHitTarget(SpellEffIndex /*effIndex*/) const
+ {
+ Creature* creatureCaster = GetCaster()->ToCreature();
+ if (!creatureCaster)
+ return;
+
+ creatureCaster->CastSpell(GetHitUnit(), SPELL_OVERLOAD_DAMAGE, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringSpell = GetSpell()
+ });
+ creatureCaster->SetReactState(REACT_AGGRESSIVE);
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_the_curator_rtk_overload::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 227289 Power Discharge
+struct at_the_curator_rtk_power_discharge : AreaTriggerAI
+{
+ using AreaTriggerAI::AreaTriggerAI;
+
+ void OnUnitEnter(Unit* unit) override
+ {
+ if (!unit->IsPlayer())
+ return;
+
+ Unit* caster = at->GetCaster();
+ if (!caster)
+ return;
+
+ caster->CastSpell(unit, SPELL_POWER_DISCHARGE_DAMAGE, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
+ }
+
+ void OnUnitExit(Unit* unit) override
+ {
+ unit->RemoveAurasDueToSpell(SPELL_POWER_DISCHARGE_DAMAGE, at->GetCasterGuid());
+ }
+};
+
+void AddSC_boss_the_curator_rtk()
+{
+ RegisterReturnToKarazhanCreatureAI(boss_the_curator_rtk);
+
+ RegisterSpellScript(spell_the_curator_rtk_summon_volatile_energy_selector);
+ RegisterSpellScript(spell_the_curator_rtk_power_discharge_selector);
+ RegisterSpellScript(spell_the_curator_rtk_arc_lightning_selector);
+ RegisterSpellScript(spell_the_curator_rtk_static_charge_selector);
+ RegisterSpellScript(spell_the_curator_rtk_overload);
+
+ RegisterAreaTriggerAI(at_the_curator_rtk_power_discharge);
+}
diff --git a/src/server/scripts/EasternKingdoms/ReturnToKarazhan/instance_return_to_karazhan.cpp b/src/server/scripts/EasternKingdoms/ReturnToKarazhan/instance_return_to_karazhan.cpp
index 2a13f3e6fdc..ca3066b5a75 100644
--- a/src/server/scripts/EasternKingdoms/ReturnToKarazhan/instance_return_to_karazhan.cpp
+++ b/src/server/scripts/EasternKingdoms/ReturnToKarazhan/instance_return_to_karazhan.cpp
@@ -28,16 +28,23 @@ BossBoundaryData const boundaries =
ObjectData const creatureData[] =
{
{ BOSS_MAIDEN_OF_VIRTUE_RTK, DATA_MAIDEN_OF_VIRTUE_RTK },
+ { BOSS_THE_CURATOR_RTK, DATA_THE_CURATOR_RTK },
{ 0, 0 } // END
};
+DoorData const doorData[] =
+{
+ { GO_STRANGE_WALL, DATA_THE_CURATOR_RTK, EncounterDoorBehavior::OpenWhenDone },
+ { 0, 0, EncounterDoorBehavior::OpenWhenNotInProgress }
+};
+
DungeonEncounterData const encounters[] =
{
{ DATA_OPERA_HALL, {{ 1957 }} },
{ DATA_MAIDEN_OF_VIRTUE_RTK, {{ 1954 }} },
{ DATA_MOROES, {{ 1961 }} },
{ DATA_ATTUMEN_THE_HUNTSMAN, {{ 1960 }} },
- { DATA_THE_CURATOR, {{ 1964 }} },
+ { DATA_THE_CURATOR_RTK, {{ 1964 }} },
{ DATA_SHADE_OF_MEDIVH, {{ 1965 }} },
{ DATA_MANA_DEVOURER, {{ 1959 }} },
{ DATA_VIZADUUM_THE_WATCHER, {{ 2017 }} },
@@ -57,6 +64,7 @@ class instance_return_to_karazhan : public InstanceMapScript
SetBossNumber(EncounterCount);
LoadObjectData(creatureData, nullptr);
LoadBossBoundaries(boundaries);
+ LoadDoorData(doorData);
LoadDungeonEncounterData(encounters);
}
};
diff --git a/src/server/scripts/EasternKingdoms/ReturnToKarazhan/return_to_karazhan.h b/src/server/scripts/EasternKingdoms/ReturnToKarazhan/return_to_karazhan.h
index 0f6ad0c5a72..0448eb5823a 100644
--- a/src/server/scripts/EasternKingdoms/ReturnToKarazhan/return_to_karazhan.h
+++ b/src/server/scripts/EasternKingdoms/ReturnToKarazhan/return_to_karazhan.h
@@ -32,7 +32,7 @@ enum RTKDataTypes : uint8
DATA_MAIDEN_OF_VIRTUE_RTK,
DATA_MOROES,
DATA_ATTUMEN_THE_HUNTSMAN,
- DATA_THE_CURATOR,
+ DATA_THE_CURATOR_RTK,
DATA_SHADE_OF_MEDIVH,
DATA_MANA_DEVOURER,
DATA_VIZADUUM_THE_WATCHER,
@@ -42,7 +42,13 @@ enum RTKDataTypes : uint8
enum RTKCreatureIds
{
// Bosses
- BOSS_MAIDEN_OF_VIRTUE_RTK = 113971
+ BOSS_MAIDEN_OF_VIRTUE_RTK = 113971,
+ BOSS_THE_CURATOR_RTK = 114247
+};
+
+enum RTKGameObjectsIds
+{
+ GO_STRANGE_WALL = 266508
};
template <class AI, class T>
diff --git a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp
index 0961807ae42..34bd72b99b9 100644
--- a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp
+++ b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp
@@ -207,6 +207,7 @@ void AddSC_undercity();
// Return to Karazhan
void AddSC_instance_return_to_karazhan();
void AddSC_boss_maiden_of_virtue_rtk();
+void AddSC_boss_the_curator_rtk();
// The name of this function should match:
// void Add${NameOfDirectory}Scripts()
@@ -404,4 +405,5 @@ void AddEasternKingdomsScripts()
// Return to Karazhan
AddSC_instance_return_to_karazhan();
AddSC_boss_maiden_of_virtue_rtk();
+ AddSC_boss_the_curator_rtk();
}