Adjust Scholomance Kirtonos boss fight (#5313)

This commit is contained in:
v.tihomirov
2021-04-25 07:57:37 +03:00
committed by GitHub
parent 72f1ec8b0c
commit 2e8ef021b6

View File

@@ -18,7 +18,8 @@ enum Spells
SPELL_KIRTONOS_TRANSFORM = 16467, SPELL_KIRTONOS_TRANSFORM = 16467,
SPELL_SHADOW_BOLT_VOLLEY = 17228, SPELL_SHADOW_BOLT_VOLLEY = 17228,
SPELL_CURSE_OF_TONGUES = 12889, SPELL_CURSE_OF_TONGUES = 12889,
SPELL_DOMINATE_MIND = 14515 SPELL_DOMINATE_MIND = 14515,
SPELL_TRANSFORM_VISUAL = 24085
}; };
enum Events enum Events
@@ -66,23 +67,27 @@ public:
instance = me->GetInstanceScript(); instance = me->GetInstanceScript();
} }
int TransformsCount;
EventMap events; EventMap events;
EventMap events2; EventMap events2;
InstanceScript* instance; InstanceScript* instance;
void EnterCombat(Unit* /*who*/) override void EnterCombat(Unit* /*who*/) override
{ {
TransformsCount = 0;
events.Reset(); events.Reset();
events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, 2000); events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, 2000);
events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, 6000); events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, 6000);
events.ScheduleEvent(EVENT_DOMINATE_MIND, 20000); events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, 20000);
events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, 5000);
} }
void JustDied(Unit* /*killer*/) override void JustDied(Unit* /*killer*/) override
{ {
if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS))) if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS)))
{
gate->SetGoState(GO_STATE_ACTIVE); gate->SetGoState(GO_STATE_ACTIVE);
}
instance->SetData(DATA_KIRTONOS_THE_HERALD, DONE); instance->SetData(DATA_KIRTONOS_THE_HERALD, DONE);
} }
@@ -90,7 +95,9 @@ public:
void EnterEvadeMode() override void EnterEvadeMode() override
{ {
if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS))) if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS)))
{
gate->SetGoState(GO_STATE_ACTIVE); gate->SetGoState(GO_STATE_ACTIVE);
}
instance->SetData(DATA_KIRTONOS_THE_HERALD, NOT_STARTED); instance->SetData(DATA_KIRTONOS_THE_HERALD, NOT_STARTED);
me->DespawnOrUnsummon(1); me->DespawnOrUnsummon(1);
@@ -102,7 +109,7 @@ public:
events2.ScheduleEvent(INTRO_1, 500); events2.ScheduleEvent(INTRO_1, 500);
me->SetDisableGravity(true); me->SetDisableGravity(true);
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
Talk(EMOTE_SUMMONED); Talk(EMOTE_SUMMONED);
} }
@@ -131,7 +138,9 @@ public:
break; break;
case INTRO_3: case INTRO_3:
if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS))) if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_KIRTONOS)))
{
gate->SetGoState(GO_STATE_READY); gate->SetGoState(GO_STATE_READY);
}
me->SetFacingTo(0.01745329f); me->SetFacingTo(0.01745329f);
break; break;
case INTRO_4: case INTRO_4:
@@ -143,20 +152,27 @@ public:
case INTRO_5: case INTRO_5:
me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_KIRTONOS_STAFF)); me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_KIRTONOS_STAFF));
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetReactState(REACT_AGGRESSIVE); me->SetReactState(REACT_AGGRESSIVE);
break; break;
case INTRO_6: case INTRO_6:
me->GetMotionMaster()->MovePoint(0, PosMove[1]); if (!me->IsInCombat())
{
me->GetMotionMaster()->MovePoint(0, PosMove[1]);
}
break; break;
} }
if (!UpdateVictim()) if (!UpdateVictim())
{
return; return;
}
events.Update(diff); events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING)) if (me->HasUnitState(UNIT_STATE_CASTING))
{
return; return;
}
switch (events.ExecuteEvent()) switch (events.ExecuteEvent())
{ {
@@ -186,26 +202,46 @@ public:
break; break;
case EVENT_DOMINATE_MIND: case EVENT_DOMINATE_MIND:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 20.0f, true)) if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 20.0f, true))
{
me->CastSpell(target, SPELL_DOMINATE_MIND, false); me->CastSpell(target, SPELL_DOMINATE_MIND, false);
events.ScheduleEvent(EVENT_DOMINATE_MIND, urand(44000, 48000)); }
break; break;
case EVENT_KIRTONOS_TRANSFORM: case EVENT_KIRTONOS_TRANSFORM:
if (me->HealthBelowPct(50)) TransformsCount++;
if (me->HasAura(SPELL_KIRTONOS_TRANSFORM))
{ {
events.Reset(); events.Reset();
events.ScheduleEvent(EVENT_SWOOP, 4000); events.ScheduleEvent(EVENT_SWOOP, 4000);
events.ScheduleEvent(EVENT_WING_FLAP, 7000); events.ScheduleEvent(EVENT_WING_FLAP, 7000);
events.ScheduleEvent(EVENT_PIERCE_ARMOR, 11000); events.ScheduleEvent(EVENT_PIERCE_ARMOR, 11000);
events.ScheduleEvent(EVENT_DISARM, 15000); events.ScheduleEvent(EVENT_DISARM, 15000);
// show shape-shift animation before aura removal
me->CastSpell(me, SPELL_TRANSFORM_VISUAL, true);
me->RemoveAura(SPELL_KIRTONOS_TRANSFORM); me->RemoveAura(SPELL_KIRTONOS_TRANSFORM);
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(0)); me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(0));
break; }
else
{
events.Reset();
events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, 2000);
events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, 6000);
events.ScheduleEvent(EVENT_WING_FLAP, 13000);
me->CastSpell(me, SPELL_KIRTONOS_TRANSFORM, true);
me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_KIRTONOS_STAFF));
// Schedule Dominate Mind on every 2nd caster transform
if ((TransformsCount - 2) % 4 == 0)
{
events.ScheduleEvent(EVENT_DOMINATE_MIND, urand(4000, 8000));
}
} }
events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, 2000); events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, 20000);
break; break;
} }
DoZoneInCombat();
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };