fix(Scripts/Northrend): Zul'Drak Betrayal quest

This commit is contained in:
Jelle Meeus 2025-11-07 10:46:37 +01:00
parent 639ee028fd
commit 135ecb6c3a
No known key found for this signature in database
2 changed files with 300 additions and 218 deletions

View File

@ -0,0 +1,44 @@
--
-- v11_2_5_63906
SET @VBUILD := 63906;
DELETE FROM `creature_template_addon` WHERE (`entry` = 28503);
INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES
(28503, 0, 0, 0, 0, 0, 0, '58837');
DELETE FROM `creature_template_addon` WHERE (`entry` = 28998);
INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES
(28998, 0, 0, 0, 0, 0, 0, '58837');
DELETE FROM `creature` WHERE (`id1` = 28998) AND (`guid` IN (1974609));
INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `Comment`, `VerifiedBuild`) VALUES
(1974609, 28998, 0, 0, 571, 0, 0, 1, 1, 0, 6175.2456, -2017.6545, 590.9613, 3.0019662, 300, 0, 0, 550001, 0, 0, 0, 0, 0, '', NULL, @VBUILD);
DELETE FROM `creature_template_addon` WHERE (`entry` = 28998);
INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES
(28998, 0, 0, 0, 1, 0, 0, '');
UPDATE `spell_target_position` SET `PositionX`=6161.15, `PositionY`=-2015.36, `PositionZ`=590.878, `Orientation`=6.283189773559570312, `VerifiedBuild`=@VBUILD WHERE `ID`=52863 AND `EffectIndex`=0;
UPDATE `creature_template_addon` SET `bytes2` = 1 WHERE (`entry` = 28717);
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceGroup` = 1) AND (`SourceEntry` = 54250) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 31) AND (`ConditionTarget` = 0) AND (`ConditionValue1` = 3) AND (`ConditionValue2` = 28960) AND (`ConditionValue3` = 0);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13, 1, 54250, 0, 0, 31, 0, 3, 28960, 0, 0, 0, 0, '', 'target Totally Generic Bunny (JSB)');
-- Update comments
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 28498) AND (`source_type` = 0) AND (`id` IN (0, 1, 2, 3, 4));
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`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(28498, 0, 0, 0, 54, 0, 100, 512, 0, 0, 0, 0, 0, 0, 53, 1, 28498, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'The Lich King - On Just Summoned - Start Waypoint Path 28498'),
(28498, 0, 1, 2, 40, 0, 100, 512, 2, 0, 0, 0, 0, 0, 54, 83000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'The Lich King - On Point 2 of Path Any Reached - Pause Waypoint'),
(28498, 0, 2, 0, 61, 0, 100, 512, 0, 0, 0, 0, 0, 0, 80, 2849800, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'The Lich King - On Point 2 of Path Any Reached - Run Script'),
(28498, 0, 3, 4, 40, 0, 100, 512, 3, 0, 0, 0, 0, 0, 45, 0, 2, 0, 0, 0, 0, 10, 127495, 0, 0, 0, 0, 0, 0, 0, 'The Lich King - On Point 3 of Path Any Reached - Set Data 0 2'),
(28498, 0, 4, 0, 61, 0, 100, 512, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'The Lich King - On Point 3 of Path Any Reached - Despawn Instant');
-- Disable gravity
DELETE FROM `creature_template_movement` WHERE (`CreatureId` = 29100);
INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES
(29100, 0, 0, 1, 0, 0, 0, 0);
-- Idle
UPDATE `creature` SET `MovementType` = 0 WHERE `id1` = 29100 AND `guid` IN (112307, 112308, 112309, 112310);

View File

