aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp187
1 files changed, 92 insertions, 95 deletions
diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp
index b2b4083f9c6..cef95b607c7 100644
--- a/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp
+++ b/src/server/scripts/EasternKingdoms/AlteracValley/alterac_valley.cpp
@@ -24,8 +24,8 @@ enum Spells
SPELL_CLEAVE = 40504,
SPELL_DEMORALIZING_SHOUT = 23511,
SPELL_ENRAGE = 8599,
- SPELL_WHIRLWIND1 = 15589,
- SPELL_WHIRLWIND2 = 13736,
+ SPELL_WHIRLWIND = 13736,
+
SPELL_NORTH_MARSHAL = 45828,
SPELL_SOUTH_MARSHAL = 45829,
SPELL_STONEHEARTH_MARSHAL = 45830,
@@ -48,38 +48,55 @@ enum Creatures
NPC_WEST_FROSTWOLF_WARMASTER = 14777
};
+enum Events
+{
+ EVENT_CHARGE_TARGET = 1,
+ EVENT_CLEAVE = 2,
+ EVENT_DEMORALIZING_SHOUT = 3,
+ EVENT_WHIRLWIND = 4,
+ EVENT_ENRAGE = 5,
+ EVENT_CHECK_RESET = 6
+};
+
+struct SpellPair
+{
+ uint32 npcEntry;
+ uint32 spellId;
+};
+
+uint8 const MAX_SPELL_PAIRS = 8;
+SpellPair const _auraPairs[MAX_SPELL_PAIRS] =
+{
+ { NPC_NORTH_MARSHAL, SPELL_NORTH_MARSHAL },
+ { NPC_SOUTH_MARSHAL, SPELL_SOUTH_MARSHAL },
+ { NPC_STONEHEARTH_MARSHAL, SPELL_STONEHEARTH_MARSHAL },
+ { NPC_ICEWING_MARSHAL, SPELL_ICEWING_MARSHAL },
+ { NPC_EAST_FROSTWOLF_WARMASTER, SPELL_EAST_FROSTWOLF_WARMASTER },
+ { NPC_WEST_FROSTWOLF_WARMASTER, SPELL_WEST_FROSTWOLF_WARMASTER },
+ { NPC_TOWER_POINT_WARMASTER, SPELL_TOWER_POINT_WARMASTER },
+ { NPC_ICEBLOOD_WARMASTER, SPELL_ICEBLOOD_WARMASTER }
+};
+
class mob_av_marshal_or_warmaster : public CreatureScript
{
public:
-
- mob_av_marshal_or_warmaster()
- : CreatureScript("mob_av_marshal_or_warmaster") {}
+ mob_av_marshal_or_warmaster() : CreatureScript("mob_av_marshal_or_warmaster") { }
struct mob_av_marshal_or_warmasterAI : public ScriptedAI
{
- mob_av_marshal_or_warmasterAI(Creature* creature) : ScriptedAI(creature) {}
-
- uint32 ChargeTimer;
- uint32 CleaveTimer;
- uint32 DemoralizingShoutTimer;
- uint32 Whirlwind1Timer;
- uint32 Whirlwind2Timer;
- uint32 EnrageTimer;
- uint32 ResetTimer;
-
- bool bHasAura;
+ mob_av_marshal_or_warmasterAI(Creature* creature) : ScriptedAI(creature) { }
void Reset()
{
- ChargeTimer = urand(2 * IN_MILLISECONDS, 12 * IN_MILLISECONDS);
- CleaveTimer = urand(1 * IN_MILLISECONDS, 11 * IN_MILLISECONDS);
- DemoralizingShoutTimer = urand(2 * IN_MILLISECONDS, 2 * IN_MILLISECONDS);
- Whirlwind1Timer = urand(1 * IN_MILLISECONDS, 12 * IN_MILLISECONDS);
- Whirlwind2Timer = urand(5 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
- EnrageTimer = urand(5 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
- ResetTimer = 5 * IN_MILLISECONDS;
-
- bHasAura = false;
+ events.Reset();
+ events.ScheduleEvent(EVENT_CHARGE_TARGET, urand(2 * IN_MILLISECONDS, 12 * IN_MILLISECONDS));
+ events.ScheduleEvent(EVENT_CLEAVE, urand(1 * IN_MILLISECONDS, 11 * IN_MILLISECONDS));
+ events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, 2000);
+ events.ScheduleEvent(EVENT_WHIRLWIND, urand(5 * IN_MILLISECONDS, 20 * IN_MILLISECONDS));
+ events.ScheduleEvent(EVENT_ENRAGE, urand(5 * IN_MILLISECONDS, 20 * IN_MILLISECONDS));
+ events.ScheduleEvent(EVENT_CHECK_RESET, 5000);
+
+ _hasAura = false;
}
void JustRespawned()
@@ -87,90 +104,70 @@ class mob_av_marshal_or_warmaster : public CreatureScript
Reset();
}
- void UpdateAI(const uint32 diff)
+ void UpdateAI(uint32 const diff)
{
- if (!bHasAura)
+ // I have a feeling this isn't blizzlike, but owell, I'm only passing by and cleaning up.
+ if (!_hasAura)
{
- switch (me->GetEntry())
- {
- case NPC_NORTH_MARSHAL:
- DoCast(me, SPELL_NORTH_MARSHAL);
- break;
- case NPC_SOUTH_MARSHAL:
- DoCast(me, SPELL_SOUTH_MARSHAL);
- break;
- case NPC_STONEHEARTH_MARSHAL:
- DoCast(me, SPELL_STONEHEARTH_MARSHAL);
- break;
- case NPC_ICEWING_MARSHAL:
- DoCast(me, SPELL_ICEWING_MARSHAL);
- break;
- case NPC_EAST_FROSTWOLF_WARMASTER:
- DoCast(me, SPELL_EAST_FROSTWOLF_WARMASTER);
- break;
- case NPC_WEST_FROSTWOLF_WARMASTER:
- DoCast(me, SPELL_WEST_FROSTWOLF_WARMASTER);
- break;
- case NPC_ICEBLOOD_WARMASTER:
- DoCast(me, SPELL_ICEBLOOD_WARMASTER);
- break;
- case NPC_TOWER_POINT_WARMASTER:
- DoCast(me, SPELL_TOWER_POINT_WARMASTER);
- break;
- }
+ for (uint8 i = 0; i < MAX_SPELL_PAIRS; ++i)
+ if (_auraPairs[i].npcEntry == me->GetEntry())
+ DoCast(me, _auraPairs[i].spellId);
- bHasAura = true;
+ _hasAura = true;
}
if (!UpdateVictim())
return;
- if (ChargeTimer <= diff)
- {
- DoCast(me->getVictim(), SPELL_CHARGE);
- ChargeTimer = urand(10 * IN_MILLISECONDS, 25 * IN_MILLISECONDS);
- } else ChargeTimer -= diff;
-
- if (CleaveTimer <= diff)
- {
- DoCast(me->getVictim(), SPELL_CLEAVE);
- CleaveTimer = urand(10 * IN_MILLISECONDS, 16 * IN_MILLISECONDS);
- } else CleaveTimer -= diff;
-
- if (DemoralizingShoutTimer <= diff)
- {
- DoCast(me->getVictim(), SPELL_DEMORALIZING_SHOUT);
- DemoralizingShoutTimer = urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS);
- } else DemoralizingShoutTimer -= diff;
+ events.Update(diff);
- if (Whirlwind1Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_WHIRLWIND1);
- Whirlwind1Timer = urand(6 * IN_MILLISECONDS, 20 * IN_MILLISECONDS);
- } else Whirlwind1Timer -= diff;
-
- if (Whirlwind2Timer <= diff)
- {
- DoCast(me->getVictim(), SPELL_WHIRLWIND2);
- Whirlwind2Timer = urand(10 * IN_MILLISECONDS, 25 * IN_MILLISECONDS);
- } else Whirlwind2Timer -= diff;
-
- if (EnrageTimer <= diff)
- {
- DoCast(me->getVictim(), SPELL_ENRAGE);
- EnrageTimer = urand(10 * IN_MILLISECONDS, 30 * IN_MILLISECONDS);
- }else EnrageTimer -= diff;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- // check if creature is not outside of building
- if (ResetTimer <= diff)
+ while (uint32 eventId = events.ExecuteEvent())
{
- if (me->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 50)
- EnterEvadeMode();
- ResetTimer = 5 * IN_MILLISECONDS;
- } else ResetTimer -= diff;
+ switch (eventId)
+ {
+ case EVENT_CHARGE_TARGET:
+ DoCast(me->getVictim(), SPELL_CHARGE);
+ events.ScheduleEvent(EVENT_CHARGE, urand(10 * IN_MILLISECONDS, 25 * IN_MILLISECONDS));
+ break;
+ case EVENT_CLEAVE:
+ DoCast(me->getVictim(), SPELL_CLEAVE);
+ events.ScheduleEvent(EVENT_CLEAVE, urand(10 * IN_MILLISECONDS, 16 * IN_MILLISECONDS));
+ break;
+ case EVENT_DEMORALIZING_SHOUT:
+ DoCast(me, SPELL_DEMORALIZING_SHOUT);
+ events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS));
+ break;
+ case EVENT_WHIRLWIND:
+ DoCast(me, SPELL_WHIRLWIND);
+ events.ScheduleEvent(EVENT_WHIRLWIND, urand(10 * IN_MILLISECONDS, 25 * IN_MILLISECONDS));
+ break;
+ case EVENT_ENRAGE:
+ DoCast(me, SPELL_ENRAGE);
+ events.ScheduleEvent(EVENT_ENRAGE, urand(10 * IN_MILLISECONDS, 30 * IN_MILLISECONDS));
+ break;
+ case EVENT_CHECK_RESET:
+ {
+ Position const& _homePosition = me->GetHomePosition();
+ if (me->GetDistance2d(_homePosition.GetPositionX(), _homePosition.GetPositionY()) > 50.0f)
+ {
+ EnterEvadeMode();
+ return;
+ }
+ events.ScheduleEvent(EVENT_CHECK_RESET, 5000);
+ break;
+ }
+ }
+ }
DoMeleeAttackIfReady();
}
+
+ private:
+ EventMap events;
+ bool _hasAura;
};
CreatureAI* GetAI(Creature* creature) const