From 4c0109688ab1763a0f530005903dfefaaf66bc39 Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Thu, 2 Dec 2021 22:14:43 +0100 Subject: [PATCH] fix(Scripts/BlackrockSpire): Improved Lord Valthalak encounter. (#9373) Fixes #9113 --- .../rev_1637960273581355100.sql | 16 +++ .../BlackrockSpire/boss_lord_valthalak.cpp | 120 +++++++++++++----- .../eastern_kingdoms_script_loader.cpp | 2 + 3 files changed, 106 insertions(+), 32 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1637960273581355100.sql diff --git a/data/sql/updates/pending_db_world/rev_1637960273581355100.sql b/data/sql/updates/pending_db_world/rev_1637960273581355100.sql new file mode 100644 index 000000000..cf631d256 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1637960273581355100.sql @@ -0,0 +1,16 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1637960273581355100'); + +UPDATE `creature_template` SET `AiName`='', `ScriptName`='boss_lord_valthalak' WHERE `entry`=16042; +DELETE FROM `smart_scripts` WHERE `entryorguid`=16042 AND `source_type`=0; + +DELETE FROM `creature_text` WHERE `creatureid`=16042; +INSERT INTO `creature_text` VALUES +(16042,0,0,'Muahahahaha! What is this pathetic spectacle I see before me? Well, what are you waiting for? I hunger, and you look as if you may make for a passable appetizer!',14,0,100,0,0,0,11967,0,'Lord Valthalak - Talk Summon'), +(16042,1,0,'Your insolence is appalling, fool! I shall feast on your soul!',12,0,100,0,0,0,11955,0,'Lord Valthalak - Talk Aggro'), +(16042,2,0,'I\'ve gone easy on you thus far, but now you bore me. Witness the magnificence of my power, and despair!',14,0,100,0,0,0,11769,0,'Lord Valthalak - Talk 40% hp'), +(16042,3,0,'I will not die again! Not to the likes of you!',14,0,100,0,0,0,11770,0,'Lord Valthalak - Talk 15% hp'); + +DELETE FROM `smart_scripts` WHERE `entryorguid`=16066 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`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 +(16066,0,0,0,0,0,100,2,3000,5000,7000,9000,11,18663,0,0,0,0,0,2,0,0,0,0,0,0,0,"Spectral Assassin - In Combat - Cast 18663 (Normal Dungeon)"), +(16066,0,1,0,0,0,100,3,10000,15000,0,0,11,27177,0,0,0,0,0,6,0,0,0,0,0,0,0,"Spectral Assassin - In Combat - Cast 27177 (Normal Dungeon)"); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp index efe5c6e5d..1ca2a75d1 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp @@ -29,14 +29,24 @@ enum Spells enum Says { - EMOTE_FRENZY = 0 + TALK_SUMMON = 0, + TALK_AGGRO = 1, + TALK_40_HP = 2, + TALK_15_HP = 3 }; enum Events { EVENT_SUMMON_SPECTRAL_ASSASSIN = 1, EVENT_SHADOW_BOLT_VOLLEY = 2, - EVENT_SHADOW_WRATH = 3 + EVENT_SHADOW_WRATH = 3, + EVENT_FIGHT = 4 +}; + +enum EventPhase +{ + EVENT_PHASE_TALK = 1, + EVENT_PHASE_FIGHT = 2 }; class boss_lord_valthalak : public CreatureScript @@ -50,74 +60,120 @@ public: void Reset() override { - _Reset(); + BossAI::Reset(); + + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + frenzy40 = false; frenzy15 = false; } - void EnterCombat(Unit* /*who*/) override + void IsSummonedBy(Unit* /*summoner*/) override { - _EnterCombat(); - events.ScheduleEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN, urand(6000, 8000)); - events.ScheduleEvent(EVENT_SHADOW_WRATH, urand(9000, 18000)); + StartTalking(TALK_SUMMON, 8 * IN_MILLISECONDS); } - void JustDied(Unit* /*killer*/) override + void EnterCombat(Unit* who) override { + BossAI::EnterCombat(who); + + Talk(TALK_AGGRO); + + events.SetPhase(EVENT_PHASE_FIGHT); + events.ScheduleEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN, urand(6 * IN_MILLISECONDS, 8 * IN_MILLISECONDS), 0, EVENT_PHASE_FIGHT); + events.ScheduleEvent(EVENT_SHADOW_WRATH, urand(9 * IN_MILLISECONDS, 18 * IN_MILLISECONDS), 0, EVENT_PHASE_FIGHT); + } + + void JustDied(Unit* killer) override + { + BossAI::JustDied(killer); + instance->SetData(DATA_LORD_VALTHALAK, DONE); } + void StartTalking(uint32 talkGroupId, uint32 timer) + { + me->SetReactState(REACT_PASSIVE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + me->AttackStop(); + + Talk(talkGroupId); + + events.SetPhase(EVENT_PHASE_TALK); + events.ScheduleEvent(EVENT_FIGHT, timer, 0, EVENT_PHASE_TALK); + } + + void StartFighting() + { + events.SetPhase(EVENT_PHASE_FIGHT); + + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + + DoZoneInCombat(); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*type*/, SpellSchoolMask /*school*/) override + { + if (!frenzy40 && me->HealthBelowPctDamaged(40, damage)) + { + frenzy40 = true; + DoCast(me, SPELL_FRENZY); + + events.CancelEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN); + + StartTalking(TALK_40_HP, 5 * IN_MILLISECONDS); + } + + if (!frenzy15 && me->HealthBelowPctDamaged(15, damage)) + { + frenzy15 = true; + + events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, urand(12 * IN_MILLISECONDS, 19 * IN_MILLISECONDS), 0, EVENT_PHASE_FIGHT); + + StartTalking(TALK_15_HP, 5 * IN_MILLISECONDS); + } + } + void UpdateAI(uint32 diff) override { - if (!UpdateVictim()) + if (!UpdateVictim() && !events.IsInPhase(EVENT_PHASE_TALK)) + { return; + } events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) + { return; + } while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { + case EVENT_FIGHT: + StartFighting(); + break; case EVENT_SUMMON_SPECTRAL_ASSASSIN: DoCast(me, SPELL_SUMMON_SPECTRAL_ASSASSIN); - events.ScheduleEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN, urand(30000, 35000)); + events.ScheduleEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN, urand(30 * IN_MILLISECONDS, 35 * IN_MILLISECONDS), 0, EVENT_PHASE_FIGHT); break; case EVENT_SHADOW_BOLT_VOLLEY: DoCastVictim(SPELL_SHADOW_BOLT_VOLLEY); - events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, urand(4000, 6000)); + events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, urand(4 * IN_MILLISECONDS, 6 * IN_MILLISECONDS), 0, EVENT_PHASE_FIGHT); break; case EVENT_SHADOW_WRATH: DoCastVictim(SPELL_SHADOW_WRATH); - events.ScheduleEvent(EVENT_SHADOW_WRATH, urand(19000, 24000)); + events.ScheduleEvent(EVENT_SHADOW_WRATH, urand(19 * IN_MILLISECONDS, 24 * IN_MILLISECONDS), 0, EVENT_PHASE_FIGHT); break; default: break; } } - if (!frenzy40) - { - if (HealthBelowPct(40)) - { - DoCast(me, SPELL_FRENZY); - events.CancelEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN); - frenzy40 = true; - } - } - - if (!frenzy15) - { - if (HealthBelowPct(15)) - { - DoCast(me, SPELL_FRENZY); - events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, urand(7000, 14000)); - frenzy15 = true; - } - } - DoMeleeAttackIfReady(); } private: diff --git a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp index f2616220a..0b1017341 100644 --- a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp +++ b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp @@ -38,6 +38,7 @@ void AddSC_boss_halycon(); void AddSC_boss_highlordomokk(); void AddSC_boss_overlordwyrmthalak(); void AddSC_boss_thebeast(); +void AddSC_boss_lord_valthalak(); void AddSC_boss_warmastervoone(); void AddSC_boss_pyroguard_emberseer(); void AddSC_boss_gyth(); @@ -178,6 +179,7 @@ void AddEasternKingdomsScripts() AddSC_boss_highlordomokk(); AddSC_boss_overlordwyrmthalak(); AddSC_boss_thebeast(); + AddSC_boss_lord_valthalak(); AddSC_boss_warmastervoone(); AddSC_boss_pyroguard_emberseer(); AddSC_boss_gyth();