@ -238,8 +238,10 @@ enum overlordDrakuru
{
SPELL_SHADOW_BOLT = 54113,
SPELL_SCOURGE_DISGUISE_EXPIRING = 52010,
SPELL_DROP_DISGUISE = 54089,
SPELL_THROW_BRIGHT_CRYSTAL = 54087,
SPELL_TELEPORT_EFFECT = 52096,
SPELL_SCOURGE_SPOTLIGHT = 53104,
SPELL_SCOURGE_DISGUISE = 51966,
SPELL_SCOURGE_DISGUISE_INSTANT_CAST = 52192,
SPELL_BLIGHT_FOG = 54104,
@ -248,17 +250,25 @@ enum overlordDrakuru
SPELL_TOUCH_OF_DEATH = 54236,
SPELL_DRAKURU_DEATH = 54248,
SPELL_SUMMON_SKULL = 54253,
SPELL_BLOATED_ABOMINATION_FEIGN_DEATH = 52593,
SPELL_EXPLODE_ABOMINATION_BLOODY_MEAT = 52523,
SPELL_EXPLODE_ABOMINATION_MEAT = 52520,
SPELL_DRAKURUS_SKULL_MISSILE = 54250,
SPELL_BURST_AT_THE_SEAMS_BONE = 52516,
QUEST_BETRAYAL = 12713,
NPC_BLIGHTBLOOD_TROLL = 28931,
NPC_LICH_KING = 28498,
NPC_TOTALLY_GENERIC_BUNNY = 29100,
EVENT_BETRAYAL_1 = 1,
EVENT_BETRAYAL_2 = 2,
EVENT_BETRAYAL_3 = 3,
EVENT_BETRAYAL_3a = 24,
EVENT_BETRAYAL_4 = 4,
EVENT_BETRAYAL_5 = 5,
EVENT_BETRAYAL_5b = 25,
EVENT_BETRAYAL_6 = 6,
EVENT_BETRAYAL_7 = 7,
EVENT_BETRAYAL_8 = 8,
@ -288,243 +298,271 @@ enum overlordDrakuru
SAY_LICH_12 = 12,
};
class npc_overlord_drakuru_betrayal : public CreatureScript
struct npc_overlord_drakuru_betrayal : public ScriptedAI
{
public:
npc_overlord_drakuru_betrayal() : CreatureScript("npc_overlord_drakuru_betrayal") { }
CreatureAI* GetAI(Creature* creature) const override
npc_overlord_drakuru_betrayal(Creature* creature) : ScriptedAI(creature), _summons(me)
{
return new npc_overlord_drakuru_betrayalAI(creature);
me->SetCombatMovement(false);
}
struct npc_overlord_drakuru_betrayalAI : public ScriptedAI
void EnterEvadeMode(EvadeReason why) override
{
npc_overlord_drakuru_betrayalAI(Creature* creature) : ScriptedAI(creature), summons(me)
{
}
if (_playerGUID)
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
if (player->IsWithinDistInMap(me, 80))
return;
me->SetFaction(FACTION_UNDEAD_SCOURGE);
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
ScriptedAI::EnterEvadeMode(why);
}
EventMap events;
SummonList summons;
ObjectGuid playerGUID;
ObjectGuid lichGUID;
void Reset() override
{
events.Reset();
_events.Reset();
_summons.DespawnAll();
_playerGUID.Clear();
_lichGUID.Clear();
me->SetFaction(FACTION_UNDEAD_SCOURGE);
me->SetVisible(false);
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
me->SetImmuneToPC(true);
}
void EnterEvadeMode(EvadeReason why) override
void MoveInLineOfSight(Unit* who) override
{
if (who->IsPlayer())
{
if (playerGUID)
if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID))
if (player->IsWithinDistInMap(me, 80))
return;
me->SetFaction(FACTION_UNDEAD_SCOURGE);
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
ScriptedAI::EnterEvadeMode(why);
}
void Reset() override
{
events.Reset();
summons.DespawnAll();
playerGUID.Clear();
lichGUID.Clear();
me->SetFaction(FACTION_UNDEAD_SCOURGE);
me->SetVisible(false);
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
}
void MoveInLineOfSight(Unit* who) override
{
if (who->IsPlayer())
if (_playerGUID)
{
if (playerGUID)
if (who->GetGUID() != _playerGUID)
{
if (who->GetGUID() != playerGUID)
{
Player* player = ObjectAccessor::GetPlayer(*me, playerGUID);
if (player && player->IsWithinDistInMap(me, 80))
who->ToPlayer()->NearTeleportTo(6143.76f, -1969.7f, 417.57f, 2.08f);
else
{
EnterEvadeMode(EVADE_REASON_OTHER);
return;
}
}
Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID);
if (player && player->IsWithinDistInMap(me, 80))
who->ToPlayer()->NearTeleportTo(6143.76f, -1969.7f, 417.57f, 2.08f);
else
ScriptedAI::MoveInLineOfSight(who);
{
EnterEvadeMode(EVADE_REASON_OTHER);
return;
}
}
else if (who->ToPlayer()->GetQuestStatus(QUEST_BETRAYAL) == QUEST_STATUS_INCOMPLETE && who->HasAura(SPELL_SCOURGE_DISGUISE))
else
ScriptedAI::MoveInLineOfSight(who);
}
else if (who->ToPlayer()->GetQuestStatus(QUEST_BETRAYAL) == QUEST_STATUS_INCOMPLETE && who->HasAura(SPELL_SCOURGE_DISGUISE))
{
me->SetVisible(true);
_playerGUID = who->GetGUID();
events.ScheduleEvent(EVENT_BETRAYAL_1, 6s);
}
}
else
ScriptedAI::MoveInLineOfSight(who);
}
void JustSummoned(Creature* summon) override
{
_summons.Summon(summon);
if (summon->GetEntry() == NPC_BLIGHTBLOOD_TROLL)
{
if (Creature* target = summon->FindNearestCreature(NPC_TOTALLY_GENERIC_BUNNY, 10.0f, true))
{
target->CastSpell(target, SPELL_TELEPORT_EFFECT, true);
// target->CastSpell(target, SPELL_SCOURGE_SPOTLIGHT, true);
}
}
else
{
me->SetFacingToObject(summon);
_lichGUID = summon->GetGUID();
float o = me->GetAngle(summon);
summon->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(o) * 6.0f, me->GetPositionY() + std::sin(o) * 6.0f, me->GetPositionZ());
}
}
void JustEngagedWith(Unit* /*who*/) override
{
_events.ScheduleEvent(EVENT_BETRAYAL_SHADOW_BOLT, 0s);
_events.ScheduleEvent(EVENT_BETRAYAL_CRYSTAL, 5s);
_events.ScheduleEvent(EVENT_BETRAYAL_COMBAT_TALK, 20s);
}
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*dmgType*/, SpellSchoolMask /*school*/) override
{
if (damage >= me->GetHealth() && !me->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE))
{
damage = 0;
me->RemoveAllAuras();
me->CombatStop();
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
me->SetFaction(2082);
me->SetImmuneToPC(true);
events.Reset();
events.ScheduleEvent(EVENT_BETRAYAL_4, 4200ms);
}
}
void SpellHitTarget(Unit* target, SpellInfo const* spellInfo) override
{
if (spellInfo->Id == SPELL_THROW_PORTAL_CRYSTAL)
if (Aura* aura = target->AddAura(SPELL_ARTHAS_PORTAL, target))
aura->SetDuration(48000);
}
void SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) override
{
if (spellInfo->Id == SPELL_TOUCH_OF_DEATH)
{
DoCastSelf(SPELL_BLOATED_ABOMINATION_FEIGN_DEATH, true);
DoCastAOE(SPELL_DRAKURUS_SKULL_MISSILE, true);
DoCastSelf(SPELL_BURST_AT_THE_SEAMS_BONE, true);
DoCastSelf(SPELL_BURST_AT_THE_SEAMS_BONE, true);
DoCastSelf(SPELL_BURST_AT_THE_SEAMS_BONE, true);
DoCastSelf(SPELL_EXPLODE_ABOMINATION_MEAT, true);
DoCastSelf(SPELL_EXPLODE_ABOMINATION_BLOODY_MEAT, true);
DoCastSelf(SPELL_EXPLODE_ABOMINATION_BLOODY_MEAT, true);
DoCastSelf(SPELL_EXPLODE_ABOMINATION_BLOODY_MEAT, true);
DoCastSelf(SPELL_DRAKURU_DEATH, true);
me->SetImmuneToPC(true);
// me->CastSpell(me, SPELL_SUMMON_SKULL, true);
}
}
void UpdateAI(uint32 diff) override
{
events.Update(diff);
switch (events.ExecuteEvent())
{
case EVENT_BETRAYAL_1:
Talk(SAY_DRAKURU_0);
events.ScheduleEvent(EVENT_BETRAYAL_2, 4s);
events.ScheduleEvent(EVENT_BETRAYAL_3, 6600ms);
break;
case EVENT_BETRAYAL_2:
me->SummonCreature(NPC_BLIGHTBLOOD_TROLL, 6184.1f, -1969.9f, 586.76f, 4.5f);
me->SummonCreature(NPC_BLIGHTBLOOD_TROLL, 6222.9f, -2026.5f, 586.76f, 2.9f);
me->SummonCreature(NPC_BLIGHTBLOOD_TROLL, 6166.2f, -2065.4f, 586.76f, 1.4f);
me->SummonCreature(NPC_BLIGHTBLOOD_TROLL, 6127.5f, -2008.7f, 586.76f, 0.0f);
break;
case EVENT_BETRAYAL_3:
Talk(SAY_DRAKURU_1);
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
player->CastSpell(player, SPELL_SCOURGE_DISGUISE_EXPIRING, true);
events.ScheduleEvent(EVENT_BETRAYAL_3a, 9600ms);
break;
case EVENT_BETRAYAL_3a:
{
Talk(SAY_DRAKURU_2);
Talk(SAY_DRAKURU_3);
if (Aura* aur = me->AddAura(SPELL_BLIGHT_FOG, me))
aur->SetDuration(22000); // TODO: should be infinite
me->SetImmuneToPC(false);
std::list<Creature*> creatures;
me->GetCreatureListWithEntryInGrid(creatures, NPC_TOTALLY_GENERIC_BUNNY, 55.0f);
for (Creature* creature : creatures)
creature->CastSpell(creature, SPELL_SCOURGE_SPOTLIGHT, true);
break;
}
case EVENT_BETRAYAL_4:
{
Talk(SAY_DRAKURU_5);
events.ScheduleEvent(EVENT_BETRAYAL_5, 4800ms);
std::list<Creature*> creatures;
me->GetCreatureListWithEntryInGrid(creatures, NPC_TOTALLY_GENERIC_BUNNY, 55.0f);
for (Creature* creature : creatures)
creature->RemoveAurasDueToSpell(SPELL_SCOURGE_SPOTLIGHT);
break;
}
case EVENT_BETRAYAL_5:
Talk(SAY_DRAKURU_6);
events.ScheduleEvent(EVENT_BETRAYAL_5b, 1800ms);
break;
case EVENT_BETRAYAL_5b:
DoCastSelf(SPELL_THROW_PORTAL_CRYSTAL, true);
events.ScheduleEvent(EVENT_BETRAYAL_6, 3600ms);
break;
case EVENT_BETRAYAL_6:
me->SummonCreature(NPC_LICH_KING, 6140.4233, -2010.9938, 589.1911, 6.126106, TEMPSUMMON_TIMED_DESPAWN, 41000);
events.ScheduleEvent(EVENT_BETRAYAL_7, 8400ms);
break;
case EVENT_BETRAYAL_7:
Talk(SAY_DRAKURU_7);
events.ScheduleEvent(EVENT_BETRAYAL_8, 9600ms);
break;
case EVENT_BETRAYAL_8:
if (Creature* lich = ObjectAccessor::GetCreature(*me, _lichGUID))
{
me->SetVisible(true);
playerGUID = who->GetGUID();
events.ScheduleEvent(EVENT_BETRAYAL_1, 5s);
lich->AI()->Talk(SAY_LICH_7);
lich->AI()->Talk(SAY_LICH_8, 5400ms);
}
}
else
ScriptedAI::MoveInLineOfSight(who);
events.ScheduleEvent(EVENT_BETRAYAL_9, 7800ms);
break;
case EVENT_BETRAYAL_9:
if (Creature* lich = ObjectAccessor::GetCreature(*me, _lichGUID))
lich->CastSpell(me, SPELL_TOUCH_OF_DEATH, false);
events.ScheduleEvent(EVENT_BETRAYAL_10, 4200ms);
break;
case EVENT_BETRAYAL_10:
me->SetVisible(false);
if (Creature* lich = ObjectAccessor::GetCreature(*me, _lichGUID))
{
lich->AI()->Talk(SAY_LICH_9, 3600ms);
lich->AI()->Talk(SAY_LICH_10, 8400ms);
lich->AI()->Talk(SAY_LICH_11, 22800ms);
lich->AI()->Talk(SAY_LICH_12, 27600ms);
}
events.ScheduleEvent(EVENT_BETRAYAL_11, 32600ms);
events.ScheduleEvent(EVENT_BETRAYAL_12, 37200ms);
break;
case EVENT_BETRAYAL_11:
if (Creature* lich = ObjectAccessor::GetCreature(*me, _lichGUID))
lich->GetMotionMaster()->MovePoint(0, 6141.2393, -2011.2728, 589.8653);
break;
case EVENT_BETRAYAL_12:
_playerGUID.Clear();
EnterEvadeMode(EVADE_REASON_OTHER);
break;
case EVENT_BETRAYAL_13:
break;
case EVENT_BETRAYAL_14:
_playerGUID.Clear();
EnterEvadeMode(EVADE_REASON_OTHER);
break;
}
void JustSummoned(Creature* cr) override
if (me->GetFaction() == FACTION_FRIENDLY || me->GetFaction() == 2082 || me->HasUnitState(UNIT_STATE_CASTING | UNIT_STATE_STUNNED))
return;
if (!UpdateVictim())
return;
_events.Update(diff);
switch (_events.ExecuteEvent())
{
summons.Summon(cr);
if (cr->GetEntry() == NPC_BLIGHTBLOOD_TROLL)
cr->CastSpell(cr, SPELL_TELEPORT_EFFECT, true);
else
{
me->SetFacingToObject(cr);
lichGUID = cr->GetGUID();
float o = me->GetAngle(cr);
cr->GetMotionMaster()->MovePoint(0, me->GetPositionX() + cos(o) * 6.0f, me->GetPositionY() + std::sin(o) * 6.0f, me->GetPositionZ());
}
case EVENT_BETRAYAL_SHADOW_BOLT:
if (!me->IsWithinMeleeRange(me->GetVictim()))
DoCastVictim(SPELL_SHADOW_BOLT);
_events.Repeat(2s);
break;
case EVENT_BETRAYAL_CRYSTAL:
if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
DoCast(player, SPELL_THROW_BRIGHT_CRYSTAL);
_events.Repeat(6s, 15s);
break;
case EVENT_BETRAYAL_COMBAT_TALK:
Talk(SAY_DRAKURU_4);
_events.Repeat(20s);
break;
}
void JustEngagedWith(Unit*) override
{
Talk(SAY_DRAKURU_3);
events.ScheduleEvent(EVENT_BETRAYAL_SHADOW_BOLT, 2s);
events.ScheduleEvent(EVENT_BETRAYAL_CRYSTAL, 5s);
events.ScheduleEvent(EVENT_BETRAYAL_COMBAT_TALK, 20s);
}
DoMeleeAttackIfReady();
}
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override
{
if (damage >= me->GetHealth() && !me->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE))
{
damage = 0;
me->RemoveAllAuras();
me->CombatStop();
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
me->SetFaction(FACTION_FRIENDLY);
events.Reset();
events.ScheduleEvent(EVENT_BETRAYAL_4, 1s);
}
}
void SpellHitTarget(Unit* target, SpellInfo const* spellInfo) override
{
if (spellInfo->Id == SPELL_THROW_PORTAL_CRYSTAL)
if (Aura* aura = target->AddAura(SPELL_ARTHAS_PORTAL, target))
aura->SetDuration(48000);
}
void SpellHit(Unit* /*caster*/, SpellInfo const* spellInfo) override
{
if (spellInfo->Id == SPELL_TOUCH_OF_DEATH)
{
me->CastSpell(me, SPELL_DRAKURU_DEATH, true);
me->CastSpell(me, SPELL_SUMMON_SKULL, true);
}
}
void UpdateAI(uint32 diff) override
{
events.Update(diff);
switch (events.ExecuteEvent())
{
case EVENT_BETRAYAL_1:
Talk(SAY_DRAKURU_0);
events.ScheduleEvent(EVENT_BETRAYAL_2, 5s);
break;
case EVENT_BETRAYAL_2:
me->SummonCreature(NPC_BLIGHTBLOOD_TROLL, 6184.1f, -1969.9f, 586.76f, 4.5f);
me->SummonCreature(NPC_BLIGHTBLOOD_TROLL, 6222.9f, -2026.5f, 586.76f, 2.9f);
me->SummonCreature(NPC_BLIGHTBLOOD_TROLL, 6166.2f, -2065.4f, 586.76f, 1.4f);
me->SummonCreature(NPC_BLIGHTBLOOD_TROLL, 6127.5f, -2008.7f, 586.76f, 0.0f);
events.ScheduleEvent(EVENT_BETRAYAL_3, 5s);
break;
case EVENT_BETRAYAL_3:
Talk(SAY_DRAKURU_1);
Talk(SAY_DRAKURU_2);
if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID))
player->CastSpell(player, SPELL_SCOURGE_DISGUISE_EXPIRING, true);
if (Aura* aur = me->AddAura(SPELL_BLIGHT_FOG, me))
aur->SetDuration(22000);
break;
case EVENT_BETRAYAL_4:
Talk(SAY_DRAKURU_5);
events.ScheduleEvent(EVENT_BETRAYAL_5, 6s);
break;
case EVENT_BETRAYAL_5:
Talk(SAY_DRAKURU_6);
me->CastSpell(me, SPELL_THROW_PORTAL_CRYSTAL, true);
events.ScheduleEvent(EVENT_BETRAYAL_6, 8s);
break;
case EVENT_BETRAYAL_6:
me->SummonCreature(NPC_LICH_KING, 6142.9f, -2011.6f, 590.86f, 0.0f, TEMPSUMMON_TIMED_DESPAWN, 41000);
events.ScheduleEvent(EVENT_BETRAYAL_7, 8s);
break;
case EVENT_BETRAYAL_7:
Talk(SAY_DRAKURU_7);
events.ScheduleEvent(EVENT_BETRAYAL_8, 5s);
break;
case EVENT_BETRAYAL_8:
if (Creature* lich = ObjectAccessor::GetCreature(*me, lichGUID))
lich->AI()->Talk(SAY_LICH_7);
events.ScheduleEvent(EVENT_BETRAYAL_9, 6s);
break;
case EVENT_BETRAYAL_9:
if (Creature* lich = ObjectAccessor::GetCreature(*me, lichGUID))
{
lich->AI()->Talk(SAY_LICH_8);
lich->CastSpell(me, SPELL_TOUCH_OF_DEATH, false);
}
events.ScheduleEvent(EVENT_BETRAYAL_10, 4s);
break;
case EVENT_BETRAYAL_10:
me->SetVisible(false);
if (Creature* lich = ObjectAccessor::GetCreature(*me, lichGUID))
lich->AI()->Talk(SAY_LICH_9);
events.ScheduleEvent(EVENT_BETRAYAL_11, 4s);
break;
case EVENT_BETRAYAL_11:
if (Creature* lich = ObjectAccessor::GetCreature(*me, lichGUID))
lich->AI()->Talk(SAY_LICH_10);
events.ScheduleEvent(EVENT_BETRAYAL_12, 6s);
break;
case EVENT_BETRAYAL_12:
if (Creature* lich = ObjectAccessor::GetCreature(*me, lichGUID))
lich->AI()->Talk(SAY_LICH_11);
events.ScheduleEvent(EVENT_BETRAYAL_13, 3s);
break;
case EVENT_BETRAYAL_13:
if (Creature* lich = ObjectAccessor::GetCreature(*me, lichGUID))
{
lich->AI()->Talk(SAY_LICH_12);
lich->GetMotionMaster()->MovePoint(0, 6143.8f, -2011.5f, 590.9f);
}
events.ScheduleEvent(EVENT_BETRAYAL_14, 7s);
break;
case EVENT_BETRAYAL_14:
playerGUID.Clear();
EnterEvadeMode(EVADE_REASON_OTHER);
break;
}
if (me->GetFaction() == FACTION_FRIENDLY || me->HasUnitState(UNIT_STATE_CASTING | UNIT_STATE_STUNNED))
return;
if (!UpdateVictim())
return;
switch (events.ExecuteEvent())
{
case EVENT_BETRAYAL_SHADOW_BOLT:
if (!me->IsWithinMeleeRange(me->GetVictim()))
me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false);
events.Repeat(2s);
break;
case EVENT_BETRAYAL_CRYSTAL:
if (Player* player = ObjectAccessor::GetPlayer(*me, playerGUID))
me->CastSpell(player, SPELL_THROW_BRIGHT_CRYSTAL, true);
events.Repeat(6s, 15s);
break;
case EVENT_BETRAYAL_COMBAT_TALK:
Talk(SAY_DRAKURU_4);
events.Repeat(20s);
break;
}
DoMeleeAttackIfReady();
}
};
private:
EventMap _events;
SummonList _summons;
ObjectGuid _playerGUID;
ObjectGuid _lichGUID;
};
/*####
@ -868,7 +906,7 @@ void AddSC_zuldrak()
{
new npc_finklestein();
new go_finklestein_cauldron();
new npc_overlord_drakuru_betrayal();
RegisterCreatureAI(npc_overlord_drakuru_betrayal);
new npc_drakuru_shackles();
new npc_captured_rageclaw();
new npc_released_offspring_harkoa();