converted all tabs to 4 spaces

This commit is contained in:
Yehonal
2016-06-26 19:23:57 +02:00
parent 52f305111c
commit f6eefedcd5
717 changed files with 132388 additions and 132388 deletions

View File

@@ -174,7 +174,7 @@ class spell_mark_of_kazrogal : public SpellScriptLoader
void FilterTargets(std::list<WorldObject*>& targets)
{
targets.remove_if(Trinity::PowerCheck(POWER_MANA, false));
targets.remove_if(Trinity::PowerCheck(POWER_MANA, false));
}
void Register()

View File

@@ -8,22 +8,22 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
#include "SpellInfo.h"
enum Spells
{
SPELL_CURSE_OF_EXERTION = 52772,
SPELL_WOUNDING_STRIKE_N = 52771,
SPELL_WOUNDING_STRIKE_H = 58830,
SPELL_TIME_STOP = 58848,
SPELL_TIME_WARP = 52766,
SPELL_TIME_STEP_N = 52737,
SPELL_TIME_STEP_H = 58829,
SPELL_CURSE_OF_EXERTION = 52772,
SPELL_WOUNDING_STRIKE_N = 52771,
SPELL_WOUNDING_STRIKE_H = 58830,
SPELL_TIME_STOP = 58848,
SPELL_TIME_WARP = 52766,
SPELL_TIME_STEP_N = 52737,
SPELL_TIME_STEP_H = 58829,
};
enum Events
{
EVENT_SPELL_CURSE_OF_EXERTION = 1,
EVENT_SPELL_WOUNDING_STRIKE = 2,
EVENT_SPELL_TIME_STOP = 3,
EVENT_SPELL_TIME_WARP = 4,
EVENT_TIME_WARP = 5,
EVENT_SPELL_CURSE_OF_EXERTION = 1,
EVENT_SPELL_WOUNDING_STRIKE = 2,
EVENT_SPELL_TIME_STOP = 3,
EVENT_SPELL_TIME_WARP = 4,
EVENT_TIME_WARP = 5,
};
enum Yells
@@ -52,75 +52,75 @@ public:
}
EventMap events;
uint8 warps;
void Reset()
{
events.Reset();
warps = 0;
}
uint8 warps;
void Reset()
{
events.Reset();
warps = 0;
}
void EnterCombat(Unit* /*who*/)
{
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_EXERTION, 9000);
events.ScheduleEvent(EVENT_SPELL_WOUNDING_STRIKE, 3000);
events.ScheduleEvent(EVENT_SPELL_TIME_WARP, 25000);
events.ScheduleEvent(EVENT_SPELL_CURSE_OF_EXERTION, 9000);
events.ScheduleEvent(EVENT_SPELL_WOUNDING_STRIKE, 3000);
events.ScheduleEvent(EVENT_SPELL_TIME_WARP, 25000);
if (IsHeroic())
events.ScheduleEvent(EVENT_SPELL_TIME_STOP, 20000);
if (IsHeroic())
events.ScheduleEvent(EVENT_SPELL_TIME_STOP, 20000);
}
void SpellHitTarget(Unit* target, const SpellInfo* spellInfo)
{
if (spellInfo->Id == SPELL_TIME_STEP_H || spellInfo->Id == SPELL_TIME_STEP_N)
{
if (target == me)
return;
void SpellHitTarget(Unit* target, const SpellInfo* spellInfo)
{
if (spellInfo->Id == SPELL_TIME_STEP_H || spellInfo->Id == SPELL_TIME_STEP_N)
{
if (target == me)
return;
if (warps >= 2)
{
warps = 0;
return;
}
warps++;
me->CastSpell(target, DUNGEON_MODE(SPELL_TIME_STEP_N, SPELL_TIME_STEP_H), true);
}
}
if (warps >= 2)
{
warps = 0;
return;
}
warps++;
me->CastSpell(target, DUNGEON_MODE(SPELL_TIME_STEP_N, SPELL_TIME_STEP_H), true);
}
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.GetEvent())
{
case EVENT_SPELL_CURSE_OF_EXERTION:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, SPELL_CURSE_OF_EXERTION, false);
events.RepeatEvent(9000);
break;
case EVENT_SPELL_WOUNDING_STRIKE:
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_WOUNDING_STRIKE_N, SPELL_WOUNDING_STRIKE_H), false);
events.RepeatEvent(6000);
break;
case EVENT_SPELL_TIME_STOP:
me->CastSpell(me, SPELL_TIME_STOP, false);
events.RepeatEvent(20000);
break;
case EVENT_SPELL_TIME_WARP:
Talk(SAY_TIME_WARP);
me->CastSpell(me, SPELL_TIME_WARP, false);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, DUNGEON_MODE(SPELL_TIME_STEP_N, SPELL_TIME_STEP_H), true);
switch (events.GetEvent())
{
case EVENT_SPELL_CURSE_OF_EXERTION:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, SPELL_CURSE_OF_EXERTION, false);
events.RepeatEvent(9000);
break;
case EVENT_SPELL_WOUNDING_STRIKE:
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_WOUNDING_STRIKE_N, SPELL_WOUNDING_STRIKE_H), false);
events.RepeatEvent(6000);
break;
case EVENT_SPELL_TIME_STOP:
me->CastSpell(me, SPELL_TIME_STOP, false);
events.RepeatEvent(20000);
break;
case EVENT_SPELL_TIME_WARP:
Talk(SAY_TIME_WARP);
me->CastSpell(me, SPELL_TIME_WARP, false);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, DUNGEON_MODE(SPELL_TIME_STEP_N, SPELL_TIME_STEP_H), true);
events.RepeatEvent(25000);
break;
}
events.RepeatEvent(25000);
break;
}
DoMeleeAttackIfReady();
}

View File

@@ -8,16 +8,16 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum Spells
{
SPELL_CORRUPTING_BLIGHT = 60588,
SPELL_VOID_STRIKE = 60590,
SPELL_CORRUPTION_OF_TIME_AURA = 60451,
SPELL_CORRUPTION_OF_TIME_CHANNEL = 60422,
SPELL_CORRUPTING_BLIGHT = 60588,
SPELL_VOID_STRIKE = 60590,
SPELL_CORRUPTION_OF_TIME_AURA = 60451,
SPELL_CORRUPTION_OF_TIME_CHANNEL = 60422,
};
enum Events
{
EVENT_SPELL_CORRUPTING_BLIGHT = 1,
EVENT_SPELL_VOID_STRIKE = 2,
EVENT_SPELL_CORRUPTING_BLIGHT = 1,
EVENT_SPELL_VOID_STRIKE = 2,
};
enum Yells
@@ -44,96 +44,96 @@ public:
}
EventMap events;
SummonList summons;
uint32 beamTimer;
SummonList summons;
uint32 beamTimer;
void Reset()
{
events.Reset();
summons.DespawnAll();
if (InstanceScript* pInstance = me->GetInstanceScript())
if (pInstance->GetData(DATA_GUARDIANTIME_EVENT) == 0)
me->DespawnOrUnsummon(500);
void Reset()
{
events.Reset();
summons.DespawnAll();
if (InstanceScript* pInstance = me->GetInstanceScript())
if (pInstance->GetData(DATA_GUARDIANTIME_EVENT) == 0)
me->DespawnOrUnsummon(500);
me->SummonCreature(NPC_TIME_RIFT, 2337.6f, 1270.0f, 132.95f, 2.79f);
me->SummonCreature(NPC_GUARDIAN_OF_TIME, 2319.3f, 1267.7f, 132.8f, 1.0f);
beamTimer = 1;
}
me->SummonCreature(NPC_TIME_RIFT, 2337.6f, 1270.0f, 132.95f, 2.79f);
me->SummonCreature(NPC_GUARDIAN_OF_TIME, 2319.3f, 1267.7f, 132.8f, 1.0f);
beamTimer = 1;
}
void JustSummoned(Creature* cr) { summons.Summon(cr); }
void JustSummoned(Creature* cr) { summons.Summon(cr); }
void EnterCombat(Unit* /*who*/)
{
me->InterruptNonMeleeSpells(false);
events.ScheduleEvent(EVENT_SPELL_VOID_STRIKE, 8000);
events.ScheduleEvent(EVENT_SPELL_CORRUPTING_BLIGHT, 12000);
Talk(SAY_AGGRO);
me->InterruptNonMeleeSpells(false);
events.ScheduleEvent(EVENT_SPELL_VOID_STRIKE, 8000);
events.ScheduleEvent(EVENT_SPELL_CORRUPTING_BLIGHT, 12000);
Talk(SAY_AGGRO);
}
void JustDied(Unit* /*killer*/)
void JustDied(Unit* /*killer*/)
{
Talk(SAY_DEATH);
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
if (Creature* cr = ObjectAccessor::GetCreature(*me, (*itr)))
{
if (cr->GetEntry() == NPC_TIME_RIFT)
cr->DespawnOrUnsummon(1000);
else
{
cr->DespawnOrUnsummon(5000);
cr->RemoveAllAuras();
cr->MonsterSay("You have my thanks for saving my existence in this timeline. Now i must report back to my superiors. They must know immediately of what i just experienced.", LANG_UNIVERSAL, 0);
}
}
Talk(SAY_DEATH);
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
if (Creature* cr = ObjectAccessor::GetCreature(*me, (*itr)))
{
if (cr->GetEntry() == NPC_TIME_RIFT)
cr->DespawnOrUnsummon(1000);
else
{
cr->DespawnOrUnsummon(5000);
cr->RemoveAllAuras();
cr->MonsterSay("You have my thanks for saving my existence in this timeline. Now i must report back to my superiors. They must know immediately of what i just experienced.", LANG_UNIVERSAL, 0);
}
}
if (InstanceScript* pInstance = me->GetInstanceScript())
pInstance->SetData(DATA_SHOW_INFINITE_TIMER, 0);
if (InstanceScript* pInstance = me->GetInstanceScript())
pInstance->SetData(DATA_SHOW_INFINITE_TIMER, 0);
}
void DoAction(int32 param)
{
if (!me->IsAlive())
return;
void DoAction(int32 param)
{
if (!me->IsAlive())
return;
if (param == ACTION_RUN_OUT_OF_TIME)
{
Talk(SAY_FAIL);
summons.DespawnAll();
me->DespawnOrUnsummon(500);
}
}
if (param == ACTION_RUN_OUT_OF_TIME)
{
Talk(SAY_FAIL);
summons.DespawnAll();
me->DespawnOrUnsummon(500);
}
}
void UpdateAI(uint32 diff)
{
if (beamTimer)
{
beamTimer += diff;
if (beamTimer >= 2000)
{
me->CastSpell(me, SPELL_CORRUPTION_OF_TIME_CHANNEL, true);
beamTimer = 0;
}
}
if (beamTimer)
{
beamTimer += diff;
if (beamTimer >= 2000)
{
me->CastSpell(me, SPELL_CORRUPTION_OF_TIME_CHANNEL, true);
beamTimer = 0;
}
}
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.GetEvent())
{
case EVENT_SPELL_VOID_STRIKE:
me->CastSpell(me->GetVictim(), SPELL_VOID_STRIKE, false);
events.RepeatEvent(8000);
break;
case EVENT_SPELL_CORRUPTING_BLIGHT:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, SPELL_CORRUPTING_BLIGHT, false);
events.RepeatEvent(12000);
break;
}
switch (events.GetEvent())
{
case EVENT_SPELL_VOID_STRIKE:
me->CastSpell(me->GetVictim(), SPELL_VOID_STRIKE, false);
events.RepeatEvent(8000);
break;
case EVENT_SPELL_CORRUPTING_BLIGHT:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, SPELL_CORRUPTING_BLIGHT, false);
events.RepeatEvent(12000);
break;
}
DoMeleeAttackIfReady();
}

View File

@@ -9,21 +9,21 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum Spells
{
SPELL_CARRION_SWARM_N = 52720,
SPELL_CARRION_SWARM_H = 58852,
SPELL_MIND_BLAST_N = 52722,
SPELL_MIND_BLAST_H = 58850,
SPELL_SLEEP_N = 52721,
SPELL_SLEEP_H = 58849,
SPELL_VAMPIRIC_TOUCH = 52723,
SPELL_CARRION_SWARM_N = 52720,
SPELL_CARRION_SWARM_H = 58852,
SPELL_MIND_BLAST_N = 52722,
SPELL_MIND_BLAST_H = 58850,
SPELL_SLEEP_N = 52721,
SPELL_SLEEP_H = 58849,
SPELL_VAMPIRIC_TOUCH = 52723,
};
enum Events
{
EVENT_SPELL_CARRION_SWARM = 1,
EVENT_SPELL_MIND_BLAST = 2,
EVENT_SPELL_SLEEP = 3,
EVENT_SPELL_VAMPIRIC_TOUCH = 4,
EVENT_SPELL_CARRION_SWARM = 1,
EVENT_SPELL_MIND_BLAST = 2,
EVENT_SPELL_SLEEP = 3,
EVENT_SPELL_VAMPIRIC_TOUCH = 4,
};
enum Yells
@@ -53,31 +53,31 @@ public:
{
boss_mal_ganisAI(Creature* c) : ScriptedAI(c)
{
finished = false;
finished = false;
}
EventMap events;
bool finished;
bool finished;
void Reset()
{
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true);
events.Reset();
if (finished)
{
Talk(SAY_OUTRO);
me->DespawnOrUnsummon(20000);
}
}
void Reset()
{
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK_DEST, true);
events.Reset();
if (finished)
{
Talk(SAY_OUTRO);
me->DespawnOrUnsummon(20000);
}
}
void EnterCombat(Unit* /*who*/)
{
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_SPELL_CARRION_SWARM, 6000);
events.ScheduleEvent(EVENT_SPELL_MIND_BLAST, 11000);
events.ScheduleEvent(EVENT_SPELL_SLEEP, 20000);
events.ScheduleEvent(EVENT_SPELL_VAMPIRIC_TOUCH, 15000);
events.ScheduleEvent(EVENT_SPELL_CARRION_SWARM, 6000);
events.ScheduleEvent(EVENT_SPELL_MIND_BLAST, 11000);
events.ScheduleEvent(EVENT_SPELL_SLEEP, 20000);
events.ScheduleEvent(EVENT_SPELL_VAMPIRIC_TOUCH, 15000);
}
void JustDied(Unit* /*killer*/)
@@ -92,67 +92,67 @@ public:
Talk(SAY_SLAY);
}
void DamageTaken(Unit* who, uint32 &damage, DamageEffectType, SpellSchoolMask)
{
if (!finished && damage >= me->GetHealth())
{
damage = 0;
finished = true;
me->SetRegeneratingHealth(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetReactState(REACT_PASSIVE);
if (InstanceScript* pInstance = me->GetInstanceScript())
{
if (Creature* cr = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_ARTHAS)))
cr->AI()->DoAction(ACTION_KILLED_MALGANIS);
// give credit to players
me->CastSpell(me, 58630, true);
}
// quest completion
if (who)
if (Player* player = who->GetCharmerOrOwnerPlayerOrPlayerItself())
player->RewardPlayerAndGroupAtEvent(31006, player); // Royal Escort quest, Mal'ganis bunny
EnterEvadeMode();
}
}
void UpdateAI(uint32 diff)
void DamageTaken(Unit* who, uint32 &damage, DamageEffectType, SpellSchoolMask)
{
if (!UpdateVictim())
return;
if (!finished && damage >= me->GetHealth())
{
damage = 0;
finished = true;
me->SetRegeneratingHealth(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetReactState(REACT_PASSIVE);
if (InstanceScript* pInstance = me->GetInstanceScript())
{
if (Creature* cr = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_ARTHAS)))
cr->AI()->DoAction(ACTION_KILLED_MALGANIS);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
// give credit to players
me->CastSpell(me, 58630, true);
}
switch (events.GetEvent())
{
case EVENT_SPELL_CARRION_SWARM:
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_CARRION_SWARM_N, SPELL_CARRION_SWARM_H), false);
events.RepeatEvent(7000);
break;
case EVENT_SPELL_MIND_BLAST:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, DUNGEON_MODE(SPELL_MIND_BLAST_N, SPELL_MIND_BLAST_H), false);
events.RepeatEvent(6000);
break;
case EVENT_SPELL_SLEEP:
Talk(SAY_SLEEP);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, DUNGEON_MODE(SPELL_SLEEP_N, SPELL_SLEEP_H), false);
events.RepeatEvent(17000);
break;
case EVENT_SPELL_VAMPIRIC_TOUCH:
me->CastSpell(me, SPELL_VAMPIRIC_TOUCH, true);
events.RepeatEvent(30000);
break;
}
// quest completion
if (who)
if (Player* player = who->GetCharmerOrOwnerPlayerOrPlayerItself())
player->RewardPlayerAndGroupAtEvent(31006, player); // Royal Escort quest, Mal'ganis bunny
DoMeleeAttackIfReady();
EnterEvadeMode();
}
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.GetEvent())
{
case EVENT_SPELL_CARRION_SWARM:
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_CARRION_SWARM_N, SPELL_CARRION_SWARM_H), false);
events.RepeatEvent(7000);
break;
case EVENT_SPELL_MIND_BLAST:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, DUNGEON_MODE(SPELL_MIND_BLAST_N, SPELL_MIND_BLAST_H), false);
events.RepeatEvent(6000);
break;
case EVENT_SPELL_SLEEP:
Talk(SAY_SLEEP);
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
me->CastSpell(target, DUNGEON_MODE(SPELL_SLEEP_N, SPELL_SLEEP_H), false);
events.RepeatEvent(17000);
break;
case EVENT_SPELL_VAMPIRIC_TOUCH:
me->CastSpell(me, SPELL_VAMPIRIC_TOUCH, true);
events.RepeatEvent(30000);
break;
}
DoMeleeAttackIfReady();
}
};

View File

@@ -8,18 +8,18 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum Spells
{
SPELL_CONSTRICTING_CHAINS_N = 52696,
SPELL_CONSTRICTING_CHAINS_H = 58823,
SPELL_DISEASE_EXPULSION_N = 52666,
SPELL_DISEASE_EXPULSION_H = 58824,
SPELL_FRENZY = 58841,
SPELL_CONSTRICTING_CHAINS_N = 52696,
SPELL_CONSTRICTING_CHAINS_H = 58823,
SPELL_DISEASE_EXPULSION_N = 52666,
SPELL_DISEASE_EXPULSION_H = 58824,
SPELL_FRENZY = 58841,
};
enum Events
{
EVENT_SPELL_CONSTRICTING_CHAINS = 1,
EVENT_SPELL_DISEASE_EXPULSION = 2,
EVENT_SPELL_FRENZY = 3,
EVENT_SPELL_CONSTRICTING_CHAINS = 1,
EVENT_SPELL_DISEASE_EXPULSION = 2,
EVENT_SPELL_FRENZY = 3,
};
enum Yells
@@ -47,15 +47,15 @@ public:
Talk(SAY_SPAWN);
}
EventMap events;
void Reset() { events.Reset(); }
EventMap events;
void Reset() { events.Reset(); }
void EnterCombat(Unit* /*who*/)
{
Talk(SAY_AGGRO);
events.RescheduleEvent(EVENT_SPELL_CONSTRICTING_CHAINS, 15000);
events.RescheduleEvent(EVENT_SPELL_DISEASE_EXPULSION, 4000);
events.RescheduleEvent(EVENT_SPELL_FRENZY, 20000);
events.RescheduleEvent(EVENT_SPELL_CONSTRICTING_CHAINS, 15000);
events.RescheduleEvent(EVENT_SPELL_DISEASE_EXPULSION, 4000);
events.RescheduleEvent(EVENT_SPELL_FRENZY, 20000);
}
void JustDied(Unit* /*killer*/)
@@ -71,35 +71,35 @@ public:
Talk(SAY_SLAY);
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.GetEvent())
{
case EVENT_SPELL_DISEASE_EXPULSION:
me->CastSpell(me, DUNGEON_MODE(SPELL_DISEASE_EXPULSION_N, SPELL_DISEASE_EXPULSION_H), false);
events.RepeatEvent(6000);
break;
case EVENT_SPELL_FRENZY:
me->CastSpell(me, SPELL_FRENZY, false);
events.RepeatEvent(20000);
break;
case EVENT_SPELL_CONSTRICTING_CHAINS:
if (Unit *pTarget = SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0, 50.0f, true))
me->CastSpell(pTarget, DUNGEON_MODE(SPELL_CONSTRICTING_CHAINS_N, SPELL_CONSTRICTING_CHAINS_H), false);
events.RepeatEvent(14000);
break;
}
switch (events.GetEvent())
{
case EVENT_SPELL_DISEASE_EXPULSION:
me->CastSpell(me, DUNGEON_MODE(SPELL_DISEASE_EXPULSION_N, SPELL_DISEASE_EXPULSION_H), false);
events.RepeatEvent(6000);
break;
case EVENT_SPELL_FRENZY:
me->CastSpell(me, SPELL_FRENZY, false);
events.RepeatEvent(20000);
break;
case EVENT_SPELL_CONSTRICTING_CHAINS:
if (Unit *pTarget = SelectTarget(SELECT_TARGET_BOTTOMAGGRO, 0, 50.0f, true))
me->CastSpell(pTarget, DUNGEON_MODE(SPELL_CONSTRICTING_CHAINS_N, SPELL_CONSTRICTING_CHAINS_H), false);
events.RepeatEvent(14000);
break;
}
DoMeleeAttackIfReady();
}
DoMeleeAttackIfReady();
}
};
};

