diff options
-rw-r--r-- | sql/updates/world/master/2024_06_19_01_world.sql | 26 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 12 | ||||
-rw-r--r-- | src/server/scripts/Zandalar/KingsRest/kings_rest.cpp | 145 |
3 files changed, 176 insertions, 7 deletions
diff --git a/sql/updates/world/master/2024_06_19_01_world.sql b/sql/updates/world/master/2024_06_19_01_world.sql new file mode 100644 index 00000000000..1a30fd506c7 --- /dev/null +++ b/sql/updates/world/master/2024_06_19_01_world.sql @@ -0,0 +1,26 @@ +-- Template +UPDATE `creature_template` SET `AIName` = '', `ScriptName` = 'npc_kings_rest_animated_guardian' WHERE `entry` = 133935; + +-- Template Addon +UPDATE `creature_template_addon` SET `auras` = '276032' where `entry` = 133943; + +-- Creature Text +DELETE FROM `creature_text` WHERE `CreatureID` = 133935; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(133935, 0, 0, 'THE IMPURE MAY NOT PASS INTO THE HALLS OF THE DEAD.', 12, 0, 100, 0, 0, 0, 153130, 0, 'Animated Guardian to Player'), +(133935, 0, 1, 'NONE SHALL ENTER.', 12, 0, 100, 0, 0, 0, 153128, 0, 'Animated Guardian to Player'); + +-- SpellScripts +DELETE FROM `spell_script_names` WHERE `spell_id` IN (270002, 269935, 276031); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(270002, 'spell_kings_rest_suppression_slam'), +(269935, 'spell_kings_rest_bound_by_shadow'), +(276031, 'spell_kings_rest_pit_of_despair'); + +-- Minion of Zul smart ai +SET @ENTRY := 133943; +UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = @ENTRY; +DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryOrGuid` = @ENTRY; +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`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(@ENTRY, 0, 0, 0, '', 63, 0, 100, 0, 0, 0, 0, 0, 85, 269935, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'On just created - Self: Cast spell 269935 on self'), +(@ENTRY, 0, 1, 0, '', 4, 0, 100, 0, 0, 0, 0, 0, 85, 269936, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'On aggro - Self: Cast spell 269936 on self'); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index c77febf47c2..5ad8c3e71d1 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -4749,6 +4749,18 @@ void SpellMgr::LoadSpellInfoCorrections() // ENDOF STORMSONG VALLEY SPELLS // + // KINGS REST SPELLS + // + + // Fixate + ApplySpellFix({ 269936 }, [](SpellInfo* spellInfo) + { + spellInfo->Attributes |= SPELL_ATTR0_AURA_IS_DEBUFF; + }); + + // ENDOF KINGS REST SPELLS + + // // SEPULCHER OF THE FIRST ONES // diff --git a/src/server/scripts/Zandalar/KingsRest/kings_rest.cpp b/src/server/scripts/Zandalar/KingsRest/kings_rest.cpp index 190c189f5f8..c4cda8e23e6 100644 --- a/src/server/scripts/Zandalar/KingsRest/kings_rest.cpp +++ b/src/server/scripts/Zandalar/KingsRest/kings_rest.cpp @@ -20,33 +20,41 @@ #include "Conversation.h" #include "GameObject.h" #include "InstanceScript.h" -#include "TemporarySummon.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellAuras.h" +#include "SpellScript.h" +#include "TemporarySummon.h" #include "Unit.h" #include "kings_rest.h" enum KingsRestData { // Creature - NPC_SHADOW_OF_ZUL = 137020, + NPC_SHADOW_OF_ZUL = 137020, + + // Creature text + SAY_ANIMATED_GUARDIAN_ENGAGE = 0, // DisplayIDs - DISPLAY_INVISIBLE_ZUL = 11686, + DISPLAY_INVISIBLE_ZUL = 11686, // Spell Visuals - SPELL_VISUAL_ZUL_OPEN_GOB = 77330, + SPELL_VISUAL_ZUL_OPEN_GOB = 77330, // Conversation - CONV_ZUL_KINGS_REST_INTRO = 7690, + CONV_ZUL_KINGS_REST_INTRO = 7690, // Spells - SPELL_ZUL_SHADOWFORM = 269058 + SPELL_ZUL_SHADOWFORM = 269058, + SPELL_SUPPRESSION_SLAM_SELECTOR = 270002, + SPELL_SUPPRESSION_SLAM_DAMAGE = 270003, + SPELL_RELEASED_INHIBITORS = 270016 }; constexpr Position ShadowOfZulIntroSpawnPosition = { -944.9617f, 2646.5268f, 832.8684f, 4.716575f }; -// XX - KingsRest - Trigger Intro Event with Shadow of Zul +// 67 - KingsRest - Trigger Intro Event with Shadow of Zul struct at_kings_rest_trigger_intro_event_with_zul : AreaTriggerAI { at_kings_rest_trigger_intro_event_with_zul(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { } @@ -139,11 +147,134 @@ private: EventMap _events; }; +enum AnimatedGuardianEvent +{ + EVENT_SUPPRESSION_SLAM = 1 +}; + +// 133935 - Animated Guardian +struct npc_kings_rest_animated_guardian : public ScriptedAI +{ + npc_kings_rest_animated_guardian(Creature* creature) : ScriptedAI(creature), _suppressionSlamCasts(0), _releasedInhibitors(false) { } + + void JustEngagedWith(Unit* /*who*/) override + { + Talk(SAY_ANIMATED_GUARDIAN_ENGAGE); + _events.ScheduleEvent(EVENT_SUPPRESSION_SLAM, 12s); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override + { + if (!_releasedInhibitors && me->HealthBelowPctDamaged(50, damage)) + { + _releasedInhibitors = true; + _events.DelayEvents(1200ms); + DoCast(SPELL_RELEASED_INHIBITORS); + } + } + + void Reset() override + { + _events.Reset(); + _suppressionSlamCasts = 0; + _releasedInhibitors = false; + } + + 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_SUPPRESSION_SLAM: + DoCast(SPELL_SUPPRESSION_SLAM_SELECTOR); + _suppressionSlamCasts++; + _events.ScheduleEvent(EVENT_SUPPRESSION_SLAM, _suppressionSlamCasts % 2 == 0 ? 12s : 13300ms); + break; + default: + break; + } + } + } + +private: + EventMap _events; + int32 _suppressionSlamCasts; + bool _releasedInhibitors; +}; + +// 270002 - Suppression Slam +class spell_kings_rest_suppression_slam : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_SUPPRESSION_SLAM_DAMAGE }); + } + + void HandleHit(SpellEffIndex /*effIndex*/) + { + // @TODO: visual is a bit off - requires SPELL_ATTR12_UNK11 impl + GetCaster()->CastSpell(GetHitUnit(), SPELL_SUPPRESSION_SLAM_DAMAGE, false); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_kings_rest_suppression_slam::HandleHit, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 269935 - Bound by Shadow +class spell_kings_rest_bound_by_shadow : public AuraScript +{ + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_ENEMY_SPELL) + return; + + GetTarget()->KillSelf(); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_kings_rest_bound_by_shadow::OnRemove, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL); + } +}; + +// 276031 - Pit of Despair +class spell_kings_rest_pit_of_despair : public AuraScript +{ + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetCaster()->KillSelf(); + } + + void Register() override + { + AfterEffectApply += AuraEffectRemoveFn(spell_kings_rest_pit_of_despair::OnApply, EFFECT_0, SPELL_AURA_MOD_FEAR, AURA_EFFECT_HANDLE_REAL); + } +}; + void AddSC_kings_rest() { + // Creature + RegisterKingsRestCreatureAI(npc_kings_rest_animated_guardian); + // Areatrigger RegisterAreaTriggerAI(at_kings_rest_trigger_intro_event_with_zul); // Conversation new conversation_kings_rest_intro(); + + // Spells + RegisterSpellScript(spell_kings_rest_suppression_slam); + RegisterSpellScript(spell_kings_rest_bound_by_shadow); + RegisterSpellScript(spell_kings_rest_pit_of_despair); } |