fix(Scripts/VOA): code-style improvements + bandwidth consumptio (#3632)
This commit is contained in:
@@ -11,13 +11,17 @@
|
|||||||
enum Archavon
|
enum Archavon
|
||||||
{
|
{
|
||||||
SPELL_ROCK_SHARDS = 58678,
|
SPELL_ROCK_SHARDS = 58678,
|
||||||
|
SPELL_ROCK_SHARDS_LEFT_HAND_VISUAL = 58689,
|
||||||
|
SPELL_ROCK_SHARDS_RIGHT_HAND_VISUAL = 58692,
|
||||||
|
SPELL_ROCK_SHARDS_DAMAGE_10 = 58695,
|
||||||
|
SPELL_ROCK_SHARDS_DAMAGE_25 = 60883,
|
||||||
SPELL_CRUSHING_LEAP_10 = 58960,
|
SPELL_CRUSHING_LEAP_10 = 58960,
|
||||||
SPELL_CRUSHING_LEAP_25 = 60894, //Instant (10-80yr range) -- Leaps at an enemy, inflicting 8000 Physical damage, knocking all nearby enemies away, and creating a cloud of choking debris.
|
SPELL_CRUSHING_LEAP_25 = 60894, // Instant (10-80yr range) -- Leaps at an enemy, inflicting 8000 Physical damage, knocking all nearby enemies away, and creating a cloud of choking debris.
|
||||||
SPELL_STOMP_10 = 58663,
|
SPELL_STOMP_10 = 58663,
|
||||||
SPELL_STOMP_25 = 60880,
|
SPELL_STOMP_25 = 60880,
|
||||||
SPELL_IMPALE_10 = 58666,
|
SPELL_IMPALE_10 = 58666,
|
||||||
SPELL_IMPALE_25 = 60882, //Lifts an enemy off the ground with a spiked fist, inflicting 47125 to 52875 Physical damage and 9425 to 10575 additional damage each second for 8 sec.
|
SPELL_IMPALE_25 = 60882, // Lifts an enemy off the ground with a spiked fist, inflicting 47125 to 52875 Physical damage and 9425 to 10575 additional damage each second for 8 sec.
|
||||||
SPELL_BERSERK = 47008,
|
SPELL_BERSERK = 47008
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
@@ -32,156 +36,184 @@ enum Events
|
|||||||
EVENT_CHOKING_CLOUD = 2,
|
EVENT_CHOKING_CLOUD = 2,
|
||||||
EVENT_STOMP = 3,
|
EVENT_STOMP = 3,
|
||||||
EVENT_IMPALE = 4,
|
EVENT_IMPALE = 4,
|
||||||
EVENT_BERSERK = 5,
|
EVENT_BERSERK = 5
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 31125 - Archavon the Stone Watcher
|
||||||
class boss_archavon : public CreatureScript
|
class boss_archavon : public CreatureScript
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
boss_archavon() : CreatureScript("boss_archavon") { }
|
boss_archavon() : CreatureScript("boss_archavon") { }
|
||||||
|
|
||||||
struct boss_archavonAI : public ScriptedAI
|
struct boss_archavonAI : public ScriptedAI
|
||||||
{
|
|
||||||
boss_archavonAI(Creature* creature) : ScriptedAI(creature)
|
|
||||||
{
|
{
|
||||||
pInstance = me->GetInstanceScript();
|
boss_archavonAI(Creature* creature) : ScriptedAI(creature)
|
||||||
}
|
|
||||||
|
|
||||||
InstanceScript* pInstance;
|
|
||||||
EventMap events;
|
|
||||||
|
|
||||||
void Reset()
|
|
||||||
{
|
|
||||||
events.Reset();
|
|
||||||
if (pInstance)
|
|
||||||
{
|
{
|
||||||
if (pInstance->GetData(DATA_STONED))
|
pInstance = me->GetInstanceScript();
|
||||||
{
|
|
||||||
if (Aura* aur = me->AddAura(SPELL_STONED_AURA, me))
|
|
||||||
{
|
|
||||||
aur->SetMaxDuration(60 * MINUTE * IN_MILLISECONDS);
|
|
||||||
aur->SetDuration(60 * MINUTE * IN_MILLISECONDS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pInstance->SetData(EVENT_ARCHAVON, NOT_STARTED);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void AttackStart(Unit* who)
|
InstanceScript* pInstance;
|
||||||
{
|
EventMap events;
|
||||||
if (me->HasAura(SPELL_STONED_AURA))
|
|
||||||
return;
|
|
||||||
|
|
||||||
ScriptedAI::AttackStart(who);
|
void Reset()
|
||||||
}
|
|
||||||
|
|
||||||
void EnterCombat(Unit* /*who*/)
|
|
||||||
{
|
|
||||||
events.ScheduleEvent(EVENT_ROCK_SHARDS, 15000);
|
|
||||||
events.ScheduleEvent(EVENT_CHOKING_CLOUD, 30000);
|
|
||||||
events.ScheduleEvent(EVENT_STOMP, 45000);
|
|
||||||
events.ScheduleEvent(EVENT_BERSERK, 300000);
|
|
||||||
if (pInstance)
|
|
||||||
pInstance->SetData(EVENT_ARCHAVON, IN_PROGRESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JustDied(Unit* )
|
|
||||||
{
|
|
||||||
if (pInstance)
|
|
||||||
pInstance->SetData(EVENT_ARCHAVON, DONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateAI(uint32 diff)
|
|
||||||
{
|
|
||||||
if (!UpdateVictim())
|
|
||||||
return;
|
|
||||||
|
|
||||||
events.Update(diff);
|
|
||||||
|
|
||||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (events.ExecuteEvent())
|
|
||||||
{
|
{
|
||||||
case EVENT_ROCK_SHARDS:
|
events.Reset();
|
||||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
if (pInstance)
|
||||||
me->CastSpell(target, SPELL_ROCK_SHARDS, false);
|
{
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
events.RepeatEvent(15000);
|
pInstance->SetData(EVENT_ARCHAVON, NOT_STARTED);
|
||||||
break;
|
}
|
||||||
case EVENT_CHOKING_CLOUD:
|
}
|
||||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
|
|
||||||
me->CastSpell(target, RAID_MODE(SPELL_CRUSHING_LEAP_10, SPELL_CRUSHING_LEAP_25), true); //10y~80y, ignore range
|
|
||||||
|
|
||||||
events.RepeatEvent(30000);
|
void AttackStart(Unit* who)
|
||||||
break;
|
{
|
||||||
case EVENT_STOMP:
|
if (me->HasAura(SPELL_STONED_AURA))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScriptedAI::AttackStart(who);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EnterCombat(Unit* /*who*/)
|
||||||
|
{
|
||||||
|
events.ScheduleEvent(EVENT_ROCK_SHARDS, 15000);
|
||||||
|
events.ScheduleEvent(EVENT_CHOKING_CLOUD, 30000);
|
||||||
|
events.ScheduleEvent(EVENT_STOMP, 45000);
|
||||||
|
events.ScheduleEvent(EVENT_BERSERK, 300000);
|
||||||
|
|
||||||
|
if (pInstance)
|
||||||
|
{
|
||||||
|
pInstance->SetData(EVENT_ARCHAVON, IN_PROGRESS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JustDied(Unit*)
|
||||||
|
{
|
||||||
|
if (pInstance)
|
||||||
|
{
|
||||||
|
pInstance->SetData(EVENT_ARCHAVON, DONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateAI(uint32 diff)
|
||||||
|
{
|
||||||
|
if (!UpdateVictim())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
events.Update(diff);
|
||||||
|
|
||||||
|
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (events.ExecuteEvent())
|
||||||
|
{
|
||||||
|
case EVENT_ROCK_SHARDS:
|
||||||
|
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||||
|
{
|
||||||
|
DoCast(target, SPELL_ROCK_SHARDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
events.RepeatEvent(15000);
|
||||||
|
break;
|
||||||
|
case EVENT_CHOKING_CLOUD:
|
||||||
|
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
|
||||||
|
{
|
||||||
|
DoCast(target, RAID_MODE(SPELL_CRUSHING_LEAP_10, SPELL_CRUSHING_LEAP_25), true); //10y ~ 80y, ignore range
|
||||||
|
}
|
||||||
|
|
||||||
|
events.RepeatEvent(30000);
|
||||||
|
break;
|
||||||
|
case EVENT_STOMP:
|
||||||
{
|
{
|
||||||
char buffer[100];
|
char buffer[100];
|
||||||
sprintf(buffer, "Archavon the Stone Watcher lunges for %s!", me->GetVictim()->GetName().c_str());
|
sprintf(buffer, "Archavon the Stone Watcher lunges for %s!", me->GetVictim()->GetName().c_str());
|
||||||
me->MonsterTextEmote(buffer, 0);
|
me->MonsterTextEmote(buffer, 0);
|
||||||
me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_STOMP_10, SPELL_STOMP_25), false);
|
|
||||||
|
DoCastVictim(RAID_MODE(SPELL_STOMP_10, SPELL_STOMP_25));
|
||||||
|
|
||||||
events.RepeatEvent(45000);
|
events.RepeatEvent(45000);
|
||||||
events.ScheduleEvent(EVENT_IMPALE, 3000);
|
events.ScheduleEvent(EVENT_IMPALE, 3000);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case EVENT_IMPALE:
|
case EVENT_IMPALE:
|
||||||
me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_IMPALE_10, SPELL_IMPALE_25), false);
|
DoCastVictim(RAID_MODE(SPELL_IMPALE_10, SPELL_IMPALE_25));
|
||||||
break;
|
break;
|
||||||
case EVENT_BERSERK:
|
case EVENT_BERSERK:
|
||||||
me->CastSpell(me, SPELL_BERSERK, true);
|
DoCast(me, SPELL_BERSERK, true);
|
||||||
Talk(EMOTE_BERSERK);
|
Talk(EMOTE_BERSERK);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* creature) const
|
|
||||||
{
|
|
||||||
return new boss_archavonAI(creature);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class spell_archavon_rock_shards : public SpellScriptLoader
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
spell_archavon_rock_shards() : SpellScriptLoader("spell_archavon_rock_shards") { }
|
|
||||||
|
|
||||||
class spell_archavon_rock_shards_SpellScript : public SpellScript
|
|
||||||
{
|
|
||||||
PrepareSpellScript(spell_archavon_rock_shards_SpellScript);
|
|
||||||
|
|
||||||
void HandleScript(SpellEffIndex effIndex)
|
|
||||||
{
|
|
||||||
PreventHitDefaultEffect(effIndex);
|
|
||||||
Unit* target = GetHitUnit();
|
|
||||||
Unit* caster = GetOriginalCaster();
|
|
||||||
if (target && caster && caster->GetMap())
|
|
||||||
{
|
|
||||||
for (uint32 i = 0; i < 3; ++i)
|
|
||||||
{
|
|
||||||
caster->CastSpell(target, 58689, true);
|
|
||||||
caster->CastSpell(target, 58692, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
caster->CastSpell(target, caster->GetMap()->Is25ManRaid() ? 60883 : 58695, true);
|
DoMeleeAttackIfReady();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
void Register()
|
CreatureAI* GetAI(Creature* creature) const
|
||||||
{
|
{
|
||||||
OnEffectHitTarget += SpellEffectFn(spell_archavon_rock_shards_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
return new boss_archavonAI(creature);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
SpellScript* GetSpellScript() const
|
// 58941 - Rock Shards
|
||||||
{
|
class spell_archavon_rock_shards : public SpellScriptLoader
|
||||||
return new spell_archavon_rock_shards_SpellScript();
|
{
|
||||||
}
|
public:
|
||||||
|
spell_archavon_rock_shards() : SpellScriptLoader("spell_archavon_rock_shards") { }
|
||||||
|
|
||||||
|
class spell_archavon_rock_shards_SpellScript : public SpellScript
|
||||||
|
{
|
||||||
|
PrepareSpellScript(spell_archavon_rock_shards_SpellScript);
|
||||||
|
|
||||||
|
void HandleScript(SpellEffIndex effIndex)
|
||||||
|
{
|
||||||
|
PreventHitDefaultEffect(effIndex);
|
||||||
|
|
||||||
|
Unit* caster = GetCaster();
|
||||||
|
Unit* target = GetHitUnit();
|
||||||
|
|
||||||
|
if (!caster || !target)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map* map = caster->GetMap();
|
||||||
|
if (!map)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
caster->CastSpell(target, SPELL_ROCK_SHARDS_LEFT_HAND_VISUAL, true);
|
||||||
|
caster->CastSpell(target, SPELL_ROCK_SHARDS_RIGHT_HAND_VISUAL, true);
|
||||||
|
|
||||||
|
uint32 spellId = map->Is25ManRaid() ? SPELL_ROCK_SHARDS_DAMAGE_25 : SPELL_ROCK_SHARDS_DAMAGE_10;
|
||||||
|
caster->CastSpell(target, spellId, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Register()
|
||||||
|
{
|
||||||
|
OnEffectHitTarget += SpellEffectFn(spell_archavon_rock_shards_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
SpellScript* GetSpellScript() const
|
||||||
|
{
|
||||||
|
return new spell_archavon_rock_shards_SpellScript();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user