View File

@@ -9,24 +9,24 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum Spells
{
SPELL_SHADOW_BOLT_N = 57725,
SPELL_SHADOW_BOLT_H = 58827,
SPELL_STEAL_FLESH_CHANNEL = 52708,
SPELL_STEAL_FLESH_TARGET = 52711,
SPELL_STEAL_FLESH_CASTER = 52712,
SPELL_SUMMON_GHOULS = 52451,
SPELL_EXPLODE_GHOUL_N = 52480,
SPELL_EXPLODE_GHOUL_H = 58825,
SPELL_CURSE_OF_TWISTED_FAITH = 58845,
SPELL_SHADOW_BOLT_N = 57725,
SPELL_SHADOW_BOLT_H = 58827,
SPELL_STEAL_FLESH_CHANNEL = 52708,
SPELL_STEAL_FLESH_TARGET = 52711,
SPELL_STEAL_FLESH_CASTER = 52712,
SPELL_SUMMON_GHOULS = 52451,
SPELL_EXPLODE_GHOUL_N = 52480,
SPELL_EXPLODE_GHOUL_H = 58825,
SPELL_CURSE_OF_TWISTED_FAITH = 58845,
};
enum Events
{
EVENT_SPELL_SHADOW_BOLT = 1,
EVENT_SPELL_STEAL_FLESH = 2,
EVENT_SPELL_SUMMON_GHOULS = 3,
EVENT_EXPLODE_GHOUL = 4,
EVENT_SPELL_CURSE = 5,
EVENT_SPELL_SHADOW_BOLT = 1,
EVENT_SPELL_STEAL_FLESH = 2,
EVENT_SPELL_SUMMON_GHOULS = 3,
EVENT_EXPLODE_GHOUL = 4,
EVENT_SPELL_CURSE = 5,
};
enum Yells
@@ -58,29 +58,29 @@ public:
}
EventMap events;
SummonList summons;
void Reset()
{
events.Reset();
summons.DespawnAll();
}
SummonList summons;
void Reset()
{
events.Reset();
summons.DespawnAll();
}
void JustSummoned(Creature* cr) { summons.Summon(cr); }
void JustSummoned(Creature* cr) { summons.Summon(cr); }
void EnterCombat(Unit* /*who*/)
{
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 7000);
events.ScheduleEvent(EVENT_SPELL_STEAL_FLESH, 11000);
events.ScheduleEvent(EVENT_SPELL_SUMMON_GHOULS, 16000);
events.ScheduleEvent(EVENT_EXPLODE_GHOUL, 22000);
if (IsHeroic())
events.ScheduleEvent(EVENT_SPELL_CURSE, 25000);
events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 7000);
events.ScheduleEvent(EVENT_SPELL_STEAL_FLESH, 11000);
events.ScheduleEvent(EVENT_SPELL_SUMMON_GHOULS, 16000);
events.ScheduleEvent(EVENT_EXPLODE_GHOUL, 22000);
if (IsHeroic())
events.ScheduleEvent(EVENT_SPELL_CURSE, 25000);
}
void JustDied(Unit* /*killer*/)
{
summons.DespawnAll();
summons.DespawnAll();
Talk(SAY_DEATH);
}
@@ -92,55 +92,55 @@ public:
Talk(SAY_SLAY);
}
void ExplodeGhoul()
{
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
if (Creature* cr = ObjectAccessor::GetCreature(*me, (*itr)))
if (cr->IsAlive())
{
me->CastSpell(cr, DUNGEON_MODE(SPELL_EXPLODE_GHOUL_N, SPELL_EXPLODE_GHOUL_H), false);
return;
}
}
void ExplodeGhoul()
{
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
if (Creature* cr = ObjectAccessor::GetCreature(*me, (*itr)))
if (cr->IsAlive())
{
me->CastSpell(cr, DUNGEON_MODE(SPELL_EXPLODE_GHOUL_N, SPELL_EXPLODE_GHOUL_H), false);
return;
}
}
void UpdateAI(uint32 diff)
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.GetEvent())
{
case EVENT_SPELL_SHADOW_BOLT:
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_SHADOW_BOLT_N, SPELL_SHADOW_BOLT_H), false);
events.RepeatEvent(10000);
break;
case EVENT_SPELL_STEAL_FLESH:
if (!urand(0,2))
Talk(SAY_STEAL_FLESH);
me->CastSpell(me->GetVictim(), SPELL_STEAL_FLESH_CHANNEL, false);
events.RepeatEvent(12000);
break;
case EVENT_SPELL_SUMMON_GHOULS:
if (!urand(0,2))
Talk(SAY_SUMMON_GHOULS);
me->CastSpell(me, SPELL_SUMMON_GHOULS, false);
events.RepeatEvent(10000);
break;
case EVENT_EXPLODE_GHOUL:
if (!urand(0,2))
Talk(SAY_EXPLODE_GHOUL);
ExplodeGhoul();
events.RepeatEvent(15000);
break;
case EVENT_SPELL_CURSE:
me->CastSpell(me->GetVictim(), SPELL_CURSE_OF_TWISTED_FAITH, false);
events.RepeatEvent(30000);
break;
}
switch (events.GetEvent())
{
case EVENT_SPELL_SHADOW_BOLT:
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_SHADOW_BOLT_N, SPELL_SHADOW_BOLT_H), false);
events.RepeatEvent(10000);
break;
case EVENT_SPELL_STEAL_FLESH:
if (!urand(0,2))
Talk(SAY_STEAL_FLESH);
me->CastSpell(me->GetVictim(), SPELL_STEAL_FLESH_CHANNEL, false);
events.RepeatEvent(12000);
break;
case EVENT_SPELL_SUMMON_GHOULS:
if (!urand(0,2))
Talk(SAY_SUMMON_GHOULS);
me->CastSpell(me, SPELL_SUMMON_GHOULS, false);
events.RepeatEvent(10000);
break;
case EVENT_EXPLODE_GHOUL:
if (!urand(0,2))
Talk(SAY_EXPLODE_GHOUL);
ExplodeGhoul();
events.RepeatEvent(15000);
break;
case EVENT_SPELL_CURSE:
me->CastSpell(me->GetVictim(), SPELL_CURSE_OF_TWISTED_FAITH, false);
events.RepeatEvent(30000);
break;
}
DoMeleeAttackIfReady();
}
@@ -159,13 +159,13 @@ class spell_boss_salramm_steal_flesh : public SpellScriptLoader
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
Unit* caster = GetCaster();
Unit* target = GetUnitOwner();
if (caster)
{
caster->CastSpell(caster, SPELL_STEAL_FLESH_CASTER, true);
caster->CastSpell(target, SPELL_STEAL_FLESH_TARGET, true);
}
Unit* caster = GetCaster();
Unit* target = GetUnitOwner();
if (caster)
{
caster->CastSpell(caster, SPELL_STEAL_FLESH_CASTER, true);
caster->CastSpell(target, SPELL_STEAL_FLESH_TARGET, true);
}
}
void Register()
@@ -183,5 +183,5 @@ class spell_boss_salramm_steal_flesh : public SpellScriptLoader
void AddSC_boss_salramm()
{
new boss_salramm();
new spell_boss_salramm_steal_flesh();
new spell_boss_salramm_steal_flesh();
}

View File

@@ -7,15 +7,15 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum Data
{
DATA_ARTHAS_EVENT,
DATA_GUARDIANTIME_EVENT,
DATA_ARTHAS_EVENT,
DATA_GUARDIANTIME_EVENT,
// Communication
DATA_SHOW_CRATES,
// Communication
DATA_SHOW_CRATES,
DATA_CRATE_COUNT,
DATA_START_WAVES,
DATA_SHOW_INFINITE_TIMER,
DATA_ARTHAS_REPOSITION,
DATA_START_WAVES,
DATA_SHOW_INFINITE_TIMER,
DATA_ARTHAS_REPOSITION,
};
enum Data64
@@ -28,107 +28,107 @@ enum Data64
enum Creatures
{
NPC_MEATHOOK = 26529,
NPC_SALRAMM = 26530,
NPC_EPOCH = 26532,
NPC_MAL_GANIS = 26533,
NPC_INFINITE = 32273,
NPC_ARTHAS = 26499,
NPC_JAINA = 26497,
NPC_UTHER = 26528,
NPC_MEATHOOK = 26529,
NPC_SALRAMM = 26530,
NPC_EPOCH = 26532,
NPC_MAL_GANIS = 26533,
NPC_INFINITE = 32273,
NPC_ARTHAS = 26499,
NPC_JAINA = 26497,
NPC_UTHER = 26528,
NPC_GUARDIAN_OF_TIME = 32281,
NPC_TIME_RIFT = 28409,
NPC_GUARDIAN_OF_TIME = 32281,
NPC_TIME_RIFT = 28409,
NPC_CHROMIE_MIDDLE = 27915,
NPC_GRAIN_CREATE_TRIGGER = 30996,
NPC_HOURGLASS = 28656,
NPC_CHROMIE_MIDDLE = 27915,
NPC_GRAIN_CREATE_TRIGGER = 30996,
NPC_HOURGLASS = 28656,
};
enum GameObjects
{
GO_SHKAF_GATE = 188686,
GO_EXIT_GATE = 191788,
GO_MALGANIS_CHEST_N = 190663,
GO_MALGANIS_CHEST_H = 193597,
GO_SUSPICIOUS_CRATE = 190094,
GO_PLAGUED_CRATE = 190095,
GO_SHKAF_GATE = 188686,
GO_EXIT_GATE = 191788,
GO_MALGANIS_CHEST_N = 190663,
GO_MALGANIS_CHEST_H = 193597,
GO_SUSPICIOUS_CRATE = 190094,
GO_PLAGUED_CRATE = 190095,
};
enum WorldStatesCoT
{
WORLDSTATE_SHOW_CRATES = 3479,
WORLDSTATE_CRATES_REVEALED = 3480,
WORLDSTATE_WAVE_COUNT = 3504,
WORLDSTATE_TIME_GUARDIAN = 3931,
WORLDSTATE_TIME_GUARDIAN_SHOW = 3932,
WORLDSTATE_SHOW_CRATES = 3479,
WORLDSTATE_CRATES_REVEALED = 3480,
WORLDSTATE_WAVE_COUNT = 3504,
WORLDSTATE_TIME_GUARDIAN = 3931,
WORLDSTATE_TIME_GUARDIAN_SHOW = 3932,
};
enum CrateSpells
{
SPELL_CRATES_CREDIT = 58109,
SPELL_ARCANE_DISRUPTION = 49590,
SPELL_CRATES_CREDIT = 58109,
SPELL_ARCANE_DISRUPTION = 49590,
SPELL_HUMAN_FEMALE = 35483,
SPELL_HUMAN_MALE = 35482,
SPELL_HUMAN_FEMALE = 35483,
SPELL_HUMAN_MALE = 35482,
};
enum EventPositions
{
EVENT_POS_CHROMIE = 0,
EVENT_POS_HOURGLASS = 1,
EVENT_SRC_UTHER,
EVENT_SRC_JAINA,
EVENT_SRC_HORSE1,
EVENT_SRC_HORSE2,
EVENT_SRC_HORSE3,
EVENT_DST_UTHER,
EVENT_DST_HORSE1,
EVENT_DST_HORSE2,
EVENT_DST_HORSE3,
EVENT_POS_RETREAT,
EVENT_SRC_TOWN_CITYMAN1,
EVENT_SRC_TOWN_CITYMAN2,
EVENT_DST_CITYMAN,
EVENT_SRC_MALGANIS,
EVENT_SRC_MEATHOOK,
EVENT_SRC_SALRAMM,
EVENT_SRC_HALL_CITYMAN1,
EVENT_SRC_HALL_CITYMAN2,
EVENT_SRC_HALL_CITYMAN3,
EVENT_SRC_EPOCH,
EVENT_DST_EPOCH,
EVENT_SRC_CORRUPTOR,
EVENT_SRC_MALGANIS_FINAL,
EVENT_POS_CHROMIE = 0,
EVENT_POS_HOURGLASS = 1,
EVENT_SRC_UTHER,
EVENT_SRC_JAINA,
EVENT_SRC_HORSE1,
EVENT_SRC_HORSE2,
EVENT_SRC_HORSE3,
EVENT_DST_UTHER,
EVENT_DST_HORSE1,
EVENT_DST_HORSE2,
EVENT_DST_HORSE3,
EVENT_POS_RETREAT,
EVENT_SRC_TOWN_CITYMAN1,
EVENT_SRC_TOWN_CITYMAN2,
EVENT_DST_CITYMAN,
EVENT_SRC_MALGANIS,
EVENT_SRC_MEATHOOK,
EVENT_SRC_SALRAMM,
EVENT_SRC_HALL_CITYMAN1,
EVENT_SRC_HALL_CITYMAN2,
EVENT_SRC_HALL_CITYMAN3,
EVENT_SRC_EPOCH,
EVENT_DST_EPOCH,
EVENT_SRC_CORRUPTOR,
EVENT_SRC_MALGANIS_FINAL,
};
enum ArthasPhase
{
COS_PROGRESS_NOT_STARTED = 0,
COS_PROGRESS_CRATES_FOUND = 1,
COS_PROGRESS_START_INTRO = 2,
COS_PROGRESS_FINISHED_INTRO = 3,
COS_PROGRESS_FINISHED_CITY_INTRO = 4,
COS_PROGRESS_KILLED_MEATHOOK = 5,
COS_PROGRESS_KILLED_SALRAMM = 6,
COS_PROGRESS_REACHED_TOWN_HALL = 7,
COS_PROGRESS_KILLED_EPOCH = 8,
COS_PROGRESS_LAST_CITY = 9,
COS_PROGRESS_BEFORE_MALGANIS = 10,
COS_PROGRESS_FINISHED = 11,
COS_PROGRESS_NOT_STARTED = 0,
COS_PROGRESS_CRATES_FOUND = 1,
COS_PROGRESS_START_INTRO = 2,
COS_PROGRESS_FINISHED_INTRO = 3,
COS_PROGRESS_FINISHED_CITY_INTRO = 4,
COS_PROGRESS_KILLED_MEATHOOK = 5,
COS_PROGRESS_KILLED_SALRAMM = 6,
COS_PROGRESS_REACHED_TOWN_HALL = 7,
COS_PROGRESS_KILLED_EPOCH = 8,
COS_PROGRESS_LAST_CITY = 9,
COS_PROGRESS_BEFORE_MALGANIS = 10,
COS_PROGRESS_FINISHED = 11,
};
enum Actions
{
ACTION_START_EVENT = 1,
ACTION_START_CITY = 2,
ACTION_KILLED_SALRAMM = 3,
ACTION_START_TOWN_HALL = 4,
ACTION_START_SECRET_PASSAGE = 5,
ACTION_START_LAST_CITY = 6,
ACTION_RUN_OUT_OF_TIME = 7,
ACTION_START_MALGANIS = 8,
ACTION_KILLED_MALGANIS = 9,
ACTION_START_EVENT = 1,
ACTION_START_CITY = 2,
ACTION_KILLED_SALRAMM = 3,
ACTION_START_TOWN_HALL = 4,
ACTION_START_SECRET_PASSAGE = 5,
ACTION_START_LAST_CITY = 6,
ACTION_RUN_OUT_OF_TIME = 7,
ACTION_START_MALGANIS = 8,
ACTION_KILLED_MALGANIS = 9,
};
const Position LeaderIntroPos1 = {1938.05f, 1289.79f, 145.38f, 3.18f};
@@ -141,31 +141,31 @@ const Position LeaderIntroPos6 = {2327.39f, 1412.47f, 127.69f, 0.0f};
const Position EventPos[] =
{
{1813.298f, 1283.578f, 142.326f, 3.878161f}, // chromie
{1809.46f, 1286.05f, 142.62f, 4.8f}, // hourglass
{1795.76f, 1271.54f, 140.61f, 0.21f}, // source for uther
{1895.48f, 1292.66f, 143.706f, 0.023475f}, // source for jaina
{1788.38f, 1273.7f, 140.15f, 0.2f}, // source for horses
{1788.76f, 1271.54f, 140.62f, 0.21f},
{1788.74f, 1267.38f, 140.18f, 0.11f},
{1897.6f, 1285.5f, 143.44f, 0.32f}, // dest for uther
{1888.56f, 1289.95f, 143.8f, 0.01f}, // dest for horses
{1888.94f, 1285.41f, 143.69f, 0.08f},
{1889.55f, 1279.95f, 143.62f, 0.1f},
{1751.9f, 1262.45f, 137.62f, 3.35f}, // retreat position after intro (uther + horses)
{2091.977f, 1275.021f, 140.757f, 0.558f}, // source for town city man 1
{2093.514f, 1275.842f, 140.408f, 3.801f}, // 2
{2089.04f, 1277.98f, 140.85f, 2.35f}, // cityman dest pos
{2117.349f, 1288.624f, 136.271f, 1.37f}, // malganis city intro
{2351.45f, 1197.81f, 130.45f, 3.83f}, // meathook spawn position
{2351.45f, 1197.81f, 130.45f, 3.83f}, // salramm spawn position
{2398.14f, 1207.81f, 134.04f, 5.15f}, // source for hall city man 1
{2403.22f, 1205.54f, 134.04f, 3.31f}, // 2
{2400.82f, 1201.69f, 134.01f, 1.53f}, // 3
{2463.131f, 1115.391f, 152.473f, 3.41f}, // epoch spawn position
{2451.809f, 1112.901f, 149.220f, 3.36f}, // epoch move pos
{2329.07f, 1276.98f, 132.68f, 4.0f}, // infinite corruptor pos
{2298.25f, 1500.56f, 128.37f, 4.95f} // malganis final pos
{1813.298f, 1283.578f, 142.326f, 3.878161f}, // chromie
{1809.46f, 1286.05f, 142.62f, 4.8f}, // hourglass
{1795.76f, 1271.54f, 140.61f, 0.21f}, // source for uther
{1895.48f, 1292.66f, 143.706f, 0.023475f}, // source for jaina
{1788.38f, 1273.7f, 140.15f, 0.2f}, // source for horses
{1788.76f, 1271.54f, 140.62f, 0.21f},
{1788.74f, 1267.38f, 140.18f, 0.11f},
{1897.6f, 1285.5f, 143.44f, 0.32f}, // dest for uther
{1888.56f, 1289.95f, 143.8f, 0.01f}, // dest for horses
{1888.94f, 1285.41f, 143.69f, 0.08f},
{1889.55f, 1279.95f, 143.62f, 0.1f},
{1751.9f, 1262.45f, 137.62f, 3.35f}, // retreat position after intro (uther + horses)
{2091.977f, 1275.021f, 140.757f, 0.558f}, // source for town city man 1
{2093.514f, 1275.842f, 140.408f, 3.801f}, // 2
{2089.04f, 1277.98f, 140.85f, 2.35f}, // cityman dest pos
{2117.349f, 1288.624f, 136.271f, 1.37f}, // malganis city intro
{2351.45f, 1197.81f, 130.45f, 3.83f}, // meathook spawn position
{2351.45f, 1197.81f, 130.45f, 3.83f}, // salramm spawn position
{2398.14f, 1207.81f, 134.04f, 5.15f}, // source for hall city man 1
{2403.22f, 1205.54f, 134.04f, 3.31f}, // 2
{2400.82f, 1201.69f, 134.01f, 1.53f}, // 3
{2463.131f, 1115.391f, 152.473f, 3.41f}, // epoch spawn position
{2451.809f, 1112.901f, 149.220f, 3.36f}, // epoch move pos
{2329.07f, 1276.98f, 132.68f, 4.0f}, // infinite corruptor pos
{2298.25f, 1500.56f, 128.37f, 4.95f} // malganis final pos
};
#endif

View File

