aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2024_06_19_01_world.sql26
-rw-r--r--src/server/game/Spells/SpellMgr.cpp12
-rw-r--r--src/server/scripts/Zandalar/KingsRest/kings_rest.cpp145
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);
}