fix(Scripts/BlackrockSpire): Improved Lord Valthalak encounter. (#9373)
Fixes #9113
This commit is contained in:
@@ -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)");
|
||||||
+88
-32
@@ -29,14 +29,24 @@ enum Spells
|
|||||||
|
|
||||||
enum Says
|
enum Says
|
||||||
{
|
{
|
||||||
EMOTE_FRENZY = 0
|
TALK_SUMMON = 0,
|
||||||
|
TALK_AGGRO = 1,
|
||||||
|
TALK_40_HP = 2,
|
||||||
|
TALK_15_HP = 3
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Events
|
enum Events
|
||||||
{
|
{
|
||||||
EVENT_SUMMON_SPECTRAL_ASSASSIN = 1,
|
EVENT_SUMMON_SPECTRAL_ASSASSIN = 1,
|
||||||
EVENT_SHADOW_BOLT_VOLLEY = 2,
|
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
|
class boss_lord_valthalak : public CreatureScript
|
||||||
@@ -50,74 +60,120 @@ public:
|
|||||||
|
|
||||||
void Reset() override
|
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;
|
frenzy40 = false;
|
||||||
frenzy15 = false;
|
frenzy15 = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnterCombat(Unit* /*who*/) override
|
void IsSummonedBy(Unit* /*summoner*/) override
|
||||||
{
|
{
|
||||||
_EnterCombat();
|
StartTalking(TALK_SUMMON, 8 * IN_MILLISECONDS);
|
||||||
events.ScheduleEvent(EVENT_SUMMON_SPECTRAL_ASSASSIN, urand(6000, 8000));
|
|
||||||
events.ScheduleEvent(EVENT_SHADOW_WRATH, urand(9000, 18000));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
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
|
void UpdateAI(uint32 diff) override
|
||||||
{
|
{
|
||||||
if (!UpdateVictim())
|
if (!UpdateVictim() && !events.IsInPhase(EVENT_PHASE_TALK))
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
events.Update(diff);
|
events.Update(diff);
|
||||||
|
|
||||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
while (uint32 eventId = events.ExecuteEvent())
|
while (uint32 eventId = events.ExecuteEvent())
|
||||||
{
|
{
|
||||||
switch (eventId)
|
switch (eventId)
|
||||||
{
|
{
|
||||||
|
case EVENT_FIGHT:
|
||||||
|
StartFighting();
|
||||||
|
break;
|
||||||
case EVENT_SUMMON_SPECTRAL_ASSASSIN:
|
case EVENT_SUMMON_SPECTRAL_ASSASSIN:
|
||||||
DoCast(me, SPELL_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;
|
break;
|
||||||
case EVENT_SHADOW_BOLT_VOLLEY:
|
case EVENT_SHADOW_BOLT_VOLLEY:
|
||||||
DoCastVictim(SPELL_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;
|
break;
|
||||||
case EVENT_SHADOW_WRATH:
|
case EVENT_SHADOW_WRATH:
|
||||||
DoCastVictim(SPELL_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;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
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();
|
DoMeleeAttackIfReady();
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ void AddSC_boss_halycon();
|
|||||||
void AddSC_boss_highlordomokk();
|
void AddSC_boss_highlordomokk();
|
||||||
void AddSC_boss_overlordwyrmthalak();
|
void AddSC_boss_overlordwyrmthalak();
|
||||||
void AddSC_boss_thebeast();
|
void AddSC_boss_thebeast();
|
||||||
|
void AddSC_boss_lord_valthalak();
|
||||||
void AddSC_boss_warmastervoone();
|
void AddSC_boss_warmastervoone();
|
||||||
void AddSC_boss_pyroguard_emberseer();
|
void AddSC_boss_pyroguard_emberseer();
|
||||||
void AddSC_boss_gyth();
|
void AddSC_boss_gyth();
|
||||||
@@ -178,6 +179,7 @@ void AddEasternKingdomsScripts()
|
|||||||
AddSC_boss_highlordomokk();
|
AddSC_boss_highlordomokk();
|
||||||
AddSC_boss_overlordwyrmthalak();
|
AddSC_boss_overlordwyrmthalak();
|
||||||
AddSC_boss_thebeast();
|
AddSC_boss_thebeast();
|
||||||
|
AddSC_boss_lord_valthalak();
|
||||||
AddSC_boss_warmastervoone();
|
AddSC_boss_warmastervoone();
|
||||||
AddSC_boss_pyroguard_emberseer();
|
AddSC_boss_pyroguard_emberseer();
|
||||||
AddSC_boss_gyth();
|
AddSC_boss_gyth();
|
||||||
|
|||||||
Reference in New Issue
Block a user