@@ -24,21 +24,21 @@ class instance_culling_of_stratholme : public InstanceMapScript
{
instance_culling_of_stratholme_InstanceMapScript(Map* pMap) : InstanceScript(pMap)
{
// NPCs
// NPCs
_arthasGUID = 0;
_infiniteGUID = 0;
_infiniteGUID = 0;
// GOs
// GOs
_shkafGateGUID = 0;
_exitGateGUID = 0;
// Instance
// Instance
_crateCount = 0;
_showCrateTimer = 0;
_guardianTimer = 0;
_respawnAndReposition = false;
_encounterState = COS_PROGRESS_NOT_STARTED;
_loadTimer = 0;
_showCrateTimer = 0;
_guardianTimer = 0;
_respawnAndReposition = false;
_encounterState = COS_PROGRESS_NOT_STARTED;
_loadTimer = 0;
}
bool IsEncounterInProgress() const
@@ -55,16 +55,16 @@ class instance_culling_of_stratholme : public InstanceMapScript
data << uint32(WORLDSTATE_TIME_GUARDIAN_SHOW) << uint32(0);
}
void OnPlayerEnter(Player* plr)
{
if (instance->GetPlayersCountExceptGMs() == 1)
SetData(DATA_ARTHAS_REPOSITION, 2);
void OnPlayerEnter(Player* plr)
{
if (instance->GetPlayersCountExceptGMs() == 1)
SetData(DATA_ARTHAS_REPOSITION, 2);
EnsureGridLoaded();
EnsureGridLoaded();
if (plr->getRace() != RACE_HUMAN && plr->getRace() != RACE_DWARF && plr->getRace() != RACE_GNOME)
plr->CastSpell(plr, ((plr->getGender() == GENDER_MALE) ? SPELL_HUMAN_MALE : SPELL_HUMAN_FEMALE), true);
}
if (plr->getRace() != RACE_HUMAN && plr->getRace() != RACE_DWARF && plr->getRace() != RACE_GNOME)
plr->CastSpell(plr, ((plr->getGender() == GENDER_MALE) ? SPELL_HUMAN_MALE : SPELL_HUMAN_FEMALE), true);
}
void OnCreatureCreate(Creature* creature)
{
@@ -72,14 +72,14 @@ class instance_culling_of_stratholme : public InstanceMapScript
{
case NPC_ARTHAS:
_arthasGUID = creature->GetGUID();
if (_encounterState == COS_PROGRESS_FINISHED)
creature->SetVisible(false);
else
Reposition(creature);
if (_encounterState == COS_PROGRESS_FINISHED)
creature->SetVisible(false);
else
Reposition(creature);
break;
case NPC_INFINITE:
_infiniteGUID = creature->GetGUID();
break;
case NPC_INFINITE:
_infiniteGUID = creature->GetGUID();
break;
}
}
@@ -89,8 +89,8 @@ class instance_culling_of_stratholme : public InstanceMapScript
{
case GO_SHKAF_GATE:
_shkafGateGUID = go->GetGUID();
if (_encounterState >= COS_PROGRESS_KILLED_EPOCH)
go->SetGoState(GO_STATE_ACTIVE);
if (_encounterState >= COS_PROGRESS_KILLED_EPOCH)
go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_EXIT_GATE:
_exitGateGUID = go->GetGUID();
@@ -104,68 +104,68 @@ class instance_culling_of_stratholme : public InstanceMapScript
{
switch (type)
{
case DATA_SHOW_CRATES:
DoUpdateWorldState(WORLDSTATE_SHOW_CRATES, data);
return;
case DATA_SHOW_INFINITE_TIMER:
if (!instance->IsHeroic() || !_guardianTimer)
return;
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, data);
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, uint32(_guardianTimer / (MINUTE*IN_MILLISECONDS)));
if (data == 0)
{
_guardianTimer = 0;
SaveToDB();
}
else if (!_infiniteGUID)
instance->SummonCreature(NPC_INFINITE, EventPos[EVENT_SRC_CORRUPTOR]);
return;
case DATA_START_WAVES:
DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, 1);
if (instance->IsHeroic())
{
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, true);
_guardianTimer = 26*MINUTE*IN_MILLISECONDS;
if (!_infiniteGUID)
instance->SummonCreature(NPC_INFINITE, EventPos[EVENT_SRC_CORRUPTOR]);
}
return;
case DATA_CRATE_COUNT:
case DATA_SHOW_CRATES:
DoUpdateWorldState(WORLDSTATE_SHOW_CRATES, data);
return;
case DATA_SHOW_INFINITE_TIMER:
if (!instance->IsHeroic() || !_guardianTimer)
return;
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, data);
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, uint32(_guardianTimer / (MINUTE*IN_MILLISECONDS)));
if (data == 0)
{
_guardianTimer = 0;
SaveToDB();
}
else if (!_infiniteGUID)
instance->SummonCreature(NPC_INFINITE, EventPos[EVENT_SRC_CORRUPTOR]);
return;
case DATA_START_WAVES:
DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, 1);
if (instance->IsHeroic())
{
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, true);
_guardianTimer = 26*MINUTE*IN_MILLISECONDS;
if (!_infiniteGUID)
instance->SummonCreature(NPC_INFINITE, EventPos[EVENT_SRC_CORRUPTOR]);
}
return;
case DATA_CRATE_COUNT:
_crateCount++;
if (_crateCount == 5)
{
Map::PlayerList const &PlayerList = instance->GetPlayers();
if (!PlayerList.isEmpty())
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
i->GetSource()->KilledMonsterCredit(NPC_GRAIN_CREATE_TRIGGER, 0);
Map::PlayerList const &PlayerList = instance->GetPlayers();
if (!PlayerList.isEmpty())
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
i->GetSource()->KilledMonsterCredit(NPC_GRAIN_CREATE_TRIGGER, 0);
_showCrateTimer++;
if (GetData(DATA_ARTHAS_EVENT) < COS_PROGRESS_CRATES_FOUND)
SetData(DATA_ARTHAS_EVENT, COS_PROGRESS_CRATES_FOUND);
_showCrateTimer++;
if (GetData(DATA_ARTHAS_EVENT) < COS_PROGRESS_CRATES_FOUND)
SetData(DATA_ARTHAS_EVENT, COS_PROGRESS_CRATES_FOUND);
}
DoUpdateWorldState(WORLDSTATE_CRATES_REVEALED, _crateCount);
return;
case DATA_ARTHAS_EVENT:
// Start Event
_encounterState = data;
if (data == COS_PROGRESS_START_INTRO)
{
if (Creature *arthas = instance->GetCreature(_arthasGUID))
arthas->AI()->DoAction(ACTION_START_EVENT);
}
else if (data == COS_PROGRESS_KILLED_SALRAMM)
{
if (Creature *arthas = instance->GetCreature(_arthasGUID))
arthas->AI()->DoAction(ACTION_KILLED_SALRAMM);
}
break;
case DATA_ARTHAS_REPOSITION:
if (data == 2)
_respawnAndReposition = true;
else if (Creature *arthas = instance->GetCreature(_arthasGUID))
Reposition(arthas);
return;
case DATA_ARTHAS_EVENT:
// Start Event
_encounterState = data;
if (data == COS_PROGRESS_START_INTRO)
{
if (Creature *arthas = instance->GetCreature(_arthasGUID))
arthas->AI()->DoAction(ACTION_START_EVENT);
}
else if (data == COS_PROGRESS_KILLED_SALRAMM)
{
if (Creature *arthas = instance->GetCreature(_arthasGUID))
arthas->AI()->DoAction(ACTION_KILLED_SALRAMM);
}
break;
case DATA_ARTHAS_REPOSITION:
if (data == 2)
_respawnAndReposition = true;
else if (Creature *arthas = instance->GetCreature(_arthasGUID))
Reposition(arthas);
return;
}
@@ -177,10 +177,10 @@ class instance_culling_of_stratholme : public InstanceMapScript
{
switch (type)
{
case DATA_ARTHAS_EVENT:
return _encounterState;
case DATA_GUARDIANTIME_EVENT:
return _guardianTimer;
case DATA_ARTHAS_EVENT:
return _encounterState;
case DATA_GUARDIANTIME_EVENT:
return _guardianTimer;
}
return 0;
}
@@ -189,175 +189,175 @@ class instance_culling_of_stratholme : public InstanceMapScript
{
switch (identifier)
{
case DATA_SHKAF_GATE:
return _shkafGateGUID;
case DATA_ARTHAS:
return _arthasGUID;
case DATA_EXIT_GATE:
return _exitGateGUID;
case DATA_SHKAF_GATE:
return _shkafGateGUID;
case DATA_ARTHAS:
return _arthasGUID;
case DATA_EXIT_GATE:
return _exitGateGUID;
}
return 0;
}
void Update(uint32 diff)
{
if (_loadTimer)
{
_loadTimer += diff;
if (_loadTimer > 3000)
{
UpdateEventState();
_loadTimer = 0;
}
}
// Used when arthas dies
if (_respawnAndReposition)
{
if (Creature *arthas = instance->GetCreature(_arthasGUID))
{
if (!arthas->IsAlive())
{
EnsureGridLoaded();
arthas->setDeathState(DEAD);
arthas->Respawn();
}
else
{
arthas->AI()->Reset();
_respawnAndReposition = false;
}
}
}
void Update(uint32 diff)
{
if (_loadTimer)
{
_loadTimer += diff;
if (_loadTimer > 3000)
{
UpdateEventState();
_loadTimer = 0;
}
}
// Used when arthas dies
if (_respawnAndReposition)
{
if (Creature *arthas = instance->GetCreature(_arthasGUID))
{
if (!arthas->IsAlive())
{
EnsureGridLoaded();
arthas->setDeathState(DEAD);
arthas->Respawn();
}
else
{
arthas->AI()->Reset();
_respawnAndReposition = false;
}
}
}
// Used after 5-th crates is revealed
if (_showCrateTimer)
{
_showCrateTimer += diff;
if (_showCrateTimer >= 20000)
{
UpdateEventState();
_showCrateTimer = 0; // just to be sure
}
}
// Used after 5-th crates is revealed
if (_showCrateTimer)
{
_showCrateTimer += diff;
if (_showCrateTimer >= 20000)
{
UpdateEventState();
_showCrateTimer = 0; // just to be sure
}
}
// Used to display how much time players have
if (_guardianTimer)
{
uint32 div = uint32(_guardianTimer / (MINUTE*IN_MILLISECONDS));
_guardianTimer -= diff;
uint32 divAfter = uint32(_guardianTimer / (MINUTE*IN_MILLISECONDS));
if (divAfter == 0)
{
_guardianTimer = 0;
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 0);
// Used to display how much time players have
if (_guardianTimer)
{
uint32 div = uint32(_guardianTimer / (MINUTE*IN_MILLISECONDS));
_guardianTimer -= diff;
uint32 divAfter = uint32(_guardianTimer / (MINUTE*IN_MILLISECONDS));
if (divAfter == 0)
{
_guardianTimer = 0;
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 0);
// Inform infinite we run out of time
if (instance->IsHeroic() && _infiniteGUID)
if (Creature* cr = instance->GetCreature(_infiniteGUID))
cr->AI()->DoAction(ACTION_RUN_OUT_OF_TIME);
// Inform infinite we run out of time
if (instance->IsHeroic() && _infiniteGUID)
if (Creature* cr = instance->GetCreature(_infiniteGUID))
cr->AI()->DoAction(ACTION_RUN_OUT_OF_TIME);
}
else if (div > divAfter)
{
if (divAfter == 5)
ChromieWhisper(1);
else if (divAfter == 1)
ChromieWhisper(2);
}
else if (div > divAfter)
{
if (divAfter == 5)
ChromieWhisper(1);
else if (divAfter == 1)
ChromieWhisper(2);
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, divAfter);
SaveToDB();
}
}
}
DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, divAfter);
SaveToDB();
}
}
}
void UpdateEventState()
{
if (_encounterState > COS_PROGRESS_NOT_STARTED)
{
// Summon Chromie and global whisper
void UpdateEventState()
{
if (_encounterState > COS_PROGRESS_NOT_STARTED)
{
// Summon Chromie and global whisper
instance->SummonCreature(NPC_CHROMIE_MIDDLE, EventPos[EVENT_POS_CHROMIE]);
instance->SummonCreature(NPC_HOURGLASS, EventPos[EVENT_POS_HOURGLASS]);
instance->SummonCreature(NPC_HOURGLASS, EventPos[EVENT_POS_HOURGLASS]);
if (_encounterState == COS_PROGRESS_CRATES_FOUND ||
_encounterState == COS_PROGRESS_START_INTRO)
{
ChromieWhisper(0);
if (_encounterState == COS_PROGRESS_CRATES_FOUND ||
_encounterState == COS_PROGRESS_START_INTRO)
{
ChromieWhisper(0);
// hide crates count
DoUpdateWorldState(WORLDSTATE_SHOW_CRATES, 0);
_showCrateTimer = 0;
_encounterState = COS_PROGRESS_CRATES_FOUND;
}
}
}
// hide crates count
DoUpdateWorldState(WORLDSTATE_SHOW_CRATES, 0);
_showCrateTimer = 0;
_encounterState = COS_PROGRESS_CRATES_FOUND;
}
}
}
void ChromieWhisper(uint8 textId)
{
if (!instance->GetPlayers().isEmpty())
if (Player* player = instance->GetPlayers().getFirst()->GetSource())
{
Position pos;
player->GetPosition(&pos);
if (Creature* cr = instance->SummonCreature(NPC_CHROMIE_MIDDLE, pos))
{
cr->SetVisible(false);
cr->DespawnOrUnsummon(1000);
sCreatureTextMgr->SendChat(cr, textId, player, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP);
}
}
}
void ChromieWhisper(uint8 textId)
{
if (!instance->GetPlayers().isEmpty())
if (Player* player = instance->GetPlayers().getFirst()->GetSource())
{
Position pos;
player->GetPosition(&pos);
if (Creature* cr = instance->SummonCreature(NPC_CHROMIE_MIDDLE, pos))
{
cr->SetVisible(false);
cr->DespawnOrUnsummon(1000);
sCreatureTextMgr->SendChat(cr, textId, player, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_MAP);
}
}
}
void Reposition(Creature* arthas)
{
switch (GetData(DATA_ARTHAS_EVENT))
{
case COS_PROGRESS_FINISHED_INTRO:
arthas->UpdatePosition(LeaderIntroPos2, true);
arthas->SetHomePosition(LeaderIntroPos2);
arthas->SetFacingTo(LeaderIntroPos2.GetOrientation());
break;
case COS_PROGRESS_FINISHED_CITY_INTRO:
case COS_PROGRESS_KILLED_MEATHOOK:
case COS_PROGRESS_KILLED_SALRAMM:
arthas->UpdatePosition(LeaderIntroPos2special, true);
arthas->SetHomePosition(LeaderIntroPos2special);
arthas->SetFacingTo(LeaderIntroPos2special.GetOrientation());
break;
case COS_PROGRESS_REACHED_TOWN_HALL:
arthas->UpdatePosition(LeaderIntroPos3, true);
arthas->SetHomePosition(LeaderIntroPos3);
arthas->SetFacingTo(LeaderIntroPos3.GetOrientation());
break;
case COS_PROGRESS_KILLED_EPOCH:
arthas->UpdatePosition(LeaderIntroPos4, true);
arthas->SetHomePosition(LeaderIntroPos4);
arthas->SetFacingTo(LeaderIntroPos4.GetOrientation());
break;
case COS_PROGRESS_LAST_CITY:
arthas->UpdatePosition(LeaderIntroPos5, true);
arthas->SetHomePosition(LeaderIntroPos5);
arthas->SetFacingTo(LeaderIntroPos5.GetOrientation());
break;
case COS_PROGRESS_BEFORE_MALGANIS:
arthas->UpdatePosition(LeaderIntroPos6, true);
arthas->SetHomePosition(LeaderIntroPos6);
arthas->SetFacingTo(LeaderIntroPos6.GetOrientation());
break;
}
}
void Reposition(Creature* arthas)
{
switch (GetData(DATA_ARTHAS_EVENT))
{
case COS_PROGRESS_FINISHED_INTRO:
arthas->UpdatePosition(LeaderIntroPos2, true);
arthas->SetHomePosition(LeaderIntroPos2);
arthas->SetFacingTo(LeaderIntroPos2.GetOrientation());
break;
case COS_PROGRESS_FINISHED_CITY_INTRO:
case COS_PROGRESS_KILLED_MEATHOOK:
case COS_PROGRESS_KILLED_SALRAMM:
arthas->UpdatePosition(LeaderIntroPos2special, true);
arthas->SetHomePosition(LeaderIntroPos2special);
arthas->SetFacingTo(LeaderIntroPos2special.GetOrientation());
break;
case COS_PROGRESS_REACHED_TOWN_HALL:
arthas->UpdatePosition(LeaderIntroPos3, true);
arthas->SetHomePosition(LeaderIntroPos3);
arthas->SetFacingTo(LeaderIntroPos3.GetOrientation());
break;
case COS_PROGRESS_KILLED_EPOCH:
arthas->UpdatePosition(LeaderIntroPos4, true);
arthas->SetHomePosition(LeaderIntroPos4);
arthas->SetFacingTo(LeaderIntroPos4.GetOrientation());
break;
case COS_PROGRESS_LAST_CITY:
arthas->UpdatePosition(LeaderIntroPos5, true);
arthas->SetHomePosition(LeaderIntroPos5);
arthas->SetFacingTo(LeaderIntroPos5.GetOrientation());
break;
case COS_PROGRESS_BEFORE_MALGANIS:
arthas->UpdatePosition(LeaderIntroPos6, true);
arthas->SetHomePosition(LeaderIntroPos6);
arthas->SetFacingTo(LeaderIntroPos6.GetOrientation());
break;
}
}
void EnsureGridLoaded()
{
instance->LoadGrid(LeaderIntroPos1.GetPositionX(), LeaderIntroPos1.GetPositionY());
instance->LoadGrid(LeaderIntroPos2.GetPositionX(), LeaderIntroPos2.GetPositionY());
instance->LoadGrid(LeaderIntroPos3.GetPositionX(), LeaderIntroPos3.GetPositionY());
instance->LoadGrid(LeaderIntroPos4.GetPositionX(), LeaderIntroPos4.GetPositionY());
instance->LoadGrid(LeaderIntroPos5.GetPositionX(), LeaderIntroPos5.GetPositionY());
instance->LoadGrid(LeaderIntroPos6.GetPositionX(), LeaderIntroPos6.GetPositionY());
}
void EnsureGridLoaded()
{
instance->LoadGrid(LeaderIntroPos1.GetPositionX(), LeaderIntroPos1.GetPositionY());
instance->LoadGrid(LeaderIntroPos2.GetPositionX(), LeaderIntroPos2.GetPositionY());
instance->LoadGrid(LeaderIntroPos3.GetPositionX(), LeaderIntroPos3.GetPositionY());
instance->LoadGrid(LeaderIntroPos4.GetPositionX(), LeaderIntroPos4.GetPositionY());
instance->LoadGrid(LeaderIntroPos5.GetPositionX(), LeaderIntroPos5.GetPositionY());
instance->LoadGrid(LeaderIntroPos6.GetPositionX(), LeaderIntroPos6.GetPositionY());
}
std::string GetSaveData()
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
@@ -387,10 +387,10 @@ class instance_culling_of_stratholme : public InstanceMapScript
if (dataHead1 == 'C' && dataHead2 == 'S')
{
_encounterState = data0;
_guardianTimer = data1;
_guardianTimer = data1;
//UpdateEventState();
_loadTimer++;
//UpdateEventState();
_loadTimer++;
}
else
OUT_LOAD_INST_DATA_FAIL;
@@ -399,20 +399,20 @@ class instance_culling_of_stratholme : public InstanceMapScript
}
private:
// NPCs
// NPCs
uint64 _arthasGUID;
uint64 _infiniteGUID;
uint64 _infiniteGUID;
// GOs
// GOs
uint64 _shkafGateGUID;
uint64 _exitGateGUID;
uint32 _encounterState;
uint32 _crateCount;
uint32 _showCrateTimer;
uint32 _guardianTimer;
uint32 _showCrateTimer;
uint32 _guardianTimer;
bool _respawnAndReposition;
uint32 _loadTimer;
bool _respawnAndReposition;
uint32 _loadTimer;
};
};

View File

