fix(Scripts/VOA): code-style improvements + bandwidth consumptio (#3632)

This commit is contained in:
Goatform
2020-11-27 12:50:50 +01:00
committed by GitHub
parent 553f1b455a
commit 37d1f2be47

View File

@@ -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();
}
};