mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-18 11:25:42 +00:00
fix(Scripts/VOA): code-style improvements + bandwidth consumptio (#3632)
This commit is contained in:
@@ -11,13 +11,17 @@
|
||||
enum Archavon
|
||||
{
|
||||
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_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_25 = 60880,
|
||||
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_BERSERK = 47008,
|
||||
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
|
||||
};
|
||||
|
||||
enum
|
||||
@@ -32,156 +36,184 @@ enum Events
|
||||
EVENT_CHOKING_CLOUD = 2,
|
||||
EVENT_STOMP = 3,
|
||||
EVENT_IMPALE = 4,
|
||||
EVENT_BERSERK = 5,
|
||||
EVENT_BERSERK = 5
|
||||
};
|
||||
|
||||
// 31125 - Archavon the Stone Watcher
|
||||
class boss_archavon : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_archavon() : CreatureScript("boss_archavon") { }
|
||||
public:
|
||||
boss_archavon() : CreatureScript("boss_archavon") { }
|
||||
|
||||
struct boss_archavonAI : public ScriptedAI
|
||||
{
|
||||
boss_archavonAI(Creature* creature) : ScriptedAI(creature)
|
||||
struct boss_archavonAI : public ScriptedAI
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
if (pInstance)
|
||||
boss_archavonAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
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_ARCHAVON, NOT_STARTED);
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who)
|
||||
{
|
||||
if (me->HasAura(SPELL_STONED_AURA))
|
||||
return;
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
|
||||
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())
|
||||
void Reset()
|
||||
{
|
||||
case EVENT_ROCK_SHARDS:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(target, SPELL_ROCK_SHARDS, false);
|
||||
events.Reset();
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
events.RepeatEvent(15000);
|
||||
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
|
||||
pInstance->SetData(EVENT_ARCHAVON, NOT_STARTED);
|
||||
}
|
||||
}
|
||||
|
||||
events.RepeatEvent(30000);
|
||||
break;
|
||||
case EVENT_STOMP:
|
||||
void AttackStart(Unit* who)
|
||||
{
|
||||
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];
|
||||
sprintf(buffer, "Archavon the Stone Watcher lunges for %s!", me->GetVictim()->GetName().c_str());
|
||||
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.ScheduleEvent(EVENT_IMPALE, 3000);
|
||||
break;
|
||||
}
|
||||
case EVENT_IMPALE:
|
||||
me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_IMPALE_10, SPELL_IMPALE_25), false);
|
||||
break;
|
||||
case EVENT_BERSERK:
|
||||
me->CastSpell(me, SPELL_BERSERK, true);
|
||||
Talk(EMOTE_BERSERK);
|
||||
break;
|
||||
default:
|
||||
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);
|
||||
case EVENT_IMPALE:
|
||||
DoCastVictim(RAID_MODE(SPELL_IMPALE_10, SPELL_IMPALE_25));
|
||||
break;
|
||||
case EVENT_BERSERK:
|
||||
DoCast(me, SPELL_BERSERK, true);
|
||||
Talk(EMOTE_BERSERK);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
return new spell_archavon_rock_shards_SpellScript();
|
||||
}
|
||||
// 58941 - Rock Shards
|
||||
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* 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