@@ -8,35 +8,35 @@ REWRITTEN BY XINEF
enum CaptainSkarloc
{
SAY_ENTER = 0,
SAY_TAUNT = 1,
SAY_SLAY = 2,
SAY_DEATH = 3,
SAY_ENTER = 0,
SAY_TAUNT = 1,
SAY_SLAY = 2,
SAY_DEATH = 3,
SPELL_HOLY_LIGHT = 29427,
SPELL_CLEANSE = 29380,
SPELL_HAMMER_OF_JUSTICE = 13005,
SPELL_HOLY_SHIELD = 31904,
SPELL_DEVOTION_AURA = 8258,
SPELL_CONSECRATION = 38385,
SPELL_HOLY_LIGHT = 29427,
SPELL_CLEANSE = 29380,
SPELL_HAMMER_OF_JUSTICE = 13005,
SPELL_HOLY_SHIELD = 31904,
SPELL_DEVOTION_AURA = 8258,
SPELL_CONSECRATION = 38385,
WAYPOINTS_COUNT = 4,
WAYPOINTS_COUNT = 4,
EVENT_INITIAL_TALK = 1,
EVENT_START_FIGHT = 2,
EVENT_SPELL_CLEANSE = 10,
EVENT_SPELL_HAMMER = 11,
EVENT_SPELL_HOLY_LIGHT = 12,
EVENT_SPELL_HOLY_SHIELD = 13,
EVENT_SPELL_CONSECRATION = 14
EVENT_INITIAL_TALK = 1,
EVENT_START_FIGHT = 2,
EVENT_SPELL_CLEANSE = 10,
EVENT_SPELL_HAMMER = 11,
EVENT_SPELL_HOLY_LIGHT = 12,
EVENT_SPELL_HOLY_SHIELD = 13,
EVENT_SPELL_CONSECRATION = 14
};
const Position startPath[WAYPOINTS_COUNT] =
{
{2008.38f, 281.57f, 65.70f, 0.0f},
{2035.71f, 271.38f, 63.495f, 0.0f},
{2049.12f, 252.31f, 62.855f, 0.0f},
{2058.77f, 236.04f, 63.92f, 0.0f}
{2008.38f, 281.57f, 65.70f, 0.0f},
{2035.71f, 271.38f, 63.495f, 0.0f},
{2049.12f, 252.31f, 62.855f, 0.0f},
{2058.77f, 236.04f, 63.92f, 0.0f}
};
class boss_captain_skarloc : public CreatureScript
@@ -54,84 +54,84 @@ public:
boss_captain_skarlocAI(Creature* creature) : ScriptedAI(creature), summons(me) { }
EventMap events;
EventMap events2;
SummonList summons;
EventMap events2;
SummonList summons;
void Reset()
{
events.Reset();
events2.Reset();
summons.DespawnAll();
events.Reset();
events2.Reset();
summons.DespawnAll();
}
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
if (Creature* thrall = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(DATA_THRALL_GUID)))
thrall->AI()->JustSummoned(summon);
summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
if (Creature* thrall = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(DATA_THRALL_GUID)))
thrall->AI()->JustSummoned(summon);
summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
if (summon->GetEntry() == NPC_SKARLOC_MOUNT)
return;
if (summon->GetEntry() == NPC_SKARLOC_MOUNT)
return;
if (summons.size() == 1)
summon->GetMotionMaster()->MovePoint(0, 2060.788f, 237.301f, 63.999f);
else
summon->GetMotionMaster()->MovePoint(0, 2056.870f, 234.853f, 63.839f);
}
if (summons.size() == 1)
summon->GetMotionMaster()->MovePoint(0, 2060.788f, 237.301f, 63.999f);
else
summon->GetMotionMaster()->MovePoint(0, 2056.870f, 234.853f, 63.839f);
}
void InitializeAI()
{
ScriptedAI::InitializeAI();
void InitializeAI()
{
ScriptedAI::InitializeAI();
Movement::PointsArray path;
path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()));
for (uint8 i = 0; i < WAYPOINTS_COUNT; ++i)
path.push_back(G3D::Vector3(startPath[i].GetPositionX(), startPath[i].GetPositionY(), startPath[i].GetPositionZ()));
Movement::PointsArray path;
path.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()));
for (uint8 i = 0; i < WAYPOINTS_COUNT; ++i)
path.push_back(G3D::Vector3(startPath[i].GetPositionX(), startPath[i].GetPositionY(), startPath[i].GetPositionZ()));
me->GetMotionMaster()->MoveSplinePath(&path);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
me->Mount(SKARLOC_MOUNT_MODEL);
}
me->GetMotionMaster()->MoveSplinePath(&path);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
me->Mount(SKARLOC_MOUNT_MODEL);
}
void MovementInform(uint32 type, uint32 id)
{
if (type != ESCORT_MOTION_TYPE)
return;
void MovementInform(uint32 type, uint32 id)
{
if (type != ESCORT_MOTION_TYPE)
return;
// Xinef: we can rely here on internal counting
if (id == 1)
{
me->SummonCreature(NPC_DURNHOLDE_MAGE, 2038.549f, 273.303f, 63.420f, 5.30f, TEMPSUMMON_MANUAL_DESPAWN);
me->SummonCreature(NPC_DURNHOLDE_VETERAN, 2032.810f, 269.416f, 63.561f, 5.30f, TEMPSUMMON_MANUAL_DESPAWN);
}
else if (id == 2)
{
me->SummonCreature(NPC_SKARLOC_MOUNT, 2049.12f, 252.31f, 62.855f, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN);
me->Dismount();
me->SetWalk(true);
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
summon->SetWalk(true);
}
// Xinef: we can rely here on internal counting
if (id == 1)
{
me->SummonCreature(NPC_DURNHOLDE_MAGE, 2038.549f, 273.303f, 63.420f, 5.30f, TEMPSUMMON_MANUAL_DESPAWN);
me->SummonCreature(NPC_DURNHOLDE_VETERAN, 2032.810f, 269.416f, 63.561f, 5.30f, TEMPSUMMON_MANUAL_DESPAWN);
}
else if (id == 2)
{
me->SummonCreature(NPC_SKARLOC_MOUNT, 2049.12f, 252.31f, 62.855f, me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN);
me->Dismount();
me->SetWalk(true);
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
summon->SetWalk(true);
}
if (me->movespline->Finalized())
{
events2.ScheduleEvent(EVENT_INITIAL_TALK, 500);
events2.ScheduleEvent(EVENT_START_FIGHT, 8000);
}
}
if (me->movespline->Finalized())
{
events2.ScheduleEvent(EVENT_INITIAL_TALK, 500);
events2.ScheduleEvent(EVENT_START_FIGHT, 8000);
}
}
void EnterCombat(Unit* /*who*/)
{
me->CastSpell(me, SPELL_DEVOTION_AURA, true);
me->CastSpell(me, SPELL_DEVOTION_AURA, true);
events.ScheduleEvent(EVENT_SPELL_HOLY_LIGHT, 15000);
events.ScheduleEvent(EVENT_SPELL_CLEANSE, 6000);
events.ScheduleEvent(EVENT_SPELL_HAMMER, 20000);
events.ScheduleEvent(EVENT_SPELL_HOLY_SHIELD, 10000);
if (IsHeroic())
events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 1000);
events.ScheduleEvent(EVENT_SPELL_HOLY_LIGHT, 15000);
events.ScheduleEvent(EVENT_SPELL_CLEANSE, 6000);
events.ScheduleEvent(EVENT_SPELL_HAMMER, 20000);
events.ScheduleEvent(EVENT_SPELL_HOLY_SHIELD, 10000);
if (IsHeroic())
events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 1000);
}
void KilledUnit(Unit* victim)
@@ -143,63 +143,63 @@ public:
{
Talk(SAY_DEATH);
me->GetInstanceScript()->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_SKARLOC_KILLED);
me->GetInstanceScript()->SetData(DATA_THRALL_ADD_FLAG, 0);
me->GetInstanceScript()->SetData(DATA_THRALL_ADD_FLAG, 0);
}
void UpdateAI(uint32 diff)
{
events2.Update(diff);
switch (events2.ExecuteEvent())
{
case EVENT_INITIAL_TALK:
Talk(SAY_ENTER);
break;
case EVENT_START_FIGHT:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
me->SetInCombatWithZone();
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
if (summon->GetEntry() != NPC_SKARLOC_MOUNT)
{
summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
summon->SetInCombatWithZone();
}
break;
}
events2.Update(diff);
switch (events2.ExecuteEvent())
{
case EVENT_INITIAL_TALK:
Talk(SAY_ENTER);
break;
case EVENT_START_FIGHT:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
me->SetInCombatWithZone();
for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr)
if (Creature* summon = ObjectAccessor::GetCreature(*me, *itr))
if (summon->GetEntry() != NPC_SKARLOC_MOUNT)
{
summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
summon->SetInCombatWithZone();
}
break;
}
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_SPELL_HOLY_LIGHT:
me->CastSpell(me, SPELL_HOLY_LIGHT, false);
events.ScheduleEvent(EVENT_SPELL_HOLY_LIGHT, 20000);
break;
case EVENT_SPELL_CLEANSE:
if (roll_chance_i(33))
Talk(SAY_TAUNT);
me->CastSpell(me, SPELL_CLEANSE, false);
events.ScheduleEvent(EVENT_SPELL_CLEANSE, 10000);
break;
case EVENT_SPELL_HAMMER:
me->CastSpell(me->GetVictim(), SPELL_HAMMER_OF_JUSTICE, false);
events.ScheduleEvent(EVENT_SPELL_HAMMER, 30000);
break;
case EVENT_SPELL_HOLY_SHIELD:
me->CastSpell(me, SPELL_CLEANSE, false);
events.ScheduleEvent(SPELL_HOLY_SHIELD, 30000);
break;
case EVENT_SPELL_CONSECRATION:
me->CastSpell(me, SPELL_CONSECRATION, false);
events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 20000);
break;
switch (events.ExecuteEvent())
{
case EVENT_SPELL_HOLY_LIGHT:
me->CastSpell(me, SPELL_HOLY_LIGHT, false);
events.ScheduleEvent(EVENT_SPELL_HOLY_LIGHT, 20000);
break;
case EVENT_SPELL_CLEANSE:
if (roll_chance_i(33))
Talk(SAY_TAUNT);
me->CastSpell(me, SPELL_CLEANSE, false);
events.ScheduleEvent(EVENT_SPELL_CLEANSE, 10000);
break;
case EVENT_SPELL_HAMMER:
me->CastSpell(me->GetVictim(), SPELL_HAMMER_OF_JUSTICE, false);
events.ScheduleEvent(EVENT_SPELL_HAMMER, 30000);
break;
case EVENT_SPELL_HOLY_SHIELD:
me->CastSpell(me, SPELL_CLEANSE, false);
events.ScheduleEvent(SPELL_HOLY_SHIELD, 30000);
break;
case EVENT_SPELL_CONSECRATION:
me->CastSpell(me, SPELL_CONSECRATION, false);
events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 20000);
break;
}
}
DoMeleeAttackIfReady();
}

View File

@@ -9,20 +9,20 @@ REWRITTEN BY XINEF
enum EpochHunter
{
SAY_AGGRO = 3,
SAY_SLAY = 4,
SAY_BREATH = 5,
SAY_DEATH = 6,
SAY_AGGRO = 3,
SAY_SLAY = 4,
SAY_BREATH = 5,
SAY_DEATH = 6,
SPELL_SAND_BREATH = 31914,
SPELL_IMPENDING_DEATH = 31916,
SPELL_MAGIC_DISRUPTION_AURA = 33834,
SPELL_WING_BUFFET = 31475,
EVENT_SPELL_SAND_BREATH = 1,
EVENT_SPELL_IMPENDING_DEATH = 2,
EVENT_SPELL_DISRUPTION = 3,
EVENT_SPELL_WING_BUFFET = 4
EVENT_SPELL_SAND_BREATH = 1,
EVENT_SPELL_IMPENDING_DEATH = 2,
EVENT_SPELL_DISRUPTION = 3,
EVENT_SPELL_WING_BUFFET = 4
};
class boss_epoch_hunter : public CreatureScript
@@ -49,26 +49,26 @@ public:
{
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_SPELL_SAND_BREATH, 8000);
events.ScheduleEvent(EVENT_SPELL_IMPENDING_DEATH, 2000);
events.ScheduleEvent(EVENT_SPELL_DISRUPTION, 20000);
events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, 14000);
events.ScheduleEvent(EVENT_SPELL_SAND_BREATH, 8000);
events.ScheduleEvent(EVENT_SPELL_IMPENDING_DEATH, 2000);
events.ScheduleEvent(EVENT_SPELL_DISRUPTION, 20000);
events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, 14000);
}
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY);
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY);
}
void JustDied(Unit* killer)
{
if (killer == me)
return;
if (killer == me)
return;
Talk(SAY_DEATH);
me->GetInstanceScript()->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_EPOCH_KILLED);
if (Creature* taretha = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(DATA_TARETHA_GUID)))
taretha->AI()->DoAction(me->GetEntry());
me->GetInstanceScript()->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_EPOCH_KILLED);
if (Creature* taretha = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(DATA_TARETHA_GUID)))
taretha->AI()->DoAction(me->GetEntry());
}
void UpdateAI(uint32 diff)
@@ -76,31 +76,31 @@ public:
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_SPELL_SAND_BREATH:
if (roll_chance_i(50))
Talk(SAY_BREATH);
me->CastSpell(me->GetVictim(), SPELL_SAND_BREATH, false);
events.ScheduleEvent(EVENT_SPELL_SAND_BREATH, 20000);
break;
case EVENT_SPELL_IMPENDING_DEATH:
me->CastSpell(me->GetVictim(), SPELL_IMPENDING_DEATH, false);
events.ScheduleEvent(EVENT_SPELL_IMPENDING_DEATH, 30000);
break;
case EVENT_SPELL_WING_BUFFET:
me->CastSpell(me, SPELL_WING_BUFFET, false);
events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, 30000);
break;
case EVENT_SPELL_DISRUPTION:
me->CastSpell(me, SPELL_MAGIC_DISRUPTION_AURA, false);
events.ScheduleEvent(EVENT_SPELL_DISRUPTION, 30000);
break;
}
switch (events.ExecuteEvent())
{
case EVENT_SPELL_SAND_BREATH:
if (roll_chance_i(50))
Talk(SAY_BREATH);
me->CastSpell(me->GetVictim(), SPELL_SAND_BREATH, false);
events.ScheduleEvent(EVENT_SPELL_SAND_BREATH, 20000);
break;
case EVENT_SPELL_IMPENDING_DEATH:
me->CastSpell(me->GetVictim(), SPELL_IMPENDING_DEATH, false);
events.ScheduleEvent(EVENT_SPELL_IMPENDING_DEATH, 30000);
break;
case EVENT_SPELL_WING_BUFFET:
me->CastSpell(me, SPELL_WING_BUFFET, false);
events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, 30000);
break;
case EVENT_SPELL_DISRUPTION:
me->CastSpell(me, SPELL_MAGIC_DISRUPTION_AURA, false);
events.ScheduleEvent(EVENT_SPELL_DISRUPTION, 30000);
break;
}
DoMeleeAttackIfReady();
}

View File

@@ -10,24 +10,24 @@ REWRITTEN BY XINEF
enum LieutenantDrake
{
SAY_ENTER = 0,
SAY_AGGRO = 1,
SAY_SLAY = 2,
SAY_MORTAL = 3,
SAY_SHOUT = 4,
SAY_DEATH = 5,
SAY_ENTER = 0,
SAY_AGGRO = 1,
SAY_SLAY = 2,
SAY_MORTAL = 3,
SAY_SHOUT = 4,
SAY_DEATH = 5,
SPELL_WHIRLWIND = 31909,
SPELL_EXPLODING_SHOT = 33792,
SPELL_HAMSTRING = 9080,
SPELL_MORTAL_STRIKE = 31911,
SPELL_FRIGHTENING_SHOUT = 33789,
SPELL_WHIRLWIND = 31909,
SPELL_EXPLODING_SHOT = 33792,
SPELL_HAMSTRING = 9080,
SPELL_MORTAL_STRIKE = 31911,
SPELL_FRIGHTENING_SHOUT = 33789,
EVENT_WHIRLWIND = 1,
EVENT_FRIGHTENING_SHOUT = 2,
EVENT_MORTAL_STRIKE = 3,
EVENT_HAMSTRING = 4,
EVENT_EXPLODING_SHOT = 5
EVENT_WHIRLWIND = 1,
EVENT_FRIGHTENING_SHOUT = 2,
EVENT_MORTAL_STRIKE = 3,
EVENT_HAMSTRING = 4,
EVENT_EXPLODING_SHOT = 5
};
class boss_lieutenant_drake : public CreatureScript
@@ -43,38 +43,38 @@ public:
struct boss_lieutenant_drakeAI : public ScriptedAI
{
boss_lieutenant_drakeAI(Creature* creature) : ScriptedAI(creature)
{
pathPoints.clear();
WPPath* path = sSmartWaypointMgr->GetPath(me->GetEntry());
if (!path || path->empty())
return;
{
pathPoints.clear();
WPPath* path = sSmartWaypointMgr->GetPath(me->GetEntry());
if (!path || path->empty())
return;
pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()));
pathPoints.push_back(G3D::Vector3(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()));
uint32 wpCounter = 1;
WPPath::const_iterator itr;
while ((itr = path->find(wpCounter++)) != path->end())
{
WayPoint* wp = itr->second;
pathPoints.push_back(G3D::Vector3(wp->x, wp->y, wp->z));
}
}
uint32 wpCounter = 1;
WPPath::const_iterator itr;
while ((itr = path->find(wpCounter++)) != path->end())
{
WayPoint* wp = itr->second;
pathPoints.push_back(G3D::Vector3(wp->x, wp->y, wp->z));
}
}
void InitializeAI()
{
ScriptedAI::InitializeAI();
//Talk(SAY_ENTER);
JustReachedHome();
}
void InitializeAI()
{
ScriptedAI::InitializeAI();
//Talk(SAY_ENTER);
JustReachedHome();
}
void JustReachedHome()
{
me->SetWalk(true);
Movement::MoveSplineInit init(me);
init.MovebyPath(pathPoints);
init.SetCyclic();
init.Launch();
}
void JustReachedHome()
{
me->SetWalk(true);
Movement::MoveSplineInit init(me);
init.MovebyPath(pathPoints);
init.SetCyclic();
init.Launch();
}
void Reset()
{
@@ -85,24 +85,24 @@ public:
{
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_WHIRLWIND, 4000);
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 14000);
events.ScheduleEvent(EVENT_MORTAL_STRIKE, 9000);
events.ScheduleEvent(EVENT_HAMSTRING, 18000);
events.ScheduleEvent(EVENT_EXPLODING_SHOT, 1000);
events.ScheduleEvent(EVENT_WHIRLWIND, 4000);
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 14000);
events.ScheduleEvent(EVENT_MORTAL_STRIKE, 9000);
events.ScheduleEvent(EVENT_HAMSTRING, 18000);
events.ScheduleEvent(EVENT_EXPLODING_SHOT, 1000);
}
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY);
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY);
}
void JustDied(Unit* /*killer*/)
{
Talk(SAY_DEATH);
if (InstanceScript* instance = me->GetInstanceScript())
instance->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_DRAKE_KILLED);
if (InstanceScript* instance = me->GetInstanceScript())
instance->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_DRAKE_KILLED);
}
void UpdateAI(uint32 diff)
@@ -110,45 +110,45 @@ public:
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_WHIRLWIND:
me->CastSpell(me, SPELL_WHIRLWIND, false);
events.ScheduleEvent(EVENT_WHIRLWIND, 25000);
break;
case EVENT_EXPLODING_SHOT:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 40.0f))
me->CastSpell(target, SPELL_EXPLODING_SHOT, false);
events.ScheduleEvent(EVENT_EXPLODING_SHOT, 25000);
break;
case EVENT_MORTAL_STRIKE:
if (roll_chance_i(40))
Talk(SAY_MORTAL);
me->CastSpell(me->GetVictim(), SPELL_MORTAL_STRIKE, false);
events.ScheduleEvent(EVENT_MORTAL_STRIKE, 10000);
break;
case EVENT_FRIGHTENING_SHOUT:
if (roll_chance_i(40))
Talk(SAY_SHOUT);
me->CastSpell(me, SPELL_FRIGHTENING_SHOUT, false);
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 25000);
break;
case EVENT_HAMSTRING:
me->CastSpell(me->GetVictim(), SPELL_HAMSTRING, false);
events.ScheduleEvent(EVENT_HAMSTRING, 25000);
break;
}
switch (events.ExecuteEvent())
{
case EVENT_WHIRLWIND:
me->CastSpell(me, SPELL_WHIRLWIND, false);
events.ScheduleEvent(EVENT_WHIRLWIND, 25000);
break;
case EVENT_EXPLODING_SHOT:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 40.0f))
me->CastSpell(target, SPELL_EXPLODING_SHOT, false);
events.ScheduleEvent(EVENT_EXPLODING_SHOT, 25000);
break;
case EVENT_MORTAL_STRIKE:
if (roll_chance_i(40))
Talk(SAY_MORTAL);
me->CastSpell(me->GetVictim(), SPELL_MORTAL_STRIKE, false);
events.ScheduleEvent(EVENT_MORTAL_STRIKE, 10000);
break;
case EVENT_FRIGHTENING_SHOUT:
if (roll_chance_i(40))
Talk(SAY_SHOUT);
me->CastSpell(me, SPELL_FRIGHTENING_SHOUT, false);
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 25000);
break;
case EVENT_HAMSTRING:
me->CastSpell(me->GetVictim(), SPELL_HAMSTRING, false);
events.ScheduleEvent(EVENT_HAMSTRING, 25000);
break;
}
DoMeleeAttackIfReady();
}
private:
EventMap events;
Movement::PointsArray pathPoints;
private:
EventMap events;
Movement::PointsArray pathPoints;
};
};

View File

@@ -10,18 +10,18 @@ REWRITTEN BY XINEF
const Position instancePositions[INSTANCE_POSITIONS_COUNT] =
{
{2188.18f, 228.90f, 53.025f, 1.77f}, // Orcs Gather Point 1
{2103.23f, 93.55f, 53.096f, 3.78f}, // Orcs Gather Point 2
{2128.43f, 71.01f, 64.42f, 1.74f} // Lieutenant Drake Summon Position
{2188.18f, 228.90f, 53.025f, 1.77f}, // Orcs Gather Point 1
{2103.23f, 93.55f, 53.096f, 3.78f}, // Orcs Gather Point 2
{2128.43f, 71.01f, 64.42f, 1.74f} // Lieutenant Drake Summon Position
};
const Position thrallPositions[THRALL_POSITIONS_COUNT] =
{
{2181.37f, 119.15f, 89.45f, 5.75f}, // After wearing armor
{2096.09f, 195.91f, 65.22f, 2.45f}, // After Fourth Ambush
{2062.9f, 229.93f, 64.454f, 2.45f}, // After Captain Skarloc death
{2486.91f, 626.356f, 58.0761f, 0.0f}, // Arrived at Tarren Mill
{2660.47f, 659.223f, 62.0f, 5.78f} // Taretha Met
{2181.37f, 119.15f, 89.45f, 5.75f}, // After wearing armor
{2096.09f, 195.91f, 65.22f, 2.45f}, // After Fourth Ambush
{2062.9f, 229.93f, 64.454f, 2.45f}, // After Captain Skarloc death
{2486.91f, 626.356f, 58.0761f, 0.0f}, // Arrived at Tarren Mill
{2660.47f, 659.223f, 62.0f, 5.78f} // Taretha Met
};
@@ -42,42 +42,42 @@ public:
void Initialize()
{
_encounterProgress = 0;
_barrelCount = 0;
_attemptsCount = 0;
_barrelCount = 0;
_attemptsCount = 0;
_thrallGUID = 0;
_tarethaGUID = 0;
_thrallGUID = 0;
_tarethaGUID = 0;
_initalFlamesSet.clear();
_finalFlamesSet.clear();
_prisonersSet.clear();
_events.Reset();
_initalFlamesSet.clear();
_finalFlamesSet.clear();
_prisonersSet.clear();
_events.Reset();
}
void OnPlayerEnter(Player* player)
{
if (instance->GetPlayersCountExceptGMs() == 1)
CleanupInstance();
void OnPlayerEnter(Player* player)
{
if (instance->GetPlayersCountExceptGMs() == 1)
CleanupInstance();
EnsureGridLoaded();
EnsureGridLoaded();
if (_encounterProgress < ENCOUNTER_PROGRESS_BARRELS)
player->SendUpdateWorldState(WORLD_STATE_BARRELS_PLANTED, _barrelCount);
}
if (_encounterProgress < ENCOUNTER_PROGRESS_BARRELS)
player->SendUpdateWorldState(WORLD_STATE_BARRELS_PLANTED, _barrelCount);
}
void CleanupInstance()
{
if (_encounterProgress == ENCOUNTER_PROGRESS_NONE)
return;
void CleanupInstance()
{
if (_encounterProgress == ENCOUNTER_PROGRESS_NONE)
return;
_events.ScheduleEvent(EVENT_INITIAL_BARRELS_FLAME, 0);
_events.ScheduleEvent(EVENT_FINAL_BARRELS_FLAME, 0);
_events.ScheduleEvent(EVENT_INITIAL_BARRELS_FLAME, 0);
_events.ScheduleEvent(EVENT_FINAL_BARRELS_FLAME, 0);
if (_encounterProgress == ENCOUNTER_PROGRESS_BARRELS)
_events.ScheduleEvent(EVENT_SUMMON_LIEUTENANT, 0);
else
SetData(DATA_THRALL_REPOSITION, 2);
}
if (_encounterProgress == ENCOUNTER_PROGRESS_BARRELS)
_events.ScheduleEvent(EVENT_SUMMON_LIEUTENANT, 0);
else
SetData(DATA_THRALL_REPOSITION, 2);
}
void OnCreatureCreate(Creature* creature)
{
@@ -85,207 +85,207 @@ public:
{
case NPC_THRALL:
_thrallGUID = creature->GetGUID();
if (_encounterProgress == ENCOUNTER_PROGRESS_FINISHED)
creature->SetVisible(false);
else
Reposition(creature);
if (_encounterProgress == ENCOUNTER_PROGRESS_FINISHED)
creature->SetVisible(false);
else
Reposition(creature);
break;
case NPC_ORC_PRISONER:
_prisonersSet.insert(creature->GetGUID());
break;
case NPC_TARETHA:
if (_encounterProgress == ENCOUNTER_PROGRESS_FINISHED)
creature->SetVisible(false);
_tarethaGUID = creature->GetGUID();
break;
case NPC_ORC_PRISONER:
_prisonersSet.insert(creature->GetGUID());
break;
case NPC_TARETHA:
if (_encounterProgress == ENCOUNTER_PROGRESS_FINISHED)
creature->SetVisible(false);
_tarethaGUID = creature->GetGUID();
break;
}
}
void OnGameObjectCreate(GameObject* gameobject)
{
switch (gameobject->GetEntry())
{
case GO_BARREL:
if (_encounterProgress >= ENCOUNTER_PROGRESS_BARRELS)
gameobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case GO_PRISON_DOOR:
if (_encounterProgress >= ENCOUNTER_PROGRESS_THRALL_ARMORED)
gameobject->SetGoState(GO_STATE_ACTIVE);
break;
case GO_ROARING_FLAME:
// Xinef: hack in DB to distinguish final / initial flames
if (gameobject->GetPhaseMask() & 0x2)
_finalFlamesSet.insert(gameobject->GetGUID());
else
_initalFlamesSet.insert(gameobject->GetGUID());
break;
}
}
void OnGameObjectCreate(GameObject* gameobject)
{
switch (gameobject->GetEntry())
{
case GO_BARREL:
if (_encounterProgress >= ENCOUNTER_PROGRESS_BARRELS)
gameobject->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
break;
case GO_PRISON_DOOR:
if (_encounterProgress >= ENCOUNTER_PROGRESS_THRALL_ARMORED)
gameobject->SetGoState(GO_STATE_ACTIVE);
break;
case GO_ROARING_FLAME:
// Xinef: hack in DB to distinguish final / initial flames
if (gameobject->GetPhaseMask() & 0x2)
_finalFlamesSet.insert(gameobject->GetGUID());
else
_initalFlamesSet.insert(gameobject->GetGUID());
break;
}
}
void SetData(uint32 type, uint32 data)
{
switch (type)
{
case DATA_THRALL_REPOSITION:
if (data > 1)
_events.ScheduleEvent(EVENT_THRALL_REPOSITION, data == 2 ? 0 : 10000);
else if (Creature* thrall = instance->GetCreature(_thrallGUID))
Reposition(thrall);
return;
case DATA_ESCORT_PROGRESS:
_encounterProgress = data;
SaveToDB();
break;
case DATA_THRALL_REPOSITION:
if (data > 1)
_events.ScheduleEvent(EVENT_THRALL_REPOSITION, data == 2 ? 0 : 10000);
else if (Creature* thrall = instance->GetCreature(_thrallGUID))
Reposition(thrall);
return;
case DATA_ESCORT_PROGRESS:
_encounterProgress = data;
SaveToDB();
break;
case DATA_BOMBS_PLACED:
{
if (_barrelCount >= 5 || _encounterProgress > ENCOUNTER_PROGRESS_NONE)
return;
if (_barrelCount >= 5 || _encounterProgress > ENCOUNTER_PROGRESS_NONE)
return;
DoUpdateWorldState(WORLD_STATE_BARRELS_PLANTED, ++_barrelCount);
if (_barrelCount == 5)
{
_events.ScheduleEvent(EVENT_INITIAL_BARRELS_FLAME, 4000);
_events.ScheduleEvent(EVENT_FINAL_BARRELS_FLAME, 12000);
_events.ScheduleEvent(EVENT_SUMMON_LIEUTENANT, 18000);
_events.ScheduleEvent(EVENT_INITIAL_BARRELS_FLAME, 4000);
_events.ScheduleEvent(EVENT_FINAL_BARRELS_FLAME, 12000);
_events.ScheduleEvent(EVENT_SUMMON_LIEUTENANT, 18000);
}
break;
}
case DATA_THRALL_ADD_FLAG:
if (Creature* thrall = instance->GetCreature(_thrallGUID))
thrall->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
break;
case DATA_THRALL_ADD_FLAG:
if (Creature* thrall = instance->GetCreature(_thrallGUID))
thrall->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
break;
}
}
uint32 GetData(uint32 data) const
{
if (data == DATA_ESCORT_PROGRESS)
return _encounterProgress;
else if (data == DATA_ATTEMPTS_COUNT)
return _attemptsCount;
if (data == DATA_ESCORT_PROGRESS)
return _encounterProgress;
else if (data == DATA_ATTEMPTS_COUNT)
return _attemptsCount;
return 0;
}
uint64 GetData64(uint32 data) const
{
if (data == DATA_THRALL_GUID)
return _thrallGUID;
else if (data == DATA_TARETHA_GUID)
return _tarethaGUID;
if (data == DATA_THRALL_GUID)
return _thrallGUID;
else if (data == DATA_TARETHA_GUID)
return _tarethaGUID;
return 0;
}
void Update(uint32 diff)
{
_events.Update(diff);
switch (_events.ExecuteEvent())
{
case EVENT_INITIAL_BARRELS_FLAME:
{
instance->LoadGrid(instancePositions[0].GetPositionX(), instancePositions[0].GetPositionY());
instance->LoadGrid(instancePositions[1].GetPositionX(), instancePositions[1].GetPositionY());
void Update(uint32 diff)
{
_events.Update(diff);
switch (_events.ExecuteEvent())
{
case EVENT_INITIAL_BARRELS_FLAME:
{
instance->LoadGrid(instancePositions[0].GetPositionX(), instancePositions[0].GetPositionY());
instance->LoadGrid(instancePositions[1].GetPositionX(), instancePositions[1].GetPositionY());
for (std::set<uint64>::const_iterator itr = _prisonersSet.begin(); itr != _prisonersSet.end(); ++itr)
if (Creature* orc = instance->GetCreature(*itr))
{
uint8 index = orc->GetDistance(instancePositions[0]) < 80.0f ? 0 : 1;
Position pos(instancePositions[index]);
orc->MovePosition(pos, frand(1.0f, 3.0f) + 15.0f * (float)rand_norm(), (float)rand_norm() * static_cast<float>(2 * M_PI));
orc->GetMotionMaster()->MovePoint(1, pos);
orc->SetStandState(UNIT_STAND_STATE_STAND);
}
for (std::set<uint64>::const_iterator itr = _prisonersSet.begin(); itr != _prisonersSet.end(); ++itr)
if (Creature* orc = instance->GetCreature(*itr))
{
uint8 index = orc->GetDistance(instancePositions[0]) < 80.0f ? 0 : 1;
Position pos(instancePositions[index]);
orc->MovePosition(pos, frand(1.0f, 3.0f) + 15.0f * (float)rand_norm(), (float)rand_norm() * static_cast<float>(2 * M_PI));
orc->GetMotionMaster()->MovePoint(1, pos);
orc->SetStandState(UNIT_STAND_STATE_STAND);
}
for (std::set<uint64>::const_iterator itr = _initalFlamesSet.begin(); itr != _initalFlamesSet.end(); ++itr)
if (GameObject* gobject = instance->GetGameObject(*itr))
{
gobject->SetRespawnTime(0);
gobject->UpdateObjectVisibility(true);
}
break;
}
case EVENT_FINAL_BARRELS_FLAME:
{
instance->LoadGrid(instancePositions[0].GetPositionX(), instancePositions[0].GetPositionY());
instance->LoadGrid(instancePositions[1].GetPositionX(), instancePositions[1].GetPositionY());
for (std::set<uint64>::const_iterator itr = _initalFlamesSet.begin(); itr != _initalFlamesSet.end(); ++itr)
if (GameObject* gobject = instance->GetGameObject(*itr))
{
gobject->SetRespawnTime(0);
gobject->UpdateObjectVisibility(true);
}
break;
}
case EVENT_FINAL_BARRELS_FLAME:
{
instance->LoadGrid(instancePositions[0].GetPositionX(), instancePositions[0].GetPositionY());
instance->LoadGrid(instancePositions[1].GetPositionX(), instancePositions[1].GetPositionY());
if (_encounterProgress == ENCOUNTER_PROGRESS_NONE)
{
Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
if (Player* player = itr->GetSource())
player->KilledMonsterCredit(NPC_LODGE_QUEST_TRIGGER, 0);
}
if (_encounterProgress == ENCOUNTER_PROGRESS_NONE)
{
Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
if (Player* player = itr->GetSource())
player->KilledMonsterCredit(NPC_LODGE_QUEST_TRIGGER, 0);
}
for (std::set<uint64>::const_iterator itr = _finalFlamesSet.begin(); itr != _finalFlamesSet.end(); ++itr)
if (GameObject* gobject = instance->GetGameObject(*itr))
{
gobject->SetRespawnTime(0);
gobject->UpdateObjectVisibility(true);
}
for (std::set<uint64>::const_iterator itr = _finalFlamesSet.begin(); itr != _finalFlamesSet.end(); ++itr)
if (GameObject* gobject = instance->GetGameObject(*itr))
{
gobject->SetRespawnTime(0);
gobject->UpdateObjectVisibility(true);
}
for (std::set<uint64>::const_iterator itr = _prisonersSet.begin(); itr != _prisonersSet.end(); ++itr)
if (Creature* orc = instance->GetCreature(*itr))
if (roll_chance_i(25))
orc->HandleEmoteCommand(EMOTE_ONESHOT_CHEER);
SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_BARRELS);
for (std::set<uint64>::const_iterator itr = _prisonersSet.begin(); itr != _prisonersSet.end(); ++itr)
if (Creature* orc = instance->GetCreature(*itr))
if (roll_chance_i(25))
orc->HandleEmoteCommand(EMOTE_ONESHOT_CHEER);
SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_BARRELS);
DoUpdateWorldState(WORLD_STATE_BARRELS_PLANTED, 0);
break;
}
case EVENT_SUMMON_LIEUTENANT:
{
instance->LoadGrid(instancePositions[2].GetPositionX(), instancePositions[2].GetPositionY());
if (Creature* drake = instance->SummonCreature(NPC_LIEUTENANT_DRAKE, instancePositions[2]))
drake->AI()->Talk(0);
}
case EVENT_THRALL_REPOSITION:
{
if (Creature* thrall = instance->GetCreature(_thrallGUID))
{
if (!thrall->IsAlive())
{
++_attemptsCount;
EnsureGridLoaded();
thrall->SetVisible(false);
Reposition(thrall);
thrall->setDeathState(DEAD);
thrall->Respawn();
thrall->SetVisible(true);
SaveToDB();
}
else
thrall->AI()->Reset();
}
break;
}
}
}
break;
}
case EVENT_SUMMON_LIEUTENANT:
{
instance->LoadGrid(instancePositions[2].GetPositionX(), instancePositions[2].GetPositionY());
if (Creature* drake = instance->SummonCreature(NPC_LIEUTENANT_DRAKE, instancePositions[2]))
drake->AI()->Talk(0);
}
case EVENT_THRALL_REPOSITION:
{
if (Creature* thrall = instance->GetCreature(_thrallGUID))
{
if (!thrall->IsAlive())
{
++_attemptsCount;
EnsureGridLoaded();
thrall->SetVisible(false);
Reposition(thrall);
thrall->setDeathState(DEAD);
thrall->Respawn();
thrall->SetVisible(true);
SaveToDB();
}
else
thrall->AI()->Reset();
}
break;
}
}
}
void Reposition(Creature* thrall)
{
switch (uint32 data = GetData(DATA_ESCORT_PROGRESS))
{
case ENCOUNTER_PROGRESS_THRALL_ARMORED:
case ENCOUNTER_PROGRESS_AMBUSHES_1:
case ENCOUNTER_PROGRESS_SKARLOC_KILLED:
case ENCOUNTER_PROGRESS_TARREN_MILL:
case ENCOUNTER_PROGRESS_TARETHA_MEET:
thrall->UpdatePosition(thrallPositions[data - ENCOUNTER_PROGRESS_THRALL_ARMORED], true);
thrall->SetHomePosition(thrallPositions[data - ENCOUNTER_PROGRESS_THRALL_ARMORED]);
thrall->SetFacingTo(thrallPositions[data - ENCOUNTER_PROGRESS_THRALL_ARMORED].GetOrientation());
break;
}
}
void Reposition(Creature* thrall)
{
switch (uint32 data = GetData(DATA_ESCORT_PROGRESS))
{
case ENCOUNTER_PROGRESS_THRALL_ARMORED:
case ENCOUNTER_PROGRESS_AMBUSHES_1:
case ENCOUNTER_PROGRESS_SKARLOC_KILLED:
case ENCOUNTER_PROGRESS_TARREN_MILL:
case ENCOUNTER_PROGRESS_TARETHA_MEET:
thrall->UpdatePosition(thrallPositions[data - ENCOUNTER_PROGRESS_THRALL_ARMORED], true);
thrall->SetHomePosition(thrallPositions[data - ENCOUNTER_PROGRESS_THRALL_ARMORED]);
thrall->SetFacingTo(thrallPositions[data - ENCOUNTER_PROGRESS_THRALL_ARMORED].GetOrientation());
break;
}
}
void EnsureGridLoaded()
{
for (uint8 i = 0; i < THRALL_POSITIONS_COUNT; ++i)
instance->LoadGrid(thrallPositions[i].GetPositionX(), thrallPositions[i].GetPositionY());
}
void EnsureGridLoaded()
{
for (uint8 i = 0; i < THRALL_POSITIONS_COUNT; ++i)
instance->LoadGrid(thrallPositions[i].GetPositionX(), thrallPositions[i].GetPositionY());
}
std::string GetSaveData()
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
@@ -323,18 +323,18 @@ public:
OUT_LOAD_INST_DATA_COMPLETE;
}
private:
uint32 _encounterProgress;
uint32 _barrelCount;
uint32 _attemptsCount;
private:
uint32 _encounterProgress;
uint32 _barrelCount;
uint32 _attemptsCount;
uint64 _thrallGUID;
uint64 _tarethaGUID;
std::set<uint64> _initalFlamesSet;
std::set<uint64> _finalFlamesSet;
std::set<uint64> _prisonersSet;
uint64 _thrallGUID;
uint64 _tarethaGUID;
std::set<uint64> _initalFlamesSet;
std::set<uint64> _finalFlamesSet;
std::set<uint64> _prisonersSet;
EventMap _events;
EventMap _events;
};
};

View File

@@ -7,71 +7,71 @@ REWRITTEN BY XINEF
enum DataIds
{
DATA_ESCORT_PROGRESS = 0,
DATA_ESCORT_PROGRESS = 0,
DATA_BOMBS_PLACED = 10,
DATA_THRALL_REPOSITION = 11,
DATA_THRALL_ADD_FLAG = 12,
DATA_THRALL_GUID = 13,
DATA_TARETHA_GUID = 14,
DATA_ATTEMPTS_COUNT = 15
DATA_BOMBS_PLACED = 10,
DATA_THRALL_REPOSITION = 11,
DATA_THRALL_ADD_FLAG = 12,
DATA_THRALL_GUID = 13,
DATA_TARETHA_GUID = 14,
DATA_ATTEMPTS_COUNT = 15
};
enum NpcIds
{
NPC_EROZION = 18723,
NPC_THRALL = 17876,
NPC_TARETHA = 18887,
NPC_EPOCH_HUNTER = 18096,
NPC_LIEUTENANT_DRAKE = 17848,
NPC_EROZION = 18723,
NPC_THRALL = 17876,
NPC_TARETHA = 18887,
NPC_EPOCH_HUNTER = 18096,
NPC_LIEUTENANT_DRAKE = 17848,
NPC_LODGE_QUEST_TRIGGER = 20155,
NPC_ORC_PRISONER = 18598,
NPC_LODGE_QUEST_TRIGGER = 20155,
NPC_ORC_PRISONER = 18598,
NPC_DURNHOLDE_ARMORER = 18764,
NPC_DURNHOLDE_WARDEN = 17833,
NPC_DURNHOLDE_VETERAN = 17860,
NPC_DURNHOLDE_MAGE = 17860,
NPC_DURNHOLDE_SENTRY = 17860,
NPC_DURNHOLDE_ARMORER = 18764,
NPC_DURNHOLDE_WARDEN = 17833,
NPC_DURNHOLDE_VETERAN = 17860,
NPC_DURNHOLDE_MAGE = 17860,
NPC_DURNHOLDE_SENTRY = 17860,
NPC_CAPTAIN_SKARLOC = 17862,
NPC_SKARLOC_MOUNT = 18798,
NPC_CAPTAIN_SKARLOC = 17862,
NPC_SKARLOC_MOUNT = 18798,
NPC_LORDAERON_SENTRY = 17815,
NPC_LORDAERON_WATCHMAN = 17814,
NPC_LORDAERON_SENTRY = 17815,
NPC_LORDAERON_WATCHMAN = 17814,
};
enum GobjectIds
{
GO_BARREL = 182589,
GO_ROARING_FLAME = 182592,
GO_PRISON_DOOR = 184393
GO_BARREL = 182589,
GO_ROARING_FLAME = 182592,
GO_PRISON_DOOR = 184393
};
enum MiscIds
{
QUEST_DIVERSION = 10283,
WORLD_STATE_BARRELS_PLANTED = 2436,
SKARLOC_MOUNT_MODEL = 18223,
QUEST_DIVERSION = 10283,
WORLD_STATE_BARRELS_PLANTED = 2436,
SKARLOC_MOUNT_MODEL = 18223,
ENCOUNTER_PROGRESS_NONE = 0,
ENCOUNTER_PROGRESS_BARRELS = 1,
ENCOUNTER_PROGRESS_DRAKE_KILLED = 2,
ENCOUNTER_PROGRESS_THRALL_ARMORED = 3,
ENCOUNTER_PROGRESS_AMBUSHES_1 = 4,
ENCOUNTER_PROGRESS_SKARLOC_KILLED = 5,
ENCOUNTER_PROGRESS_TARREN_MILL = 6,
ENCOUNTER_PROGRESS_TARETHA_MEET = 7,
ENCOUNTER_PROGRESS_EPOCH_KILLED = 8,
ENCOUNTER_PROGRESS_FINISHED = 9,
ENCOUNTER_PROGRESS_NONE = 0,
ENCOUNTER_PROGRESS_BARRELS = 1,
ENCOUNTER_PROGRESS_DRAKE_KILLED = 2,
ENCOUNTER_PROGRESS_THRALL_ARMORED = 3,
ENCOUNTER_PROGRESS_AMBUSHES_1 = 4,
ENCOUNTER_PROGRESS_SKARLOC_KILLED = 5,
ENCOUNTER_PROGRESS_TARREN_MILL = 6,
ENCOUNTER_PROGRESS_TARETHA_MEET = 7,
ENCOUNTER_PROGRESS_EPOCH_KILLED = 8,
ENCOUNTER_PROGRESS_FINISHED = 9,
EVENT_INITIAL_BARRELS_FLAME = 1,
EVENT_FINAL_BARRELS_FLAME = 2,
EVENT_SUMMON_LIEUTENANT = 3,
EVENT_THRALL_REPOSITION = 4,
EVENT_INITIAL_BARRELS_FLAME = 1,
EVENT_FINAL_BARRELS_FLAME = 2,
EVENT_SUMMON_LIEUTENANT = 3,
EVENT_THRALL_REPOSITION = 4,
INSTANCE_POSITIONS_COUNT = 3,
THRALL_POSITIONS_COUNT = 5
INSTANCE_POSITIONS_COUNT = 3,
THRALL_POSITIONS_COUNT = 5
};

View File

@@ -8,27 +8,27 @@ REWRITTEN BY XINEF
enum Enums
{
SAY_ENTER = 0,
SAY_AGGRO = 1,
SAY_BANISH = 2,
SAY_SLAY = 3,
SAY_DEATH = 4,
EMOTE_FRENZY = 5,
SAY_ENTER = 0,
SAY_AGGRO = 1,
SAY_BANISH = 2,
SAY_SLAY = 3,
SAY_DEATH = 4,
EMOTE_FRENZY = 5,
SPELL_CLEAVE = 40504,
SPELL_TIME_STOP = 31422,
SPELL_ENRAGE = 37605,
SPELL_SAND_BREATH = 31473,
SPELL_CORRUPT_MEDIVH = 37853,
SPELL_BANISH_DRAGON_HELPER = 31550
SPELL_CLEAVE = 40504,
SPELL_TIME_STOP = 31422,
SPELL_ENRAGE = 37605,
SPELL_SAND_BREATH = 31473,
SPELL_CORRUPT_MEDIVH = 37853,
SPELL_BANISH_DRAGON_HELPER = 31550
};
enum Events
{
EVENT_SANDBREATH = 1,
EVENT_TIMESTOP = 2,
EVENT_FRENZY = 3,
EVENT_CLEAVE = 4
EVENT_SANDBREATH = 1,
EVENT_TIMESTOP = 2,
EVENT_FRENZY = 3,
EVENT_CLEAVE = 4
};
class boss_aeonus : public CreatureScript
@@ -39,36 +39,36 @@ public:
struct boss_aeonusAI : public ScriptedAI
{
boss_aeonusAI(Creature* creature) : ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
}
{
instance = creature->GetInstanceScript();
}
EventMap events;
InstanceScript* instance;
EventMap events;
InstanceScript* instance;
void Reset()
{
events.Reset();
}
{
events.Reset();
}
void JustReachedHome()
{
if (Unit* medivh = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_MEDIVH)))
if (me->GetDistance2d(medivh) < 20.0f)
me->CastSpell(me, SPELL_CORRUPT_MEDIVH, false);
}
void JustReachedHome()
{
if (Unit* medivh = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_MEDIVH)))
if (me->GetDistance2d(medivh) < 20.0f)
me->CastSpell(me, SPELL_CORRUPT_MEDIVH, false);
}
void InitializeAI()
{
Talk(SAY_ENTER);
ScriptedAI::InitializeAI();
void InitializeAI()
{
Talk(SAY_ENTER);
ScriptedAI::InitializeAI();
if (Unit* medivh = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_MEDIVH)))
{
me->SetHomePosition(medivh->GetPositionX() + 14.0f*cos(medivh->GetAngle(me)), medivh->GetPositionY() + 14.0f*sin(medivh->GetAngle(me)), medivh->GetPositionZ(), me->GetAngle(medivh));
me->GetMotionMaster()->MoveTargetedHome();
}
}
if (Unit* medivh = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_MEDIVH)))
{
me->SetHomePosition(medivh->GetPositionX() + 14.0f*cos(medivh->GetAngle(me)), medivh->GetPositionY() + 14.0f*sin(medivh->GetAngle(me)), medivh->GetPositionZ(), me->GetAngle(medivh));
me->GetMotionMaster()->MoveTargetedHome();
}
}
void EnterCombat(Unit* /*who*/)
{
@@ -87,8 +87,8 @@ public:
if (me->IsWithinDistInMap(who, 20.0f))
{
Talk(SAY_BANISH);
me->CastSpell(me, SPELL_BANISH_DRAGON_HELPER, true);
return;
me->CastSpell(me, SPELL_BANISH_DRAGON_HELPER, true);
return;
}
}
@@ -118,21 +118,21 @@ public:
switch (events.ExecuteEvent())
{
case EVENT_CLEAVE:
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
events.ScheduleEvent(EVENT_CLEAVE, 10000);
break;
case EVENT_CLEAVE:
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
events.ScheduleEvent(EVENT_CLEAVE, 10000);
break;
case EVENT_SANDBREATH:
me->CastSpell(me->GetVictim(), SPELL_SAND_BREATH, false);
events.ScheduleEvent(EVENT_SANDBREATH, 20000);
break;
case EVENT_TIMESTOP:
me->CastSpell(me, SPELL_TIME_STOP, false);
me->CastSpell(me, SPELL_TIME_STOP, false);
events.ScheduleEvent(EVENT_TIMESTOP, 25000);
break;
case EVENT_FRENZY:
Talk(EMOTE_FRENZY);
me->CastSpell(me, SPELL_ENRAGE, false);
me->CastSpell(me, SPELL_ENRAGE, false);
events.ScheduleEvent(EVENT_FRENZY, 30000);
break;
}

View File

@@ -8,26 +8,26 @@ REWRITTEN BY XINEF
enum Enums
{
SAY_ENTER = 0,
SAY_AGGRO = 1,
SAY_BANISH = 2,
SAY_SLAY = 3,
SAY_DEATH = 4,
SAY_ENTER = 0,
SAY_AGGRO = 1,
SAY_BANISH = 2,
SAY_SLAY = 3,
SAY_DEATH = 4,
SPELL_ARCANE_BLAST = 31457,
SPELL_ARCANE_DISCHARGE = 31472,
SPELL_TIME_LAPSE = 31467,
SPELL_ATTRACTION = 38540,
SPELL_ARCANE_BLAST = 31457,
SPELL_ARCANE_DISCHARGE = 31472,
SPELL_TIME_LAPSE = 31467,
SPELL_ATTRACTION = 38540,
SPELL_BANISH_DRAGON_HELPER = 31550,
SPELL_BANISH_DRAGON_HELPER = 31550,
};
enum Events
{
EVENT_ARCANE_BLAST = 1,
EVENT_TIME_LAPSE = 2,
EVENT_ARCANE_DISCHARGE = 3,
EVENT_ATTRACTION = 4
EVENT_ARCANE_BLAST = 1,
EVENT_TIME_LAPSE = 2,
EVENT_ARCANE_DISCHARGE = 3,
EVENT_ATTRACTION = 4
};
class boss_chrono_lord_deja : public CreatureScript
@@ -37,26 +37,26 @@ public:
struct boss_chrono_lord_dejaAI : public ScriptedAI
{
boss_chrono_lord_dejaAI(Creature* creature) : ScriptedAI(creature) { }
boss_chrono_lord_dejaAI(Creature* creature) : ScriptedAI(creature) { }
EventMap events;
EventMap events;
void Reset()
{
events.Reset();
}
{
events.Reset();
}
void OwnTalk(uint32 id)
{
if (me->GetEntry() == NPC_CHRONO_LORD_DEJA)
Talk(id);
}
void OwnTalk(uint32 id)
{
if (me->GetEntry() == NPC_CHRONO_LORD_DEJA)
Talk(id);
}
void InitializeAI()
{
OwnTalk(SAY_ENTER);
ScriptedAI::InitializeAI();
}
void InitializeAI()
{
OwnTalk(SAY_ENTER);
ScriptedAI::InitializeAI();
}
void EnterCombat(Unit* /*who*/)
{
@@ -76,8 +76,8 @@ public:
if (me->IsWithinDistInMap(who, 20.0f))
{
OwnTalk(SAY_BANISH);
me->CastSpell(me, SPELL_BANISH_DRAGON_HELPER, true);
return;
me->CastSpell(me, SPELL_BANISH_DRAGON_HELPER, true);
return;
}
}
@@ -86,15 +86,15 @@ public:
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() == TYPEID_PLAYER)
OwnTalk(SAY_SLAY);
if (victim->GetTypeId() == TYPEID_PLAYER)
OwnTalk(SAY_SLAY);
}
void JustDied(Unit* /*killer*/)
{
OwnTalk(SAY_DEATH);
if (InstanceScript* instance = me->GetInstanceScript())
instance->SetData(TYPE_CHRONO_LORD_DEJA, DONE);
if (InstanceScript* instance = me->GetInstanceScript())
instance->SetData(TYPE_CHRONO_LORD_DEJA, DONE);
}
void UpdateAI(uint32 diff)
@@ -109,19 +109,19 @@ public:
switch (events.ExecuteEvent())
{
case EVENT_ARCANE_BLAST:
me->CastSpell(me->GetVictim(), SPELL_ARCANE_BLAST, false);
me->CastSpell(me->GetVictim(), SPELL_ARCANE_BLAST, false);
events.ScheduleEvent(EVENT_ARCANE_BLAST, 20000);
break;
case EVENT_TIME_LAPSE:
me->CastSpell(me, SPELL_TIME_LAPSE, false);
me->CastSpell(me, SPELL_TIME_LAPSE, false);
events.ScheduleEvent(EVENT_TIME_LAPSE, 20000);
break;
case EVENT_ARCANE_DISCHARGE:
me->CastSpell(me, SPELL_ARCANE_DISCHARGE, false);
me->CastSpell(me, SPELL_ARCANE_DISCHARGE, false);
events.ScheduleEvent(EVENT_ARCANE_DISCHARGE, 25000);
break;
case EVENT_ATTRACTION:
me->CastSpell(me, SPELL_ATTRACTION, false);
me->CastSpell(me, SPELL_ATTRACTION, false);
events.ScheduleEvent(EVENT_ATTRACTION, 30000);
break;
}

View File

@@ -8,25 +8,25 @@ REWRITTEN BY XINEF
enum Enums
{
SAY_ENTER = 0,
SAY_AGGRO = 1,
SAY_BANISH = 2,
SAY_SLAY = 3,
SAY_DEATH = 4,
SAY_ENTER = 0,
SAY_AGGRO = 1,
SAY_BANISH = 2,
SAY_SLAY = 3,
SAY_DEATH = 4,
SPELL_HASTEN = 31458,
SPELL_MORTAL_WOUND = 31464,
SPELL_WING_BUFFET = 31475,
SPELL_REFLECT = 38592,
SPELL_BANISH_DRAGON_HELPER = 31550
SPELL_HASTEN = 31458,
SPELL_MORTAL_WOUND = 31464,
SPELL_WING_BUFFET = 31475,
SPELL_REFLECT = 38592,
SPELL_BANISH_DRAGON_HELPER = 31550
};
enum Events
{
EVENT_HASTEN = 1,
EVENT_MORTAL_WOUND = 2,
EVENT_WING_BUFFET = 3,
EVENT_SPELL_REFLECTION = 4
EVENT_HASTEN = 1,
EVENT_MORTAL_WOUND = 2,
EVENT_WING_BUFFET = 3,
EVENT_SPELL_REFLECTION = 4
};
class boss_temporus : public CreatureScript
@@ -38,24 +38,24 @@ public:
{
boss_temporusAI(Creature* creature) : ScriptedAI(creature) { }
EventMap events;
EventMap events;
void OwnTalk(uint32 id)
{
if (me->GetEntry() == NPC_TEMPORUS)
Talk(id);
}
void OwnTalk(uint32 id)
{
if (me->GetEntry() == NPC_TEMPORUS)
Talk(id);
}
void Reset()
{
events.Reset();
}
{
events.Reset();
}
void InitializeAI()
{
OwnTalk(SAY_ENTER);
ScriptedAI::InitializeAI();
}
void InitializeAI()
{
OwnTalk(SAY_ENTER);
ScriptedAI::InitializeAI();
}
void EnterCombat(Unit* /*who*/)
{
@@ -70,15 +70,15 @@ public:
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() == TYPEID_PLAYER)
OwnTalk(SAY_SLAY);
if (victim->GetTypeId() == TYPEID_PLAYER)
OwnTalk(SAY_SLAY);
}
void JustDied(Unit* /*killer*/)
{
OwnTalk(SAY_DEATH);
if (InstanceScript* instance = me->GetInstanceScript())
instance->SetData(TYPE_TEMPORUS, DONE);
instance->SetData(TYPE_TEMPORUS, DONE);
}
void MoveInLineOfSight(Unit* who)
@@ -88,8 +88,8 @@ public:
if (me->IsWithinDistInMap(who, 20.0f))
{
OwnTalk(SAY_BANISH);
me->CastSpell(me, SPELL_BANISH_DRAGON_HELPER, true);
return;
me->CastSpell(me, SPELL_BANISH_DRAGON_HELPER, true);
return;
}
}
@@ -108,11 +108,11 @@ public:
switch (events.ExecuteEvent())
{
case EVENT_HASTEN:
me->CastSpell(me, SPELL_HASTEN, false);
me->CastSpell(me, SPELL_HASTEN, false);
events.ScheduleEvent(EVENT_HASTEN, 20000);
break;
case EVENT_MORTAL_WOUND:
me->CastSpell(me->GetVictim(), SPELL_MORTAL_WOUND, false);
me->CastSpell(me->GetVictim(), SPELL_MORTAL_WOUND, false);
events.ScheduleEvent(EVENT_MORTAL_WOUND, 10000);
break;
case EVENT_WING_BUFFET:
@@ -120,7 +120,7 @@ public:
events.ScheduleEvent(EVENT_WING_BUFFET, 20000);
break;
case EVENT_SPELL_REFLECTION:
me->CastSpell(me, SPELL_REFLECT, false);
me->CastSpell(me, SPELL_REFLECT, false);
events.ScheduleEvent(EVENT_SPELL_REFLECTION, 30000);
break;
}

View File

