fix(Core/Boss): Toravon Script Mechanics (#2868)

This commit is contained in:
Arthas Wow
2020-10-07 07:17:36 -03:00
committed by GitHub
parent 86a7226af0
commit 22f8195c14
2 changed files with 123 additions and 119 deletions

View File

@@ -12,10 +12,11 @@
enum Spells
{
// Toravon
SPELL_FREEZING_GROUND = 72090,
SPELL_FROZEN_ORB = 72091,
SPELL_WHITEOUT = 72034,
SPELL_FROZEN_MALLET = 71993,
SPELL_FREEZING_GROUND = 72090,
SPELL_FROZEN_ORB = 72091,
SPELL_WHITEOUT = 72034,
SPELL_WHITEOUT_VISUAL = 72036,
SPELL_FROZEN_MALLET = 71993,
// Frozen Orb
SPELL_FROZEN_ORB_DMG = 72081, // priodic dmg aura
@@ -23,13 +24,19 @@ enum Spells
// Frozen Orb Stalker
SPELL_FROZEN_ORB_STALKER_VISUAL = 72094,
// Whiteout GroundEffect NPC
NPC_WHITEOUT_GROUND_EFFECT = 38440,
};
enum Events
{
EVENT_FREEZING_GROUND = 1,
EVENT_FROZEN_ORB_STALKER = 2,
EVENT_CHECK_SUMMONS = 3,
EVENT_CAST_WHITEOUT = 3,
EVENT_CAST_WHITEOUT_GROUND_EFFECT = 4,
};
enum Misc
@@ -41,122 +48,114 @@ enum Misc
class boss_toravon : public CreatureScript
{
public:
boss_toravon() : CreatureScript("boss_toravon") { }
public:
boss_toravon() : CreatureScript("boss_toravon") { }
struct boss_toravonAI : public ScriptedAI
struct boss_toravonAI : public ScriptedAI
{
boss_toravonAI(Creature* creature) : ScriptedAI(creature), summons(me)
{
boss_toravonAI(Creature* creature) : ScriptedAI(creature), summons(me)
{
pInstance = me->GetInstanceScript();
}
InstanceScript* pInstance;
EventMap events;
SummonList summons;
void Reset()
{
events.Reset();
summons.DespawnAll();
if (pInstance)
{
if (pInstance->GetData(DATA_STONED))
{
if (Aura* aur = me->AddAura(SPELL_STONED_AURA, me))
{
aur->SetMaxDuration(60 * MINUTE* IN_MILLISECONDS);
aur->SetDuration(60 * MINUTE* IN_MILLISECONDS);
}
}
pInstance->SetData(EVENT_TORAVON, NOT_STARTED);
}
}
void AttackStart(Unit* who)
{
if (me->HasAura(SPELL_STONED_AURA))
return;
ScriptedAI::AttackStart(who);
}
void EnterCombat(Unit* /*who*/)
{
me->CastSpell(me, SPELL_FROZEN_MALLET, true);
events.ScheduleEvent(EVENT_FROZEN_ORB_STALKER, 12000);
events.ScheduleEvent(EVENT_FREEZING_GROUND, 7000);
if (pInstance)
pInstance->SetData(EVENT_TORAVON, IN_PROGRESS);
}
void JustDied(Unit* )
{
if (pInstance)
{
pInstance->SetData(EVENT_TORAVON, DONE);
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_WHITEOUT);
}
}
void JustSummoned(Creature* cr)
{
summons.Summon(cr);
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.GetEvent())
{
case EVENT_FREEZING_GROUND:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
me->CastSpell(target, SPELL_FREEZING_GROUND, false);
events.RepeatEvent(20000);
break;
case EVENT_FROZEN_ORB_STALKER:
me->CastCustomSpell(SPELL_FROZEN_ORB, SPELLVALUE_MAX_TARGETS, RAID_MODE(1, 3), me, false);
events.RepeatEvent(35000);
events.ScheduleEvent(EVENT_CHECK_SUMMONS, 10000);
break;
case EVENT_CHECK_SUMMONS:
for (SummonList::iterator i = summons.begin(); i != summons.end();)
{
if (Creature* cr = ObjectAccessor::GetCreature(*me, *i))
{
if (!cr->IsAlive())
summons.erase(i++);
else
++i;
}
else
summons.erase(i++);
}
if (summons.empty())
{
events.PopEvent();
me->CastSpell(me, SPELL_WHITEOUT, false);
break;
}
events.RepeatEvent(2000);
break;
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new boss_toravonAI(creature);
pInstance = me->GetInstanceScript();
}
InstanceScript* pInstance;
EventMap events;
SummonList summons;
void Reset()
{
events.Reset();
summons.DespawnAll();
if (pInstance)
{
if (pInstance->GetData(DATA_STONED))
{
if (Aura* aur = me->AddAura(SPELL_STONED_AURA, me))
{
aur->SetMaxDuration(60 * MINUTE* IN_MILLISECONDS);
aur->SetDuration(60 * MINUTE* IN_MILLISECONDS);
}
}
pInstance->SetData(EVENT_TORAVON, NOT_STARTED);
}
}
void AttackStart(Unit* who)
{
if (me->HasAura(SPELL_STONED_AURA))
return;
ScriptedAI::AttackStart(who);
}
void EnterCombat(Unit* /*who*/)
{
me->CastSpell(me, SPELL_FROZEN_MALLET, true);
events.ScheduleEvent(EVENT_FROZEN_ORB_STALKER, 12000);
events.ScheduleEvent(EVENT_FREEZING_GROUND, 7000);
events.ScheduleEvent(EVENT_CAST_WHITEOUT, 25000); // schedule FIRST whiteout event in 25 seconds -1 for compesate updateai 2seconds check delay
if (pInstance)
pInstance->SetData(EVENT_TORAVON, IN_PROGRESS);
}
void JustDied(Unit*)
{
if (pInstance)
{
pInstance->SetData(EVENT_TORAVON, DONE);
pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_WHITEOUT);
}
}
void JustSummoned(Creature* cr)
{
summons.Summon(cr);
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.GetEvent())
{
case EVENT_FREEZING_GROUND:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
me->CastSpell(target, SPELL_FREEZING_GROUND, false);
events.RepeatEvent(20000);
break;
case EVENT_FROZEN_ORB_STALKER:
me->CastCustomSpell(SPELL_FROZEN_ORB, SPELLVALUE_MAX_TARGETS, RAID_MODE(1, 3), me, false);
events.RepeatEvent(30000);
break;
case EVENT_CAST_WHITEOUT:
me->CastSpell(me, SPELL_WHITEOUT, false);
events.ScheduleEvent(EVENT_CAST_WHITEOUT_GROUND_EFFECT, 1000); // triggers after 1 sec "plus 1 from trigger to cast visual"
events.RepeatEvent(40000); // next whiteout instead first 25 SEC is now 45 SEC
break;
case EVENT_CAST_WHITEOUT_GROUND_EFFECT: // Whiteout Ground effect trigger
if (Unit* whiteOutGround = me->SummonCreature(NPC_WHITEOUT_GROUND_EFFECT, -43.3316, -288.708, 92.2511, 1.58825, TEMPSUMMON_TIMED_DESPAWN, 4000))
whiteOutGround->CastSpell(whiteOutGround, SPELL_WHITEOUT_VISUAL, false); // Cast the spell
events.PopEvent();
break;
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new boss_toravonAI(creature);
}
};
class npc_frozen_orb : public CreatureScript
@@ -234,7 +233,6 @@ public:
}
};
void AddSC_boss_toravon()
{
new boss_toravon();