@@ -33,39 +33,39 @@ public:
{
instance_the_black_morass_InstanceMapScript(Map* map) : InstanceScript(map) { }
std::set<uint64> encounterNPCs;
uint32 encounters[MAX_ENCOUNTER];
std::set<uint64> encounterNPCs;
uint32 encounters[MAX_ENCOUNTER];
uint64 _medivhGUID;
uint8 _currentRift;
uint8 _shieldPercent;
uint8 _shieldPercent;
void Initialize()
{
memset(&encounters, 0, sizeof(encounters));
memset(&encounters, 0, sizeof(encounters));
_medivhGUID = 0;
_currentRift = 0;
_shieldPercent = 100;
encounterNPCs.clear();
_shieldPercent = 100;
encounterNPCs.clear();
}
void CleanupInstance()
{
Events.Reset();
void CleanupInstance()
{
Events.Reset();
_currentRift = 0;
_shieldPercent = 100;
_shieldPercent = 100;
instance->LoadGrid(-2023.0f, 7121.0f);
if (Creature* medivh = instance->GetCreature(_medivhGUID))
{
medivh->DespawnOrUnsummon();
medivh->SetRespawnTime(3);
}
instance->LoadGrid(-2023.0f, 7121.0f);
if (Creature* medivh = instance->GetCreature(_medivhGUID))
{
medivh->DespawnOrUnsummon();
medivh->SetRespawnTime(3);
}
std::set<uint64> eCopy = encounterNPCs;
for (std::set<uint64>::const_iterator itr = eCopy.begin(); itr != eCopy.end(); ++itr)
if (Creature* creature = instance->GetCreature(*itr))
creature->DespawnOrUnsummon();
}
std::set<uint64> eCopy = encounterNPCs;
for (std::set<uint64>::const_iterator itr = eCopy.begin(); itr != eCopy.end(); ++itr)
if (Creature* creature = instance->GetCreature(*itr))
creature->DespawnOrUnsummon();
}
bool IsEncounterInProgress() const
{
@@ -74,10 +74,10 @@ public:
void OnPlayerEnter(Player* player)
{
if (instance->GetPlayersCountExceptGMs() <= 1 && GetData(TYPE_AEONUS) != DONE)
CleanupInstance();
if (instance->GetPlayersCountExceptGMs() <= 1 && GetData(TYPE_AEONUS) != DONE)
CleanupInstance();
player->SendUpdateWorldState(WORLD_STATE_BM, _currentRift > 0 ? 1 : 0);
player->SendUpdateWorldState(WORLD_STATE_BM, _currentRift > 0 ? 1 : 0);
player->SendUpdateWorldState(WORLD_STATE_BM_SHIELD, _shieldPercent);
player->SendUpdateWorldState(WORLD_STATE_BM_RIFT, _currentRift);
}
@@ -85,65 +85,65 @@ public:
void OnCreatureCreate(Creature* creature)
{
switch (creature->GetEntry())
{
case NPC_MEDIVH:
_medivhGUID = creature->GetGUID();
break;
case NPC_TIME_RIFT:
case NPC_CHRONO_LORD_DEJA:
case NPC_INFINITE_CHRONO_LORD:
case NPC_TEMPORUS:
case NPC_INFINITE_TIMEREAVER:
case NPC_AEONUS:
case NPC_RIFT_KEEPER_WARLOCK:
case NPC_RIFT_KEEPER_MAGE:
case NPC_RIFT_LORD:
case NPC_RIFT_LORD_2:
case NPC_INFINITE_ASSASIN:
case NPC_INFINITE_WHELP:
case NPC_INFINITE_CRONOMANCER:
case NPC_INFINITE_EXECUTIONER:
case NPC_INFINITE_VANQUISHER:
encounterNPCs.insert(creature->GetGUID());
break;
}
{
case NPC_MEDIVH:
_medivhGUID = creature->GetGUID();
break;
case NPC_TIME_RIFT:
case NPC_CHRONO_LORD_DEJA:
case NPC_INFINITE_CHRONO_LORD:
case NPC_TEMPORUS:
case NPC_INFINITE_TIMEREAVER:
case NPC_AEONUS:
case NPC_RIFT_KEEPER_WARLOCK:
case NPC_RIFT_KEEPER_MAGE:
case NPC_RIFT_LORD:
case NPC_RIFT_LORD_2:
case NPC_INFINITE_ASSASIN:
case NPC_INFINITE_WHELP:
case NPC_INFINITE_CRONOMANCER:
case NPC_INFINITE_EXECUTIONER:
case NPC_INFINITE_VANQUISHER:
encounterNPCs.insert(creature->GetGUID());
break;
}
}
void OnCreatureRemove(Creature* creature)
{
void OnCreatureRemove(Creature* creature)
{
switch (creature->GetEntry())
{
case NPC_TIME_RIFT:
case NPC_CHRONO_LORD_DEJA:
case NPC_INFINITE_CHRONO_LORD:
case NPC_TEMPORUS:
case NPC_INFINITE_TIMEREAVER:
case NPC_AEONUS:
case NPC_RIFT_KEEPER_WARLOCK:
case NPC_RIFT_KEEPER_MAGE:
case NPC_RIFT_LORD:
case NPC_RIFT_LORD_2:
case NPC_INFINITE_ASSASIN:
case NPC_INFINITE_WHELP:
case NPC_INFINITE_CRONOMANCER:
case NPC_INFINITE_EXECUTIONER:
case NPC_INFINITE_VANQUISHER:
encounterNPCs.erase(creature->GetGUID());
break;
}
{
case NPC_TIME_RIFT:
case NPC_CHRONO_LORD_DEJA:
case NPC_INFINITE_CHRONO_LORD:
case NPC_TEMPORUS:
case NPC_INFINITE_TIMEREAVER:
case NPC_AEONUS:
case NPC_RIFT_KEEPER_WARLOCK:
case NPC_RIFT_KEEPER_MAGE:
case NPC_RIFT_LORD:
case NPC_RIFT_LORD_2:
case NPC_INFINITE_ASSASIN:
case NPC_INFINITE_WHELP:
case NPC_INFINITE_CRONOMANCER:
case NPC_INFINITE_EXECUTIONER:
case NPC_INFINITE_VANQUISHER:
encounterNPCs.erase(creature->GetGUID());
break;
}
}
void SetData(uint32 type, uint32 data)
{
switch (type)
{
case TYPE_AEONUS:
{
encounters[type] = DONE;
SaveToDB();
case TYPE_AEONUS:
{
encounters[type] = DONE;
SaveToDB();
if (Creature* medivh = instance->GetCreature(_medivhGUID))
medivh->AI()->DoAction(ACTION_OUTRO);
if (Creature* medivh = instance->GetCreature(_medivhGUID))
medivh->AI()->DoAction(ACTION_OUTRO);
Map::PlayerList const& players = instance->GetPlayers();
if (!players.isEmpty())
@@ -155,68 +155,68 @@ public:
if (player->GetQuestStatus(QUEST_MASTER_TOUCH) == QUEST_STATUS_INCOMPLETE)
player->AreaExploredOrEventHappens(QUEST_MASTER_TOUCH);
}
break;
}
break;
}
case TYPE_CHRONO_LORD_DEJA:
case TYPE_TEMPORUS:
encounters[type] = DONE;
Events.RescheduleEvent(EVENT_NEXT_PORTAL, 60000);
Events.SetPhase(1);
SaveToDB();
break;
case DATA_RIFT_KILLED:
if (!Events.IsInPhase(1))
Events.RescheduleEvent(EVENT_NEXT_PORTAL, 4000);
break;
case DATA_MEDIVH:
DoUpdateWorldState(WORLD_STATE_BM, 1);
DoUpdateWorldState(WORLD_STATE_BM_SHIELD, _shieldPercent);
DoUpdateWorldState(WORLD_STATE_BM_RIFT, _currentRift);
Events.RescheduleEvent(EVENT_NEXT_PORTAL, 3000);
break;
case DATA_DAMAGE_SHIELD:
--_shieldPercent;
DoUpdateWorldState(WORLD_STATE_BM_SHIELD, _shieldPercent);
if (!_shieldPercent)
if (Creature* medivh = instance->GetCreature(_medivhGUID))
if (medivh->IsAlive())
{
Unit::Kill(medivh, medivh);
case TYPE_CHRONO_LORD_DEJA:
case TYPE_TEMPORUS:
encounters[type] = DONE;
Events.RescheduleEvent(EVENT_NEXT_PORTAL, 60000);
Events.SetPhase(1);
SaveToDB();
break;
case DATA_RIFT_KILLED:
if (!Events.IsInPhase(1))
Events.RescheduleEvent(EVENT_NEXT_PORTAL, 4000);
break;
case DATA_MEDIVH:
DoUpdateWorldState(WORLD_STATE_BM, 1);
DoUpdateWorldState(WORLD_STATE_BM_SHIELD, _shieldPercent);
DoUpdateWorldState(WORLD_STATE_BM_RIFT, _currentRift);
Events.RescheduleEvent(EVENT_NEXT_PORTAL, 3000);
break;
case DATA_DAMAGE_SHIELD:
--_shieldPercent;
DoUpdateWorldState(WORLD_STATE_BM_SHIELD, _shieldPercent);
if (!_shieldPercent)
if (Creature* medivh = instance->GetCreature(_medivhGUID))
if (medivh->IsAlive())
{
Unit::Kill(medivh, medivh);
// Xinef: delete all spawns
std::set<uint64> eCopy = encounterNPCs;
for (std::set<uint64>::iterator itr = eCopy.begin(); itr != eCopy.end(); ++itr)
if (Creature* creature = instance->GetCreature(*itr))
creature->DespawnOrUnsummon();
}
break;
// Xinef: delete all spawns
std::set<uint64> eCopy = encounterNPCs;
for (std::set<uint64>::iterator itr = eCopy.begin(); itr != eCopy.end(); ++itr)
if (Creature* creature = instance->GetCreature(*itr))
creature->DespawnOrUnsummon();
}
break;
}
}
uint32 GetData(uint32 type) const
{
switch (type)
{
case TYPE_CHRONO_LORD_DEJA:
case TYPE_TEMPORUS:
case TYPE_AEONUS:
return encounters[type];
case DATA_SHIELD_PERCENT:
return _shieldPercent;
case DATA_RIFT_NUMBER:
return _currentRift;
}
switch (type)
{
case TYPE_CHRONO_LORD_DEJA:
case TYPE_TEMPORUS:
case TYPE_AEONUS:
return encounters[type];
case DATA_SHIELD_PERCENT:
return _shieldPercent;
case DATA_RIFT_NUMBER:
return _currentRift;
}
return 0;
}
void SetData64(uint32 type, uint64 data)
{
if (type == DATA_SUMMONED_NPC)
encounterNPCs.insert(data);
else if (type == DATA_DELETED_NPC)
encounterNPCs.erase(data);
}
void SetData64(uint32 type, uint64 data)
{
if (type == DATA_SUMMONED_NPC)
encounterNPCs.insert(data);
else if (type == DATA_DELETED_NPC)
encounterNPCs.erase(data);
}
uint64 GetData64(uint32 data) const
{
@@ -228,46 +228,46 @@ public:
void SummonPortalKeeper()
{
Creature* rift = NULL;
for (std::set<uint64>::const_iterator itr = encounterNPCs.begin(); itr != encounterNPCs.end(); ++itr)
if (Creature* summon = instance->GetCreature(*itr))
if (summon->GetEntry() == NPC_TIME_RIFT)
{
rift = summon;
break;
}
Creature* rift = NULL;
for (std::set<uint64>::const_iterator itr = encounterNPCs.begin(); itr != encounterNPCs.end(); ++itr)
if (Creature* summon = instance->GetCreature(*itr))
if (summon->GetEntry() == NPC_TIME_RIFT)
{
rift = summon;
break;
}
if (!rift)
return;
if (!rift)
return;
int32 entry = 0;
switch (_currentRift)
{
case 6: entry = GetData(TYPE_CHRONO_LORD_DEJA) == DONE ? (instance->IsHeroic() ? NPC_INFINITE_CHRONO_LORD : -NPC_CHRONO_LORD_DEJA) : NPC_CHRONO_LORD_DEJA; break;
case 12: entry = GetData(TYPE_TEMPORUS) == DONE ? (instance->IsHeroic() ? NPC_INFINITE_TIMEREAVER : -NPC_TEMPORUS) : NPC_TEMPORUS; break;
case 18: entry = NPC_AEONUS; break;
default: entry = RAND(NPC_RIFT_KEEPER_WARLOCK, NPC_RIFT_KEEPER_MAGE, NPC_RIFT_LORD, NPC_RIFT_LORD_2); break;
}
int32 entry = 0;
switch (_currentRift)
{
case 6: entry = GetData(TYPE_CHRONO_LORD_DEJA) == DONE ? (instance->IsHeroic() ? NPC_INFINITE_CHRONO_LORD : -NPC_CHRONO_LORD_DEJA) : NPC_CHRONO_LORD_DEJA; break;
case 12: entry = GetData(TYPE_TEMPORUS) == DONE ? (instance->IsHeroic() ? NPC_INFINITE_TIMEREAVER : -NPC_TEMPORUS) : NPC_TEMPORUS; break;
case 18: entry = NPC_AEONUS; break;
default: entry = RAND(NPC_RIFT_KEEPER_WARLOCK, NPC_RIFT_KEEPER_MAGE, NPC_RIFT_LORD, NPC_RIFT_LORD_2); break;
}
Position pos;
rift->GetNearPosition(pos, 10.0f, 2*M_PI*rand_norm());
if (TempSummon* summon = instance->SummonCreature(abs(entry), pos))
{
summon->SetTempSummonType(TEMPSUMMON_CORPSE_TIMED_DESPAWN);
summon->SetTimer(3*MINUTE*IN_MILLISECONDS);
{
summon->SetTempSummonType(TEMPSUMMON_CORPSE_TIMED_DESPAWN);
summon->SetTimer(3*MINUTE*IN_MILLISECONDS);
if (entry < 0)
summon->SetLootMode(0);
if (entry < 0)
summon->SetLootMode(0);
if (summon->GetEntry() != NPC_AEONUS)
{
rift->AI()->SetGUID(summon->GetGUID());
rift->CastSpell(summon, SPELL_RIFT_CHANNEL, false);
}
else
summon->SetReactState(REACT_DEFENSIVE);
}
if (summon->GetEntry() != NPC_AEONUS)
{
rift->AI()->SetGUID(summon->GetGUID());
rift->CastSpell(summon, SPELL_RIFT_CHANNEL, false);
}
else
summon->SetReactState(REACT_DEFENSIVE);
}
}
void Update(uint32 diff)
@@ -275,59 +275,59 @@ public:
Events.Update(diff);
switch (Events.ExecuteEvent())
{
case EVENT_NEXT_PORTAL:
++_currentRift;
DoUpdateWorldState(WORLD_STATE_BM_RIFT, _currentRift);
Events.ScheduleEvent(EVENT_SUMMON_KEEPER, 6000);
Events.SetPhase(0);
case EVENT_NEXT_PORTAL:
++_currentRift;
DoUpdateWorldState(WORLD_STATE_BM_RIFT, _currentRift);
Events.ScheduleEvent(EVENT_SUMMON_KEEPER, 6000);
Events.SetPhase(0);
if (Creature* medivh = instance->GetCreature(_medivhGUID))
{
uint8 position = (_currentRift-1)%4;
instance->SummonCreature(NPC_TIME_RIFT, PortalLocation[position]);
}
break;
case EVENT_SUMMON_KEEPER:
SummonPortalKeeper();
break;
if (Creature* medivh = instance->GetCreature(_medivhGUID))
{
uint8 position = (_currentRift-1)%4;
instance->SummonCreature(NPC_TIME_RIFT, PortalLocation[position]);
}
break;
case EVENT_SUMMON_KEEPER:
SummonPortalKeeper();
break;
}
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "B M " << encounters[0] << ' ' << encounters[1] << ' ' << encounters[2];
std::ostringstream saveStream;
saveStream << "B M " << encounters[0] << ' ' << encounters[1] << ' ' << encounters[2];
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
char dataHead1, dataHead2;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'B' && dataHead2 == 'M')
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
loadStream >> encounters[i];
}
else
OUT_LOAD_INST_DATA_FAIL;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2;
if (dataHead1 == 'B' && dataHead2 == 'M')
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
loadStream >> encounters[i];
}
else
OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
}
OUT_LOAD_INST_DATA_COMPLETE;
}
protected:
EventMap Events;

View File

@@ -10,67 +10,67 @@ REWRITTEN BY XINEF
enum medivhSays
{
SAY_WEAK75 = 0,
SAY_WEAK50 = 1,
SAY_WEAK25 = 2,
SAY_ENTER = 3,
SAY_INTRO = 4,
SAY_DEATH = 5,
SAY_WIN = 6,
SAY_ORCS_ENTER = 7,
SAY_WEAK75 = 0,
SAY_WEAK50 = 1,
SAY_WEAK25 = 2,
SAY_ENTER = 3,
SAY_INTRO = 4,
SAY_DEATH = 5,
SAY_WIN = 6,
SAY_ORCS_ENTER = 7,
SAY_ORCS_ANSWER = 0
SAY_ORCS_ANSWER = 0
};
enum medivhSpells
{
SPELL_MANA_SHIELD = 31635,
SPELL_MEDIVH_CHANNEL = 31556,
SPELL_BLACK_CRYSTAL = 32563,
SPELL_PORTAL_CRYSTALS = 32564,
SPELL_BANISH_PURPLE = 32566,
SPELL_BANISH_GREEN = 32567,
SPELL_MANA_SHIELD = 31635,
SPELL_MEDIVH_CHANNEL = 31556,
SPELL_BLACK_CRYSTAL = 32563,
SPELL_PORTAL_CRYSTALS = 32564,
SPELL_BANISH_PURPLE = 32566,
SPELL_BANISH_GREEN = 32567,
SPELL_CORRUPT = 31326,
SPELL_CORRUPT_AEONUS = 37853,
SPELL_CORRUPT = 31326,
SPELL_CORRUPT_AEONUS = 37853,
};
enum medivhMisc
{
NPC_DP_EMITTER_STALKER = 18582,
NPC_DP_CRYSTAL_STALKER = 18553,
NPC_SHADOW_COUNCIL_ENFORCER = 17023,
GO_DARK_PORTAL = 185103,
NPC_DP_EMITTER_STALKER = 18582,
NPC_DP_CRYSTAL_STALKER = 18553,
NPC_SHADOW_COUNCIL_ENFORCER = 17023,
GO_DARK_PORTAL = 185103,
EVENT_CHECK_HEALTH_25 = 1,
EVENT_CHECK_HEALTH_50 = 2,
EVENT_CHECK_HEALTH_75 = 3,
EVENT_SUMMON_CRYSTAL = 4,
EVENT_SUMMON_FLYING_CRYSTAL = 5,
EVENT_CHECK_HEALTH_25 = 1,
EVENT_CHECK_HEALTH_50 = 2,
EVENT_CHECK_HEALTH_75 = 3,
EVENT_SUMMON_CRYSTAL = 4,
EVENT_SUMMON_FLYING_CRYSTAL = 5,
EVENT_OUTRO_1 = 10,
EVENT_OUTRO_2 = 11,
EVENT_OUTRO_3 = 12,
EVENT_OUTRO_4 = 13,
EVENT_OUTRO_5 = 14,
EVENT_OUTRO_6 = 15,
EVENT_OUTRO_7 = 16,
EVENT_OUTRO_8 = 17
EVENT_OUTRO_1 = 10,
EVENT_OUTRO_2 = 11,
EVENT_OUTRO_3 = 12,
EVENT_OUTRO_4 = 13,
EVENT_OUTRO_5 = 14,
EVENT_OUTRO_6 = 15,
EVENT_OUTRO_7 = 16,
EVENT_OUTRO_8 = 17
};
class NpcRunToHome : public BasicEvent
{
public:
NpcRunToHome(Creature& owner) : _owner(owner) { }
NpcRunToHome(Creature& owner) : _owner(owner) { }
bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/)
{
_owner.GetMotionMaster()->MoveTargetedHome();
return true;
}
bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/)
{
_owner.GetMotionMaster()->MoveTargetedHome();
return true;
}
private:
Creature& _owner;
Creature& _owner;
};
class npc_medivh_bm : public CreatureScript
@@ -89,184 +89,184 @@ public:
{
instance = creature->GetInstanceScript();
groundArray.clear();
airArray.clear();
groundArray.clear();
airArray.clear();
groundArray.push_back(G3D::Vector3(creature->GetPositionX() + 8.0f, creature->GetPositionY(), creature->GetPositionZ()));
airArray.push_back(G3D::Vector3(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ()));
for (uint8 i = 0; i < 10; ++i)
groundArray.push_back(G3D::Vector3(creature->GetPositionX() + 8.0f*cos(2.0f*M_PI*i/10.0f), creature->GetPositionY() + 8.0f*sin(2.0f*M_PI*i/10.0f), creature->GetPositionZ()));
groundArray.push_back(G3D::Vector3(creature->GetPositionX() + 8.0f, creature->GetPositionY(), creature->GetPositionZ()));
airArray.push_back(G3D::Vector3(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ()));
for (uint8 i = 0; i < 10; ++i)
groundArray.push_back(G3D::Vector3(creature->GetPositionX() + 8.0f*cos(2.0f*M_PI*i/10.0f), creature->GetPositionY() + 8.0f*sin(2.0f*M_PI*i/10.0f), creature->GetPositionZ()));
for (uint8 i = 0; i < 40; ++i)
airArray.push_back(G3D::Vector3(creature->GetPositionX() + i*0.25f*cos(2.0f*M_PI*i/10.0f), creature->GetPositionY() + i*0.25f*sin(2.0f*M_PI*i/10.0f), creature->GetPositionZ() + i/4.0f));
for (uint8 i = 40; i < 80; ++i)
airArray.push_back(G3D::Vector3(creature->GetPositionX() + 10.0f*cos(2.0f*M_PI*i/10.0f), creature->GetPositionY() + 10.0f*sin(2.0f*M_PI*i/10.0f), creature->GetPositionZ() + i/4.0f));
for (uint8 i = 0; i < 40; ++i)
airArray.push_back(G3D::Vector3(creature->GetPositionX() + i*0.25f*cos(2.0f*M_PI*i/10.0f), creature->GetPositionY() + i*0.25f*sin(2.0f*M_PI*i/10.0f), creature->GetPositionZ() + i/4.0f));
for (uint8 i = 40; i < 80; ++i)
airArray.push_back(G3D::Vector3(creature->GetPositionX() + 10.0f*cos(2.0f*M_PI*i/10.0f), creature->GetPositionY() + 10.0f*sin(2.0f*M_PI*i/10.0f), creature->GetPositionZ() + i/4.0f));
}
InstanceScript* instance;
EventMap events;
Movement::PointsArray groundArray;
Movement::PointsArray airArray;
EventMap events;
Movement::PointsArray groundArray;
Movement::PointsArray airArray;
void Reset()
{
events.Reset();
me->CastSpell(me, SPELL_MANA_SHIELD, true);
events.Reset();
me->CastSpell(me, SPELL_MANA_SHIELD, true);
if (instance->GetData(TYPE_AEONUS) != DONE)
me->CastSpell(me, SPELL_MEDIVH_CHANNEL, false);
if (instance->GetData(TYPE_AEONUS) != DONE)
me->CastSpell(me, SPELL_MEDIVH_CHANNEL, false);
}
void JustSummoned(Creature* summon)
{
instance->SetData64(DATA_SUMMONED_NPC, summon->GetGUID());
if (summon->GetEntry() == NPC_DP_CRYSTAL_STALKER)
{
summon->DespawnOrUnsummon(25000);
summon->CastSpell(summon, RAND(SPELL_BANISH_PURPLE, SPELL_BANISH_GREEN), true);
summon->GetMotionMaster()->MoveSplinePath(&airArray);
}
else if (summon->GetEntry() == NPC_DP_EMITTER_STALKER)
{
summon->CastSpell(summon, SPELL_BLACK_CRYSTAL, true);
Movement::MoveSplineInit init(summon);
init.MovebyPath(groundArray);
init.SetCyclic();
init.Launch();
}
}
void JustSummoned(Creature* summon)
{
instance->SetData64(DATA_SUMMONED_NPC, summon->GetGUID());
if (summon->GetEntry() == NPC_DP_CRYSTAL_STALKER)
{
summon->DespawnOrUnsummon(25000);
summon->CastSpell(summon, RAND(SPELL_BANISH_PURPLE, SPELL_BANISH_GREEN), true);
summon->GetMotionMaster()->MoveSplinePath(&airArray);
}
else if (summon->GetEntry() == NPC_DP_EMITTER_STALKER)
{
summon->CastSpell(summon, SPELL_BLACK_CRYSTAL, true);
Movement::MoveSplineInit init(summon);
init.MovebyPath(groundArray);
init.SetCyclic();
init.Launch();
}
}
void SummonedCreatureDespawn(Creature* summon)
{
instance->SetData64(DATA_DELETED_NPC, summon->GetGUID());
}
void SummonedCreatureDespawn(Creature* summon)
{
instance->SetData64(DATA_DELETED_NPC, summon->GetGUID());
}
void MoveInLineOfSight(Unit* who)
{
if (!events.Empty() || instance->GetData(TYPE_AEONUS) == DONE)
return;
if (!events.Empty() || instance->GetData(TYPE_AEONUS) == DONE)
return;
if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 20.0f))
{
Talk(SAY_ENTER);
instance->SetData(DATA_MEDIVH, 1);
me->CastSpell(me, SPELL_MEDIVH_CHANNEL, false);
instance->SetData(DATA_MEDIVH, 1);
me->CastSpell(me, SPELL_MEDIVH_CHANNEL, false);
events.ScheduleEvent(EVENT_CHECK_HEALTH_75, 500);
events.ScheduleEvent(EVENT_CHECK_HEALTH_50, 500);
events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 500);
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 2000);
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 4000);
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 6000);
events.ScheduleEvent(EVENT_SUMMON_FLYING_CRYSTAL, 8000);
events.ScheduleEvent(EVENT_CHECK_HEALTH_75, 500);
events.ScheduleEvent(EVENT_CHECK_HEALTH_50, 500);
events.ScheduleEvent(EVENT_CHECK_HEALTH_25, 500);
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 2000);
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 4000);
events.ScheduleEvent(EVENT_SUMMON_CRYSTAL, 6000);
events.ScheduleEvent(EVENT_SUMMON_FLYING_CRYSTAL, 8000);
}
}
void AttackStart(Unit* ) { }
void DoAction(int32 param)
{
if (param == ACTION_OUTRO)
{
events.Reset();
events.ScheduleEvent(EVENT_OUTRO_1, 4000);
me->InterruptNonMeleeSpells(true);
void DoAction(int32 param)
{
if (param == ACTION_OUTRO)
{
events.Reset();
events.ScheduleEvent(EVENT_OUTRO_1, 4000);
me->InterruptNonMeleeSpells(true);
me->SummonGameObject(GO_DARK_PORTAL, -2086.0f, 7125.6215f, 30.5f, 6.148f, 0.0f, 0.0f, 0.0f, 0.0f, 0);
}
}
me->SummonGameObject(GO_DARK_PORTAL, -2086.0f, 7125.6215f, 30.5f, 6.148f, 0.0f, 0.0f, 0.0f, 0.0f, 0);
}
}
void JustDied(Unit* )
{
me->SetRespawnTime(DAY);
events.Reset();
Talk(SAY_DEATH);
me->SetRespawnTime(DAY);
events.Reset();
Talk(SAY_DEATH);
}
void UpdateAI(uint32 diff)
{
events.Update(diff);
switch (uint32 eventId = events.ExecuteEvent())
{
case EVENT_CHECK_HEALTH_25:
case EVENT_CHECK_HEALTH_50:
case EVENT_CHECK_HEALTH_75:
if (instance->GetData(DATA_SHIELD_PERCENT) <= eventId*25)
{
Talk(eventId-1);
break;
}
events.ScheduleEvent(eventId, 500);
break;
case EVENT_SUMMON_CRYSTAL:
me->SummonCreature(NPC_DP_EMITTER_STALKER, me->GetPositionX() + 8.0f, me->GetPositionY(), me->GetPositionZ());
break;
case EVENT_SUMMON_FLYING_CRYSTAL:
me->CastSpell(me, SPELL_PORTAL_CRYSTALS, true);
events.ScheduleEvent(EVENT_SUMMON_FLYING_CRYSTAL, 1000);
break;
case EVENT_OUTRO_1:
me->SetFacingTo(6.21f);
Talk(SAY_WIN);
events.ScheduleEvent(EVENT_OUTRO_2, 17000);
break;
case EVENT_OUTRO_2:
me->SetFacingTo(3.07f);
events.ScheduleEvent(EVENT_OUTRO_3, 2000);
break;
case EVENT_OUTRO_3:
SummonOrcs(-2046.158f, -3.0f, 37000, 30000, true);
events.ScheduleEvent(EVENT_OUTRO_4, 2000);
break;
case EVENT_OUTRO_4:
SummonOrcs(-2055.97f, -2.0f, 33000, 28000, false);
events.ScheduleEvent(EVENT_OUTRO_5, 2000);
break;
case EVENT_OUTRO_5:
SummonOrcs(-2064.0f, -1.5f, 29000, 26000, false);
events.ScheduleEvent(EVENT_OUTRO_6, 2000);
break;
case EVENT_OUTRO_6:
SummonOrcs(-2074.35f, -0.1f, 26000, 24000, false);
events.ScheduleEvent(EVENT_OUTRO_7, 7000);
break;
case EVENT_OUTRO_7:
Talk(SAY_ORCS_ENTER);
events.ScheduleEvent(EVENT_OUTRO_8, 7000);
break;
case EVENT_OUTRO_8:
if (Creature* cr = me->FindNearestCreature(NPC_SHADOW_COUNCIL_ENFORCER, 20.0f))
{
cr->SetFacingTo(3.07f);
cr->AI()->Talk(SAY_ORCS_ANSWER);
}
break;
events.Update(diff);
switch (uint32 eventId = events.ExecuteEvent())
{
case EVENT_CHECK_HEALTH_25:
case EVENT_CHECK_HEALTH_50:
case EVENT_CHECK_HEALTH_75:
if (instance->GetData(DATA_SHIELD_PERCENT) <= eventId*25)
{
Talk(eventId-1);
break;
}
events.ScheduleEvent(eventId, 500);
break;
case EVENT_SUMMON_CRYSTAL:
me->SummonCreature(NPC_DP_EMITTER_STALKER, me->GetPositionX() + 8.0f, me->GetPositionY(), me->GetPositionZ());
break;
case EVENT_SUMMON_FLYING_CRYSTAL:
me->CastSpell(me, SPELL_PORTAL_CRYSTALS, true);
events.ScheduleEvent(EVENT_SUMMON_FLYING_CRYSTAL, 1000);
break;
case EVENT_OUTRO_1:
me->SetFacingTo(6.21f);
Talk(SAY_WIN);
events.ScheduleEvent(EVENT_OUTRO_2, 17000);
break;
case EVENT_OUTRO_2:
me->SetFacingTo(3.07f);
events.ScheduleEvent(EVENT_OUTRO_3, 2000);
break;
case EVENT_OUTRO_3:
SummonOrcs(-2046.158f, -3.0f, 37000, 30000, true);
events.ScheduleEvent(EVENT_OUTRO_4, 2000);
break;
case EVENT_OUTRO_4:
SummonOrcs(-2055.97f, -2.0f, 33000, 28000, false);
events.ScheduleEvent(EVENT_OUTRO_5, 2000);
break;
case EVENT_OUTRO_5:
SummonOrcs(-2064.0f, -1.5f, 29000, 26000, false);
events.ScheduleEvent(EVENT_OUTRO_6, 2000);
break;
case EVENT_OUTRO_6:
SummonOrcs(-2074.35f, -0.1f, 26000, 24000, false);
events.ScheduleEvent(EVENT_OUTRO_7, 7000);
break;
case EVENT_OUTRO_7:
Talk(SAY_ORCS_ENTER);
events.ScheduleEvent(EVENT_OUTRO_8, 7000);
break;
case EVENT_OUTRO_8:
if (Creature* cr = me->FindNearestCreature(NPC_SHADOW_COUNCIL_ENFORCER, 20.0f))
{
cr->SetFacingTo(3.07f);
cr->AI()->Talk(SAY_ORCS_ANSWER);
}
break;
}
}
}
void SummonOrcs(float x, float y, uint32 duration, uint32 homeTime, bool first)
{
for (uint8 i = 0; i < 6; ++i)
{
if (Creature* cr = me->SummonCreature(NPC_SHADOW_COUNCIL_ENFORCER, -2091.731f, 7133.083f - 3.0f*i, 34.589f, 0.0f))
{
cr->GetMotionMaster()->MovePoint(0, (first && i == 3) ? x+2.0f : x, cr->GetPositionY()+y, cr->GetMap()->GetHeight(x, cr->GetPositionY()+y, MAX_HEIGHT, true));
cr->m_Events.AddEvent(new NpcRunToHome(*cr), cr->m_Events.CalculateTime(homeTime+urand(0, 2000)));
cr->DespawnOrUnsummon(duration+urand(0, 2000));
}
}
}
void SummonOrcs(float x, float y, uint32 duration, uint32 homeTime, bool first)
{
for (uint8 i = 0; i < 6; ++i)
{
if (Creature* cr = me->SummonCreature(NPC_SHADOW_COUNCIL_ENFORCER, -2091.731f, 7133.083f - 3.0f*i, 34.589f, 0.0f))
{
cr->GetMotionMaster()->MovePoint(0, (first && i == 3) ? x+2.0f : x, cr->GetPositionY()+y, cr->GetMap()->GetHeight(x, cr->GetPositionY()+y, MAX_HEIGHT, true));
cr->m_Events.AddEvent(new NpcRunToHome(*cr), cr->m_Events.CalculateTime(homeTime+urand(0, 2000)));
cr->DespawnOrUnsummon(duration+urand(0, 2000));
}
}
}
};
};
enum timeRift
{
EVENT_SUMMON_AT_RIFT = 1,
EVENT_CHECK_DEATH = 2
EVENT_SUMMON_AT_RIFT = 1,
EVENT_CHECK_DEATH = 2
};
class npc_time_rift : public CreatureScript
@@ -282,45 +282,45 @@ public:
struct npc_time_riftAI : public NullCreatureAI
{
npc_time_riftAI(Creature* creature) : NullCreatureAI(creature)
{
instance = creature->GetInstanceScript();
riftKeeperGUID = 0;
}
{
instance = creature->GetInstanceScript();
riftKeeperGUID = 0;
}
EventMap events;
InstanceScript* instance;
uint64 riftKeeperGUID;
EventMap events;
InstanceScript* instance;
uint64 riftKeeperGUID;
void Reset()
{
if (instance->GetData(DATA_RIFT_NUMBER) >= 18)
{
me->DespawnOrUnsummon(30000);
return;
}
if (instance->GetData(DATA_RIFT_NUMBER) >= 18)
{
me->DespawnOrUnsummon(30000);
return;
}
events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 16000);
events.ScheduleEvent(EVENT_CHECK_DEATH, 8000);
events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 16000);
events.ScheduleEvent(EVENT_CHECK_DEATH, 8000);
}
void SetGUID(uint64 guid, int32)
{
riftKeeperGUID = guid;
}
void SetGUID(uint64 guid, int32)
{
riftKeeperGUID = guid;
}
void DoSummonAtRift(uint32 entry)
{
Position pos;
me->GetNearPosition(pos, 10.0f, 2*M_PI*rand_norm());
if (Creature* summon = me->SummonCreature(entry, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000))
if (Creature* summon = me->SummonCreature(entry, pos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 15000))
if (Unit* medivh = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_MEDIVH)))
{
float o = medivh->GetAngle(summon)+frand(-1.0f, 1.0f);
summon->SetHomePosition(medivh->GetPositionX() + 14.0f*cos(o), medivh->GetPositionY() + 14.0f*sin(o), medivh->GetPositionZ(), summon->GetAngle(medivh));
summon->GetMotionMaster()->MoveTargetedHome();
summon->SetReactState(REACT_DEFENSIVE);
}
{
float o = medivh->GetAngle(summon)+frand(-1.0f, 1.0f);
summon->SetHomePosition(medivh->GetPositionX() + 14.0f*cos(o), medivh->GetPositionY() + 14.0f*sin(o), medivh->GetPositionZ(), summon->GetAngle(medivh));
summon->GetMotionMaster()->MoveTargetedHome();
summon->SetReactState(REACT_DEFENSIVE);
}
}
void DoSelectSummon()
@@ -328,75 +328,75 @@ public:
uint32 entry = RAND(NPC_INFINITE_ASSASIN, NPC_INFINITE_WHELP, NPC_INFINITE_CRONOMANCER, NPC_INFINITE_EXECUTIONER, NPC_INFINITE_VANQUISHER);
if (entry == NPC_INFINITE_WHELP)
{
DoSummonAtRift(entry);
DoSummonAtRift(entry);
DoSummonAtRift(entry);
DoSummonAtRift(entry);
DoSummonAtRift(entry);
DoSummonAtRift(entry);
}
else
DoSummonAtRift(entry);
else
DoSummonAtRift(entry);
}
void UpdateAI(uint32 diff)
{
events.Update(diff);
switch (events.ExecuteEvent())
{
case EVENT_SUMMON_AT_RIFT:
DoSelectSummon();
events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 15000);
break;
case EVENT_CHECK_DEATH:
if (!me->HasUnitState(UNIT_STATE_CASTING))
{
Creature* riftKeeper = ObjectAccessor::GetCreature(*me, riftKeeperGUID);
if (!riftKeeper || !riftKeeper->IsAlive())
{
instance->SetData(DATA_RIFT_KILLED, 1);
me->DespawnOrUnsummon(0);
break;
}
else
me->CastSpell(riftKeeper, SPELL_RIFT_CHANNEL, false);
}
events.ScheduleEvent(EVENT_CHECK_DEATH, 500);
break;
}
events.Update(diff);
switch (events.ExecuteEvent())
{
case EVENT_SUMMON_AT_RIFT:
DoSelectSummon();
events.ScheduleEvent(EVENT_SUMMON_AT_RIFT, 15000);
break;
case EVENT_CHECK_DEATH:
if (!me->HasUnitState(UNIT_STATE_CASTING))
{
Creature* riftKeeper = ObjectAccessor::GetCreature(*me, riftKeeperGUID);
if (!riftKeeper || !riftKeeper->IsAlive())
{
instance->SetData(DATA_RIFT_KILLED, 1);
me->DespawnOrUnsummon(0);
break;
}
else
me->CastSpell(riftKeeper, SPELL_RIFT_CHANNEL, false);
}
events.ScheduleEvent(EVENT_CHECK_DEATH, 500);
break;
}
}
};
};
class spell_black_morass_corrupt_medivh : public SpellScriptLoader
{
public:
spell_black_morass_corrupt_medivh() : SpellScriptLoader("spell_black_morass_corrupt_medivh") { }
public:
spell_black_morass_corrupt_medivh() : SpellScriptLoader("spell_black_morass_corrupt_medivh") { }
class spell_black_morass_corrupt_medivh_AuraScript : public AuraScript
{
PrepareAuraScript(spell_black_morass_corrupt_medivh_AuraScript);
class spell_black_morass_corrupt_medivh_AuraScript : public AuraScript
{
PrepareAuraScript(spell_black_morass_corrupt_medivh_AuraScript);
void PeriodicTick(AuraEffect const* /*aurEff*/)
{
if (InstanceScript* instance = GetUnitOwner()->GetInstanceScript())
instance->SetData(DATA_DAMAGE_SHIELD, 1);
}
void PeriodicTick(AuraEffect const* /*aurEff*/)
{
if (InstanceScript* instance = GetUnitOwner()->GetInstanceScript())
instance->SetData(DATA_DAMAGE_SHIELD, 1);
}
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_morass_corrupt_medivh_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_morass_corrupt_medivh_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
InstanceScript* _instance;
};
InstanceScript* _instance;
};
AuraScript* GetAuraScript() const
{
return new spell_black_morass_corrupt_medivh_AuraScript();
}
AuraScript* GetAuraScript() const
{
return new spell_black_morass_corrupt_medivh_AuraScript();
}
};
void AddSC_the_black_morass()
{
new npc_medivh_bm();
new npc_time_rift();
new spell_black_morass_corrupt_medivh();
new spell_black_morass_corrupt_medivh();
}

View File

@@ -7,19 +7,19 @@ REWRITTEN BY XINEF
enum DataTypes
{
TYPE_CHRONO_LORD_DEJA = 0,
TYPE_TEMPORUS = 1,
TYPE_AEONUS = 2,
MAX_ENCOUNTER = 3,
TYPE_CHRONO_LORD_DEJA = 0,
TYPE_TEMPORUS = 1,
TYPE_AEONUS = 2,
MAX_ENCOUNTER = 3,
DATA_MEDIVH = 10,
DATA_RIFT_KILLED = 11,
DATA_DAMAGE_SHIELD = 12,
DATA_SHIELD_PERCENT = 13,
DATA_RIFT_NUMBER = 14,
DATA_MEDIVH = 10,
DATA_RIFT_KILLED = 11,
DATA_DAMAGE_SHIELD = 12,
DATA_SHIELD_PERCENT = 13,
DATA_RIFT_NUMBER = 14,
DATA_SUMMONED_NPC = 20,
DATA_DELETED_NPC = 21,
DATA_SUMMONED_NPC = 20,
DATA_DELETED_NPC = 21,
};
enum WorldStateIds
@@ -37,36 +37,36 @@ enum QuestIds
enum CreatureIds
{
NPC_MEDIVH = 15608,
NPC_TIME_RIFT = 17838,
NPC_TIME_KEEPER = 17918,
NPC_MEDIVH = 15608,
NPC_TIME_RIFT = 17838,
NPC_TIME_KEEPER = 17918,
NPC_RIFT_KEEPER_WARLOCK = 21104,
NPC_RIFT_KEEPER_MAGE = 21148,
NPC_RIFT_LORD = 17839,
NPC_RIFT_LORD_2 = 21140,
NPC_RIFT_KEEPER_WARLOCK = 21104,
NPC_RIFT_KEEPER_MAGE = 21148,
NPC_RIFT_LORD = 17839,
NPC_RIFT_LORD_2 = 21140,
NPC_CHRONO_LORD_DEJA = 17879,
NPC_INFINITE_CHRONO_LORD = 21697,
NPC_TEMPORUS = 17880,
NPC_INFINITE_TIMEREAVER = 21698,
NPC_AEONUS = 17881,
NPC_CHRONO_LORD_DEJA = 17879,
NPC_INFINITE_CHRONO_LORD = 21697,
NPC_TEMPORUS = 17880,
NPC_INFINITE_TIMEREAVER = 21698,
NPC_AEONUS = 17881,
NPC_INFINITE_ASSASIN = 17835,
NPC_INFINITE_WHELP = 21818,
NPC_INFINITE_CRONOMANCER = 17892,
NPC_INFINITE_EXECUTIONER = 18994,
NPC_INFINITE_VANQUISHER = 18995
NPC_INFINITE_ASSASIN = 17835,
NPC_INFINITE_WHELP = 21818,
NPC_INFINITE_CRONOMANCER = 17892,
NPC_INFINITE_EXECUTIONER = 18994,
NPC_INFINITE_VANQUISHER = 18995
};
enum Misc
{
SPELL_RIFT_CHANNEL = 31387,
{
SPELL_RIFT_CHANNEL = 31387,
EVENT_NEXT_PORTAL = 1,
EVENT_SUMMON_KEEPER = 2,
EVENT_NEXT_PORTAL = 1,
EVENT_SUMMON_KEEPER = 2,
ACTION_OUTRO = 1
ACTION_OUTRO = 1
};
#endif