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

@@ -9,75 +9,75 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum BjarngrimSpells
{
// DEFENSIVE STANCE
SPELL_DEFENSIVE_STANCE = 53790,
SPELL_DEFENSIVE_AURA = 41105,
SPELL_BJARNGRIM_REFLETION = 36096,
SPELL_PUMMEL = 12555,
SPELL_KNOCK_AWAY = 52029,
SPELL_IRONFORM = 52022,
// DEFENSIVE STANCE
SPELL_DEFENSIVE_STANCE = 53790,
SPELL_DEFENSIVE_AURA = 41105,
SPELL_BJARNGRIM_REFLETION = 36096,
SPELL_PUMMEL = 12555,
SPELL_KNOCK_AWAY = 52029,
SPELL_IRONFORM = 52022,
// BERSERKER STANCE
SPELL_BERSERKER_STANCE = 53791,
SPELL_BERSERKER_AURA = 41107,
SPELL_MORTAL_STRIKE = 16856,
SPELL_WHIRLWIND = 52027,
// BATTLE STANCE
SPELL_BATTLE_STANCE = 53792,
SPELL_BATTLE_AURA = 41106,
SPELL_INTERCEPT = 58769,
SPELL_CLEAVE = 15284,
SPELL_SLAM = 52026,
// BERSERKER STANCE
SPELL_BERSERKER_STANCE = 53791,
SPELL_BERSERKER_AURA = 41107,
SPELL_MORTAL_STRIKE = 16856,
SPELL_WHIRLWIND = 52027,
// BATTLE STANCE
SPELL_BATTLE_STANCE = 53792,
SPELL_BATTLE_AURA = 41106,
SPELL_INTERCEPT = 58769,
SPELL_CLEAVE = 15284,
SPELL_SLAM = 52026,
//OTHER SPELLS
SPELL_CHARGE_UP = 52098, // only used when starting walk from one platform to the other
SPELL_TEMPORARY_ELECTRICAL_CHARGE = 52092, // triggered part of above
//OTHER SPELLS
SPELL_CHARGE_UP = 52098, // only used when starting walk from one platform to the other
SPELL_TEMPORARY_ELECTRICAL_CHARGE = 52092, // triggered part of above
// STORMFORGED LIEUTENANT
SPELL_ARC_WELD = 59085,
SPELL_RENEW_STEEL_N = 52774,
SPELL_RENEW_STEEL_H = 59160,
// STORMFORGED LIEUTENANT
SPELL_ARC_WELD = 59085,
SPELL_RENEW_STEEL_N = 52774,
SPELL_RENEW_STEEL_H = 59160,
};
enum BjarngrimOther
{
// Stances
STANCE_DEFENSIVE = 1,
STANCE_BERSERKER = 2,
STANCE_BATTLE = 3,
// Stances
STANCE_DEFENSIVE = 1,
STANCE_BERSERKER = 2,
STANCE_BATTLE = 3,
// NPCs
NPC_STORMFORGED_LIEUTENANT = 29240,
// NPCs
NPC_STORMFORGED_LIEUTENANT = 29240,
// Models
EQUIP_SWORD = 37871,
EQUIP_SHIELD = 35642,
EQUIP_MACE = 43623,
// Models
EQUIP_SWORD = 37871,
EQUIP_SHIELD = 35642,
EQUIP_MACE = 43623,
};
enum BjarngrimEvents
{
EVENT_BJARNGRIM_CHANGE_STANCE = 1,
EVENT_BJARNGRIM_CHANGE_STANCE = 1,
// DEFENSIVE STANCE
EVENT_BJARNGRIM_REFLECTION = 11,
EVENT_BJARNGRIM_PUMMEL = 12,
EVENT_BJARNGRIM_KNOCK = 13,
EVENT_BJARNGRIM_IRONFORM = 14,
// DEFENSIVE STANCE
EVENT_BJARNGRIM_REFLECTION = 11,
EVENT_BJARNGRIM_PUMMEL = 12,
EVENT_BJARNGRIM_KNOCK = 13,
EVENT_BJARNGRIM_IRONFORM = 14,
// BERSERKER STANCE
EVENT_BJARNGRIM_MORTAL_STRIKE = 21,
EVENT_BJARNGRIM_WHIRLWIND = 22,
// BERSERKER STANCE
EVENT_BJARNGRIM_MORTAL_STRIKE = 21,
EVENT_BJARNGRIM_WHIRLWIND = 22,
// BATTLE STANCE
EVENT_BJARNGRIM_INTERCEPT = 31,
EVENT_BJARNGRIM_CLEAVE = 32,
EVENT_BJARNGRIM_SLAM = 33,
// BATTLE STANCE
EVENT_BJARNGRIM_INTERCEPT = 31,
EVENT_BJARNGRIM_CLEAVE = 32,
EVENT_BJARNGRIM_SLAM = 33,
// STORMFORGED LIEUTENANT
EVENT_ARC_WELD = 41,
EVENT_RENEW_STEEL = 42,
// STORMFORGED LIEUTENANT
EVENT_ARC_WELD = 41,
EVENT_RENEW_STEEL = 42,
};
enum Yells
@@ -103,258 +103,258 @@ public:
return new boss_bjarngrimAI (creature);
}
struct boss_bjarngrimAI : public npc_escortAI
{
boss_bjarngrimAI(Creature* creature) : npc_escortAI(creature), summons(creature)
{
m_pInstance = creature->GetInstanceScript();
struct boss_bjarngrimAI : public npc_escortAI
{
boss_bjarngrimAI(Creature* creature) : npc_escortAI(creature), summons(creature)
{
m_pInstance = creature->GetInstanceScript();
// Init waypoints
AddWaypoint(1, 1262.18f, 99.3f, 33.5f, 0);
AddWaypoint(2, 1281.6f, 99.5f, 33.5f, 0);
AddWaypoint(3, 1311.7f, 99.4f, 40.1f, 0);
AddWaypoint(4, 1332.5f, 99.7f, 40.18f, 0);
AddWaypoint(5, 1311.7f, 99.4f, 40.1f, 0);
AddWaypoint(6, 1281.6f, 99.5f, 33.5f, 0);
AddWaypoint(7, 1262.18f, 99.3f, 33.5f, 0);
AddWaypoint(8, 1262, -26.9f, 33.5f, 0);
AddWaypoint(9, 1281.2f, -26.8f, 33.5f, 0);
AddWaypoint(10, 1311.3f, -26.9f, 40.03f, 0);
AddWaypoint(11, 1332, -26.6f, 40.18f, 0);
AddWaypoint(12, 1311.3f, -26.9f, 40.03f, 0);
AddWaypoint(13, 1281.2f, -26.8f, 33.5f, 0);
AddWaypoint(14, 1262, -26.9f, 33.5f, 0);
Start(true, false, 0, NULL, false, true);
}
// Init waypoints
AddWaypoint(1, 1262.18f, 99.3f, 33.5f, 0);
AddWaypoint(2, 1281.6f, 99.5f, 33.5f, 0);
AddWaypoint(3, 1311.7f, 99.4f, 40.1f, 0);
AddWaypoint(4, 1332.5f, 99.7f, 40.18f, 0);
AddWaypoint(5, 1311.7f, 99.4f, 40.1f, 0);
AddWaypoint(6, 1281.6f, 99.5f, 33.5f, 0);
AddWaypoint(7, 1262.18f, 99.3f, 33.5f, 0);
AddWaypoint(8, 1262, -26.9f, 33.5f, 0);
AddWaypoint(9, 1281.2f, -26.8f, 33.5f, 0);
AddWaypoint(10, 1311.3f, -26.9f, 40.03f, 0);
AddWaypoint(11, 1332, -26.6f, 40.18f, 0);
AddWaypoint(12, 1311.3f, -26.9f, 40.03f, 0);
AddWaypoint(13, 1281.2f, -26.8f, 33.5f, 0);
AddWaypoint(14, 1262, -26.9f, 33.5f, 0);
Start(true, false, 0, NULL, false, true);
}
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
uint8 m_uiStance;
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
uint8 m_uiStance;
void Reset()
{
events.Reset();
summons.DespawnAll();
void Reset()
{
events.Reset();
summons.DespawnAll();
for (uint8 i = 0; i < 2; ++i)
if (Creature* dwarf = me->SummonCreature(NPC_STORMFORGED_LIEUTENANT, me->GetPositionX()+urand(4,12), me->GetPositionY()+urand(4,12), me->GetPositionZ()))
{
dwarf->GetMotionMaster()->MoveFollow(me, 3, rand_norm()*2*3.14f);
summons.Summon(dwarf);
}
for (uint8 i = 0; i < 2; ++i)
if (Creature* dwarf = me->SummonCreature(NPC_STORMFORGED_LIEUTENANT, me->GetPositionX()+urand(4,12), me->GetPositionY()+urand(4,12), me->GetPositionZ()))
{
dwarf->GetMotionMaster()->MoveFollow(me, 3, rand_norm()*2*3.14f);
summons.Summon(dwarf);
}
me->RemoveAllAuras();
me->CastSpell(me, SPELL_TEMPORARY_ELECTRICAL_CHARGE, true);
RollStance(0, STANCE_DEFENSIVE);
me->RemoveAllAuras();
me->CastSpell(me, SPELL_TEMPORARY_ELECTRICAL_CHARGE, true);
RollStance(0, STANCE_DEFENSIVE);
if (m_pInstance)
m_pInstance->SetData(TYPE_BJARNGRIM, NOT_STARTED);
}
if (m_pInstance)
m_pInstance->SetData(TYPE_BJARNGRIM, NOT_STARTED);
}
void EnterCombat(Unit*)
{
me->SetInCombatWithZone();
Talk(SAY_AGGRO);
void EnterCombat(Unit*)
{
me->SetInCombatWithZone();
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_BJARNGRIM_CHANGE_STANCE, 20000, 0);
events.ScheduleEvent(EVENT_BJARNGRIM_CHANGE_STANCE, 20000, 0);
// DEFENSIVE STANCE
events.ScheduleEvent(EVENT_BJARNGRIM_REFLECTION, 8000, STANCE_DEFENSIVE);
events.ScheduleEvent(EVENT_BJARNGRIM_PUMMEL, 5000, STANCE_DEFENSIVE);
events.ScheduleEvent(EVENT_BJARNGRIM_KNOCK, 16000, STANCE_DEFENSIVE);
events.ScheduleEvent(EVENT_BJARNGRIM_IRONFORM, 12000, STANCE_DEFENSIVE);
// DEFENSIVE STANCE
events.ScheduleEvent(EVENT_BJARNGRIM_REFLECTION, 8000, STANCE_DEFENSIVE);
events.ScheduleEvent(EVENT_BJARNGRIM_PUMMEL, 5000, STANCE_DEFENSIVE);
events.ScheduleEvent(EVENT_BJARNGRIM_KNOCK, 16000, STANCE_DEFENSIVE);
events.ScheduleEvent(EVENT_BJARNGRIM_IRONFORM, 12000, STANCE_DEFENSIVE);
// BERSERKER STANCE
events.ScheduleEvent(EVENT_BJARNGRIM_MORTAL_STRIKE, 20000+4000, STANCE_BERSERKER);
events.ScheduleEvent(EVENT_BJARNGRIM_WHIRLWIND, 20000+6000, STANCE_BERSERKER);
// BERSERKER STANCE
events.ScheduleEvent(EVENT_BJARNGRIM_MORTAL_STRIKE, 20000+4000, STANCE_BERSERKER);
events.ScheduleEvent(EVENT_BJARNGRIM_WHIRLWIND, 20000+6000, STANCE_BERSERKER);
// BATTLE STANCE
events.ScheduleEvent(EVENT_BJARNGRIM_INTERCEPT, 20000+3000, STANCE_BATTLE);
events.ScheduleEvent(EVENT_BJARNGRIM_CLEAVE, 20000+5000, STANCE_BATTLE);
events.ScheduleEvent(EVENT_BJARNGRIM_SLAM, 20000+10000, STANCE_BATTLE);
// BATTLE STANCE
events.ScheduleEvent(EVENT_BJARNGRIM_INTERCEPT, 20000+3000, STANCE_BATTLE);
events.ScheduleEvent(EVENT_BJARNGRIM_CLEAVE, 20000+5000, STANCE_BATTLE);
events.ScheduleEvent(EVENT_BJARNGRIM_SLAM, 20000+10000, STANCE_BATTLE);
if (m_pInstance)
{
m_pInstance->SetData(TYPE_BJARNGRIM, IN_PROGRESS);
m_pInstance->SetData(DATA_BJARNGRIM_ACHIEVEMENT, me->HasAura(SPELL_TEMPORARY_ELECTRICAL_CHARGE));
}
}
if (m_pInstance)
{
m_pInstance->SetData(TYPE_BJARNGRIM, IN_PROGRESS);
m_pInstance->SetData(DATA_BJARNGRIM_ACHIEVEMENT, me->HasAura(SPELL_TEMPORARY_ELECTRICAL_CHARGE));
}
}
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() != TYPEID_PLAYER)
return;
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() != TYPEID_PLAYER)
return;
Talk(SAY_SLAY);
}
Talk(SAY_SLAY);
}
void JustDied(Unit*)
{
Talk(SAY_DEATH);
void JustDied(Unit*)
{
Talk(SAY_DEATH);
if (m_pInstance)
m_pInstance->SetData(TYPE_BJARNGRIM, DONE);
}
if (m_pInstance)
m_pInstance->SetData(TYPE_BJARNGRIM, DONE);
}
void RemoveStanceAura(uint8 stance)
{
switch (stance)
{
case STANCE_DEFENSIVE:
me->RemoveAura(SPELL_DEFENSIVE_STANCE);
me->RemoveAura(SPELL_DEFENSIVE_AURA);
break;
case STANCE_BERSERKER:
me->RemoveAura(SPELL_BERSERKER_STANCE);
me->RemoveAura(SPELL_BERSERKER_AURA);
break;
case STANCE_BATTLE:
me->RemoveAura(SPELL_BATTLE_STANCE);
me->RemoveAura(SPELL_BATTLE_AURA);
break;
}
}
void RemoveStanceAura(uint8 stance)
{
switch (stance)
{
case STANCE_DEFENSIVE:
me->RemoveAura(SPELL_DEFENSIVE_STANCE);
me->RemoveAura(SPELL_DEFENSIVE_AURA);
break;
case STANCE_BERSERKER:
me->RemoveAura(SPELL_BERSERKER_STANCE);
me->RemoveAura(SPELL_BERSERKER_AURA);
break;
case STANCE_BATTLE:
me->RemoveAura(SPELL_BATTLE_STANCE);
me->RemoveAura(SPELL_BATTLE_AURA);
break;
}
}
void RollStance(uint8 stance, uint8 force = 0)
{
if (urand(0,1))
stance = (++stance == 4 ? 1 : stance);
else
stance = (--stance == 0 ? 3 : stance);
void RollStance(uint8 stance, uint8 force = 0)
{
if (urand(0,1))
stance = (++stance == 4 ? 1 : stance);
else
stance = (--stance == 0 ? 3 : stance);
if (force)
stance = force;
switch (stance)
{
case STANCE_DEFENSIVE:
Talk(SAY_DEFENSIVE_STANCE);
if (force)
stance = force;
switch (stance)
{
case STANCE_DEFENSIVE:
Talk(SAY_DEFENSIVE_STANCE);
me->CastSpell(me, SPELL_DEFENSIVE_STANCE, true);
me->CastSpell(me, SPELL_DEFENSIVE_AURA, true);
me->CastSpell(me, SPELL_DEFENSIVE_STANCE, true);
me->CastSpell(me, SPELL_DEFENSIVE_AURA, true);
events.DelayEvents(20000, STANCE_BERSERKER);
events.DelayEvents(20000, STANCE_BATTLE);
events.DelayEvents(20000, STANCE_BERSERKER);
events.DelayEvents(20000, STANCE_BATTLE);
SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SHIELD, EQUIP_NO_CHANGE);
break;
case STANCE_BERSERKER:
Talk(SAY_BERSERKER_STANCE);
SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SHIELD, EQUIP_NO_CHANGE);
break;
case STANCE_BERSERKER:
Talk(SAY_BERSERKER_STANCE);
me->CastSpell(me, SPELL_BERSERKER_STANCE, true);
me->CastSpell(me, SPELL_BERSERKER_AURA, true);
me->CastSpell(me, SPELL_BERSERKER_STANCE, true);
me->CastSpell(me, SPELL_BERSERKER_AURA, true);
events.DelayEvents(20000, STANCE_DEFENSIVE);
events.DelayEvents(20000, STANCE_BATTLE);
events.DelayEvents(20000, STANCE_DEFENSIVE);
events.DelayEvents(20000, STANCE_BATTLE);
SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SWORD, EQUIP_NO_CHANGE);
break;
case STANCE_BATTLE:
Talk(SAY_BATTLE_STANCE);
SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SWORD, EQUIP_NO_CHANGE);
break;
case STANCE_BATTLE:
Talk(SAY_BATTLE_STANCE);
me->CastSpell(me, SPELL_BATTLE_STANCE, true);
me->CastSpell(me, SPELL_BATTLE_AURA, true);
me->CastSpell(me, SPELL_BATTLE_STANCE, true);
me->CastSpell(me, SPELL_BATTLE_AURA, true);
events.DelayEvents(20000, STANCE_BERSERKER);
events.DelayEvents(20000, STANCE_DEFENSIVE);
events.DelayEvents(20000, STANCE_BERSERKER);
events.DelayEvents(20000, STANCE_DEFENSIVE);
SetEquipmentSlots(false, EQUIP_MACE, EQUIP_UNEQUIP, EQUIP_NO_CHANGE);
break;
}
SetEquipmentSlots(false, EQUIP_MACE, EQUIP_UNEQUIP, EQUIP_NO_CHANGE);
break;
}
m_uiStance = stance;
}
m_uiStance = stance;
}
void WaypointReached(uint32 Point)
{
if (Point == 1 || Point == 8)
me->CastSpell(me, SPELL_TEMPORARY_ELECTRICAL_CHARGE, true);
else if (Point == 7 || Point == 14)
me->RemoveAura(SPELL_TEMPORARY_ELECTRICAL_CHARGE);
}
void WaypointReached(uint32 Point)
{
if (Point == 1 || Point == 8)
me->CastSpell(me, SPELL_TEMPORARY_ELECTRICAL_CHARGE, true);
else if (Point == 7 || Point == 14)
me->RemoveAura(SPELL_TEMPORARY_ELECTRICAL_CHARGE);
}
void UpdateEscortAI(uint32 diff)
{
if (!me->IsInCombat())
return;
void UpdateEscortAI(uint32 diff)
{
if (!me->IsInCombat())
return;
// Return since we have no target
if (!UpdateVictim())
{
Reset();
return;
}
// Return since we have no target
if (!UpdateVictim())
{
Reset();
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_BJARNGRIM_CHANGE_STANCE:
// roll new stance
RemoveStanceAura(m_uiStance);
RollStance(m_uiStance);
events.RepeatEvent(20000);
break;
switch (events.GetEvent())
{
case EVENT_BJARNGRIM_CHANGE_STANCE:
// roll new stance
RemoveStanceAura(m_uiStance);
RollStance(m_uiStance);
events.RepeatEvent(20000);
break;
///////////////////////////////////////////////////////
///// DEFENSIVE STANCE
///////////////////////////////////////////////////////
case EVENT_BJARNGRIM_REFLECTION:
me->CastSpell(me, SPELL_BJARNGRIM_REFLETION, true);
events.RepeatEvent(8000 + rand()%1000);
break;
case EVENT_BJARNGRIM_PUMMEL:
me->CastSpell(me->GetVictim(), SPELL_PUMMEL, false);
events.RepeatEvent(10000 + rand()%1000);
break;
case EVENT_BJARNGRIM_KNOCK:
me->CastSpell(me, SPELL_KNOCK_AWAY, false);
events.RepeatEvent(20000 + rand()%1000);
break;
case EVENT_BJARNGRIM_IRONFORM:
me->CastSpell(me, SPELL_IRONFORM, true);
events.RepeatEvent(18000 + rand()%5000);
break;
///////////////////////////////////////////////////////
///// DEFENSIVE STANCE
///////////////////////////////////////////////////////
case EVENT_BJARNGRIM_REFLECTION:
me->CastSpell(me, SPELL_BJARNGRIM_REFLETION, true);
events.RepeatEvent(8000 + rand()%1000);
break;
case EVENT_BJARNGRIM_PUMMEL:
me->CastSpell(me->GetVictim(), SPELL_PUMMEL, false);
events.RepeatEvent(10000 + rand()%1000);
break;
case EVENT_BJARNGRIM_KNOCK:
me->CastSpell(me, SPELL_KNOCK_AWAY, false);
events.RepeatEvent(20000 + rand()%1000);
break;
case EVENT_BJARNGRIM_IRONFORM:
me->CastSpell(me, SPELL_IRONFORM, true);
events.RepeatEvent(18000 + rand()%5000);
break;
///////////////////////////////////////////////////////
///// BERSERKER STANCE
///////////////////////////////////////////////////////
case EVENT_BJARNGRIM_MORTAL_STRIKE:
me->CastSpell(me->GetVictim(), SPELL_MORTAL_STRIKE, false);
events.RepeatEvent(10000);
break;
case EVENT_BJARNGRIM_WHIRLWIND:
me->CastSpell(me, SPELL_WHIRLWIND, true);
events.RepeatEvent(25000);
break;
///////////////////////////////////////////////////////
///// BATTLE STANCE
///////////////////////////////////////////////////////
case EVENT_BJARNGRIM_INTERCEPT:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
me->CastSpell(target, SPELL_INTERCEPT, true);
///////////////////////////////////////////////////////
///// BERSERKER STANCE
///////////////////////////////////////////////////////
case EVENT_BJARNGRIM_MORTAL_STRIKE:
me->CastSpell(me->GetVictim(), SPELL_MORTAL_STRIKE, false);
events.RepeatEvent(10000);
break;
case EVENT_BJARNGRIM_WHIRLWIND:
me->CastSpell(me, SPELL_WHIRLWIND, true);
events.RepeatEvent(25000);
break;
///////////////////////////////////////////////////////
///// BATTLE STANCE
///////////////////////////////////////////////////////
case EVENT_BJARNGRIM_INTERCEPT:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
me->CastSpell(target, SPELL_INTERCEPT, true);
events.RepeatEvent(30000);
break;
case EVENT_BJARNGRIM_CLEAVE:
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
events.RepeatEvent(25000);
break;
case EVENT_BJARNGRIM_SLAM:
me->CastSpell(me->GetVictim(), SPELL_SLAM, false);
events.RepeatEvent(10000 + rand()%2000);
break;
}
events.RepeatEvent(30000);
break;
case EVENT_BJARNGRIM_CLEAVE:
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
events.RepeatEvent(25000);
break;
case EVENT_BJARNGRIM_SLAM:
me->CastSpell(me->GetVictim(), SPELL_SLAM, false);
events.RepeatEvent(10000 + rand()%2000);
break;
}
DoMeleeAttackIfReady();
}
};
DoMeleeAttackIfReady();
}
};
};
class npc_stormforged_lieutenant : public CreatureScript
@@ -367,61 +367,61 @@ public:
return new npc_stormforged_lieutenantAI (creature);
}
struct npc_stormforged_lieutenantAI : public ScriptedAI
{
npc_stormforged_lieutenantAI(Creature* creature) : ScriptedAI(creature) { }
struct npc_stormforged_lieutenantAI : public ScriptedAI
{
npc_stormforged_lieutenantAI(Creature* creature) : ScriptedAI(creature) { }
EventMap events;
uint64 BjarngrimGUID;
EventMap events;
uint64 BjarngrimGUID;
void Reset()
{
if (me->IsSummon())
BjarngrimGUID = me->ToTempSummon()->GetSummonerGUID();
else
BjarngrimGUID = 0;
}
void Reset()
{
if (me->IsSummon())
BjarngrimGUID = me->ToTempSummon()->GetSummonerGUID();
else
BjarngrimGUID = 0;
}
void EnterCombat(Unit*)
{
events.ScheduleEvent(EVENT_ARC_WELD, 2000);
events.ScheduleEvent(EVENT_RENEW_STEEL, 10000 + rand()%1000);
}
void EnterCombat(Unit*)
{
events.ScheduleEvent(EVENT_ARC_WELD, 2000);
events.ScheduleEvent(EVENT_RENEW_STEEL, 10000 + rand()%1000);
}
void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
//Return since we have no target
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_ARC_WELD:
me->CastSpell(me->GetVictim(), SPELL_ARC_WELD, true);
events.RepeatEvent(20000);
break;
case EVENT_RENEW_STEEL:
if (Creature* bjarngrim = ObjectAccessor::GetCreature(*me, BjarngrimGUID))
if (bjarngrim->IsAlive())
me->CastSpell(bjarngrim, me->GetMap()->IsHeroic() ? SPELL_RENEW_STEEL_H : SPELL_RENEW_STEEL_N, true);
switch (events.GetEvent())
{
case EVENT_ARC_WELD:
me->CastSpell(me->GetVictim(), SPELL_ARC_WELD, true);
events.RepeatEvent(20000);
break;
case EVENT_RENEW_STEEL:
if (Creature* bjarngrim = ObjectAccessor::GetCreature(*me, BjarngrimGUID))
if (bjarngrim->IsAlive())
me->CastSpell(bjarngrim, me->GetMap()->IsHeroic() ? SPELL_RENEW_STEEL_H : SPELL_RENEW_STEEL_N, true);
events.RepeatEvent(10000 + rand()%4000);
break;
}
events.RepeatEvent(10000 + rand()%4000);
break;
}
DoMeleeAttackIfReady();
}
};
DoMeleeAttackIfReady();
}
};
};
void AddSC_boss_bjarngrim()
{
new boss_bjarngrim();
new npc_stormforged_lieutenant();
new boss_bjarngrim();
new npc_stormforged_lieutenant();
}

View File

@@ -10,29 +10,29 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum IonarSpells
{
SPELL_BALL_LIGHTNING_N = 52780,
SPELL_BALL_LIGHTNING_H = 59800,
SPELL_STATIC_OVERLOAD_N = 52658,
SPELL_STATIC_OVERLOAD_H = 59795,
SPELL_BALL_LIGHTNING_N = 52780,
SPELL_BALL_LIGHTNING_H = 59800,
SPELL_STATIC_OVERLOAD_N = 52658,
SPELL_STATIC_OVERLOAD_H = 59795,
SPELL_DISPERSE = 52770,
SPELL_SUMMON_SPARK = 52746,
SPELL_SPARK_DESPAWN = 52776,
SPELL_DISPERSE = 52770,
SPELL_SUMMON_SPARK = 52746,
SPELL_SPARK_DESPAWN = 52776,
//Spark of Ionar
SPELL_SPARK_VISUAL_TRIGGER_N = 52667,
SPELL_SPARK_VISUAL_TRIGGER_H = 59833,
SPELL_RANDOM_LIGHTNING = 52663,
//Spark of Ionar
SPELL_SPARK_VISUAL_TRIGGER_N = 52667,
SPELL_SPARK_VISUAL_TRIGGER_H = 59833,
SPELL_RANDOM_LIGHTNING = 52663,
};
enum IonarOther
{
// NPCs
NPC_SPARK_OF_IONAR = 28926,
// NPCs
NPC_SPARK_OF_IONAR = 28926,
// Actions
ACTION_CALLBACK = 1,
ACTION_SPARK_DESPAWN = 2,
// Actions
ACTION_CALLBACK = 1,
ACTION_SPARK_DESPAWN = 2,
};
enum Yells
@@ -45,11 +45,11 @@ enum Yells
enum IonarEvents
{
EVENT_BALL_LIGHTNING = 1,
EVENT_STATIC_OVERLOAD = 2,
EVENT_CHECK_HEALTH = 3,
EVENT_CALL_SPARKS = 4,
EVENT_RESTORE = 5,
EVENT_BALL_LIGHTNING = 1,
EVENT_STATIC_OVERLOAD = 2,
EVENT_CHECK_HEALTH = 3,
EVENT_CALL_SPARKS = 4,
EVENT_RESTORE = 5,
};
class boss_ionar : public CreatureScript
@@ -62,157 +62,157 @@ public:
return new boss_ionarAI (creature);
}
struct boss_ionarAI : public ScriptedAI
{
boss_ionarAI(Creature* creature) : ScriptedAI(creature), summons(creature)
{
m_pInstance = creature->GetInstanceScript();
}
struct boss_ionarAI : public ScriptedAI
{
boss_ionarAI(Creature* creature) : ScriptedAI(creature), summons(creature)
{
m_pInstance = creature->GetInstanceScript();
}
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
uint8 HealthCheck;
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
uint8 HealthCheck;
void Reset()
{
HealthCheck = 50;
events.Reset();
summons.DespawnAll();
void Reset()
{
HealthCheck = 50;
events.Reset();
summons.DespawnAll();
me->SetVisible(true);
me->SetVisible(true);
if (m_pInstance)
m_pInstance->SetData(TYPE_IONAR, NOT_STARTED);
if (m_pInstance)
m_pInstance->SetData(TYPE_IONAR, NOT_STARTED);
// Ionar is immune to nature damage
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NATURE, true);
}
// Ionar is immune to nature damage
me->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NATURE, true);
}
void ScheduleEvents(bool spark)
{
events.SetPhase(1);
if (!spark)
events.RescheduleEvent(EVENT_CHECK_HEALTH, 1000, 0, 1);
void ScheduleEvents(bool spark)
{
events.SetPhase(1);
if (!spark)
events.RescheduleEvent(EVENT_CHECK_HEALTH, 1000, 0, 1);
events.RescheduleEvent(EVENT_BALL_LIGHTNING, 10000, 0, 1);
events.RescheduleEvent(EVENT_STATIC_OVERLOAD, 5000, 0, 1);
}
events.RescheduleEvent(EVENT_BALL_LIGHTNING, 10000, 0, 1);
events.RescheduleEvent(EVENT_STATIC_OVERLOAD, 5000, 0, 1);
}
void EnterCombat(Unit*)
{
me->SetInCombatWithZone();
Talk(SAY_AGGRO);
void EnterCombat(Unit*)
{
me->SetInCombatWithZone();
Talk(SAY_AGGRO);
if (m_pInstance)
m_pInstance->SetData(TYPE_IONAR, IN_PROGRESS);
if (m_pInstance)
m_pInstance->SetData(TYPE_IONAR, IN_PROGRESS);
ScheduleEvents(false);
}
ScheduleEvents(false);
}
void JustDied(Unit*)
{
Talk(SAY_DEATH);
void JustDied(Unit*)
{
Talk(SAY_DEATH);
summons.DespawnAll();
summons.DespawnAll();
if (m_pInstance)
m_pInstance->SetData(TYPE_IONAR, DONE);
}
if (m_pInstance)
m_pInstance->SetData(TYPE_IONAR, DONE);
}
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() != TYPEID_PLAYER)
return;
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() != TYPEID_PLAYER)
return;
Talk(SAY_SLAY);
}
Talk(SAY_SLAY);
}
void SpellHit(Unit* /*caster*/, const SpellInfo* spell)
{
if (spell->Id == SPELL_DISPERSE)
Split();
}
void SpellHit(Unit* /*caster*/, const SpellInfo* spell)
{
if (spell->Id == SPELL_DISPERSE)
Split();
}
void Split()
{
Talk(SAY_SPLIT);
void Split()
{
Talk(SAY_SPLIT);
Creature* spark;
for (uint8 i = 0; i < 5; ++i)
{
if (spark = me->SummonCreature(NPC_SPARK_OF_IONAR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 20000))
{
summons.Summon(spark);
spark->CastSpell(spark, me->GetMap()->IsHeroic() ? SPELL_SPARK_VISUAL_TRIGGER_H : SPELL_SPARK_VISUAL_TRIGGER_N, true);
spark->CastSpell(spark, SPELL_RANDOM_LIGHTNING, true);
spark->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED|UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_NON_ATTACKABLE);
spark->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0);
Creature* spark;
for (uint8 i = 0; i < 5; ++i)
{
if (spark = me->SummonCreature(NPC_SPARK_OF_IONAR, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 20000))
{
summons.Summon(spark);
spark->CastSpell(spark, me->GetMap()->IsHeroic() ? SPELL_SPARK_VISUAL_TRIGGER_H : SPELL_SPARK_VISUAL_TRIGGER_N, true);
spark->CastSpell(spark, SPELL_RANDOM_LIGHTNING, true);
spark->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED|UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_NON_ATTACKABLE);
spark->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0);
if (Player* tgt = SelectTargetFromPlayerList(100))
spark->GetMotionMaster()->MoveFollow(tgt, 0.0f, 0.0f, MOTION_SLOT_CONTROLLED);
}
}
me->SetVisible(false);
me->SetControlled(true, UNIT_STATE_STUNNED);
if (Player* tgt = SelectTargetFromPlayerList(100))
spark->GetMotionMaster()->MoveFollow(tgt, 0.0f, 0.0f, MOTION_SLOT_CONTROLLED);
}
}
me->SetVisible(false);
me->SetControlled(true, UNIT_STATE_STUNNED);
events.SetPhase(2);
events.ScheduleEvent(EVENT_CALL_SPARKS, 15000, 0, 2);
}
events.SetPhase(2);
events.ScheduleEvent(EVENT_CALL_SPARKS, 15000, 0, 2);
}
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_BALL_LIGHTNING:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
me->CastSpell(target, me->GetMap()->IsHeroic() ? SPELL_BALL_LIGHTNING_H : SPELL_BALL_LIGHTNING_N, false);
events.RepeatEvent(10000 + rand()%1000);
break;
case EVENT_STATIC_OVERLOAD:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
me->CastSpell(target, me->GetMap()->IsHeroic() ? SPELL_STATIC_OVERLOAD_H : SPELL_STATIC_OVERLOAD_N, false);
switch (events.GetEvent())
{
case EVENT_BALL_LIGHTNING:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
me->CastSpell(target, me->GetMap()->IsHeroic() ? SPELL_BALL_LIGHTNING_H : SPELL_BALL_LIGHTNING_N, false);
events.RepeatEvent(10000 + rand()%1000);
break;
case EVENT_STATIC_OVERLOAD:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
me->CastSpell(target, me->GetMap()->IsHeroic() ? SPELL_STATIC_OVERLOAD_H : SPELL_STATIC_OVERLOAD_N, false);
events.RepeatEvent(5000 + rand()%1000);
break;
case EVENT_CHECK_HEALTH:
if (HealthBelowPct(HealthCheck))
me->CastSpell(me, SPELL_DISPERSE, false);
events.RepeatEvent(5000 + rand()%1000);
break;
case EVENT_CHECK_HEALTH:
if (HealthBelowPct(HealthCheck))
me->CastSpell(me, SPELL_DISPERSE, false);
events.RepeatEvent(1000);
return;
case EVENT_CALL_SPARKS:
{
EntryCheckPredicate pred(NPC_SPARK_OF_IONAR);
summons.DoAction(ACTION_CALLBACK, pred);
events.PopEvent();
events.ScheduleEvent(EVENT_RESTORE, 2000, 0, 2);
return;
}
case EVENT_RESTORE:
EntryCheckPredicate pred(NPC_SPARK_OF_IONAR);
summons.DoAction(ACTION_SPARK_DESPAWN, pred);
events.PopEvent();
events.RepeatEvent(1000);
return;
case EVENT_CALL_SPARKS:
{
EntryCheckPredicate pred(NPC_SPARK_OF_IONAR);
summons.DoAction(ACTION_CALLBACK, pred);
events.PopEvent();
events.ScheduleEvent(EVENT_RESTORE, 2000, 0, 2);
return;
}
case EVENT_RESTORE:
EntryCheckPredicate pred(NPC_SPARK_OF_IONAR);
summons.DoAction(ACTION_SPARK_DESPAWN, pred);
events.PopEvent();
me->SetVisible(true);
me->SetControlled(false, UNIT_STATE_STUNNED);
ScheduleEvents(true);
return;
}
me->SetVisible(true);
me->SetControlled(false, UNIT_STATE_STUNNED);
ScheduleEvents(true);
return;
}
DoMeleeAttackIfReady();
}
};
DoMeleeAttackIfReady();
}
};
};
class npc_spark_of_ionar : public CreatureScript
@@ -225,47 +225,47 @@ public:
return new npc_spark_of_ionarAI (creature);
}
struct npc_spark_of_ionarAI : public ScriptedAI
{
npc_spark_of_ionarAI(Creature* creature) : ScriptedAI(creature) { }
struct npc_spark_of_ionarAI : public ScriptedAI
{
npc_spark_of_ionarAI(Creature* creature) : ScriptedAI(creature) { }
bool returning;
bool returning;
void MoveInLineOfSight(Unit*) { }
void UpdateAI(uint32) { }
void AttackStart(Unit* who) { }
void MoveInLineOfSight(Unit*) { }
void UpdateAI(uint32) { }
void AttackStart(Unit* who) { }
void Reset() { returning = false; }
void Reset() { returning = false; }
void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask)
{
damage = 0;
}
void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask)
{
damage = 0;
}
void DoAction(int32 param)
{
if (param == ACTION_CALLBACK)
{
me->SetSpeed(MOVE_RUN, 2.5f);
me->DeleteThreatList();
me->CombatStop(true);
me->GetMotionMaster()->MoveTargetedHome();
returning = true;
}
else if (param == ACTION_SPARK_DESPAWN)
{
me->GetMotionMaster()->MoveIdle();
void DoAction(int32 param)
{
if (param == ACTION_CALLBACK)
{
me->SetSpeed(MOVE_RUN, 2.5f);
me->DeleteThreatList();
me->CombatStop(true);
me->GetMotionMaster()->MoveTargetedHome();
returning = true;
}
else if (param == ACTION_SPARK_DESPAWN)
{
me->GetMotionMaster()->MoveIdle();
me->RemoveAllAuras();
me->CastSpell(me, SPELL_SPARK_DESPAWN, true);
me->DespawnOrUnsummon(1000);
}
}
};
me->RemoveAllAuras();
me->CastSpell(me, SPELL_SPARK_DESPAWN, true);
me->DespawnOrUnsummon(1000);
}
}
};
};
void AddSC_boss_ionar()
{
new boss_ionar();
new npc_spark_of_ionar();
new boss_ionar();
new npc_spark_of_ionar();
}

View File

@@ -10,17 +10,17 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum LokenSpells
{
SPELL_ARC_LIGHTNING = 52921,
SPELL_LIGHTNING_NOVA_N = 52960,
SPELL_LIGHTNING_NOVA_H = 59835,
SPELL_LIGHTNING_NOVA_VISUAL = 56502,
SPELL_LIGHTNING_NOVA_THUNDERS = 52663,
SPELL_ARC_LIGHTNING = 52921,
SPELL_LIGHTNING_NOVA_N = 52960,
SPELL_LIGHTNING_NOVA_H = 59835,
SPELL_LIGHTNING_NOVA_VISUAL = 56502,
SPELL_LIGHTNING_NOVA_THUNDERS = 52663,
SPELL_PULSING_SHOCKWAVE_N = 52961,
SPELL_PULSING_SHOCKWAVE_H = 59836,
SPELL_PULSING_SHOCKWAVE_N = 52961,
SPELL_PULSING_SHOCKWAVE_H = 59836,
// Achievement
ACHIEVEMENT_TIMELY_DEATH = 20384
// Achievement
ACHIEVEMENT_TIMELY_DEATH = 20384
};
enum Yells
@@ -39,11 +39,11 @@ enum Yells
enum LokenEvents
{
EVENT_LIGHTNING_NOVA = 1,
EVENT_SHOCKWAVE = 2,
EVENT_ARC_LIGHTNING = 3,
EVENT_CHECK_HEALTH = 4,
EVENT_AURA_REMOVE = 5
EVENT_LIGHTNING_NOVA = 1,
EVENT_SHOCKWAVE = 2,
EVENT_ARC_LIGHTNING = 3,
EVENT_CHECK_HEALTH = 4,
EVENT_AURA_REMOVE = 5
};
class boss_loken : public CreatureScript
@@ -56,184 +56,184 @@ public:
return new boss_lokenAI (creature);
}
struct boss_lokenAI : public ScriptedAI
{
boss_lokenAI(Creature* creature) : ScriptedAI(creature)
{
m_pInstance = creature->GetInstanceScript();
if (m_pInstance)
isActive = m_pInstance->GetData(TYPE_LOKEN_INTRO);
}
struct boss_lokenAI : public ScriptedAI
{
boss_lokenAI(Creature* creature) : ScriptedAI(creature)
{
m_pInstance = creature->GetInstanceScript();
if (m_pInstance)
isActive = m_pInstance->GetData(TYPE_LOKEN_INTRO);
}
InstanceScript* m_pInstance;
EventMap events;
InstanceScript* m_pInstance;
EventMap events;
bool isActive;
uint32 IntroTimer;
uint8 HealthCheck;
bool isActive;
uint32 IntroTimer;
uint8 HealthCheck;
void MoveInLineOfSight(Unit*) { }
void MoveInLineOfSight(Unit*) { }
void Reset()
{
events.Reset();
if (m_pInstance)
{
m_pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_TIMELY_DEATH);
m_pInstance->SetData(TYPE_LOKEN, NOT_STARTED);
}
void Reset()
{
events.Reset();
if (m_pInstance)
{
m_pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_TIMELY_DEATH);
m_pInstance->SetData(TYPE_LOKEN, NOT_STARTED);
}
HealthCheck = 75;
IntroTimer = 0;
me->RemoveAllAuras();
HealthCheck = 75;
IntroTimer = 0;
me->RemoveAllAuras();
if (!isActive)
{
me->SetControlled(true, UNIT_STATE_STUNNED);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
else
{
me->SetControlled(false, UNIT_STATE_STUNNED);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
}
if (!isActive)
{
me->SetControlled(true, UNIT_STATE_STUNNED);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
else
{
me->SetControlled(false, UNIT_STATE_STUNNED);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
}
void EnterCombat(Unit*)
{
me->SetInCombatWithZone();
Talk(SAY_AGGRO);
void EnterCombat(Unit*)
{
me->SetInCombatWithZone();
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_ARC_LIGHTNING, 10000);
events.ScheduleEvent(EVENT_SHOCKWAVE, 3000);
events.ScheduleEvent(EVENT_LIGHTNING_NOVA, 15000);
events.ScheduleEvent(EVENT_ARC_LIGHTNING, 10000);
events.ScheduleEvent(EVENT_SHOCKWAVE, 3000);
events.ScheduleEvent(EVENT_LIGHTNING_NOVA, 15000);
if (m_pInstance)
{
m_pInstance->SetData(TYPE_LOKEN, IN_PROGRESS);
if (m_pInstance)
{
m_pInstance->SetData(TYPE_LOKEN, IN_PROGRESS);
if (me->GetMap()->IsHeroic())
m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_TIMELY_DEATH);
}
}
if (me->GetMap()->IsHeroic())
m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_TIMELY_DEATH);
}
}
void JustDied(Unit*)
{
Talk(SAY_DEATH);
void JustDied(Unit*)
{
Talk(SAY_DEATH);
if (m_pInstance)
m_pInstance->SetData(TYPE_LOKEN, DONE);
}
if (m_pInstance)
m_pInstance->SetData(TYPE_LOKEN, DONE);
}
void LokenSpeach(bool hp)
{
if (hp)
{
switch(HealthCheck)
{
case 75: Talk(SAY_75HEALTH); break;
case 50: Talk(SAY_50HEALTH); break;
case 25: Talk(SAY_25HEALTH); break;
}
}
else
Talk(SAY_NOVA);
}
void LokenSpeach(bool hp)
{
if (hp)
{
switch(HealthCheck)
{
case 75: Talk(SAY_75HEALTH); break;
case 50: Talk(SAY_50HEALTH); break;
case 25: Talk(SAY_25HEALTH); break;
}
}
else
Talk(SAY_NOVA);
}
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() != TYPEID_PLAYER)
return;
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() != TYPEID_PLAYER)
return;
Talk(SAY_SLAY);
}
Talk(SAY_SLAY);
}
void UpdateAI(uint32 diff)
{
if (!isActive)
{
IntroTimer += diff;
if (IntroTimer > 5000 && IntroTimer < 10000)
{
if (SelectTargetFromPlayerList(60))
{
Talk(SAY_INTRO_1);
IntroTimer = 10000;
}
else
IntroTimer = 0;
}
void UpdateAI(uint32 diff)
{
if (!isActive)
{
IntroTimer += diff;
if (IntroTimer > 5000 && IntroTimer < 10000)
{
if (SelectTargetFromPlayerList(60))
{
Talk(SAY_INTRO_1);
IntroTimer = 10000;
}
else
IntroTimer = 0;
}
if (IntroTimer >= 30000 && IntroTimer < 40000)
{
Talk(SAY_INTRO_2);
IntroTimer = 40000;
}
if (IntroTimer >= 60000)
{
isActive = true;
if (m_pInstance)
m_pInstance->SetData(TYPE_LOKEN_INTRO, 1);
if (IntroTimer >= 30000 && IntroTimer < 40000)
{
Talk(SAY_INTRO_2);
IntroTimer = 40000;
}
if (IntroTimer >= 60000)
{
isActive = true;
if (m_pInstance)
m_pInstance->SetData(TYPE_LOKEN_INTRO, 1);
me->SetControlled(false, UNIT_STATE_STUNNED);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
if (Player* target = SelectTargetFromPlayerList(80))
AttackStart(target);
}
me->SetControlled(false, UNIT_STATE_STUNNED);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
if (Player* target = SelectTargetFromPlayerList(80))
AttackStart(target);
}
return;
}
return;
}
//Return since we have no target
if (!UpdateVictim())
return;
//Return since we have no target
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_CHECK_HEALTH:
if (HealthBelowPct(HealthCheck))
{
LokenSpeach(true);
HealthCheck -= 25;
}
switch (events.GetEvent())
{
case EVENT_CHECK_HEALTH:
if (HealthBelowPct(HealthCheck))
{
LokenSpeach(true);
HealthCheck -= 25;
}
events.RepeatEvent(1000);
break;
case EVENT_LIGHTNING_NOVA:
events.RepeatEvent(15000);
me->CastSpell(me, SPELL_LIGHTNING_NOVA_VISUAL, true);
me->CastSpell(me, SPELL_LIGHTNING_NOVA_THUNDERS, true);
events.RepeatEvent(1000);
break;
case EVENT_LIGHTNING_NOVA:
events.RepeatEvent(15000);
me->CastSpell(me, SPELL_LIGHTNING_NOVA_VISUAL, true);
me->CastSpell(me, SPELL_LIGHTNING_NOVA_THUNDERS, true);
events.DelayEvents(5001);
events.ScheduleEvent(EVENT_AURA_REMOVE, me->GetMap()->IsHeroic() ? 4000 : 5000);
events.DelayEvents(5001);
events.ScheduleEvent(EVENT_AURA_REMOVE, me->GetMap()->IsHeroic() ? 4000 : 5000);
me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_LIGHTNING_NOVA_H : SPELL_LIGHTNING_NOVA_N, false);
break;
case EVENT_SHOCKWAVE:
me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_PULSING_SHOCKWAVE_H : SPELL_PULSING_SHOCKWAVE_N, false);
events.PopEvent();
break;
case EVENT_ARC_LIGHTNING:
if (Unit* target = SelectTargetFromPlayerList(100, SPELL_ARC_LIGHTNING))
me->CastSpell(target, SPELL_ARC_LIGHTNING, false);
me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_LIGHTNING_NOVA_H : SPELL_LIGHTNING_NOVA_N, false);
break;
case EVENT_SHOCKWAVE:
me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_PULSING_SHOCKWAVE_H : SPELL_PULSING_SHOCKWAVE_N, false);
events.PopEvent();
break;
case EVENT_ARC_LIGHTNING:
if (Unit* target = SelectTargetFromPlayerList(100, SPELL_ARC_LIGHTNING))
me->CastSpell(target, SPELL_ARC_LIGHTNING, false);
events.RepeatEvent(12000);
break;
case EVENT_AURA_REMOVE:
me->RemoveAura(SPELL_LIGHTNING_NOVA_THUNDERS);
events.PopEvent();
break;
}
events.RepeatEvent(12000);
break;
case EVENT_AURA_REMOVE:
me->RemoveAura(SPELL_LIGHTNING_NOVA_THUNDERS);
events.PopEvent();
break;
}
DoMeleeAttackIfReady();
}
};
DoMeleeAttackIfReady();
}
};
};
class spell_loken_pulsing_shockwave : public SpellScriptLoader
@@ -269,6 +269,6 @@ class spell_loken_pulsing_shockwave : public SpellScriptLoader
void AddSC_boss_loken()
{
new boss_loken();
new spell_loken_pulsing_shockwave();
new boss_loken();
new spell_loken_pulsing_shockwave();
}

View File

@@ -9,49 +9,49 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum VolkahnSpells
{
// Volkhan
SPELL_HEAT_N = 52387,
SPELL_HEAT_H = 59528,
SPELL_SHATTERING_STOMP_N = 52237,
SPELL_SHATTERING_STOMP_H = 59529,
SPELL_TEMPER = 52238,
SPELL_SUMMON_MOLTEN_GOLEM = 52405,
// Volkhan
SPELL_HEAT_N = 52387,
SPELL_HEAT_H = 59528,
SPELL_SHATTERING_STOMP_N = 52237,
SPELL_SHATTERING_STOMP_H = 59529,
SPELL_TEMPER = 52238,
SPELL_SUMMON_MOLTEN_GOLEM = 52405,
//Molten Golem
SPELL_BLAST_WAVE = 23113,
SPELL_IMMOLATION_STRIKE_N = 52433,
SPELL_IMMOLATION_STRIKE_H = 59530,
SPELL_SHATTER_N = 52429,
SPELL_SHATTER_H = 59527,
//Molten Golem
SPELL_BLAST_WAVE = 23113,
SPELL_IMMOLATION_STRIKE_N = 52433,
SPELL_IMMOLATION_STRIKE_H = 59530,
SPELL_SHATTER_N = 52429,
SPELL_SHATTER_H = 59527,
};
enum VolkhanOther
{
// NPCs
NPC_VOLKHAN_ANVIL = 28823,
NPC_MOLTEN_GOLEM = 28695,
NPC_BRITTLE_GOLEM = 28681,
// NPCs
NPC_VOLKHAN_ANVIL = 28823,
NPC_MOLTEN_GOLEM = 28695,
NPC_BRITTLE_GOLEM = 28681,
// Misc
ACTION_SHATTER = 1,
ACTION_DESTROYED = 2,
// Misc
ACTION_SHATTER = 1,
ACTION_DESTROYED = 2,
// Point
POINT_ANVIL = 1,
// Point
POINT_ANVIL = 1,
};
enum VolkhanEvents
{
// Volkhan
EVENT_HEAT = 1,
EVENT_CHECK_HEALTH = 2,
EVENT_SHATTER = 3,
EVENT_POSITION = 4,
EVENT_MOVE_TO_ANVIL = 5,
// Volkhan
EVENT_HEAT = 1,
EVENT_CHECK_HEALTH = 2,
EVENT_SHATTER = 3,
EVENT_POSITION = 4,
EVENT_MOVE_TO_ANVIL = 5,
// Molten Golem
EVENT_BLAST = 11,
EVENT_IMMOLATION = 12,
// Molten Golem
EVENT_BLAST = 11,
EVENT_IMMOLATION = 12,
};
enum Yells
@@ -75,236 +75,236 @@ public:
return new boss_volkhanAI (creature);
}
struct boss_volkhanAI : public ScriptedAI
{
boss_volkhanAI(Creature* creature) : ScriptedAI(creature), summons(creature)
{
m_pInstance = creature->GetInstanceScript();
}
struct boss_volkhanAI : public ScriptedAI
{
boss_volkhanAI(Creature* creature) : ScriptedAI(creature), summons(creature)
{
m_pInstance = creature->GetInstanceScript();
}
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
uint8 HealthCheck;
float x, y, z;
uint8 PointID;
uint8 ShatteredCount;
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
uint8 HealthCheck;
float x, y, z;
uint8 PointID;
uint8 ShatteredCount;
void Reset()
{
x = y = z = PointID = ShatteredCount = 0;
HealthCheck = 100;
events.Reset();
summons.DespawnAll();
me->SetSpeed(MOVE_RUN, 1.2f,true);
me->SetReactState(REACT_AGGRESSIVE);
void Reset()
{
x = y = z = PointID = ShatteredCount = 0;
HealthCheck = 100;
events.Reset();
summons.DespawnAll();
me->SetSpeed(MOVE_RUN, 1.2f,true);
me->SetReactState(REACT_AGGRESSIVE);
if (m_pInstance)
{
m_pInstance->SetData(TYPE_VOLKHAN, NOT_STARTED);
m_pInstance->SetData(DATA_VOLKHAN_ACHIEVEMENT, true);
}
}
if (m_pInstance)
{
m_pInstance->SetData(TYPE_VOLKHAN, NOT_STARTED);
m_pInstance->SetData(DATA_VOLKHAN_ACHIEVEMENT, true);
}
}
void EnterCombat(Unit*)
{
me->SetInCombatWithZone();
Talk(SAY_AGGRO);
void EnterCombat(Unit*)
{
me->SetInCombatWithZone();
Talk(SAY_AGGRO);
if (m_pInstance)
m_pInstance->SetData(TYPE_VOLKHAN, IN_PROGRESS);
if (m_pInstance)
m_pInstance->SetData(TYPE_VOLKHAN, IN_PROGRESS);
ScheduleEvents(false);
}
ScheduleEvents(false);
}
void JustDied(Unit*)
{
Talk(SAY_DEATH);
void JustDied(Unit*)
{
Talk(SAY_DEATH);
summons.DespawnAll();
summons.DespawnAll();
if (m_pInstance)
m_pInstance->SetData(TYPE_VOLKHAN, DONE);
}
if (m_pInstance)
m_pInstance->SetData(TYPE_VOLKHAN, DONE);
}
void GetNextPos()
{
if (me->GetPositionY() < -180)
{
if (me->GetPositionX() > 1330)
x = 1355;
else
x = 1308;
void GetNextPos()
{
if (me->GetPositionY() < -180)
{
if (me->GetPositionX() > 1330)
x = 1355;
else
x = 1308;
y = -178;
z = 52.5f;
}
else if (me->GetPositionY() < -145)
{
if (me->GetPositionX() > 1330)
x = 1355;
else
x = 1308;
y = -178;
z = 52.5f;
}
else if (me->GetPositionY() < -145)
{
if (me->GetPositionX() > 1330)
x = 1355;
else
x = 1308;
y = -137;
z = 52.5f;
}
else if (me->GetPositionY() < -130)
{
if (me->GetPositionX() > 1330)
x = 1343;
else
x = 1320;
y = -137;
z = 52.5f;
}
else if (me->GetPositionY() < -130)
{
if (me->GetPositionX() > 1330)
x = 1343;
else
x = 1320;
y = -123;
z = 56.7f;
}
else
{
PointID = POINT_ANVIL;
x = 1327;
y = -96;
z = 56.7f;
}
}
y = -123;
z = 56.7f;
}
else
{
PointID = POINT_ANVIL;
x = 1327;
y = -96;
z = 56.7f;
}
}
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() != TYPEID_PLAYER)
return;
void KilledUnit(Unit* victim)
{
if (victim->GetTypeId() != TYPEID_PLAYER)
return;
Talk(SAY_SLAY);
}
Talk(SAY_SLAY);
}
void ScheduleEvents(bool anvil)
{
events.SetPhase(1);
events.RescheduleEvent(EVENT_HEAT, 8000, 0, 1);
events.RescheduleEvent(EVENT_SHATTER, 10000, 0, 1);
events.RescheduleEvent(EVENT_CHECK_HEALTH, anvil ? 1000 : 6000, 0, 1);
events.RescheduleEvent(EVENT_POSITION, 4000, 0, 1);
}
void ScheduleEvents(bool anvil)
{
events.SetPhase(1);
events.RescheduleEvent(EVENT_HEAT, 8000, 0, 1);
events.RescheduleEvent(EVENT_SHATTER, 10000, 0, 1);
events.RescheduleEvent(EVENT_CHECK_HEALTH, anvil ? 1000 : 6000, 0, 1);
events.RescheduleEvent(EVENT_POSITION, 4000, 0, 1);
}
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
if (summon->GetEntry() == NPC_MOLTEN_GOLEM)
{
summon->setFaction(me->getFaction());
void JustSummoned(Creature* summon)
{
summons.Summon(summon);
if (summon->GetEntry() == NPC_MOLTEN_GOLEM)
{
summon->setFaction(me->getFaction());
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
summon->AI()->AttackStart(target);
}
}
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM))
summon->AI()->AttackStart(target);
}
}
void DoAction(int32 param)
{
if (param == ACTION_DESTROYED)
{
ShatteredCount++;
if (ShatteredCount > 4)
m_pInstance->SetData(DATA_VOLKHAN_ACHIEVEMENT, false);
}
}
void DoAction(int32 param)
{
if (param == ACTION_DESTROYED)
{
ShatteredCount++;
if (ShatteredCount > 4)
m_pInstance->SetData(DATA_VOLKHAN_ACHIEVEMENT, false);
}
}
void MovementInform(uint32 type, uint32 id)
{
if (type != POINT_MOTION_TYPE)
return;
void MovementInform(uint32 type, uint32 id)
{
if (type != POINT_MOTION_TYPE)
return;
if (id == POINT_ANVIL)
{
me->SetSpeed(MOVE_RUN, 1.2f,true);
me->SetReactState(REACT_AGGRESSIVE);
me->CastSpell(me, SPELL_TEMPER, false);
PointID = 0;
ScheduleEvents(true);
if (id == POINT_ANVIL)
{
me->SetSpeed(MOVE_RUN, 1.2f,true);
me->SetReactState(REACT_AGGRESSIVE);
me->CastSpell(me, SPELL_TEMPER, false);
PointID = 0;
ScheduleEvents(true);
// update orientation at server
me->SetOrientation(2.19f);
// update orientation at server
me->SetOrientation(2.19f);
// and client
WorldPacket data;
me->BuildHeartBeatMsg(&data);
me->SendMessageToSet(&data, false);
me->SetControlled(true, UNIT_STATE_ROOT);
}
else
events.ScheduleEvent(EVENT_MOVE_TO_ANVIL, 0, 0, 2);
}
// and client
WorldPacket data;
me->BuildHeartBeatMsg(&data);
me->SendMessageToSet(&data, false);
me->SetControlled(true, UNIT_STATE_ROOT);
}
else
events.ScheduleEvent(EVENT_MOVE_TO_ANVIL, 0, 0, 2);
}
void SpellHitTarget(Unit* /*who*/, const SpellInfo *spellInfo)
{
if (spellInfo->Id == SPELL_TEMPER)
{
me->CastSpell(me, SPELL_SUMMON_MOLTEN_GOLEM, true);
me->CastSpell(me, SPELL_SUMMON_MOLTEN_GOLEM, true);
me->GetMotionMaster()->MoveChase(me->GetVictim());
me->SetControlled(false, UNIT_STATE_ROOT);
}
}
void SpellHitTarget(Unit* /*who*/, const SpellInfo *spellInfo)
{
if (spellInfo->Id == SPELL_TEMPER)
{
me->CastSpell(me, SPELL_SUMMON_MOLTEN_GOLEM, true);
me->CastSpell(me, SPELL_SUMMON_MOLTEN_GOLEM, true);
me->GetMotionMaster()->MoveChase(me->GetVictim());
me->SetControlled(false, UNIT_STATE_ROOT);
}
}
void GoToAnvil()
{
events.SetPhase(2);
HealthCheck -= 20;
me->SetSpeed(MOVE_RUN, 4.0f,true);
me->SetReactState(REACT_PASSIVE);
void GoToAnvil()
{
events.SetPhase(2);
HealthCheck -= 20;
me->SetSpeed(MOVE_RUN, 4.0f,true);
me->SetReactState(REACT_PASSIVE);
Talk(SAY_FORGE);
Talk(SAY_FORGE);
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE)
me->GetMotionMaster()->MovementExpired();
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE)
me->GetMotionMaster()->MovementExpired();
events.ScheduleEvent(EVENT_MOVE_TO_ANVIL, 0, 0, 2);
}
events.ScheduleEvent(EVENT_MOVE_TO_ANVIL, 0, 0, 2);
}
void UpdateAI(uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
//Return since we have no target
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_HEAT:
me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_HEAT_H : SPELL_HEAT_N, true);
events.RepeatEvent(8000);
break;
case EVENT_CHECK_HEALTH:
if (HealthBelowPct(HealthCheck))
GoToAnvil();
switch (events.GetEvent())
{
case EVENT_HEAT:
me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_HEAT_H : SPELL_HEAT_N, true);
events.RepeatEvent(8000);
break;
case EVENT_CHECK_HEALTH:
if (HealthBelowPct(HealthCheck))
GoToAnvil();
events.RepeatEvent(1000);
return;
case EVENT_SHATTER:
{
events.RepeatEvent(10000);
summons.DoAction(ACTION_SHATTER);
break;
}
case EVENT_MOVE_TO_ANVIL:
GetNextPos();
me->GetMotionMaster()->MovePoint(PointID, x, y, z);
events.PopEvent();
return;
case EVENT_POSITION:
if (me->GetDistance(1331.9f, -106, 56) > 95)
EnterEvadeMode();
else
events.RepeatEvent(4000);
return;
}
DoMeleeAttackIfReady();
}
};
events.RepeatEvent(1000);
return;
case EVENT_SHATTER:
{
events.RepeatEvent(10000);
summons.DoAction(ACTION_SHATTER);
break;
}
case EVENT_MOVE_TO_ANVIL:
GetNextPos();
me->GetMotionMaster()->MovePoint(PointID, x, y, z);
events.PopEvent();
return;
case EVENT_POSITION:
if (me->GetDistance(1331.9f, -106, 56) > 95)
EnterEvadeMode();
else
events.RepeatEvent(4000);
return;
}
DoMeleeAttackIfReady();
}
};
};
class npc_molten_golem : public CreatureScript
@@ -317,256 +317,256 @@ public:
return new npc_molten_golemAI (creature);
}
struct npc_molten_golemAI : public ScriptedAI
{
npc_molten_golemAI(Creature* creature) : ScriptedAI(creature)
{
m_pInstance = creature->GetInstanceScript();
}
struct npc_molten_golemAI : public ScriptedAI
{
npc_molten_golemAI(Creature* creature) : ScriptedAI(creature)
{
m_pInstance = creature->GetInstanceScript();
}
EventMap events;
InstanceScript* m_pInstance;
EventMap events;
InstanceScript* m_pInstance;
void Reset()
{
events.Reset();
events.ScheduleEvent(EVENT_BLAST, 7000);
events.ScheduleEvent(EVENT_IMMOLATION, 3000);
}
void Reset()
{
events.Reset();
events.ScheduleEvent(EVENT_BLAST, 7000);
events.ScheduleEvent(EVENT_IMMOLATION, 3000);
}
void DamageTaken(Unit*, uint32 &uiDamage, DamageEffectType, SpellSchoolMask)
{
if (me->GetEntry() == NPC_BRITTLE_GOLEM)
{
uiDamage = 0;
return;
}
void DamageTaken(Unit*, uint32 &uiDamage, DamageEffectType, SpellSchoolMask)
{
if (me->GetEntry() == NPC_BRITTLE_GOLEM)
{
uiDamage = 0;
return;
}
if (uiDamage >= me->GetHealth())
{
me->UpdateEntry(NPC_BRITTLE_GOLEM, 0, false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_DISABLE_MOVE);
me->SetHealth(me->GetMaxHealth());
me->RemoveAllAuras();
me->AttackStop();
uiDamage = 0;
if (uiDamage >= me->GetHealth())
{
me->UpdateEntry(NPC_BRITTLE_GOLEM, 0, false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_DISABLE_MOVE);
me->SetHealth(me->GetMaxHealth());
me->RemoveAllAuras();
me->AttackStop();
uiDamage = 0;
if (me->IsNonMeleeSpellCast(false))
me->InterruptNonMeleeSpells(false);
if (me->IsNonMeleeSpellCast(false))
me->InterruptNonMeleeSpells(false);
me->SetControlled(true, UNIT_STATE_STUNNED);
}
}
me->SetControlled(true, UNIT_STATE_STUNNED);
}
}
void DoAction(int32 param)
{
if (me->GetEntry() == NPC_BRITTLE_GOLEM && param == ACTION_SHATTER)
{
if (Creature* volkhan = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(TYPE_VOLKHAN)))
volkhan->AI()->DoAction(ACTION_DESTROYED);
void DoAction(int32 param)
{
if (me->GetEntry() == NPC_BRITTLE_GOLEM && param == ACTION_SHATTER)
{
if (Creature* volkhan = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(TYPE_VOLKHAN)))
volkhan->AI()->DoAction(ACTION_DESTROYED);
me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_SHATTER_H : SPELL_SHATTER_N, true);
me->DespawnOrUnsummon(500);
}
}
me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_SHATTER_H : SPELL_SHATTER_N, true);
me->DespawnOrUnsummon(500);
}
}
void UpdateAI(uint32 diff)
{
//Return since we have no target or if we are frozen
if (!UpdateVictim() || me->GetEntry() == NPC_BRITTLE_GOLEM)
return;
void UpdateAI(uint32 diff)
{
//Return since we have no target or if we are frozen
if (!UpdateVictim() || me->GetEntry() == NPC_BRITTLE_GOLEM)
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_BLAST:
me->CastSpell(me, SPELL_BLAST_WAVE, false);
events.RepeatEvent(14000);
break;
case EVENT_IMMOLATION:
me->CastSpell(me->GetVictim(), me->GetMap()->IsHeroic() ? SPELL_IMMOLATION_STRIKE_H : SPELL_IMMOLATION_STRIKE_N, false);
events.RepeatEvent(5000);
break;
}
switch (events.GetEvent())
{
case EVENT_BLAST:
me->CastSpell(me, SPELL_BLAST_WAVE, false);
events.RepeatEvent(14000);
break;
case EVENT_IMMOLATION:
me->CastSpell(me->GetVictim(), me->GetMap()->IsHeroic() ? SPELL_IMMOLATION_STRIKE_H : SPELL_IMMOLATION_STRIKE_N, false);
events.RepeatEvent(5000);
break;
}
DoMeleeAttackIfReady();
}
};
DoMeleeAttackIfReady();
}
};
};
enum monumentSpells
{
SPELL_FREEZE_ANIM = 16245,
SPELL_AWAKEN = 52875,
SPELL_FREEZE_ANIM = 16245,
SPELL_AWAKEN = 52875,
SPELL_PIERCING_HOWL = 23600,
SPELL_PENETRATING_STRIKE = 52890,
SPELL_FRIGHTENING_SHOUT = 19134,
SPELL_BLADE_TURNING_N = 52891,
SPELL_BLADE_TURNING_H = 59173,
SPELL_PIERCING_HOWL = 23600,
SPELL_PENETRATING_STRIKE = 52890,
SPELL_FRIGHTENING_SHOUT = 19134,
SPELL_BLADE_TURNING_N = 52891,
SPELL_BLADE_TURNING_H = 59173,
SPELL_DEADLY_THROW_N = 52885,
SPELL_DEADLY_THROW_H = 59180,
SPELL_DEFLECTION_N = 52879,
SPELL_DEFLECTION_H = 59181,
SPELL_THROW_N = 52904,
SPELL_THROW_H = 59179,
SPELL_DEADLY_THROW_N = 52885,
SPELL_DEADLY_THROW_H = 59180,
SPELL_DEFLECTION_N = 52879,
SPELL_DEFLECTION_H = 59181,
SPELL_THROW_N = 52904,
SPELL_THROW_H = 59179,
};
enum monumentEvents
{
EVENT_PIERCING_HOWL = 1,
EVENT_PENETRATING_STRIKE = 2,
EVENT_FRIGHTENING_SHOUT = 3,
EVENT_BLADE_TURNING = 4,
EVENT_PIERCING_HOWL = 1,
EVENT_PENETRATING_STRIKE = 2,
EVENT_FRIGHTENING_SHOUT = 3,
EVENT_BLADE_TURNING = 4,
EVENT_DEADLY_THROW = 11,
EVENT_DEFLECTION = 12,
EVENT_THROW = 13,
EVENT_DEADLY_THROW = 11,
EVENT_DEFLECTION = 12,
EVENT_THROW = 13,
EVENT_UNFREEZE = 20,
EVENT_UNFREEZE = 20,
};
class npc_hol_monument : public CreatureScript
{
public:
npc_hol_monument() : CreatureScript("npc_hol_monument") {}
npc_hol_monument() : CreatureScript("npc_hol_monument") {}
CreatureAI* GetAI(Creature* creature) const
{
return new npc_hol_monumentAI(creature);
}
CreatureAI* GetAI(Creature* creature) const
{
return new npc_hol_monumentAI(creature);
}
struct npc_hol_monumentAI : public ScriptedAI
{
npc_hol_monumentAI(Creature* creature) : ScriptedAI(creature)
{
_attackGUID = 0;
_isActive = urand(0,1);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->CastSpell(me, SPELL_FREEZE_ANIM, true);
}
struct npc_hol_monumentAI : public ScriptedAI
{
npc_hol_monumentAI(Creature* creature) : ScriptedAI(creature)
{
_attackGUID = 0;
_isActive = urand(0,1);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->CastSpell(me, SPELL_FREEZE_ANIM, true);
}
EventMap events;
bool _isActive;
uint64 _attackGUID;
EventMap events;
bool _isActive;
uint64 _attackGUID;
void Reset()
{
}
void Reset()
{
}
void MoveInLineOfSight(Unit* who)
{
if (_attackGUID)
ScriptedAI::MoveInLineOfSight(who);
else if (_isActive && who->GetTypeId() == TYPEID_PLAYER)
{
if ((who->GetPositionX() < me->GetPositionX() || who->GetPositionY() < -220.0f) && me->GetDistance2d(who) < 40)
{
_isActive = false;
_attackGUID = who->GetGUID();
events.Reset();
events.RescheduleEvent(EVENT_UNFREEZE, 5000);
}
}
}
void MoveInLineOfSight(Unit* who)
{
if (_attackGUID)
ScriptedAI::MoveInLineOfSight(who);
else if (_isActive && who->GetTypeId() == TYPEID_PLAYER)
{
if ((who->GetPositionX() < me->GetPositionX() || who->GetPositionY() < -220.0f) && me->GetDistance2d(who) < 40)
{
_isActive = false;
_attackGUID = who->GetGUID();
events.Reset();
events.RescheduleEvent(EVENT_UNFREEZE, 5000);
}
}
}
void EnterCombat(Unit*)
{
events.Reset();
if (me->GetEntry() == 28961) // NPC_TITANIUM_SIEGEBREAKER
{
events.ScheduleEvent(EVENT_PIERCING_HOWL, 10000+rand()%15000);
events.ScheduleEvent(EVENT_PENETRATING_STRIKE, 5000+rand()%5000);
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 20000+rand()%8000);
events.ScheduleEvent(EVENT_BLADE_TURNING, 12000);
}
else
{
events.ScheduleEvent(EVENT_THROW, 10000+rand()%15000);
events.ScheduleEvent(EVENT_DEADLY_THROW, 15000+rand()%15000);
events.ScheduleEvent(EVENT_DEFLECTION, 15000);
}
}
void EnterCombat(Unit*)
{
events.Reset();
if (me->GetEntry() == 28961) // NPC_TITANIUM_SIEGEBREAKER
{
events.ScheduleEvent(EVENT_PIERCING_HOWL, 10000+rand()%15000);
events.ScheduleEvent(EVENT_PENETRATING_STRIKE, 5000+rand()%5000);
events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 20000+rand()%8000);
events.ScheduleEvent(EVENT_BLADE_TURNING, 12000);
}
else
{
events.ScheduleEvent(EVENT_THROW, 10000+rand()%15000);
events.ScheduleEvent(EVENT_DEADLY_THROW, 15000+rand()%15000);
events.ScheduleEvent(EVENT_DEFLECTION, 15000);
}
}
void AttackStart(Unit* who)
{
if (!_attackGUID || !_isActive)
return;
ScriptedAI::AttackStart(who);
}
void AttackStart(Unit* who)
{
if (!_attackGUID || !_isActive)
return;
ScriptedAI::AttackStart(who);
}
void UpdateAI(uint32 diff)
{
if (!_isActive && !_attackGUID)
return;
void UpdateAI(uint32 diff)
{
if (!_isActive && !_attackGUID)
return;
events.Update(diff);
uint32 eventId = events.GetEvent();
events.Update(diff);
uint32 eventId = events.GetEvent();
if (eventId == EVENT_UNFREEZE)
{
events.PopEvent();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->CastSpell(me, SPELL_AWAKEN, true);
me->RemoveAllAuras();
_isActive = true;
if (Unit* target = ObjectAccessor::GetUnit(*me, _attackGUID))
AttackStart(target);
return;
}
if (eventId == EVENT_UNFREEZE)
{
events.PopEvent();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->CastSpell(me, SPELL_AWAKEN, true);
me->RemoveAllAuras();
_isActive = true;
if (Unit* target = ObjectAccessor::GetUnit(*me, _attackGUID))
AttackStart(target);
return;
}
//Return since we have no target or if we are disabled from fight
if (!UpdateVictim())
return;
//Return since we have no target or if we are disabled from fight
if (!UpdateVictim())
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (eventId)
{
case EVENT_PIERCING_HOWL:
me->CastSpell(me->GetVictim(), SPELL_PIERCING_HOWL, false);
events.RepeatEvent(10000+rand()%1500);
break;
case EVENT_PENETRATING_STRIKE:
me->CastSpell(me->GetVictim(), SPELL_PENETRATING_STRIKE, false);
events.RepeatEvent(5000+rand()%5000);
break;
case EVENT_FRIGHTENING_SHOUT:
me->CastSpell(me->GetVictim(), SPELL_FRIGHTENING_SHOUT, false);
events.RepeatEvent(20000+rand()%8000);
break;
case EVENT_BLADE_TURNING:
me->CastSpell(me->GetVictim(), me->GetMap()->IsHeroic() ? SPELL_BLADE_TURNING_H : SPELL_BLADE_TURNING_N, false);
events.RepeatEvent(12000);
break;
case EVENT_THROW:
me->CastSpell(SelectTarget(SELECT_TARGET_RANDOM,0,50.0f, true,0), me->GetMap()->IsHeroic() ? SPELL_THROW_H : SPELL_THROW_N, true);
events.RepeatEvent(10000+rand()%15000);
break;
case EVENT_DEADLY_THROW:
me->CastSpell(SelectTarget(SELECT_TARGET_RANDOM,0,50.0f, true,0), me->GetMap()->IsHeroic() ? SPELL_DEADLY_THROW_H : SPELL_DEADLY_THROW_N, true);
events.RepeatEvent(15000+rand()%15000);
break;
case EVENT_DEFLECTION:
me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_DEFLECTION_H : SPELL_DEFLECTION_N, false);
events.RepeatEvent(15000);
break;
}
switch (eventId)
{
case EVENT_PIERCING_HOWL:
me->CastSpell(me->GetVictim(), SPELL_PIERCING_HOWL, false);
events.RepeatEvent(10000+rand()%1500);
break;
case EVENT_PENETRATING_STRIKE:
me->CastSpell(me->GetVictim(), SPELL_PENETRATING_STRIKE, false);
events.RepeatEvent(5000+rand()%5000);
break;
case EVENT_FRIGHTENING_SHOUT:
me->CastSpell(me->GetVictim(), SPELL_FRIGHTENING_SHOUT, false);
events.RepeatEvent(20000+rand()%8000);
break;
case EVENT_BLADE_TURNING:
me->CastSpell(me->GetVictim(), me->GetMap()->IsHeroic() ? SPELL_BLADE_TURNING_H : SPELL_BLADE_TURNING_N, false);
events.RepeatEvent(12000);
break;
case EVENT_THROW:
me->CastSpell(SelectTarget(SELECT_TARGET_RANDOM,0,50.0f, true,0), me->GetMap()->IsHeroic() ? SPELL_THROW_H : SPELL_THROW_N, true);
events.RepeatEvent(10000+rand()%15000);
break;
case EVENT_DEADLY_THROW:
me->CastSpell(SelectTarget(SELECT_TARGET_RANDOM,0,50.0f, true,0), me->GetMap()->IsHeroic() ? SPELL_DEADLY_THROW_H : SPELL_DEADLY_THROW_N, true);
events.RepeatEvent(15000+rand()%15000);
break;
case EVENT_DEFLECTION:
me->CastSpell(me, me->GetMap()->IsHeroic() ? SPELL_DEFLECTION_H : SPELL_DEFLECTION_N, false);
events.RepeatEvent(15000);
break;
}
DoMeleeAttackIfReady();
}
};
DoMeleeAttackIfReady();
}
};
};
void AddSC_boss_volkhan()
{
new boss_volkhan();
new npc_molten_golem();
new npc_hol_monument();
new boss_volkhan();
new npc_molten_golem();
new npc_hol_monument();
}

View File

@@ -8,32 +8,32 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum HoLEvents
{
TYPE_BJARNGRIM = 0,
TYPE_IONAR = 1,
TYPE_LOKEN = 2,
TYPE_VOLKHAN = 3,
TYPE_LOKEN_INTRO = 4,
MAX_ENCOUNTER = 5,
TYPE_BJARNGRIM = 0,
TYPE_IONAR = 1,
TYPE_LOKEN = 2,
TYPE_VOLKHAN = 3,
TYPE_LOKEN_INTRO = 4,
MAX_ENCOUNTER = 5,
DATA_BJARNGRIM_ACHIEVEMENT = 10,
DATA_VOLKHAN_ACHIEVEMENT = 11,
DATA_BJARNGRIM_ACHIEVEMENT = 10,
DATA_VOLKHAN_ACHIEVEMENT = 11,
};
enum HoLNPCs
{
NPC_BJARNGRIM = 28586,
NPC_VOLKHAN = 28587,
NPC_IONAR = 28546,
NPC_LOKEN = 28923,
NPC_BJARNGRIM = 28586,
NPC_VOLKHAN = 28587,
NPC_IONAR = 28546,
NPC_LOKEN = 28923,
};
enum HoLGOs
{
GO_BJARNGRIM_DOOR = 191416, //_doors10
GO_VOLKHAN_DOOR = 191325, //_doors07
GO_IONAR_DOOR = 191326, //_doors05
GO_LOKEN_DOOR = 191324, //_doors02
GO_LOKEN_THRONE = 192654,
GO_BJARNGRIM_DOOR = 191416, //_doors10
GO_VOLKHAN_DOOR = 191325, //_doors07
GO_IONAR_DOOR = 191326, //_doors05
GO_LOKEN_DOOR = 191324, //_doors02
GO_LOKEN_THRONE = 192654,
};
#endif

View File

@@ -16,230 +16,230 @@ public:
return new instance_halls_of_lightning_InstanceMapScript(pMap);
}
struct instance_halls_of_lightning_InstanceMapScript : public InstanceScript
{
instance_halls_of_lightning_InstanceMapScript(Map* pMap) : InstanceScript(pMap) { Initialize(); };
struct instance_halls_of_lightning_InstanceMapScript : public InstanceScript
{
instance_halls_of_lightning_InstanceMapScript(Map* pMap) : InstanceScript(pMap) { Initialize(); };
uint32 m_auiEncounter[MAX_ENCOUNTER];
uint32 m_auiEncounter[MAX_ENCOUNTER];
uint64 m_uiGeneralBjarngrimGUID;
uint64 m_uiIonarGUID;
uint64 m_uiLokenGUID;
uint64 m_uiVolkhanGUID;
uint64 m_uiGeneralBjarngrimGUID;
uint64 m_uiIonarGUID;
uint64 m_uiLokenGUID;
uint64 m_uiVolkhanGUID;
uint64 m_uiBjarngrimDoorGUID;
uint64 m_uiVolkhanDoorGUID;
uint64 m_uiIonarDoorGUID;
uint64 m_uiLokenDoorGUID;
uint64 m_uiLokenGlobeGUID;
uint64 m_uiBjarngrimDoorGUID;
uint64 m_uiVolkhanDoorGUID;
uint64 m_uiIonarDoorGUID;
uint64 m_uiLokenDoorGUID;
uint64 m_uiLokenGlobeGUID;
bool volkhanAchievement;
bool bjarngrimAchievement;
bool volkhanAchievement;
bool bjarngrimAchievement;
void Initialize()
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
void Initialize()
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
m_uiGeneralBjarngrimGUID = 0;
m_uiVolkhanGUID = 0;
m_uiIonarGUID = 0;
m_uiLokenGUID = 0;
m_uiGeneralBjarngrimGUID = 0;
m_uiVolkhanGUID = 0;
m_uiIonarGUID = 0;
m_uiLokenGUID = 0;
m_uiBjarngrimDoorGUID = 0;
m_uiVolkhanDoorGUID = 0;
m_uiIonarDoorGUID = 0;
m_uiLokenDoorGUID = 0;
m_uiLokenGlobeGUID = 0;
m_uiBjarngrimDoorGUID = 0;
m_uiVolkhanDoorGUID = 0;
m_uiIonarDoorGUID = 0;
m_uiLokenDoorGUID = 0;
m_uiLokenGlobeGUID = 0;
volkhanAchievement = false;
bjarngrimAchievement = false;
}
volkhanAchievement = false;
bjarngrimAchievement = false;
}
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
{
if (m_auiEncounter[i] == IN_PROGRESS)
return true;
}
return false;
}
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
{
if (m_auiEncounter[i] == IN_PROGRESS)
return true;
}
return false;
}
void OnCreatureCreate(Creature* pCreature)
{
switch(pCreature->GetEntry())
{
case NPC_BJARNGRIM:
m_uiGeneralBjarngrimGUID = pCreature->GetGUID();
break;
case NPC_VOLKHAN:
m_uiVolkhanGUID = pCreature->GetGUID();
break;
case NPC_IONAR:
m_uiIonarGUID = pCreature->GetGUID();
break;
case NPC_LOKEN:
m_uiLokenGUID = pCreature->GetGUID();
break;
}
}
void OnCreatureCreate(Creature* pCreature)
{
switch(pCreature->GetEntry())
{
case NPC_BJARNGRIM:
m_uiGeneralBjarngrimGUID = pCreature->GetGUID();
break;
case NPC_VOLKHAN:
m_uiVolkhanGUID = pCreature->GetGUID();
break;
case NPC_IONAR:
m_uiIonarGUID = pCreature->GetGUID();
break;
case NPC_LOKEN:
m_uiLokenGUID = pCreature->GetGUID();
break;
}
}
void OnGameObjectCreate(GameObject* pGo)
{
switch(pGo->GetEntry())
{
case GO_BJARNGRIM_DOOR:
m_uiBjarngrimDoorGUID = pGo->GetGUID();
if (m_auiEncounter[TYPE_BJARNGRIM] == DONE)
pGo->SetGoState(GO_STATE_ACTIVE);
void OnGameObjectCreate(GameObject* pGo)
{
switch(pGo->GetEntry())
{
case GO_BJARNGRIM_DOOR:
m_uiBjarngrimDoorGUID = pGo->GetGUID();
if (m_auiEncounter[TYPE_BJARNGRIM] == DONE)
pGo->SetGoState(GO_STATE_ACTIVE);
break;
case GO_VOLKHAN_DOOR:
m_uiVolkhanDoorGUID = pGo->GetGUID();
if (m_auiEncounter[TYPE_VOLKHAN] == DONE)
pGo->SetGoState(GO_STATE_ACTIVE);
break;
case GO_VOLKHAN_DOOR:
m_uiVolkhanDoorGUID = pGo->GetGUID();
if (m_auiEncounter[TYPE_VOLKHAN] == DONE)
pGo->SetGoState(GO_STATE_ACTIVE);
break;
case GO_IONAR_DOOR:
m_uiIonarDoorGUID = pGo->GetGUID();
if (m_auiEncounter[TYPE_IONAR] == DONE)
pGo->SetGoState(GO_STATE_ACTIVE);
break;
case GO_IONAR_DOOR:
m_uiIonarDoorGUID = pGo->GetGUID();
if (m_auiEncounter[TYPE_IONAR] == DONE)
pGo->SetGoState(GO_STATE_ACTIVE);
break;
case GO_LOKEN_DOOR:
m_uiLokenDoorGUID = pGo->GetGUID();
if (m_auiEncounter[TYPE_LOKEN] == DONE)
pGo->SetGoState(GO_STATE_ACTIVE);
break;
case GO_LOKEN_DOOR:
m_uiLokenDoorGUID = pGo->GetGUID();
if (m_auiEncounter[TYPE_LOKEN] == DONE)
pGo->SetGoState(GO_STATE_ACTIVE);
break;
case GO_LOKEN_THRONE:
m_uiLokenGlobeGUID = pGo->GetGUID();
break;
}
}
break;
case GO_LOKEN_THRONE:
m_uiLokenGlobeGUID = pGo->GetGUID();
break;
}
}
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0)
{
switch(criteria_id)
{
case 7321: //Shatter Resistant (2042)
return volkhanAchievement;
case 6835: // Lightning Struck (1834)
return bjarngrimAchievement;
}
return false;
}
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0)
{
switch(criteria_id)
{
case 7321: //Shatter Resistant (2042)
return volkhanAchievement;
case 6835: // Lightning Struck (1834)
return bjarngrimAchievement;
}
return false;
}
void SetData(uint32 uiType, uint32 uiData)
{
m_auiEncounter[uiType] = uiData;
if( uiType == TYPE_LOKEN_INTRO )
SaveToDB();
void SetData(uint32 uiType, uint32 uiData)
{
m_auiEncounter[uiType] = uiData;
if( uiType == TYPE_LOKEN_INTRO )
SaveToDB();
// Achievements
if (uiType == DATA_BJARNGRIM_ACHIEVEMENT)
bjarngrimAchievement = (bool)uiData;
else if (uiType == DATA_VOLKHAN_ACHIEVEMENT)
volkhanAchievement = (bool)uiData;
// Achievements
if (uiType == DATA_BJARNGRIM_ACHIEVEMENT)
bjarngrimAchievement = (bool)uiData;
else if (uiType == DATA_VOLKHAN_ACHIEVEMENT)
volkhanAchievement = (bool)uiData;
if( uiData != DONE )
return;
if( uiData != DONE )
return;
switch(uiType)
{
case TYPE_BJARNGRIM:
HandleGameObject(m_uiBjarngrimDoorGUID, true);
break;
case TYPE_VOLKHAN:
HandleGameObject(m_uiVolkhanDoorGUID, true);
break;
case TYPE_IONAR:
HandleGameObject(m_uiIonarDoorGUID, true);
break;
case TYPE_LOKEN:
HandleGameObject(m_uiLokenDoorGUID, true);
//Appears to be type 5 GO with animation. Need to figure out how this work, code below only placeholder
if (GameObject* pGlobe = instance->GetGameObject(m_uiLokenGlobeGUID))
pGlobe->SetGoState(GO_STATE_ACTIVE);
switch(uiType)
{
case TYPE_BJARNGRIM:
HandleGameObject(m_uiBjarngrimDoorGUID, true);
break;
case TYPE_VOLKHAN:
HandleGameObject(m_uiVolkhanDoorGUID, true);
break;
case TYPE_IONAR:
HandleGameObject(m_uiIonarDoorGUID, true);
break;
case TYPE_LOKEN:
HandleGameObject(m_uiLokenDoorGUID, true);
//Appears to be type 5 GO with animation. Need to figure out how this work, code below only placeholder
if (GameObject* pGlobe = instance->GetGameObject(m_uiLokenGlobeGUID))
pGlobe->SetGoState(GO_STATE_ACTIVE);
break;
}
break;
}
SaveToDB();
}
SaveToDB();
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "H L " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' '
<< m_auiEncounter[2] << ' ' << m_auiEncounter[3] << ' ' << m_auiEncounter[4];
std::ostringstream saveStream;
saveStream << "H L " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' '
<< m_auiEncounter[2] << ' ' << m_auiEncounter[3] << ' ' << m_auiEncounter[4];
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;
uint32 data0, data1, data2, data3, data4;
char dataHead1, dataHead2;
uint32 data0, data1, data2, data3, data4;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4;
if (dataHead1 == 'H' && dataHead2 == 'L')
{
m_auiEncounter[0] = data0;
m_auiEncounter[1] = data1;
m_auiEncounter[2] = data2;
m_auiEncounter[3] = data3;
m_auiEncounter[4] = data4;
if (dataHead1 == 'H' && dataHead2 == 'L')
{
m_auiEncounter[0] = data0;
m_auiEncounter[1] = data1;
m_auiEncounter[2] = data2;
m_auiEncounter[3] = data3;
m_auiEncounter[4] = data4;
for (uint8 i = 0; i < TYPE_LOKEN_INTRO; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
m_auiEncounter[i] = NOT_STARTED;
for (uint8 i = 0; i < TYPE_LOKEN_INTRO; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
m_auiEncounter[i] = NOT_STARTED;
OUT_LOAD_INST_DATA_COMPLETE;
OUT_LOAD_INST_DATA_COMPLETE;
}
else
OUT_LOAD_INST_DATA_FAIL;
}
}
else
OUT_LOAD_INST_DATA_FAIL;
}
uint32 GetData(uint32 uiType) const
{
return m_auiEncounter[uiType];
}
uint32 GetData(uint32 uiType) const
{
return m_auiEncounter[uiType];
}
uint64 GetData64(uint32 uiData) const
{
switch(uiData)
{
case TYPE_BJARNGRIM:
return m_uiGeneralBjarngrimGUID;
case TYPE_VOLKHAN:
return m_uiVolkhanGUID;
case TYPE_IONAR:
return m_uiIonarGUID;
case TYPE_LOKEN:
return m_uiLokenGUID;
}
return 0;
}
};
uint64 GetData64(uint32 uiData) const
{
switch(uiData)
{
case TYPE_BJARNGRIM:
return m_uiGeneralBjarngrimGUID;
case TYPE_VOLKHAN:
return m_uiVolkhanGUID;
case TYPE_IONAR:
return m_uiIonarGUID;
case TYPE_LOKEN:
return m_uiLokenGUID;
}
return 0;
}
};
};
void AddSC_instance_halls_of_lightning()
{
new instance_halls_of_lightning();
new instance_halls_of_lightning();
}

View File

@@ -9,27 +9,27 @@
enum spells
{
GROUND_SPIKE_H = 59750,
BOULDER_TOSS = 50843,
BOULDER_TOSS_H = 59742,
SHATTER = 50810,
SHATTER_H = 61546,
STOMP = 50868,
STOMP_H = 59744,
GROUND_SLAM = 50827,
GROUND_SLAM_STONED_EFFECT = 50812,
SPELL_SHATTER_EFFECT = 50811,
GROUND_SPIKE_H = 59750,
BOULDER_TOSS = 50843,
BOULDER_TOSS_H = 59742,
SHATTER = 50810,
SHATTER_H = 61546,
STOMP = 50868,
STOMP_H = 59744,
GROUND_SLAM = 50827,
GROUND_SLAM_STONED_EFFECT = 50812,
SPELL_SHATTER_EFFECT = 50811,
};
enum events
{
EVENT_NONE,
EVENT_BOULDER,
EVENT_STOMP,
EVENT_GROUND_SLAM,
EVENT_GROUND_SPIKE,
EVENT_SHATTER,
EVENT_REMOVE_STONED,
EVENT_NONE,
EVENT_BOULDER,
EVENT_STOMP,
EVENT_GROUND_SLAM,
EVENT_GROUND_SPIKE,
EVENT_SHATTER,
EVENT_REMOVE_STONED,
};
enum Yells
@@ -50,121 +50,121 @@ public:
return new boss_krystallusAI (pCreature);
}
struct boss_krystallusAI : public ScriptedAI
{
boss_krystallusAI(Creature *c) : ScriptedAI(c)
{
pInstance = me->GetInstanceScript();
}
struct boss_krystallusAI : public ScriptedAI
{
boss_krystallusAI(Creature *c) : ScriptedAI(c)
{
pInstance = me->GetInstanceScript();
}
EventMap events;
InstanceScript* pInstance;
EventMap events;
InstanceScript* pInstance;
void Reset()
{
events.Reset();
if (pInstance)
pInstance->SetData(BOSS_KRYSTALLUS, NOT_STARTED);
}
void Reset()
{
events.Reset();
if (pInstance)
pInstance->SetData(BOSS_KRYSTALLUS, NOT_STARTED);
}
void EnterCombat(Unit* who)
{
events.Reset();
events.RescheduleEvent(EVENT_BOULDER, 8000);
events.RescheduleEvent(EVENT_STOMP, 5000);
events.RescheduleEvent(EVENT_GROUND_SLAM, 15000);
if (me->GetMap()->IsHeroic())
events.RescheduleEvent(EVENT_GROUND_SPIKE, 10000);
void EnterCombat(Unit* who)
{
events.Reset();
events.RescheduleEvent(EVENT_BOULDER, 8000);
events.RescheduleEvent(EVENT_STOMP, 5000);
events.RescheduleEvent(EVENT_GROUND_SLAM, 15000);
if (me->GetMap()->IsHeroic())
events.RescheduleEvent(EVENT_GROUND_SPIKE, 10000);
if (pInstance)
pInstance->SetData(BOSS_KRYSTALLUS, IN_PROGRESS);
if (pInstance)
pInstance->SetData(BOSS_KRYSTALLUS, IN_PROGRESS);
Talk(SAY_AGGRO);
}
Talk(SAY_AGGRO);
}
void RemoveStonedEffect()
{
Map* map = me->GetMap();
if (map->IsDungeon())
{
Map::PlayerList const &players = map->GetPlayers();
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
if (itr->GetSource()->IsAlive())
itr->GetSource()->RemoveAura(GROUND_SLAM_STONED_EFFECT);
}
}
void RemoveStonedEffect()
{
Map* map = me->GetMap();
if (map->IsDungeon())
{
Map::PlayerList const &players = map->GetPlayers();
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
if (itr->GetSource()->IsAlive())
itr->GetSource()->RemoveAura(GROUND_SLAM_STONED_EFFECT);
}
}
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_BOULDER:
{
if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0))
me->CastSpell(target, DUNGEON_MODE(BOULDER_TOSS, BOULDER_TOSS_H), false);
switch (events.GetEvent())
{
case EVENT_BOULDER:
{
if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0))
me->CastSpell(target, DUNGEON_MODE(BOULDER_TOSS, BOULDER_TOSS_H), false);
events.RepeatEvent(5000 + rand()%2000);
break;
}
case EVENT_GROUND_SPIKE:
{
me->CastSpell(me->GetVictim(), GROUND_SPIKE_H, false); // current enemy target
events.RepeatEvent(8000 + rand()%3000);
break;
}
case EVENT_STOMP:
{
me->CastSpell(me, DUNGEON_MODE(STOMP, STOMP_H), false);
events.RepeatEvent(13000 + rand()% 5000);
break;
}
case EVENT_GROUND_SLAM:
{
events.RepeatEvent(10000 + rand()%3000);
me->CastSpell(me->GetVictim(), GROUND_SLAM, true);
events.DelayEvents(10000);
events.RescheduleEvent(EVENT_SHATTER, 8000);
break;
}
case EVENT_SHATTER:
{
me->CastSpell((Unit*)NULL, DUNGEON_MODE(SHATTER, SHATTER_H), false);
Talk(SAY_SHATTER);
events.RescheduleEvent(EVENT_REMOVE_STONED, 1500);
events.PopEvent();
break;
}
case EVENT_REMOVE_STONED:
{
RemoveStonedEffect();
events.PopEvent();
break;
}
}
events.RepeatEvent(5000 + rand()%2000);
break;
}
case EVENT_GROUND_SPIKE:
{
me->CastSpell(me->GetVictim(), GROUND_SPIKE_H, false); // current enemy target
events.RepeatEvent(8000 + rand()%3000);
break;
}
case EVENT_STOMP:
{
me->CastSpell(me, DUNGEON_MODE(STOMP, STOMP_H), false);
events.RepeatEvent(13000 + rand()% 5000);
break;
}
case EVENT_GROUND_SLAM:
{
events.RepeatEvent(10000 + rand()%3000);
me->CastSpell(me->GetVictim(), GROUND_SLAM, true);
events.DelayEvents(10000);
events.RescheduleEvent(EVENT_SHATTER, 8000);
break;
}
case EVENT_SHATTER:
{
me->CastSpell((Unit*)NULL, DUNGEON_MODE(SHATTER, SHATTER_H), false);
Talk(SAY_SHATTER);
events.RescheduleEvent(EVENT_REMOVE_STONED, 1500);
events.PopEvent();
break;
}
case EVENT_REMOVE_STONED:
{
RemoveStonedEffect();
events.PopEvent();
break;
}
}
DoMeleeAttackIfReady();
}
DoMeleeAttackIfReady();
}
void JustDied(Unit* killer)
{
Talk(SAY_DEATH);
if (pInstance)
pInstance->SetData(BOSS_KRYSTALLUS, DONE);
}
void JustDied(Unit* killer)
{
Talk(SAY_DEATH);
if (pInstance)
pInstance->SetData(BOSS_KRYSTALLUS, DONE);
}
void KilledUnit(Unit *victim)
{
Talk(SAY_KILL);
}
};
void KilledUnit(Unit *victim)
{
Talk(SAY_KILL);
}
};
};

View File

@@ -5,23 +5,23 @@
#include "halls_of_stone.h"
enum spells
{
PARTING_SORROW = 59723,
PILLAR_OF_WOE = 50761,
PILLAR_OF_WOE_H = 59727,
SHOCK_OF_SORROW = 50760,
SHOCK_OF_SORROW_H = 59726,
STORM_OF_GRIEF = 50752,
STORM_OF_GRIEF_H = 59772,
PARTING_SORROW = 59723,
PILLAR_OF_WOE = 50761,
PILLAR_OF_WOE_H = 59727,
SHOCK_OF_SORROW = 50760,
SHOCK_OF_SORROW_H = 59726,
STORM_OF_GRIEF = 50752,
STORM_OF_GRIEF_H = 59772,
ACHIEVEMENT_GOOD_GRIEF = 20383,
ACHIEVEMENT_GOOD_GRIEF = 20383,
};
enum maidenEvents
{
EVENT_NONE,
EVENT_STORM,
EVENT_SHOCK,
EVENT_PILLAR,
EVENT_PARTING,
EVENT_NONE,
EVENT_STORM,
EVENT_SHOCK,
EVENT_PILLAR,
EVENT_PARTING,
};
enum Yells
@@ -42,107 +42,107 @@ public:
return new boss_maiden_of_griefAI (pCreature);
}
struct boss_maiden_of_griefAI : public ScriptedAI
{
boss_maiden_of_griefAI(Creature *c) : ScriptedAI(c)
{
pInstance = me->GetInstanceScript();
}
struct boss_maiden_of_griefAI : public ScriptedAI
{
boss_maiden_of_griefAI(Creature *c) : ScriptedAI(c)
{
pInstance = me->GetInstanceScript();
}
InstanceScript* pInstance;
EventMap events;
InstanceScript* pInstance;
EventMap events;
void Reset()
{
events.Reset();
if (pInstance)
{
pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_GOOD_GRIEF);
pInstance->SetData(BOSS_MAIDEN_OF_GRIEF, NOT_STARTED);
}
}
void Reset()
{
events.Reset();
if (pInstance)
{
pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_GOOD_GRIEF);
pInstance->SetData(BOSS_MAIDEN_OF_GRIEF, NOT_STARTED);
}
}
void EnterCombat(Unit* who)
{
events.ScheduleEvent(EVENT_STORM, 5000);
events.ScheduleEvent(EVENT_SHOCK, 26000+rand()%6000);
events.ScheduleEvent(EVENT_PILLAR, 12000+rand()%8000);
events.ScheduleEvent(EVENT_PARTING, 8000);
void EnterCombat(Unit* who)
{
events.ScheduleEvent(EVENT_STORM, 5000);
events.ScheduleEvent(EVENT_SHOCK, 26000+rand()%6000);
events.ScheduleEvent(EVENT_PILLAR, 12000+rand()%8000);
events.ScheduleEvent(EVENT_PARTING, 8000);
Talk(SAY_AGGRO);
if (pInstance)
{
pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_GOOD_GRIEF);
pInstance->SetData(BOSS_MAIDEN_OF_GRIEF, IN_PROGRESS);
}
}
Talk(SAY_AGGRO);
if (pInstance)
{
pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_GOOD_GRIEF);
pInstance->SetData(BOSS_MAIDEN_OF_GRIEF, IN_PROGRESS);
}
}
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_STORM:
{
me->CastSpell(me->GetVictim(), DUNGEON_MODE(STORM_OF_GRIEF, STORM_OF_GRIEF_H), true);
events.RepeatEvent(10000);
break;
}
case EVENT_SHOCK:
{
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SHOCK_OF_SORROW, SHOCK_OF_SORROW_H), false);
Talk(SAY_STUN);
switch( events.GetEvent() )
{
case EVENT_STORM:
{
me->CastSpell(me->GetVictim(), DUNGEON_MODE(STORM_OF_GRIEF, STORM_OF_GRIEF_H), true);
events.RepeatEvent(10000);
break;
}
case EVENT_SHOCK:
{
me->CastSpell(me->GetVictim(), DUNGEON_MODE(SHOCK_OF_SORROW, SHOCK_OF_SORROW_H), false);
Talk(SAY_STUN);
events.RepeatEvent(16000+rand()%6000);
break;
}
case EVENT_PILLAR:
{
if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0))
me->CastSpell(target, DUNGEON_MODE(PILLAR_OF_WOE, PILLAR_OF_WOE_H), false);
events.RepeatEvent(12000+rand()%8000);
break;
}
case EVENT_PARTING:
{
if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0))
me->CastSpell(target, PARTING_SORROW, false);
events.RepeatEvent(6000+rand()%10000);
break;
}
}
events.RepeatEvent(16000+rand()%6000);
break;
}
case EVENT_PILLAR:
{
if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0))
me->CastSpell(target, DUNGEON_MODE(PILLAR_OF_WOE, PILLAR_OF_WOE_H), false);
events.RepeatEvent(12000+rand()%8000);
break;
}
case EVENT_PARTING:
{
if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0))
me->CastSpell(target, PARTING_SORROW, false);
events.RepeatEvent(6000+rand()%10000);
break;
}
}
DoMeleeAttackIfReady();
}
DoMeleeAttackIfReady();
}
void JustDied(Unit* killer)
{
Talk(SAY_DEATH);
if (pInstance)
pInstance->SetData(BOSS_MAIDEN_OF_GRIEF, DONE);
}
void JustDied(Unit* killer)
{
Talk(SAY_DEATH);
if (pInstance)
pInstance->SetData(BOSS_MAIDEN_OF_GRIEF, DONE);
}
void KilledUnit(Unit *victim)
{
if (urand(0,1))
return;
void KilledUnit(Unit *victim)
{
if (urand(0,1))
return;
Talk(SAY_SLAY);
}
};
Talk(SAY_SLAY);
}
};
};
void AddSC_boss_maiden_of_grief()
{
new boss_maiden_of_grief();
new boss_maiden_of_grief();
}

View File

@@ -9,37 +9,37 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum Spells
{
// SJONNIR
SPELL_FRENZY = 28747, //at 20% hp
SPELL_CHAIN_LIGHTNING = 50830,
SPELL_CHAIN_LIGHTNING_H = 59844,
SPELL_LIGHTNING_SHIELD = 50831,
SPELL_LIGHTNING_SHIELD_H = 59845,
SPELL_STATIC_CHARGE = 50834,
SPELL_STATIC_CHARGE_H = 59846,
SPELL_LIGHTNING_RING = 50840,
SPELL_LIGHTNING_RING_H = 59848,
// SJONNIR
SPELL_FRENZY = 28747, //at 20% hp
SPELL_CHAIN_LIGHTNING = 50830,
SPELL_CHAIN_LIGHTNING_H = 59844,
SPELL_LIGHTNING_SHIELD = 50831,
SPELL_LIGHTNING_SHIELD_H = 59845,
SPELL_STATIC_CHARGE = 50834,
SPELL_STATIC_CHARGE_H = 59846,
SPELL_LIGHTNING_RING = 50840,
SPELL_LIGHTNING_RING_H = 59848,
// IRON SLUDGE
SPELL_TOXIC_VOLLEY = 50838,
SPELL_TOXIC_VOLLEY_H = 59853,
// IRON SLUDGE
SPELL_TOXIC_VOLLEY = 50838,
SPELL_TOXIC_VOLLEY_H = 59853,
// FORGED IRON DWARF
SPELL_LIGHTNING_TETHER = 50895,
SPELL_LIGHTNING_TETHER_H = 59851,
// FORGED IRON DWARF
SPELL_LIGHTNING_TETHER = 50895,
SPELL_LIGHTNING_TETHER_H = 59851,
// FORGED IRON TROGG
SPELL_LIGHTNING_SHOCK = 50900,
SPELL_LIGHTNING_SHOCK_H = 59852,
// FORGED IRON TROGG
SPELL_LIGHTNING_SHOCK = 50900,
SPELL_LIGHTNING_SHOCK_H = 59852,
};
enum Npc
{
NPC_IRON_SLUDGE = 28165, // if 2 ooze then spawn 1 iron_sludge
NPC_DWARFES_FRIENDLY = 27980, //after fix the machine by Brann
NPC_OOZE = 27981, //spawn after killing dwarf
NPC_FORGED_IRON_DWARF = 27982,
NPC_FORGED_IRON_TROGG = 27979,
NPC_IRON_SLUDGE = 28165, // if 2 ooze then spawn 1 iron_sludge
NPC_DWARFES_FRIENDLY = 27980, //after fix the machine by Brann
NPC_OOZE = 27981, //spawn after killing dwarf
NPC_FORGED_IRON_DWARF = 27982,
NPC_FORGED_IRON_TROGG = 27979,
};
enum Yells
@@ -51,44 +51,44 @@ enum Yells
enum Events
{
// SJONNIR
EVENT_SHIELD = 1,
EVENT_CHAIN_LIGHTNING = 2,
EVENT_STATIC_CHARGE = 3,
EVENT_LIGHTNING_RING = 4,
EVENT_CHECK_HEALTH = 5,
EVENT_SUMMON = 6,
EVENT_SUMMON_SPEACH = 7,
// SJONNIR
EVENT_SHIELD = 1,
EVENT_CHAIN_LIGHTNING = 2,
EVENT_STATIC_CHARGE = 3,
EVENT_LIGHTNING_RING = 4,
EVENT_CHECK_HEALTH = 5,
EVENT_SUMMON = 6,
EVENT_SUMMON_SPEACH = 7,
// TRASH
EVENT_MALFORMED_OOZE_CHECK = 10,
EVENT_TOXIC_VOLLEY = 11,
EVENT_FORGED_LIGHTNING_SHOCK = 12,
EVENT_FORGED_LIGHTNING_TETHER = 13,
// TRASH
EVENT_MALFORMED_OOZE_CHECK = 10,
EVENT_TOXIC_VOLLEY = 11,
EVENT_FORGED_LIGHTNING_SHOCK = 12,
EVENT_FORGED_LIGHTNING_TETHER = 13,
};
enum Misc
{
POS_GEN_RIGHT = 0,
POS_GEN_LEFT = 1,
POS_ROOM_CENTER = 2,
POS_GEN_RIGHT = 0,
POS_GEN_LEFT = 1,
POS_ROOM_CENTER = 2,
// ACTIONS
ACTION_SLUG_KILLED = 1,
// ACTIONS
ACTION_SLUG_KILLED = 1,
};
enum SummonPhases
{
PHASE_SUMMON_UNFRIENDLY_DWARFES = 0,
PHASE_SUMMON_OOZE = 1,
PHASE_SUMMON_FRIENDLY_DWARFES = 2,
PHASE_SUMMON_UNFRIENDLY_DWARFES = 0,
PHASE_SUMMON_OOZE = 1,
PHASE_SUMMON_FRIENDLY_DWARFES = 2,
};
static Position RoomPosition[] =
{
{1293.0f, 610.0f, 199.3f},
{1294.2f, 724.3f, 199.3f},
{1295.2f, 667.1f, 189.7f},
{1293.0f, 610.0f, 199.3f},
{1294.2f, 724.3f, 199.3f},
{1295.2f, 667.1f, 189.7f},
};
class boss_sjonnir : public CreatureScript
@@ -101,278 +101,278 @@ public:
return new boss_sjonnirAI (pCreature);
}
struct boss_sjonnirAI : public ScriptedAI
{
boss_sjonnirAI(Creature *c) : ScriptedAI(c), summons(me)
{
pInstance = c->GetInstanceScript();
}
struct boss_sjonnirAI : public ScriptedAI
{
boss_sjonnirAI(Creature *c) : ScriptedAI(c), summons(me)
{
pInstance = c->GetInstanceScript();
}
InstanceScript* pInstance;
EventMap events;
SummonList summons;
InstanceScript* pInstance;
EventMap events;
SummonList summons;
uint8 SummonPhase;
uint8 SlugeCount;
uint8 SummonPhase;
uint8 SlugeCount;
void Reset()
{
events.Reset();
summons.DespawnAll();
void Reset()
{
events.Reset();
summons.DespawnAll();
SlugeCount = 0;
SummonPhase = PHASE_SUMMON_UNFRIENDLY_DWARFES;
SlugeCount = 0;
SummonPhase = PHASE_SUMMON_UNFRIENDLY_DWARFES;
if (pInstance)
{
pInstance->SetData(BOSS_SJONNIR, NOT_STARTED);
pInstance->SetData(DATA_SJONNIR_ACHIEVEMENT, false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
if (pInstance->GetData(BOSS_TRIBUNAL_OF_AGES) == DONE)
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
if (GameObject *doors = me->GetMap()->GetGameObject(pInstance->GetData64(GO_SJONNIR_DOOR)))
doors->SetGoState(GO_STATE_ACTIVE);
if (pInstance)
{
pInstance->SetData(BOSS_SJONNIR, NOT_STARTED);
pInstance->SetData(DATA_SJONNIR_ACHIEVEMENT, false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
if (pInstance->GetData(BOSS_TRIBUNAL_OF_AGES) == DONE)
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
if (GameObject *doors = me->GetMap()->GetGameObject(pInstance->GetData64(GO_SJONNIR_DOOR)))
doors->SetGoState(GO_STATE_ACTIVE);
if (GameObject *console = me->GetMap()->GetGameObject( pInstance->GetData64(GO_SJONNIR_CONSOLE)))
console->SetGoState(GO_STATE_READY);
if (GameObject *console = me->GetMap()->GetGameObject( pInstance->GetData64(GO_SJONNIR_CONSOLE)))
console->SetGoState(GO_STATE_READY);
if (Creature *brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN)))
{
brann->setDeathState(JUST_DIED);
brann->Respawn();
brann->AI()->DoAction(5);
}
}
}
}
if (Creature *brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN)))
{
brann->setDeathState(JUST_DIED);
brann->Respawn();
brann->AI()->DoAction(5);
}
}
}
}
void EnterCombat(Unit* who)
{
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
events.ScheduleEvent(EVENT_SHIELD, 14000 + rand()%5000);
events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 6000 + rand()%6000);
events.ScheduleEvent(EVENT_STATIC_CHARGE, 24000);
events.ScheduleEvent(EVENT_LIGHTNING_RING, 25000 + rand()%6000);
events.ScheduleEvent(EVENT_SUMMON, 20000);
events.ScheduleEvent(EVENT_SUMMON, 21500);
events.ScheduleEvent(EVENT_SUMMON_SPEACH, 20000);
void EnterCombat(Unit* who)
{
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
events.ScheduleEvent(EVENT_SHIELD, 14000 + rand()%5000);
events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 6000 + rand()%6000);
events.ScheduleEvent(EVENT_STATIC_CHARGE, 24000);
events.ScheduleEvent(EVENT_LIGHTNING_RING, 25000 + rand()%6000);
events.ScheduleEvent(EVENT_SUMMON, 20000);
events.ScheduleEvent(EVENT_SUMMON, 21500);
events.ScheduleEvent(EVENT_SUMMON_SPEACH, 20000);
if (pInstance)
{
pInstance->SetData(BOSS_SJONNIR, IN_PROGRESS);
if (pInstance)
{
pInstance->SetData(BOSS_SJONNIR, IN_PROGRESS);
if (GameObject *doors = me->GetMap()->GetGameObject(pInstance->GetData64(GO_SJONNIR_DOOR)))
doors->SetGoState(GO_STATE_READY);
if (pInstance->GetData(BOSS_TRIBUNAL_OF_AGES) == DONE)
if (Creature *brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN)))
brann->AI()->DoAction(3);
}
}
if (GameObject *doors = me->GetMap()->GetGameObject(pInstance->GetData64(GO_SJONNIR_DOOR)))
doors->SetGoState(GO_STATE_READY);
if (pInstance->GetData(BOSS_TRIBUNAL_OF_AGES) == DONE)
if (Creature *brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN)))
brann->AI()->DoAction(3);
}
}
void DoAction(int32 param)
{
if (param == ACTION_SLUG_KILLED)
{
SlugeCount++;
if (SlugeCount >= 5 && pInstance)
pInstance->SetData(DATA_SJONNIR_ACHIEVEMENT, true);
}
}
void DoAction(int32 param)
{
if (param == ACTION_SLUG_KILLED)
{
SlugeCount++;
if (SlugeCount >= 5 && pInstance)
pInstance->SetData(DATA_SJONNIR_ACHIEVEMENT, true);
}
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
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_CHECK_HEALTH:
{
if (SummonPhase == PHASE_SUMMON_UNFRIENDLY_DWARFES && HealthBelowPct(50))
{
SummonPhase = PHASE_SUMMON_OOZE;
events.CancelEvent(EVENT_SUMMON);
events.ScheduleEvent(EVENT_SUMMON, 0);
events.ScheduleEvent(EVENT_SUMMON, 1500);
switch (events.GetEvent())
{
case EVENT_CHECK_HEALTH:
{
if (SummonPhase == PHASE_SUMMON_UNFRIENDLY_DWARFES && HealthBelowPct(50))
{
SummonPhase = PHASE_SUMMON_OOZE;
events.CancelEvent(EVENT_SUMMON);
events.ScheduleEvent(EVENT_SUMMON, 0);
events.ScheduleEvent(EVENT_SUMMON, 1500);
if (pInstance)
if (Creature *brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN)))
{
brann->MonsterYell("What in the name o' Madoran did THAT do? Oh! Wait: I just about got it...", LANG_UNIVERSAL, 0);
brann->PlayDirectSound(14276);
}
}
if (pInstance)
if (Creature *brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN)))
{
brann->MonsterYell("What in the name o' Madoran did THAT do? Oh! Wait: I just about got it...", LANG_UNIVERSAL, 0);
brann->PlayDirectSound(14276);
}
}
if (HealthBelowPct(20))
{
if (Creature *brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN)))
{
brann->MonsterYell("Ha, that did it! Help's a-comin'! Take this, ya glowin' iron brute!", LANG_UNIVERSAL, 0);
brann->PlayDirectSound(14277);
}
SummonPhase = PHASE_SUMMON_FRIENDLY_DWARFES;
me->CastSpell(me, SPELL_FRENZY, false);
if (HealthBelowPct(20))
{
if (Creature *brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN)))
{
brann->MonsterYell("Ha, that did it! Help's a-comin'! Take this, ya glowin' iron brute!", LANG_UNIVERSAL, 0);
brann->PlayDirectSound(14277);
}
SummonPhase = PHASE_SUMMON_FRIENDLY_DWARFES;
me->CastSpell(me, SPELL_FRENZY, false);
events.CancelEvent(EVENT_SUMMON);
events.ScheduleEvent(EVENT_SUMMON, 0);
events.PopEvent();
break;
}
events.CancelEvent(EVENT_SUMMON);
events.ScheduleEvent(EVENT_SUMMON, 0);
events.PopEvent();
break;
}
events.RepeatEvent(1000);
break;
}
case EVENT_SHIELD:
{
me->CastSpell(me, DUNGEON_MODE(SPELL_LIGHTNING_SHIELD, SPELL_LIGHTNING_SHIELD_H), false);
events.RepeatEvent(14000 + rand()%5000);
break;
}
case EVENT_CHAIN_LIGHTNING:
{
if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0))
me->CastSpell(target, DUNGEON_MODE(SPELL_CHAIN_LIGHTNING, SPELL_CHAIN_LIGHTNING_H), false);
events.RepeatEvent(1000);
break;
}
case EVENT_SHIELD:
{
me->CastSpell(me, DUNGEON_MODE(SPELL_LIGHTNING_SHIELD, SPELL_LIGHTNING_SHIELD_H), false);
events.RepeatEvent(14000 + rand()%5000);
break;
}
case EVENT_CHAIN_LIGHTNING:
{
if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0))
me->CastSpell(target, DUNGEON_MODE(SPELL_CHAIN_LIGHTNING, SPELL_CHAIN_LIGHTNING_H), false);
events.RepeatEvent(6000 + rand()%6000);
break;
}
case EVENT_STATIC_CHARGE:
{
if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0))
me->CastSpell(target, DUNGEON_MODE(SPELL_STATIC_CHARGE, SPELL_STATIC_CHARGE_H), false);
events.RepeatEvent(6000 + rand()%6000);
break;
}
case EVENT_STATIC_CHARGE:
{
if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true, 0))
me->CastSpell(target, DUNGEON_MODE(SPELL_STATIC_CHARGE, SPELL_STATIC_CHARGE_H), false);
events.RepeatEvent(20000);
break;
}
case EVENT_LIGHTNING_RING:
{
me->CastSpell(me, DUNGEON_MODE(SPELL_LIGHTNING_RING, SPELL_LIGHTNING_RING_H), false);
events.RepeatEvent(25000 + rand()%6000);
events.DelayEvents(10000); // Channel duration
break;
}
case EVENT_SUMMON_SPEACH:
{
if (Creature *brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN)))
{
brann->MonsterYell("This is a wee bit trickier that before... Oh, bloody--incomin'!", LANG_UNIVERSAL, 0);
brann->PlayDirectSound(14275);
}
events.RepeatEvent(20000);
break;
}
case EVENT_LIGHTNING_RING:
{
me->CastSpell(me, DUNGEON_MODE(SPELL_LIGHTNING_RING, SPELL_LIGHTNING_RING_H), false);
events.RepeatEvent(25000 + rand()%6000);
events.DelayEvents(10000); // Channel duration
break;
}
case EVENT_SUMMON_SPEACH:
{
if (Creature *brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN)))
{
brann->MonsterYell("This is a wee bit trickier that before... Oh, bloody--incomin'!", LANG_UNIVERSAL, 0);
brann->PlayDirectSound(14275);
}
events.PopEvent();
break;
}
case EVENT_SUMMON:
{
switch (SummonPhase)
{
case PHASE_SUMMON_UNFRIENDLY_DWARFES:
{
SummonDwarfes(false);
events.RepeatEvent(20000);
break;
}
case PHASE_SUMMON_OOZE:
{
for (uint8 i = POS_GEN_RIGHT; i <= POS_GEN_LEFT; i++)
{
if (Creature* ooze = me->SummonCreature(NPC_OOZE, RoomPosition[i].GetPositionX(), RoomPosition[i].GetPositionY(), RoomPosition[i].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
{
ActivatePipe(i);
ooze->GetMotionMaster()->MovePoint(0, RoomPosition[POS_ROOM_CENTER].GetPositionX(), RoomPosition[POS_ROOM_CENTER].GetPositionY(), RoomPosition[POS_ROOM_CENTER].GetPositionZ());
summons.Summon(ooze);
}
}
events.RepeatEvent(10000);
break;
}
case PHASE_SUMMON_FRIENDLY_DWARFES:
{
SummonDwarfes(true);
events.PopEvent();
break;
}
}
break;
}
}
DoMeleeAttackIfReady();
}
events.PopEvent();
break;
}
case EVENT_SUMMON:
{
switch (SummonPhase)
{
case PHASE_SUMMON_UNFRIENDLY_DWARFES:
{
SummonDwarfes(false);
events.RepeatEvent(20000);
break;
}
case PHASE_SUMMON_OOZE:
{
for (uint8 i = POS_GEN_RIGHT; i <= POS_GEN_LEFT; i++)
{
if (Creature* ooze = me->SummonCreature(NPC_OOZE, RoomPosition[i].GetPositionX(), RoomPosition[i].GetPositionY(), RoomPosition[i].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
{
ActivatePipe(i);
ooze->GetMotionMaster()->MovePoint(0, RoomPosition[POS_ROOM_CENTER].GetPositionX(), RoomPosition[POS_ROOM_CENTER].GetPositionY(), RoomPosition[POS_ROOM_CENTER].GetPositionZ());
summons.Summon(ooze);
}
}
events.RepeatEvent(10000);
break;
}
case PHASE_SUMMON_FRIENDLY_DWARFES:
{
SummonDwarfes(true);
events.PopEvent();
break;
}
}
break;
}
}
DoMeleeAttackIfReady();
}
void JustDied(Unit* killer)
{
Talk(SAY_DEATH);
void JustDied(Unit* killer)
{
Talk(SAY_DEATH);
summons.DespawnAll();
if (pInstance)
{
pInstance->SetData(BOSS_SJONNIR, DONE);
if (GameObject *sd = me->GetMap()->GetGameObject(pInstance->GetData64(GO_SJONNIR_DOOR)))
sd->SetGoState(GO_STATE_ACTIVE);
summons.DespawnAll();
if (pInstance)
{
pInstance->SetData(BOSS_SJONNIR, DONE);
if (GameObject *sd = me->GetMap()->GetGameObject(pInstance->GetData64(GO_SJONNIR_DOOR)))
sd->SetGoState(GO_STATE_ACTIVE);
if (Creature *brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN)))
brann->AI()->DoAction(4);
}
}
if (Creature *brann = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_BRANN)))
brann->AI()->DoAction(4);
}
}
void KilledUnit(Unit *victim)
{
if (urand(0,1))
return;
void KilledUnit(Unit *victim)
{
if (urand(0,1))
return;
Talk(SAY_SLAY);
}
Talk(SAY_SLAY);
}
void ActivatePipe(uint8 side)
{
if (pInstance)
if (GameObject *pipe = me->GetMap()->GetGameObject(pInstance->GetData64(side == POS_GEN_RIGHT ? GO_RIGHT_PIPE : GO_LEFT_PIPE)))
pipe->SendCustomAnim(0);
}
void ActivatePipe(uint8 side)
{
if (pInstance)
if (GameObject *pipe = me->GetMap()->GetGameObject(pInstance->GetData64(side == POS_GEN_RIGHT ? GO_RIGHT_PIPE : GO_LEFT_PIPE)))
pipe->SendCustomAnim(0);
}
void SummonDwarfes(bool friendly)
{
if (friendly)
{
for (int i = 0; i < 3; i++)
{
uint8 Pos = urand(POS_GEN_RIGHT, POS_GEN_LEFT);
if (Creature* dwarf = me->SummonCreature(NPC_DWARFES_FRIENDLY, RoomPosition[Pos].GetPositionX(), RoomPosition[Pos].GetPositionY() , RoomPosition[Pos].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
{
if (Player *plr = SelectTargetFromPlayerList(100.0f))
dwarf->setFaction(plr->getFaction());
void SummonDwarfes(bool friendly)
{
if (friendly)
{
for (int i = 0; i < 3; i++)
{
uint8 Pos = urand(POS_GEN_RIGHT, POS_GEN_LEFT);
if (Creature* dwarf = me->SummonCreature(NPC_DWARFES_FRIENDLY, RoomPosition[Pos].GetPositionX(), RoomPosition[Pos].GetPositionY() , RoomPosition[Pos].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
{
if (Player *plr = SelectTargetFromPlayerList(100.0f))
dwarf->setFaction(plr->getFaction());
ActivatePipe(Pos);
dwarf->AI()->AttackStart(me);
summons.Summon(dwarf);
}
}
}
else
{
for (int i = 0; i < 2; i++)
{
uint8 Pos = urand(POS_GEN_RIGHT, POS_GEN_LEFT);
if (Creature* dwarf = me->SummonCreature(urand(0,1) ? NPC_FORGED_IRON_TROGG : NPC_FORGED_IRON_DWARF, RoomPosition[Pos].GetPositionX(), RoomPosition[Pos].GetPositionY() , RoomPosition[Pos].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
{
ActivatePipe(Pos);
dwarf->SetInCombatWithZone();
summons.Summon(dwarf);
}
}
}
}
};
ActivatePipe(Pos);
dwarf->AI()->AttackStart(me);
summons.Summon(dwarf);
}
}
}
else
{
for (int i = 0; i < 2; i++)
{
uint8 Pos = urand(POS_GEN_RIGHT, POS_GEN_LEFT);
if (Creature* dwarf = me->SummonCreature(urand(0,1) ? NPC_FORGED_IRON_TROGG : NPC_FORGED_IRON_DWARF, RoomPosition[Pos].GetPositionX(), RoomPosition[Pos].GetPositionY() , RoomPosition[Pos].GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
{
ActivatePipe(Pos);
dwarf->SetInCombatWithZone();
summons.Summon(dwarf);
}
}
}
}
};
};
class boss_sjonnir_dwarf : public CreatureScript
@@ -385,18 +385,18 @@ public:
return new boss_sjonnir_dwarfAI (pCreature);
}
struct boss_sjonnir_dwarfAI : public ScriptedAI
{
boss_sjonnir_dwarfAI(Creature *c) : ScriptedAI(c) { }
struct boss_sjonnir_dwarfAI : public ScriptedAI
{
boss_sjonnir_dwarfAI(Creature *c) : ScriptedAI(c) { }
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
DoSpellAttackIfReady((me->GetEntry() == NPC_FORGED_IRON_DWARF) ? DUNGEON_MODE(SPELL_LIGHTNING_TETHER, SPELL_LIGHTNING_TETHER_H) : DUNGEON_MODE(SPELL_LIGHTNING_SHOCK, SPELL_LIGHTNING_SHOCK_H));
}
};
DoSpellAttackIfReady((me->GetEntry() == NPC_FORGED_IRON_DWARF) ? DUNGEON_MODE(SPELL_LIGHTNING_TETHER, SPELL_LIGHTNING_TETHER_H) : DUNGEON_MODE(SPELL_LIGHTNING_SHOCK, SPELL_LIGHTNING_SHOCK_H));
}
};
};
class boss_sjonnir_iron_sludge : public CreatureScript
@@ -409,49 +409,49 @@ public:
return new boss_sjonnir_iron_sludgeAI (pCreature);
}
struct boss_sjonnir_iron_sludgeAI : public ScriptedAI
{
boss_sjonnir_iron_sludgeAI(Creature *c) : ScriptedAI(c) { }
EventMap events;
void Reset()
{
events.Reset();
}
struct boss_sjonnir_iron_sludgeAI : public ScriptedAI
{
boss_sjonnir_iron_sludgeAI(Creature *c) : ScriptedAI(c) { }
EventMap events;
void Reset()
{
events.Reset();
}
void EnterCombat(Unit *)
{
events.ScheduleEvent(EVENT_TOXIC_VOLLEY, 5000);
}
void JustDied(Unit* killer)
{
if (InstanceScript *pInstance = me->GetInstanceScript())
if (Creature *sjonnir = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_SJONNIR)))
sjonnir->AI()->DoAction(ACTION_SLUG_KILLED);
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void EnterCombat(Unit *)
{
events.ScheduleEvent(EVENT_TOXIC_VOLLEY, 5000);
}
void JustDied(Unit* killer)
{
if (InstanceScript *pInstance = me->GetInstanceScript())
if (Creature *sjonnir = ObjectAccessor::GetCreature(*me, pInstance->GetData64(NPC_SJONNIR)))
sjonnir->AI()->DoAction(ACTION_SLUG_KILLED);
}
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())
{
// Every 5 seconds
case EVENT_TOXIC_VOLLEY:
{
me->CastSpell(me, DUNGEON_MODE(SPELL_TOXIC_VOLLEY, SPELL_TOXIC_VOLLEY_H), false);
events.RepeatEvent(5000);
break;
}
}
switch (events.GetEvent())
{
// Every 5 seconds
case EVENT_TOXIC_VOLLEY:
{
me->CastSpell(me, DUNGEON_MODE(SPELL_TOXIC_VOLLEY, SPELL_TOXIC_VOLLEY_H), false);
events.RepeatEvent(5000);
break;
}
}
DoMeleeAttackIfReady();
}
};
DoMeleeAttackIfReady();
}
};
};
//OOZE
@@ -465,51 +465,51 @@ public:
return new boss_sjonnir_malformed_oozeAI (pCreature);
}
struct boss_sjonnir_malformed_oozeAI : public ScriptedAI
{
boss_sjonnir_malformed_oozeAI(Creature *c) : ScriptedAI(c) { }
struct boss_sjonnir_malformed_oozeAI : public ScriptedAI
{
boss_sjonnir_malformed_oozeAI(Creature *c) : ScriptedAI(c) { }
EventMap events;
void MovementInform(uint32 type, uint32 point)
{
if (type == POINT_MOTION_TYPE && point == 0)
events.RescheduleEvent(EVENT_MALFORMED_OOZE_CHECK, 1000);
}
EventMap events;
void MovementInform(uint32 type, uint32 point)
{
if (type == POINT_MOTION_TYPE && point == 0)
events.RescheduleEvent(EVENT_MALFORMED_OOZE_CHECK, 1000);
}
void EnterCombat(Unit *) { }
void MoveInLineOfSight(Unit *) { }
void EnterCombat(Unit *) { }
void MoveInLineOfSight(Unit *) { }
void UpdateAI(uint32 diff)
{
events.Update(diff);
switch (events.GetEvent())
{
case EVENT_MALFORMED_OOZE_CHECK:
{
std::list<Creature*> oozeList;
me->GetCreaturesWithEntryInRange(oozeList, 5.0f, NPC_OOZE);
for (std::list<Creature*>::const_iterator itr = oozeList.begin(); itr != oozeList.end(); ++itr)
if ((*itr)->GetGUID() != me->GetGUID() && (*itr)->IsAlive() && me->IsAlive())
if (Creature* is = me->SummonCreature(NPC_IRON_SLUDGE, me->GetPositionX(), me->GetPositionY() , me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 20000))
{
Unit::Kill(me, me);
Unit::Kill(*itr, *itr);
is->SetInCombatWithZone();
break;
}
void UpdateAI(uint32 diff)
{
events.Update(diff);
switch (events.GetEvent())
{
case EVENT_MALFORMED_OOZE_CHECK:
{
std::list<Creature*> oozeList;
me->GetCreaturesWithEntryInRange(oozeList, 5.0f, NPC_OOZE);
for (std::list<Creature*>::const_iterator itr = oozeList.begin(); itr != oozeList.end(); ++itr)
if ((*itr)->GetGUID() != me->GetGUID() && (*itr)->IsAlive() && me->IsAlive())
if (Creature* is = me->SummonCreature(NPC_IRON_SLUDGE, me->GetPositionX(), me->GetPositionY() , me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 20000))
{
Unit::Kill(me, me);
Unit::Kill(*itr, *itr);
is->SetInCombatWithZone();
break;
}
events.RepeatEvent(1000);
break;
}
}
}
};
events.RepeatEvent(1000);
break;
}
}
}
};
};
void AddSC_boss_sjonnir()
{
new boss_sjonnir();
new boss_sjonnir_dwarf();
new boss_sjonnir_malformed_ooze();
new boss_sjonnir_iron_sludge();
new boss_sjonnir();
new boss_sjonnir_dwarf();
new boss_sjonnir_malformed_ooze();
new boss_sjonnir_iron_sludge();
}

View File

@@ -7,39 +7,39 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum Encounter
{
BOSS_KRYSTALLUS = 0,
BOSS_MAIDEN_OF_GRIEF = 1,
BOSS_TRIBUNAL_OF_AGES = 2,
BOSS_SJONNIR = 3,
BRANN_BRONZEBEARD = 4,
MAX_ENCOUNTER = 5,
BOSS_KRYSTALLUS = 0,
BOSS_MAIDEN_OF_GRIEF = 1,
BOSS_TRIBUNAL_OF_AGES = 2,
BOSS_SJONNIR = 3,
BRANN_BRONZEBEARD = 4,
MAX_ENCOUNTER = 5,
DATA_BRANN_ACHIEVEMENT,
DATA_SJONNIR_ACHIEVEMENT,
DATA_BRANN_ACHIEVEMENT,
DATA_SJONNIR_ACHIEVEMENT,
};
enum gobjects
{
GO_TRIBUNAL_CONSOLE = 193907,
GO_KADDRAK = 191671,
GO_MARNAK = 191670,
GO_ABEDNEUM = 191669,
GO_SKY_FLOOR = 191527,
GO_SJONNIR_CONSOLE = 193906,
GO_SJONNIR_DOOR = 191296,
GO_TRIBUNAL_CHEST = 190586,
GO_TRIBUNAL_CHEST_H = 193996,
GO_LEFT_PIPE = 192163,
GO_RIGHT_PIPE = 192164,
GO_TRIBUNAL_CONSOLE = 193907,
GO_KADDRAK = 191671,
GO_MARNAK = 191670,
GO_ABEDNEUM = 191669,
GO_SKY_FLOOR = 191527,
GO_SJONNIR_CONSOLE = 193906,
GO_SJONNIR_DOOR = 191296,
GO_TRIBUNAL_CHEST = 190586,
GO_TRIBUNAL_CHEST_H = 193996,
GO_LEFT_PIPE = 192163,
GO_RIGHT_PIPE = 192164,
};
enum npcs
{
NPC_KADDRAK = 30898,
NPC_MARNAK = 30897,
NPC_ABEDNEUM = 30899,
NPC_SJONNIR = 27978,
NPC_BRANN = 28070,
NPC_KADDRAK = 30898,
NPC_MARNAK = 30897,
NPC_ABEDNEUM = 30899,
NPC_SJONNIR = 27978,
NPC_BRANN = 28070,
};
#endif

View File

@@ -17,237 +17,237 @@ public:
}
struct instance_halls_of_stone_InstanceMapScript : public InstanceScript
{
instance_halls_of_stone_InstanceMapScript(Map* map) : InstanceScript(map){ Initialize(); }
{
instance_halls_of_stone_InstanceMapScript(Map* map) : InstanceScript(map){ Initialize(); }
uint32 Encounter[MAX_ENCOUNTER];
uint32 Encounter[MAX_ENCOUNTER];
uint64 goKaddrakGUID;
uint64 goMarnakGUID;
uint64 goAbedneumGUID;
uint64 goTribunalConsoleGUID;
uint64 goSkyRoomFloorGUID;
uint64 goSjonnirConsoleGUID;
uint64 goSjonnirDoorGUID;
uint64 goLeftPipeGUID;
uint64 goRightPipeGUID;
uint64 goKaddrakGUID;
uint64 goMarnakGUID;
uint64 goAbedneumGUID;
uint64 goTribunalConsoleGUID;
uint64 goSkyRoomFloorGUID;
uint64 goSjonnirConsoleGUID;
uint64 goSjonnirDoorGUID;
uint64 goLeftPipeGUID;
uint64 goRightPipeGUID;
uint64 SjonnirGUID;
uint64 BrannGUID;
uint64 SjonnirGUID;
uint64 BrannGUID;
bool brannAchievement;
bool sjonnirAchievement;
bool brannAchievement;
bool sjonnirAchievement;
void Initialize()
{
memset(&Encounter, 0, sizeof(Encounter));
void Initialize()
{
memset(&Encounter, 0, sizeof(Encounter));
goKaddrakGUID = 0;
goMarnakGUID = 0;
goAbedneumGUID = 0;
goTribunalConsoleGUID = 0;
goSkyRoomFloorGUID = 0;
goSjonnirConsoleGUID = 0;
goSjonnirDoorGUID = 0;
goLeftPipeGUID = 0;
goRightPipeGUID = 0;
goKaddrakGUID = 0;
goMarnakGUID = 0;
goAbedneumGUID = 0;
goTribunalConsoleGUID = 0;
goSkyRoomFloorGUID = 0;
goSjonnirConsoleGUID = 0;
goSjonnirDoorGUID = 0;
goLeftPipeGUID = 0;
goRightPipeGUID = 0;
SjonnirGUID = 0;
BrannGUID = 0;
SjonnirGUID = 0;
BrannGUID = 0;
brannAchievement = false;
sjonnirAchievement = false;
}
brannAchievement = false;
sjonnirAchievement = false;
}
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
{
if (Encounter[i] == IN_PROGRESS)
return true;
}
return false;
}
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
{
if (Encounter[i] == IN_PROGRESS)
return true;
}
return false;
}
void OnGameObjectCreate(GameObject *go)
{
switch(go->GetEntry())
{
case GO_KADDRAK:
goKaddrakGUID = go->GetGUID();
break;
case GO_ABEDNEUM:
goAbedneumGUID = go->GetGUID();
if (Encounter[BOSS_TRIBUNAL_OF_AGES] == DONE)
go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_MARNAK:
goMarnakGUID = go->GetGUID();
break;
case GO_TRIBUNAL_CONSOLE:
goTribunalConsoleGUID = go->GetGUID();
break;
case GO_SKY_FLOOR:
goSkyRoomFloorGUID = go->GetGUID();
if (Encounter[BOSS_TRIBUNAL_OF_AGES] == DONE)
go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_SJONNIR_CONSOLE:
goSjonnirConsoleGUID = go->GetGUID();
break;
case GO_SJONNIR_DOOR:
goSjonnirDoorGUID = go->GetGUID();
if (Encounter[BOSS_TRIBUNAL_OF_AGES] == DONE)
go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_LEFT_PIPE:
goLeftPipeGUID = go->GetGUID();
break;
case GO_RIGHT_PIPE:
goRightPipeGUID = go->GetGUID();
break;
}
}
void OnGameObjectCreate(GameObject *go)
{
switch(go->GetEntry())
{
case GO_KADDRAK:
goKaddrakGUID = go->GetGUID();
break;
case GO_ABEDNEUM:
goAbedneumGUID = go->GetGUID();
if (Encounter[BOSS_TRIBUNAL_OF_AGES] == DONE)
go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_MARNAK:
goMarnakGUID = go->GetGUID();
break;
case GO_TRIBUNAL_CONSOLE:
goTribunalConsoleGUID = go->GetGUID();
break;
case GO_SKY_FLOOR:
goSkyRoomFloorGUID = go->GetGUID();
if (Encounter[BOSS_TRIBUNAL_OF_AGES] == DONE)
go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_SJONNIR_CONSOLE:
goSjonnirConsoleGUID = go->GetGUID();
break;
case GO_SJONNIR_DOOR:
goSjonnirDoorGUID = go->GetGUID();
if (Encounter[BOSS_TRIBUNAL_OF_AGES] == DONE)
go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_LEFT_PIPE:
goLeftPipeGUID = go->GetGUID();
break;
case GO_RIGHT_PIPE:
goRightPipeGUID = go->GetGUID();
break;
}
}
void OnCreatureCreate(Creature *creature)
{
switch(creature->GetEntry())
{
case NPC_SJONNIR:
SjonnirGUID = creature->GetGUID();
break;
case NPC_BRANN:
BrannGUID = creature->GetGUID();
break;
}
}
void OnCreatureCreate(Creature *creature)
{
switch(creature->GetEntry())
{
case NPC_SJONNIR:
SjonnirGUID = creature->GetGUID();
break;
case NPC_BRANN:
BrannGUID = creature->GetGUID();
break;
}
}
uint64 GetData64(uint32 id) const
{
switch(id)
{
case GO_TRIBUNAL_CONSOLE: return goTribunalConsoleGUID;
case GO_SJONNIR_CONSOLE: return goSjonnirConsoleGUID;
case GO_SJONNIR_DOOR: return goSjonnirDoorGUID;
case GO_LEFT_PIPE: return goLeftPipeGUID;
case GO_RIGHT_PIPE: return goRightPipeGUID;
case GO_KADDRAK: return goKaddrakGUID;
case GO_MARNAK: return goMarnakGUID;
case GO_ABEDNEUM: return goAbedneumGUID;
uint64 GetData64(uint32 id) const
{
switch(id)
{
case GO_TRIBUNAL_CONSOLE: return goTribunalConsoleGUID;
case GO_SJONNIR_CONSOLE: return goSjonnirConsoleGUID;
case GO_SJONNIR_DOOR: return goSjonnirDoorGUID;
case GO_LEFT_PIPE: return goLeftPipeGUID;
case GO_RIGHT_PIPE: return goRightPipeGUID;
case GO_KADDRAK: return goKaddrakGUID;
case GO_MARNAK: return goMarnakGUID;
case GO_ABEDNEUM: return goAbedneumGUID;
case NPC_SJONNIR: return SjonnirGUID;
case NPC_BRANN: return BrannGUID;
}
return 0;
}
case NPC_SJONNIR: return SjonnirGUID;
case NPC_BRANN: return BrannGUID;
}
return 0;
}
uint32 GetData(uint32 id) const
{
switch(id)
{
case BOSS_KRYSTALLUS:
case BOSS_MAIDEN_OF_GRIEF:
case BOSS_TRIBUNAL_OF_AGES:
case BOSS_SJONNIR:
case BRANN_BRONZEBEARD:
return Encounter[id];
}
return 0;
}
uint32 GetData(uint32 id) const
{
switch(id)
{
case BOSS_KRYSTALLUS:
case BOSS_MAIDEN_OF_GRIEF:
case BOSS_TRIBUNAL_OF_AGES:
case BOSS_SJONNIR:
case BRANN_BRONZEBEARD:
return Encounter[id];
}
return 0;
}
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0)
{
switch(criteria_id)
{
case 7590: // Brann Spankin' New (2154)
return brannAchievement;
case 7593: // Abuse the Ooze (2155)
return sjonnirAchievement;
}
return false;
}
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0)
{
switch(criteria_id)
{
case 7590: // Brann Spankin' New (2154)
return brannAchievement;
case 7593: // Abuse the Ooze (2155)
return sjonnirAchievement;
}
return false;
}
void SetData(uint32 type, uint32 data)
{
if (type < MAX_ENCOUNTER)
Encounter[type] = data;
void SetData(uint32 type, uint32 data)
{
if (type < MAX_ENCOUNTER)
Encounter[type] = data;
if (type == BOSS_TRIBUNAL_OF_AGES && data == DONE)
{
if (GameObject* pA = instance->GetGameObject(goAbedneumGUID))
pA->SetGoState(GO_STATE_ACTIVE);
if (GameObject* pF = instance->GetGameObject(goSkyRoomFloorGUID))
pF->SetGoState(GO_STATE_ACTIVE);
if (type == BOSS_TRIBUNAL_OF_AGES && data == DONE)
{
if (GameObject* pA = instance->GetGameObject(goAbedneumGUID))
pA->SetGoState(GO_STATE_ACTIVE);
if (GameObject* pF = instance->GetGameObject(goSkyRoomFloorGUID))
pF->SetGoState(GO_STATE_ACTIVE);
// Make sjonnir attackable
if (Creature *cr = instance->GetCreature(SjonnirGUID))
cr->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
if (type == BOSS_TRIBUNAL_OF_AGES && data == NOT_STARTED)
{
if (GameObject* pA = instance->GetGameObject(goAbedneumGUID))
pA->SetGoState(GO_STATE_READY);
if (GameObject* pF = instance->GetGameObject(goSkyRoomFloorGUID))
pF->SetGoState(GO_STATE_READY);
}
// Make sjonnir attackable
if (Creature *cr = instance->GetCreature(SjonnirGUID))
cr->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
if (type == BOSS_TRIBUNAL_OF_AGES && data == NOT_STARTED)
{
if (GameObject* pA = instance->GetGameObject(goAbedneumGUID))
pA->SetGoState(GO_STATE_READY);
if (GameObject* pF = instance->GetGameObject(goSkyRoomFloorGUID))
pF->SetGoState(GO_STATE_READY);
}
if (type == DATA_BRANN_ACHIEVEMENT)
{
brannAchievement = (bool)data;
return;
}
if (type == DATA_SJONNIR_ACHIEVEMENT)
{
sjonnirAchievement = (bool)data;
return;
}
if (data == DONE)
SaveToDB();
}
if (type == DATA_BRANN_ACHIEVEMENT)
{
brannAchievement = (bool)data;
return;
}
if (type == DATA_SJONNIR_ACHIEVEMENT)
{
sjonnirAchievement = (bool)data;
return;
}
if (data == DONE)
SaveToDB();
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "H O S " << Encounter[0] << ' ' << Encounter[1] << ' ' << Encounter[2] << ' ' << Encounter[3] << ' ' << Encounter[4];
std::ostringstream saveStream;
saveStream << "H O S " << Encounter[0] << ' ' << Encounter[1] << ' ' << Encounter[2] << ' ' << Encounter[3] << ' ' << Encounter[4];
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
void Load(const char* strIn)
{
if (!strIn)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
void Load(const char* strIn)
{
if (!strIn)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(strIn);
OUT_LOAD_INST_DATA(strIn);
char dataHead1, dataHead2, dataHead3;
char dataHead1, dataHead2, dataHead3;
std::istringstream loadStream(strIn);
loadStream >> dataHead1 >> dataHead2 >> dataHead3;
std::istringstream loadStream(strIn);
loadStream >> dataHead1 >> dataHead2 >> dataHead3;
if (dataHead1 == 'H' && dataHead2 == 'O' && dataHead3 == 'S')
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
{
loadStream >> Encounter[i];
if( Encounter[i] == IN_PROGRESS )
Encounter[i] = NOT_STARTED;
}
}
OUT_LOAD_INST_DATA_COMPLETE;
}
};
if (dataHead1 == 'H' && dataHead2 == 'O' && dataHead3 == 'S')
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
{
loadStream >> Encounter[i];
if( Encounter[i] == IN_PROGRESS )
Encounter[i] = NOT_STARTED;
}
}
OUT_LOAD_INST_DATA_COMPLETE;
}
};
};
void AddSC_instance_halls_of_stone()
{
new instance_halls_of_stone();
new instance_halls_of_stone();
}

View File

@@ -11,81 +11,81 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum AuriayaSpells
{
// BASIC
SPELL_TERRIFYING_SCREECH = 64386,
SPELL_SENTINEL_BLAST_10 = 64389,
SPELL_SENTINEL_BLAST_25 = 64678,
SPELL_SONIC_SCREECH_10 = 64422,
SPELL_SONIC_SCREECH_25 = 64688,
SPELL_GUARDIAN_SWARM = 64396,
SPELL_ENRAGE = 47008,
SPELL_ACTIVATE_FERAL_DEFENDER = 64449,
// BASIC
SPELL_TERRIFYING_SCREECH = 64386,
SPELL_SENTINEL_BLAST_10 = 64389,
SPELL_SENTINEL_BLAST_25 = 64678,
SPELL_SONIC_SCREECH_10 = 64422,
SPELL_SONIC_SCREECH_25 = 64688,
SPELL_GUARDIAN_SWARM = 64396,
SPELL_ENRAGE = 47008,
SPELL_ACTIVATE_FERAL_DEFENDER = 64449,
// Sanctum Sentry
SPELL_SAVAGE_POUNCE_10 = 64666,
SPELL_SAVAGE_POUNCE_25 = 64374,
SPELL_RIP_FLESH_10 = 64375,
SPELL_RIP_FLESH_25 = 64667,
SPELL_STRENGTH_OF_THE_PACK = 64369,
// Sanctum Sentry
SPELL_SAVAGE_POUNCE_10 = 64666,
SPELL_SAVAGE_POUNCE_25 = 64374,
SPELL_RIP_FLESH_10 = 64375,
SPELL_RIP_FLESH_25 = 64667,
SPELL_STRENGTH_OF_THE_PACK = 64369,
// Feral Defender
SPELL_FERAL_ESSENCE = 64455,
SPELL_FERAL_POUNCE_10 = 64478,
SPELL_FERAL_POUNCE_25 = 64669,
SPELL_FERAL_RUSH_10 = 64496,
SPELL_FERAL_RUSH_25 = 64674,
//SPELL_SEEPING_FERAL_ESSENCE_SUMMON = 64457,
SPELL_SEEPING_FERAL_ESSENCE_10 = 64458,
SPELL_SEEPING_FERAL_ESSENCE_25 = 64676,
// Feral Defender
SPELL_FERAL_ESSENCE = 64455,
SPELL_FERAL_POUNCE_10 = 64478,
SPELL_FERAL_POUNCE_25 = 64669,
SPELL_FERAL_RUSH_10 = 64496,
SPELL_FERAL_RUSH_25 = 64674,
//SPELL_SEEPING_FERAL_ESSENCE_SUMMON = 64457,
SPELL_SEEPING_FERAL_ESSENCE_10 = 64458,
SPELL_SEEPING_FERAL_ESSENCE_25 = 64676,
};
#define SPELL_SONIC_SCREECH RAID_MODE(SPELL_SONIC_SCREECH_10, SPELL_SONIC_SCREECH_25)
#define SPELL_SENTINEL_BLAST RAID_MODE(SPELL_SENTINEL_BLAST_10, SPELL_SENTINEL_BLAST_25)
#define SPELL_SAVAGE_POUNCE RAID_MODE(SPELL_SAVAGE_POUNCE_10, SPELL_SAVAGE_POUNCE_25)
#define SPELL_RIP_FLESH RAID_MODE(SPELL_RIP_FLESH_10, SPELL_RIP_FLESH_25)
#define SPELL_FERAL_POUNCE RAID_MODE(SPELL_FERAL_POUNCE_10, SPELL_FERAL_POUNCE_25)
#define SPELL_FERAL_RUSH RAID_MODE(SPELL_FERAL_RUSH_10, SPELL_FERAL_RUSH_25)
#define SPELL_SEEPING_FERAL_ESSENCE RAID_MODE(SPELL_SEEPING_FERAL_ESSENCE_10, SPELL_SEEPING_FERAL_ESSENCE_25)
#define SPELL_SONIC_SCREECH RAID_MODE(SPELL_SONIC_SCREECH_10, SPELL_SONIC_SCREECH_25)
#define SPELL_SENTINEL_BLAST RAID_MODE(SPELL_SENTINEL_BLAST_10, SPELL_SENTINEL_BLAST_25)
#define SPELL_SAVAGE_POUNCE RAID_MODE(SPELL_SAVAGE_POUNCE_10, SPELL_SAVAGE_POUNCE_25)
#define SPELL_RIP_FLESH RAID_MODE(SPELL_RIP_FLESH_10, SPELL_RIP_FLESH_25)
#define SPELL_FERAL_POUNCE RAID_MODE(SPELL_FERAL_POUNCE_10, SPELL_FERAL_POUNCE_25)
#define SPELL_FERAL_RUSH RAID_MODE(SPELL_FERAL_RUSH_10, SPELL_FERAL_RUSH_25)
#define SPELL_SEEPING_FERAL_ESSENCE RAID_MODE(SPELL_SEEPING_FERAL_ESSENCE_10, SPELL_SEEPING_FERAL_ESSENCE_25)
enum AuriayaNPC
{
NPC_FERAL_DEFENDER = 34035,
NPC_SANCTUM_SENTRY = 34014,
NPC_SEEPING_FERAL_ESSENCE = 34098,
NPC_FERAL_DEFENDER = 34035,
NPC_SANCTUM_SENTRY = 34014,
NPC_SEEPING_FERAL_ESSENCE = 34098,
};
enum AuriayaEvents
{
EVENT_SUMMON_FERAL_DEFENDER = 1,
EVENT_TERRIFYING_SCREECH = 2,
EVENT_SONIC_SCREECH = 3,
EVENT_GUARDIAN_SWARM = 4,
EVENT_SENTINEL_BLAST = 5,
EVENT_REMOVE_IMMUNE = 6,
EVENT_SUMMON_FERAL_DEFENDER = 1,
EVENT_TERRIFYING_SCREECH = 2,
EVENT_SONIC_SCREECH = 3,
EVENT_GUARDIAN_SWARM = 4,
EVENT_SENTINEL_BLAST = 5,
EVENT_REMOVE_IMMUNE = 6,
EVENT_RESPAWN_FERAL_DEFENDER = 9,
EVENT_ENRAGE = 10,
EVENT_RESPAWN_FERAL_DEFENDER = 9,
EVENT_ENRAGE = 10,
};
enum AuriayaSounds
{
SOUND_AGGRO = 15473,
SOUND_SLAY1 = 15474,
SOUND_SLAY2 = 15475,
SOUND_DEATH = 15476,
SOUND_BERSERK = 15477,
SOUND_WOUND = 15478,
SOUND_AGGRO = 15473,
SOUND_SLAY1 = 15474,
SOUND_SLAY2 = 15475,
SOUND_DEATH = 15476,
SOUND_BERSERK = 15477,
SOUND_WOUND = 15478,
};
enum Misc
{
ACTION_FERAL_RESPAWN = 1,
ACTION_FERAL_DEATH = 2,
ACTION_DESPAWN_ADDS = 3,
ACTION_FERAL_DEATH_WITH_STACK = 4,
ACTION_FERAL_RESPAWN = 1,
ACTION_FERAL_DEATH = 2,
ACTION_DESPAWN_ADDS = 3,
ACTION_FERAL_DEATH_WITH_STACK = 4,
DATA_CRAZY_CAT = 10,
DATA_NINE_LIVES = 11,
DATA_CRAZY_CAT = 10,
DATA_NINE_LIVES = 11,
};
class boss_auriaya : public CreatureScript
@@ -98,181 +98,181 @@ public:
return new boss_auriayaAI (pCreature);
}
struct boss_auriayaAI : public ScriptedAI
{
boss_auriayaAI(Creature* pCreature) : ScriptedAI(pCreature), summons(pCreature)
{
m_pInstance = pCreature->GetInstanceScript();
}
struct boss_auriayaAI : public ScriptedAI
{
boss_auriayaAI(Creature* pCreature) : ScriptedAI(pCreature), summons(pCreature)
{
m_pInstance = pCreature->GetInstanceScript();
}
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
InstanceScript* m_pInstance;
EventMap events;
SummonList summons;
bool _feralDied;
bool _nineLives;
bool _feralDied;
bool _nineLives;
void Reset()
{
_feralDied = false;
_nineLives = false;
void Reset()
{
_feralDied = false;
_nineLives = false;
events.Reset();
EntryCheckPredicate pred(NPC_FERAL_DEFENDER);
summons.DoAction(ACTION_DESPAWN_ADDS, pred);
summons.DespawnAll();
events.Reset();
EntryCheckPredicate pred(NPC_FERAL_DEFENDER);
summons.DoAction(ACTION_DESPAWN_ADDS, pred);
summons.DespawnAll();
if (m_pInstance)
m_pInstance->SetData(TYPE_AURIAYA, NOT_STARTED);
if (m_pInstance)
m_pInstance->SetData(TYPE_AURIAYA, NOT_STARTED);
for (uint8 i = 0; i < RAID_MODE(2,4); ++i)
me->SummonCreature(NPC_SANCTUM_SENTRY, me->GetPositionX()+urand(4,12), me->GetPositionY()+urand(4,12), me->GetPositionZ());
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false);
}
for (uint8 i = 0; i < RAID_MODE(2,4); ++i)
me->SummonCreature(NPC_SANCTUM_SENTRY, me->GetPositionX()+urand(4,12), me->GetPositionY()+urand(4,12), me->GetPositionZ());
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false);
}
uint32 GetData(uint32 param) const
{
if (param == DATA_CRAZY_CAT)
return !_feralDied;
else if (param == DATA_NINE_LIVES)
return _nineLives;
uint32 GetData(uint32 param) const
{
if (param == DATA_CRAZY_CAT)
return !_feralDied;
else if (param == DATA_NINE_LIVES)
return _nineLives;
return 0;
}
return 0;
}
void JustSummoned(Creature* cr)
{
if (cr->GetEntry() == NPC_SANCTUM_SENTRY)
cr->GetMotionMaster()->MoveFollow(me, 6, rand_norm()*2*3.14f);
else
cr->SetInCombatWithZone();
void JustSummoned(Creature* cr)
{
if (cr->GetEntry() == NPC_SANCTUM_SENTRY)
cr->GetMotionMaster()->MoveFollow(me, 6, rand_norm()*2*3.14f);
else
cr->SetInCombatWithZone();
summons.Summon(cr);
}
summons.Summon(cr);
}
void SummonedCreatureDies(Creature* cr, Unit*)
{
if (cr->GetEntry() == NPC_SANCTUM_SENTRY)
_feralDied = true;
}
void SummonedCreatureDies(Creature* cr, Unit*)
{
if (cr->GetEntry() == NPC_SANCTUM_SENTRY)
_feralDied = true;
}
void JustReachedHome() { me->setActive(false); }
void JustReachedHome() { me->setActive(false); }
void EnterCombat(Unit* who)
{
if (m_pInstance)
m_pInstance->SetData(TYPE_AURIAYA, IN_PROGRESS);
void EnterCombat(Unit* who)
{
if (m_pInstance)
m_pInstance->SetData(TYPE_AURIAYA, IN_PROGRESS);
events.ScheduleEvent(EVENT_TERRIFYING_SCREECH, 35000);
events.ScheduleEvent(EVENT_SONIC_SCREECH, 45000);
events.ScheduleEvent(EVENT_GUARDIAN_SWARM, 70000);
events.ScheduleEvent(EVENT_SUMMON_FERAL_DEFENDER, 60000);
events.ScheduleEvent(EVENT_SENTINEL_BLAST, 36000);
events.ScheduleEvent(EVENT_ENRAGE, 600000);
events.ScheduleEvent(EVENT_TERRIFYING_SCREECH, 35000);
events.ScheduleEvent(EVENT_SONIC_SCREECH, 45000);
events.ScheduleEvent(EVENT_GUARDIAN_SWARM, 70000);
events.ScheduleEvent(EVENT_SUMMON_FERAL_DEFENDER, 60000);
events.ScheduleEvent(EVENT_SENTINEL_BLAST, 36000);
events.ScheduleEvent(EVENT_ENRAGE, 600000);
summons.DoZoneInCombat(NPC_SANCTUM_SENTRY);
summons.DoZoneInCombat(NPC_SANCTUM_SENTRY);
me->MonsterYell("Some things are better left alone!", LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_AGGRO);
me->setActive(true);
}
me->MonsterYell("Some things are better left alone!", LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_AGGRO);
me->setActive(true);
}
void KilledUnit(Unit* victim)
{
if (urand(0,2))
return;
void KilledUnit(Unit* victim)
{
if (urand(0,2))
return;
if (urand(0,1))
{
me->MonsterYell("The secret dies with you!", LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_SLAY1);
}
else
{
me->MonsterYell("There is no escape!", LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_SLAY2);
}
}
if (urand(0,1))
{
me->MonsterYell("The secret dies with you!", LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_SLAY1);
}
else
{
me->MonsterYell("There is no escape!", LANG_UNIVERSAL, 0);
me->PlayDirectSound(SOUND_SLAY2);
}
}
void JustDied(Unit *victim)
{
if (m_pInstance)
m_pInstance->SetData(TYPE_AURIAYA, DONE);
void JustDied(Unit *victim)
{
if (m_pInstance)
m_pInstance->SetData(TYPE_AURIAYA, DONE);
EntryCheckPredicate pred(NPC_FERAL_DEFENDER);
summons.DoAction(ACTION_DESPAWN_ADDS, pred);
summons.DespawnAll();
me->MonsterTextEmote("Auriaya screams in agony.", 0);
me->PlayDirectSound(SOUND_DEATH);
}
EntryCheckPredicate pred(NPC_FERAL_DEFENDER);
summons.DoAction(ACTION_DESPAWN_ADDS, pred);
summons.DespawnAll();
me->MonsterTextEmote("Auriaya screams in agony.", 0);
me->PlayDirectSound(SOUND_DEATH);
}
void DoAction(int32 param)
{
if (param == ACTION_FERAL_DEATH_WITH_STACK)
events.ScheduleEvent(EVENT_RESPAWN_FERAL_DEFENDER, 25000);
else if (param == ACTION_FERAL_DEATH)
_nineLives = true;
}
void DoAction(int32 param)
{
if (param == ACTION_FERAL_DEATH_WITH_STACK)
events.ScheduleEvent(EVENT_RESPAWN_FERAL_DEFENDER, 25000);
else if (param == ACTION_FERAL_DEATH)
_nineLives = true;
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
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_SUMMON_FERAL_DEFENDER:
me->MonsterTextEmote("Auriaya begins to activate Feral Defender.", 0, true);
me->CastSpell(me, SPELL_ACTIVATE_FERAL_DEFENDER, true);
events.PopEvent();
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true);
events.ScheduleEvent(EVENT_REMOVE_IMMUNE, 3000);
break;
case EVENT_REMOVE_IMMUNE:
events.PopEvent();
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false);
break;
case EVENT_TERRIFYING_SCREECH:
me->MonsterTextEmote("Auriaya begins to cast Terrifying Screech.", 0, true);
me->CastSpell(me, SPELL_TERRIFYING_SCREECH, false);
events.RepeatEvent(35000);
break;
case EVENT_SONIC_SCREECH:
me->CastSpell(me, SPELL_SONIC_SCREECH, false);
events.RepeatEvent(50000);
break;
case EVENT_GUARDIAN_SWARM:
me->CastSpell(me->GetVictim(), SPELL_GUARDIAN_SWARM, false);
events.RepeatEvent(40000);
break;
case EVENT_SENTINEL_BLAST:
me->CastSpell(me, SPELL_SENTINEL_BLAST, false);
events.RepeatEvent(35000);
events.DelayEvents(5000, 0);
break;
case EVENT_RESPAWN_FERAL_DEFENDER:
{
EntryCheckPredicate pred(NPC_FERAL_DEFENDER);
summons.DoAction(ACTION_FERAL_RESPAWN, pred);
events.PopEvent();
break;
}
case EVENT_ENRAGE:
me->MonsterTextEmote("You waste my time!", 0);
me->PlayDirectSound(SOUND_BERSERK);
me->CastSpell(me, SPELL_ENRAGE, true);
events.PopEvent();
break;
}
switch (events.GetEvent())
{
case EVENT_SUMMON_FERAL_DEFENDER:
me->MonsterTextEmote("Auriaya begins to activate Feral Defender.", 0, true);
me->CastSpell(me, SPELL_ACTIVATE_FERAL_DEFENDER, true);
events.PopEvent();
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true);
events.ScheduleEvent(EVENT_REMOVE_IMMUNE, 3000);
break;
case EVENT_REMOVE_IMMUNE:
events.PopEvent();
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false);
break;
case EVENT_TERRIFYING_SCREECH:
me->MonsterTextEmote("Auriaya begins to cast Terrifying Screech.", 0, true);
me->CastSpell(me, SPELL_TERRIFYING_SCREECH, false);
events.RepeatEvent(35000);
break;
case EVENT_SONIC_SCREECH:
me->CastSpell(me, SPELL_SONIC_SCREECH, false);
events.RepeatEvent(50000);
break;
case EVENT_GUARDIAN_SWARM:
me->CastSpell(me->GetVictim(), SPELL_GUARDIAN_SWARM, false);
events.RepeatEvent(40000);
break;
case EVENT_SENTINEL_BLAST:
me->CastSpell(me, SPELL_SENTINEL_BLAST, false);
events.RepeatEvent(35000);
events.DelayEvents(5000, 0);
break;
case EVENT_RESPAWN_FERAL_DEFENDER:
{
EntryCheckPredicate pred(NPC_FERAL_DEFENDER);
summons.DoAction(ACTION_FERAL_RESPAWN, pred);
events.PopEvent();
break;
}
case EVENT_ENRAGE:
me->MonsterTextEmote("You waste my time!", 0);
me->PlayDirectSound(SOUND_BERSERK);
me->CastSpell(me, SPELL_ENRAGE, true);
events.PopEvent();
break;
}
DoMeleeAttackIfReady();
}
};
DoMeleeAttackIfReady();
}
};
};
class npc_auriaya_sanctum_sentry : public CreatureScript
@@ -285,56 +285,56 @@ public:
return new npc_auriaya_sanctum_sentryAI (pCreature);
}
struct npc_auriaya_sanctum_sentryAI : public ScriptedAI
{
npc_auriaya_sanctum_sentryAI(Creature* pCreature) : ScriptedAI(pCreature) { }
struct npc_auriaya_sanctum_sentryAI : public ScriptedAI
{
npc_auriaya_sanctum_sentryAI(Creature* pCreature) : ScriptedAI(pCreature) { }
uint32 _savagePounceTimer;
uint32 _ripFleshTimer;
uint32 _savagePounceTimer;
uint32 _ripFleshTimer;
void EnterCombat(Unit*)
{
if (me->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(TYPE_AURIAYA)))
cr->SetInCombatWithZone();
}
void EnterCombat(Unit*)
{
if (me->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(TYPE_AURIAYA)))
cr->SetInCombatWithZone();
}
void Reset()
{
_savagePounceTimer = 5000;
_ripFleshTimer = 0;
void Reset()
{
_savagePounceTimer = 5000;
_ripFleshTimer = 0;
me->CastSpell(me, SPELL_STRENGTH_OF_THE_PACK, true);
}
me->CastSpell(me, SPELL_STRENGTH_OF_THE_PACK, true);
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
_savagePounceTimer += diff;
_ripFleshTimer += diff;
_savagePounceTimer += diff;
_ripFleshTimer += diff;
if (_savagePounceTimer >= 5000)
{
float dist = me->GetDistance(me->GetVictim());
if (dist >= 8 && dist < 25 && me->IsWithinLOSInMap(me->GetVictim()))
{
me->CastSpell(me->GetVictim(), SPELL_SAVAGE_POUNCE, false);
_savagePounceTimer = 0;
return;
}
_savagePounceTimer = 200;
}
else if (_ripFleshTimer >= 10000)
{
me->CastSpell(me->GetVictim(), SPELL_RIP_FLESH, false);
_ripFleshTimer = 0;
}
if (_savagePounceTimer >= 5000)
{
float dist = me->GetDistance(me->GetVictim());
if (dist >= 8 && dist < 25 && me->IsWithinLOSInMap(me->GetVictim()))
{
me->CastSpell(me->GetVictim(), SPELL_SAVAGE_POUNCE, false);
_savagePounceTimer = 0;
return;
}
_savagePounceTimer = 200;
}
else if (_ripFleshTimer >= 10000)
{
me->CastSpell(me->GetVictim(), SPELL_RIP_FLESH, false);
_ripFleshTimer = 0;
}
DoMeleeAttackIfReady();
}
};
DoMeleeAttackIfReady();
}
};
};
class npc_auriaya_feral_defender : public CreatureScript
@@ -347,90 +347,90 @@ public:
return new npc_auriaya_feral_defenderAI (pCreature);
}
struct npc_auriaya_feral_defenderAI : public ScriptedAI
{
npc_auriaya_feral_defenderAI(Creature* pCreature) : ScriptedAI(pCreature), summons(pCreature) { }
struct npc_auriaya_feral_defenderAI : public ScriptedAI
{
npc_auriaya_feral_defenderAI(Creature* pCreature) : ScriptedAI(pCreature), summons(pCreature) { }
int32 _feralRushTimer;
int32 _feralPounceTimer;
uint8 _feralEssenceStack;
SummonList summons;
int32 _feralRushTimer;
int32 _feralPounceTimer;
uint8 _feralEssenceStack;
SummonList summons;
void Reset()
{
summons.DespawnAll();
_feralRushTimer = 3000;
_feralPounceTimer = 0;
_feralEssenceStack = 8;
void Reset()
{
summons.DespawnAll();
_feralRushTimer = 3000;
_feralPounceTimer = 0;
_feralEssenceStack = 8;
if (Aura* aur = me->AddAura(SPELL_FERAL_ESSENCE, me))
aur->SetStackAmount(_feralEssenceStack);
}
if (Aura* aur = me->AddAura(SPELL_FERAL_ESSENCE, me))
aur->SetStackAmount(_feralEssenceStack);
}
void JustDied(Unit*)
{
// inform about our death, start timer
if (me->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(TYPE_AURIAYA)))
cr->AI()->DoAction(_feralEssenceStack ? ACTION_FERAL_DEATH_WITH_STACK : ACTION_FERAL_DEATH);
void JustDied(Unit*)
{
// inform about our death, start timer
if (me->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*me, me->GetInstanceScript()->GetData64(TYPE_AURIAYA)))
cr->AI()->DoAction(_feralEssenceStack ? ACTION_FERAL_DEATH_WITH_STACK : ACTION_FERAL_DEATH);
if (_feralEssenceStack)
{
if (Creature *cr = me->SummonCreature(NPC_SEEPING_FERAL_ESSENCE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f))
summons.Summon(cr);
if (_feralEssenceStack)
{
if (Creature *cr = me->SummonCreature(NPC_SEEPING_FERAL_ESSENCE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f))
summons.Summon(cr);
--_feralEssenceStack;
}
}
--_feralEssenceStack;
}
}
void DoAction(int32 param)
{
if (param == ACTION_FERAL_RESPAWN)
{
me->setDeathState(JUST_RESPAWNED);
void DoAction(int32 param)
{
if (param == ACTION_FERAL_RESPAWN)
{
me->setDeathState(JUST_RESPAWNED);
if (Player* target = SelectTargetFromPlayerList(200))
AttackStart(target);
else
{
summons.DespawnAll();
me->DespawnOrUnsummon(1);
}
if (Player* target = SelectTargetFromPlayerList(200))
AttackStart(target);
else
{
summons.DespawnAll();
me->DespawnOrUnsummon(1);
}
if (_feralEssenceStack)
if (Aura* aur = me->AddAura(SPELL_FERAL_ESSENCE, me))
aur->SetStackAmount(_feralEssenceStack);
}
else if (param == ACTION_DESPAWN_ADDS)
summons.DespawnAll();
}
if (_feralEssenceStack)
if (Aura* aur = me->AddAura(SPELL_FERAL_ESSENCE, me))
aur->SetStackAmount(_feralEssenceStack);
}
else if (param == ACTION_DESPAWN_ADDS)
summons.DespawnAll();
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
_feralRushTimer += diff;
_feralPounceTimer += diff;
_feralRushTimer += diff;
_feralPounceTimer += diff;
if (_feralRushTimer >= 6000)
{
DoResetThreat();
if (!UpdateVictim())
return;
if (_feralRushTimer >= 6000)
{
DoResetThreat();
if (!UpdateVictim())
return;
me->CastSpell(me->GetVictim(), SPELL_FERAL_RUSH, true);
_feralRushTimer = 0;
}
else if (_feralPounceTimer >= 6000)
{
me->CastSpell(me->GetVictim(), SPELL_FERAL_POUNCE, false);
_feralPounceTimer = 0;
}
me->CastSpell(me->GetVictim(), SPELL_FERAL_RUSH, true);
_feralRushTimer = 0;
}
else if (_feralPounceTimer >= 6000)
{
me->CastSpell(me->GetVictim(), SPELL_FERAL_POUNCE, false);
_feralPounceTimer = 0;
}
DoMeleeAttackIfReady();
}
};
DoMeleeAttackIfReady();
}
};
};
class spell_auriaya_sentinel_blast : public SpellScriptLoader
@@ -466,12 +466,12 @@ class achievement_auriaya_crazy_cat_lady : public AchievementCriteriaScript
bool OnCheck(Player* player, Unit* target)
{
if (target)
if (InstanceScript* instance = target->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_AURIAYA)))
return cr->AI()->GetData(DATA_CRAZY_CAT);
return false;
if (target)
if (InstanceScript* instance = target->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_AURIAYA)))
return cr->AI()->GetData(DATA_CRAZY_CAT);
return false;
}
};
@@ -482,23 +482,23 @@ class achievement_auriaya_nine_lives : public AchievementCriteriaScript
bool OnCheck(Player* player, Unit* target)
{
if (target)
if (InstanceScript* instance = target->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_AURIAYA)))
return cr->AI()->GetData(DATA_NINE_LIVES);
return false;
if (target)
if (InstanceScript* instance = target->GetInstanceScript())
if (Creature* cr = ObjectAccessor::GetCreature(*target, instance->GetData64(TYPE_AURIAYA)))
return cr->AI()->GetData(DATA_NINE_LIVES);
return false;
}
};
void AddSC_boss_auriaya()
{
new boss_auriaya();
new npc_auriaya_sanctum_sentry();
new npc_auriaya_feral_defender();
new boss_auriaya();
new npc_auriaya_sanctum_sentry();
new npc_auriaya_feral_defender();
new spell_auriaya_sentinel_blast();
new spell_auriaya_sentinel_blast();
new achievement_auriaya_crazy_cat_lady();
new achievement_auriaya_nine_lives();
new achievement_auriaya_crazy_cat_lady();
new achievement_auriaya_nine_lives();
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -17,443 +17,443 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
#define ANTECHAMBER 204
#define WALKWAY 205
#define CONSERVATORY 206
#define MADNESS 207
#define SPARK 208
#define MADNESS 207
#define SPARK 208
class go_ulduar_teleporter : public GameObjectScript
{
public:
go_ulduar_teleporter() : GameObjectScript("ulduar_teleporter") { }
go_ulduar_teleporter() : GameObjectScript("ulduar_teleporter") { }
bool OnGossipHello(Player* player, GameObject* go)
{
InstanceScript* pInstance = go->GetInstanceScript();
if (!pInstance)
return true;
bool OnGossipHello(Player* player, GameObject* go)
{
InstanceScript* pInstance = go->GetInstanceScript();
if (!pInstance)
return true;
player->ADD_GOSSIP_ITEM(0, "Teleport to the Expedition Base Camp.", GOSSIP_SENDER_MAIN, BASE_CAMP);
if (pInstance->GetData(TYPE_LEVIATHAN) >= DONE) // count special
{
player->ADD_GOSSIP_ITEM(0, "Teleport to the Formation Grounds.", GOSSIP_SENDER_MAIN, GROUNDS);
if (pInstance->GetData(TYPE_LEVIATHAN) == DONE)
{
player->ADD_GOSSIP_ITEM(0, "Teleport to the Colossal Forge.", GOSSIP_SENDER_MAIN, FORGE);
if (pInstance->GetData(TYPE_XT002) == DONE)
{
player->ADD_GOSSIP_ITEM(0, "Teleport to the Scrapyard.", GOSSIP_SENDER_MAIN, SCRAPYARD);
player->ADD_GOSSIP_ITEM(0, "Teleport to the Antechamber of Ulduar.", GOSSIP_SENDER_MAIN, ANTECHAMBER);
if (pInstance->GetData(TYPE_KOLOGARN) == DONE)
{
player->ADD_GOSSIP_ITEM(0, "Teleport to the Shattered Walkway.", GOSSIP_SENDER_MAIN, WALKWAY);
if (pInstance->GetData(TYPE_AURIAYA) == DONE)
{
player->ADD_GOSSIP_ITEM(0, "Teleport to the Conservatory of Life.", GOSSIP_SENDER_MAIN, CONSERVATORY);
if (pInstance->GetData(DATA_CALL_TRAM))
player->ADD_GOSSIP_ITEM(0, "Teleport to the Spark of Imagination.", GOSSIP_SENDER_MAIN, SPARK);
if (pInstance->GetData(TYPE_VEZAX) == DONE)
player->ADD_GOSSIP_ITEM(0, "Teleport to the Prison of Yogg-Saron.", GOSSIP_SENDER_MAIN, MADNESS);
}
}
}
}
}
player->ADD_GOSSIP_ITEM(0, "Teleport to the Expedition Base Camp.", GOSSIP_SENDER_MAIN, BASE_CAMP);
if (pInstance->GetData(TYPE_LEVIATHAN) >= DONE) // count special
{
player->ADD_GOSSIP_ITEM(0, "Teleport to the Formation Grounds.", GOSSIP_SENDER_MAIN, GROUNDS);
if (pInstance->GetData(TYPE_LEVIATHAN) == DONE)
{
player->ADD_GOSSIP_ITEM(0, "Teleport to the Colossal Forge.", GOSSIP_SENDER_MAIN, FORGE);
if (pInstance->GetData(TYPE_XT002) == DONE)
{
player->ADD_GOSSIP_ITEM(0, "Teleport to the Scrapyard.", GOSSIP_SENDER_MAIN, SCRAPYARD);
player->ADD_GOSSIP_ITEM(0, "Teleport to the Antechamber of Ulduar.", GOSSIP_SENDER_MAIN, ANTECHAMBER);
if (pInstance->GetData(TYPE_KOLOGARN) == DONE)
{
player->ADD_GOSSIP_ITEM(0, "Teleport to the Shattered Walkway.", GOSSIP_SENDER_MAIN, WALKWAY);
if (pInstance->GetData(TYPE_AURIAYA) == DONE)
{
player->ADD_GOSSIP_ITEM(0, "Teleport to the Conservatory of Life.", GOSSIP_SENDER_MAIN, CONSERVATORY);
if (pInstance->GetData(DATA_CALL_TRAM))
player->ADD_GOSSIP_ITEM(0, "Teleport to the Spark of Imagination.", GOSSIP_SENDER_MAIN, SPARK);
if (pInstance->GetData(TYPE_VEZAX) == DONE)
player->ADD_GOSSIP_ITEM(0, "Teleport to the Prison of Yogg-Saron.", GOSSIP_SENDER_MAIN, MADNESS);
}
}
}
}
}
player->SEND_GOSSIP_MENU(14424, go->GetGUID());
return true;
}
player->SEND_GOSSIP_MENU(14424, go->GetGUID());
return true;
}
bool OnGossipSelect(Player* player, GameObject* go, uint32 sender, uint32 action)
{
if (sender != GOSSIP_SENDER_MAIN || !player->getAttackers().empty())
return true;
bool OnGossipSelect(Player* player, GameObject* go, uint32 sender, uint32 action)
{
if (sender != GOSSIP_SENDER_MAIN || !player->getAttackers().empty())
return true;
switch(action)
{
case BASE_CAMP:
player->TeleportTo(603, -706.122f, -92.6024f, 429.876f, 0);
player->CLOSE_GOSSIP_MENU(); break;
case GROUNDS:
player->TeleportTo(603, 131.248f, -35.3802f, 409.804f, 0);
player->CLOSE_GOSSIP_MENU(); break;
case FORGE:
player->TeleportTo(603, 553.233f, -12.3247f, 409.679f, 0);
player->CLOSE_GOSSIP_MENU(); break;
case SCRAPYARD:
player->TeleportTo(603, 926.292f, -11.4635f, 418.595f, 0);
player->CLOSE_GOSSIP_MENU(); break;
case ANTECHAMBER:
player->TeleportTo(603, 1498.09f, -24.246f, 420.967f, 0);
player->CLOSE_GOSSIP_MENU(); break;
case WALKWAY:
player->TeleportTo(603, 1859.45f, -24.1f, 448.9f, 0);
player->CLOSE_GOSSIP_MENU(); break;
case CONSERVATORY:
player->TeleportTo(603, 2086.27f, -24.3134f, 421.239f, 0);
player->CLOSE_GOSSIP_MENU(); break;
case MADNESS:
player->TeleportTo(603, 1854.8f, -11.46f, 334.57f, 4.8f);
player->CLOSE_GOSSIP_MENU(); break;
case SPARK:
player->TeleportTo(603, 2517.9f, 2568.9f, 412.7f, 0);
player->CLOSE_GOSSIP_MENU(); break;
}
switch(action)
{
case BASE_CAMP:
player->TeleportTo(603, -706.122f, -92.6024f, 429.876f, 0);
player->CLOSE_GOSSIP_MENU(); break;
case GROUNDS:
player->TeleportTo(603, 131.248f, -35.3802f, 409.804f, 0);
player->CLOSE_GOSSIP_MENU(); break;
case FORGE:
player->TeleportTo(603, 553.233f, -12.3247f, 409.679f, 0);
player->CLOSE_GOSSIP_MENU(); break;
case SCRAPYARD:
player->TeleportTo(603, 926.292f, -11.4635f, 418.595f, 0);
player->CLOSE_GOSSIP_MENU(); break;
case ANTECHAMBER:
player->TeleportTo(603, 1498.09f, -24.246f, 420.967f, 0);
player->CLOSE_GOSSIP_MENU(); break;
case WALKWAY:
player->TeleportTo(603, 1859.45f, -24.1f, 448.9f, 0);
player->CLOSE_GOSSIP_MENU(); break;
case CONSERVATORY:
player->TeleportTo(603, 2086.27f, -24.3134f, 421.239f, 0);
player->CLOSE_GOSSIP_MENU(); break;
case MADNESS:
player->TeleportTo(603, 1854.8f, -11.46f, 334.57f, 4.8f);
player->CLOSE_GOSSIP_MENU(); break;
case SPARK:
player->TeleportTo(603, 2517.9f, 2568.9f, 412.7f, 0);
player->CLOSE_GOSSIP_MENU(); break;
}
return true;
}
return true;
}
};
class npc_ulduar_keeper : public CreatureScript
{
public:
npc_ulduar_keeper() : CreatureScript("npc_ulduar_keeper_gossip") { }
npc_ulduar_keeper() : CreatureScript("npc_ulduar_keeper_gossip") { }
bool OnGossipHello(Player* pPlayer, Creature* pCreature)
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Lend us your aid, keeper. Together we shall defeat Yogg-Saron.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pCreature->GetGUID());
return true;
}
bool OnGossipHello(Player* pPlayer, Creature* pCreature)
{
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Lend us your aid, keeper. Together we shall defeat Yogg-Saron.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
pPlayer->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pCreature->GetGUID());
return true;
}
bool OnGossipSelect(Player* player, Creature* creature, uint32 uiSender, uint32 uiAction)
{
creature->SetUInt32Value(UNIT_NPC_FLAGS, 0);
uint8 _keeper = 0;
switch (creature->GetEntry())
{
case NPC_FREYA_GOSSIP:
creature->MonsterYell("Eonar, your servant calls for your blessing!", LANG_UNIVERSAL, 0);
creature->PlayDirectSound(15535);
_keeper = KEEPER_FREYA;
break;
case NPC_HODIR_GOSSIP:
creature->MonsterYell("The veil of winter will protect you, champions!", LANG_UNIVERSAL, 0);
creature->PlayDirectSound(15559);
_keeper = KEEPER_HODIR;
break;
case NPC_MIMIRON_GOSSIP:
creature->MonsterYell("Combat matrix enhanced. Behold wonderous rapidity!", LANG_UNIVERSAL, 0);
creature->PlayDirectSound(15630);
_keeper = KEEPER_MIMIRON;
break;
case NPC_THORIM_GOSSIP:
creature->MonsterYell("Golganneth, lend me your strengh! Grant my mortal allies the power of thunder!", LANG_UNIVERSAL, 0);
creature->PlayDirectSound(15750);
_keeper = KEEPER_THORIM;
break;
}
bool OnGossipSelect(Player* player, Creature* creature, uint32 uiSender, uint32 uiAction)
{
creature->SetUInt32Value(UNIT_NPC_FLAGS, 0);
uint8 _keeper = 0;
switch (creature->GetEntry())
{
case NPC_FREYA_GOSSIP:
creature->MonsterYell("Eonar, your servant calls for your blessing!", LANG_UNIVERSAL, 0);
creature->PlayDirectSound(15535);
_keeper = KEEPER_FREYA;
break;
case NPC_HODIR_GOSSIP:
creature->MonsterYell("The veil of winter will protect you, champions!", LANG_UNIVERSAL, 0);
creature->PlayDirectSound(15559);
_keeper = KEEPER_HODIR;
break;
case NPC_MIMIRON_GOSSIP:
creature->MonsterYell("Combat matrix enhanced. Behold wonderous rapidity!", LANG_UNIVERSAL, 0);
creature->PlayDirectSound(15630);
_keeper = KEEPER_MIMIRON;
break;
case NPC_THORIM_GOSSIP:
creature->MonsterYell("Golganneth, lend me your strengh! Grant my mortal allies the power of thunder!", LANG_UNIVERSAL, 0);
creature->PlayDirectSound(15750);
_keeper = KEEPER_THORIM;
break;
}
if (creature->GetInstanceScript())
{
creature->GetInstanceScript()->SetData(TYPE_WATCHERS, _keeper);
creature->DespawnOrUnsummon(6000);
}
if (creature->GetInstanceScript())
{
creature->GetInstanceScript()->SetData(TYPE_WATCHERS, _keeper);
creature->DespawnOrUnsummon(6000);
}
return true;
}
return true;
}
};
class spell_ulduar_energy_sap : public SpellScriptLoader
{
public:
spell_ulduar_energy_sap() : SpellScriptLoader("spell_ulduar_energy_sap") { }
spell_ulduar_energy_sap() : SpellScriptLoader("spell_ulduar_energy_sap") { }
class spell_ulduar_energy_sap_AuraScript : public AuraScript
{
PrepareAuraScript(spell_ulduar_energy_sap_AuraScript)
class spell_ulduar_energy_sap_AuraScript : public AuraScript
{
PrepareAuraScript(spell_ulduar_energy_sap_AuraScript)
void HandleEffectPeriodic(AuraEffect const * aurEff)
{
if (Unit* target = GetTarget())
target->CastSpell(target, (aurEff->GetId() == 64740) ? 64747 : 64863, true);
}
void HandleEffectPeriodic(AuraEffect const * aurEff)
{
if (Unit* target = GetTarget())
target->CastSpell(target, (aurEff->GetId() == 64740) ? 64747 : 64863, true);
}
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_ulduar_energy_sap_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
}
};
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_ulduar_energy_sap_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
}
};
AuraScript *GetAuraScript() const
{
return new spell_ulduar_energy_sap_AuraScript();
}
AuraScript *GetAuraScript() const
{
return new spell_ulduar_energy_sap_AuraScript();
}
};
class npc_ulduar_snow_mound : public CreatureScript
{
public:
npc_ulduar_snow_mound() : CreatureScript("npc_ulduar_snow_mound") { }
npc_ulduar_snow_mound() : CreatureScript("npc_ulduar_snow_mound") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new npc_ulduar_snow_moundAI(pCreature);
}
CreatureAI* GetAI(Creature* pCreature) const
{
return new npc_ulduar_snow_moundAI(pCreature);
}
struct npc_ulduar_snow_moundAI : public ScriptedAI
{
npc_ulduar_snow_moundAI(Creature* pCreature) : ScriptedAI(pCreature)
{
activated = false;
me->CastSpell(me, 64615, true);
}
struct npc_ulduar_snow_moundAI : public ScriptedAI
{
npc_ulduar_snow_moundAI(Creature* pCreature) : ScriptedAI(pCreature)
{
activated = false;
me->CastSpell(me, 64615, true);
}
bool activated;
bool activated;
void MoveInLineOfSight(Unit* who)
{
if (!activated && who->GetTypeId() == TYPEID_PLAYER)
if (me->GetExactDist2d(who) <= 25.0f && me->GetMap()->isInLineOfSight(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+5.0f, who->GetPositionX(), who->GetPositionY(), who->GetPositionZ()+5.0f, 2))
{
activated = true;
me->RemoveAura(64615);
if (GameObject* go = me->FindNearestGameObject(194907, 5.0f))
go->Delete();
uint8 count;
if (me->GetEntry() == 34146) count = 4;
else if (me->GetEntry() == 34150) count = 6;
else count = 8;
for (uint8 i=0; i<count; ++i)
{
float a = rand_norm()*2*M_PI; float d = rand_norm()*4.0f;
if (Creature* c = me->SummonCreature(34137, me->GetPositionX()+cos(a)*d, me->GetPositionY()+sin(a)*d, me->GetPositionZ()+1.0f, 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000))
c->AI()->AttackStart(who);
}
}
}
void MoveInLineOfSight(Unit* who)
{
if (!activated && who->GetTypeId() == TYPEID_PLAYER)
if (me->GetExactDist2d(who) <= 25.0f && me->GetMap()->isInLineOfSight(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+5.0f, who->GetPositionX(), who->GetPositionY(), who->GetPositionZ()+5.0f, 2))
{
activated = true;
me->RemoveAura(64615);
if (GameObject* go = me->FindNearestGameObject(194907, 5.0f))
go->Delete();
uint8 count;
if (me->GetEntry() == 34146) count = 4;
else if (me->GetEntry() == 34150) count = 6;
else count = 8;
for (uint8 i=0; i<count; ++i)
{
float a = rand_norm()*2*M_PI; float d = rand_norm()*4.0f;
if (Creature* c = me->SummonCreature(34137, me->GetPositionX()+cos(a)*d, me->GetPositionY()+sin(a)*d, me->GetPositionZ()+1.0f, 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 300000))
c->AI()->AttackStart(who);
}
}
}
void UpdateAI(uint32 diff) {}
};
void UpdateAI(uint32 diff) {}
};
};
class npc_ulduar_storm_tempered_keeper : public CreatureScript
{
public:
npc_ulduar_storm_tempered_keeper() : CreatureScript("npc_ulduar_storm_tempered_keeper") { }
npc_ulduar_storm_tempered_keeper() : CreatureScript("npc_ulduar_storm_tempered_keeper") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new npc_ulduar_storm_tempered_keeperAI(pCreature);
}
CreatureAI* GetAI(Creature* pCreature) const
{
return new npc_ulduar_storm_tempered_keeperAI(pCreature);
}
struct npc_ulduar_storm_tempered_keeperAI : public ScriptedAI
{
npc_ulduar_storm_tempered_keeperAI(Creature* pCreature) : ScriptedAI(pCreature)
{
otherGUID = 0;
}
struct npc_ulduar_storm_tempered_keeperAI : public ScriptedAI
{
npc_ulduar_storm_tempered_keeperAI(Creature* pCreature) : ScriptedAI(pCreature)
{
otherGUID = 0;
}
EventMap events;
uint64 otherGUID;
EventMap events;
uint64 otherGUID;
void Reset()
{
events.Reset();
}
void Reset()
{
events.Reset();
}
void EnterCombat(Unit* /*who*/)
{
events.Reset();
events.ScheduleEvent(1, 2000); // checking Separation Anxiety, Charged Sphere
events.ScheduleEvent(2, urand(5000,8000)); // Forked Lightning
events.ScheduleEvent(3, (me->GetEntry() == 33722 ? 20000 : 50000)); // Summon Charged Sphere
if (Creature* c = me->FindNearestCreature((me->GetEntry() == 33722 ? 33699 : 33722), 30.0f, true))
otherGUID = c->GetGUID();
else
me->CastSpell(me, 63630, true); // Vengeful Surge
}
void EnterCombat(Unit* /*who*/)
{
events.Reset();
events.ScheduleEvent(1, 2000); // checking Separation Anxiety, Charged Sphere
events.ScheduleEvent(2, urand(5000,8000)); // Forked Lightning
events.ScheduleEvent(3, (me->GetEntry() == 33722 ? 20000 : 50000)); // Summon Charged Sphere
if (Creature* c = me->FindNearestCreature((me->GetEntry() == 33722 ? 33699 : 33722), 30.0f, true))
otherGUID = c->GetGUID();
else
me->CastSpell(me, 63630, true); // Vengeful Surge
}
void JustDied(Unit* /*killer*/)
{
if (Creature* c = ObjectAccessor::GetCreature(*me, otherGUID))
c->CastSpell(c, 63630, true); // Vengeful Surge
}
void JustDied(Unit* /*killer*/)
{
if (Creature* c = ObjectAccessor::GetCreature(*me, otherGUID))
c->CastSpell(c, 63630, true); // Vengeful Surge
}
void JustSummoned(Creature* s)
{
if (Creature* c = ObjectAccessor::GetCreature(*me, otherGUID))
s->GetMotionMaster()->MoveFollow(c, 0.0f, 0.0f);
}
void JustSummoned(Creature* s)
{
if (Creature* c = ObjectAccessor::GetCreature(*me, otherGUID))
s->GetMotionMaster()->MoveFollow(c, 0.0f, 0.0f);
}
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 0:
break;
case 1:
if (Creature* c = ObjectAccessor::GetCreature(*me, otherGUID))
if (c->IsAlive() && me->GetExactDist2d(c) > 45.0f)
me->CastSpell(me, 63539, true);
if (Creature* c = me->FindNearestCreature(33715, 2.0f, true))
if (c->IsSummon())
if (c->ToTempSummon()->GetSummonerGUID() != me->GetGUID())
me->CastSpell(me, 63528, true);
events.RepeatEvent(2000);
break;
case 2:
me->CastSpell(me->GetVictim(), 63541, false);
events.RepeatEvent(urand(10000,14000));
break;
case 3:
if (!me->HasAura(63630))
me->CastSpell(me, 63527, false);
events.RepeatEvent(60000);
break;
}
switch (events.GetEvent())
{
case 0:
break;
case 1:
if (Creature* c = ObjectAccessor::GetCreature(*me, otherGUID))
if (c->IsAlive() && me->GetExactDist2d(c) > 45.0f)
me->CastSpell(me, 63539, true);
if (Creature* c = me->FindNearestCreature(33715, 2.0f, true))
if (c->IsSummon())
if (c->ToTempSummon()->GetSummonerGUID() != me->GetGUID())
me->CastSpell(me, 63528, true);
events.RepeatEvent(2000);
break;
case 2:
me->CastSpell(me->GetVictim(), 63541, false);
events.RepeatEvent(urand(10000,14000));
break;
case 3:
if (!me->HasAura(63630))
me->CastSpell(me, 63527, false);
events.RepeatEvent(60000);
break;
}
DoMeleeAttackIfReady();
}
};
DoMeleeAttackIfReady();
}
};
};
class npc_ulduar_arachnopod_destroyer : public CreatureScript
{
public:
npc_ulduar_arachnopod_destroyer() : CreatureScript("npc_ulduar_arachnopod_destroyer") { }
npc_ulduar_arachnopod_destroyer() : CreatureScript("npc_ulduar_arachnopod_destroyer") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new npc_ulduar_arachnopod_destroyerAI(pCreature);
}
CreatureAI* GetAI(Creature* pCreature) const
{
return new npc_ulduar_arachnopod_destroyerAI(pCreature);
}
struct npc_ulduar_arachnopod_destroyerAI : public ScriptedAI
{
npc_ulduar_arachnopod_destroyerAI(Creature* pCreature) : ScriptedAI(pCreature)
{
_spawnedMechanic = false;
me->ApplySpellImmune(0, IMMUNITY_ID, 64919, true); // Ice Nova from Ice Turret
}
struct npc_ulduar_arachnopod_destroyerAI : public ScriptedAI
{
npc_ulduar_arachnopod_destroyerAI(Creature* pCreature) : ScriptedAI(pCreature)
{
_spawnedMechanic = false;
me->ApplySpellImmune(0, IMMUNITY_ID, 64919, true); // Ice Nova from Ice Turret
}
EventMap events;
bool _spawnedMechanic;
EventMap events;
bool _spawnedMechanic;
void Reset()
{
events.Reset();
events.ScheduleEvent(1, urand(5000, 8000)); // Flame Spray
events.ScheduleEvent(2, urand(3000, 6000)); // Machine Gun
events.ScheduleEvent(3, 1000); // Charged Leap
}
void Reset()
{
events.Reset();
events.ScheduleEvent(1, urand(5000, 8000)); // Flame Spray
events.ScheduleEvent(2, urand(3000, 6000)); // Machine Gun
events.ScheduleEvent(3, 1000); // Charged Leap
}
void PassengerBoarded(Unit* p, int8 seat, bool apply)
{
me->setFaction(p->getFaction());
me->SetReactState(REACT_PASSIVE);
}
void PassengerBoarded(Unit* p, int8 seat, bool apply)
{
me->setFaction(p->getFaction());
me->SetReactState(REACT_PASSIVE);
}
void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask)
{
if (!_spawnedMechanic && me->HealthBelowPctDamaged(20, damage))
{
_spawnedMechanic = true;
if (Creature* c = me->SummonCreature(34184, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN, 0))
c->AI()->AttackStart(me->GetVictim());
me->InterruptNonMeleeSpells(false);
me->CombatStop(true);
me->SetReactState(REACT_PASSIVE);
me->SetRegeneratingHealth(false);
me->setFaction(31);
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
me->CastSpell(me, 64770, true);
}
}
void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask)
{
if (!_spawnedMechanic && me->HealthBelowPctDamaged(20, damage))
{
_spawnedMechanic = true;
if (Creature* c = me->SummonCreature(34184, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_MANUAL_DESPAWN, 0))
c->AI()->AttackStart(me->GetVictim());
me->InterruptNonMeleeSpells(false);
me->CombatStop(true);
me->SetReactState(REACT_PASSIVE);
me->SetRegeneratingHealth(false);
me->setFaction(31);
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
me->CastSpell(me, 64770, true);
}
}
void AttackStart(Unit* who)
{
if (me->getFaction() == 16)
ScriptedAI::AttackStart(who);
}
void AttackStart(Unit* who)
{
if (me->getFaction() == 16)
ScriptedAI::AttackStart(who);
}
void EnterEvadeMode()
{
if (me->getFaction() == 16)
ScriptedAI::EnterEvadeMode();
}
void EnterEvadeMode()
{
if (me->getFaction() == 16)
ScriptedAI::EnterEvadeMode();
}
void OnCharmed(bool apply) {}
void OnCharmed(bool apply) {}
void UpdateAI(uint32 diff)
{
if (me->getFaction() != 16)
{
if (me->IsAlive() && (me->GetExactDist2dSq(2058.0f, 42.0f) < 25.0f*25.0f || me->GetExactDist2dSq(2203.0f, 292.0f) < 25.0f*25.0f || me->GetExactDist2dSq(2125.0f, 170.0f) > 160.0f*160.0f))
Unit::Kill(me, me, false);
}
else
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (me->getFaction() != 16)
{
if (me->IsAlive() && (me->GetExactDist2dSq(2058.0f, 42.0f) < 25.0f*25.0f || me->GetExactDist2dSq(2203.0f, 292.0f) < 25.0f*25.0f || me->GetExactDist2dSq(2125.0f, 170.0f) > 160.0f*160.0f))
Unit::Kill(me, me, false);
}
else
{
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 0:
break;
case 1:
me->CastSpell(me->GetVictim(), RAID_MODE(64717, 65241), false);
events.RepeatEvent(urand(15000, 25000));
break;
case 2:
me->CastSpell(me->GetVictim(), RAID_MODE(64776, 65240), false);
events.RepeatEvent(urand(10000, 15000));
break;
case 3:
{
float dist = me->GetDistance(me->GetVictim());
if (dist > 10.0f && dist < 40.0f)
{
me->CastSpell(me->GetVictim(), 64779, false);
events.RepeatEvent(25000);
}
else
events.RepeatEvent(3000);
}
break;
}
switch (events.GetEvent())
{
case 0:
break;
case 1:
me->CastSpell(me->GetVictim(), RAID_MODE(64717, 65241), false);
events.RepeatEvent(urand(15000, 25000));
break;
case 2:
me->CastSpell(me->GetVictim(), RAID_MODE(64776, 65240), false);
events.RepeatEvent(urand(10000, 15000));
break;
case 3:
{
float dist = me->GetDistance(me->GetVictim());
if (dist > 10.0f && dist < 40.0f)
{
me->CastSpell(me->GetVictim(), 64779, false);
events.RepeatEvent(25000);
}
else
events.RepeatEvent(3000);
}
break;
}
DoMeleeAttackIfReady();
}
}
};
DoMeleeAttackIfReady();
}
}
};
};
class spell_ulduar_arachnopod_damaged : public SpellScriptLoader
{
public:
spell_ulduar_arachnopod_damaged() : SpellScriptLoader("spell_ulduar_arachnopod_damaged") { }
spell_ulduar_arachnopod_damaged() : SpellScriptLoader("spell_ulduar_arachnopod_damaged") { }
class spell_ulduar_arachnopod_damaged_AuraScript : public AuraScript
{
PrepareAuraScript(spell_ulduar_arachnopod_damaged_AuraScript)
class spell_ulduar_arachnopod_damaged_AuraScript : public AuraScript
{
PrepareAuraScript(spell_ulduar_arachnopod_damaged_AuraScript)
void HandleEffectPeriodic(AuraEffect const * aurEff)
{
if (Unit* c = GetCaster())
Unit::Kill(c, c, false);
}
void HandleEffectPeriodic(AuraEffect const * aurEff)
{
if (Unit* c = GetCaster())
Unit::Kill(c, c, false);
}
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_ulduar_arachnopod_damaged_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_ulduar_arachnopod_damaged_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
AuraScript *GetAuraScript() const
{
return new spell_ulduar_arachnopod_damaged_AuraScript();
}
AuraScript *GetAuraScript() const
{
return new spell_ulduar_arachnopod_damaged_AuraScript();
}
};
class AreaTrigger_at_celestial_planetarium_enterance : public AreaTriggerScript
@@ -468,9 +468,9 @@ class AreaTrigger_at_celestial_planetarium_enterance : public AreaTriggerScript
bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/)
{
if (player->IsAlive())
if (uint32 questId = (player->GetMap()->Is25ManRaid() ? 13816 : 13607 /*QUEST_CELESTIAL_PLANETARIUM*/))
if (player->GetQuestStatus(questId) == QUEST_STATUS_INCOMPLETE)
player->AreaExploredOrEventHappens(questId);
if (uint32 questId = (player->GetMap()->Is25ManRaid() ? 13816 : 13607 /*QUEST_CELESTIAL_PLANETARIUM*/))
if (player->GetQuestStatus(questId) == QUEST_STATUS_INCOMPLETE)
player->AreaExploredOrEventHappens(questId);
return false;
}
};
@@ -505,15 +505,15 @@ public:
void AddSC_ulduar()
{
new go_ulduar_teleporter();
new npc_ulduar_keeper();
new go_ulduar_teleporter();
new npc_ulduar_keeper();
new spell_ulduar_energy_sap();
new npc_ulduar_snow_mound();
new npc_ulduar_storm_tempered_keeper();
new npc_ulduar_arachnopod_destroyer();
new spell_ulduar_arachnopod_damaged();
new spell_ulduar_energy_sap();
new npc_ulduar_snow_mound();
new npc_ulduar_storm_tempered_keeper();
new npc_ulduar_arachnopod_destroyer();
new spell_ulduar_arachnopod_damaged();
new AreaTrigger_at_celestial_planetarium_enterance();
new go_call_tram();
new AreaTrigger_at_celestial_planetarium_enterance();
new go_call_tram();
}

View File

@@ -7,260 +7,260 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum UlduarEncounters
{
MAX_ENCOUNTER = 15,
MAX_ENCOUNTER = 15,
TYPE_LEVIATHAN = 0,
TYPE_IGNIS = 1,
TYPE_RAZORSCALE = 2,
TYPE_XT002 = 3,
TYPE_ASSEMBLY = 4,
TYPE_KOLOGARN = 5,
TYPE_AURIAYA = 6,
TYPE_FREYA = 7,
TYPE_HODIR = 8,
TYPE_MIMIRON = 9,
TYPE_THORIM = 10,
TYPE_VEZAX = 11,
TYPE_YOGGSARON = 12,
TYPE_ALGALON = 13,
TYPE_WATCHERS = 14,
TYPE_LEVIATHAN = 0,
TYPE_IGNIS = 1,
TYPE_RAZORSCALE = 2,
TYPE_XT002 = 3,
TYPE_ASSEMBLY = 4,
TYPE_KOLOGARN = 5,
TYPE_AURIAYA = 6,
TYPE_FREYA = 7,
TYPE_HODIR = 8,
TYPE_MIMIRON = 9,
TYPE_THORIM = 10,
TYPE_VEZAX = 11,
TYPE_YOGGSARON = 12,
TYPE_ALGALON = 13,
TYPE_WATCHERS = 14,
};
enum UlduarData
{
// Flame Leviathan
DATA_VEHICLE_SPAWN = 100,
DATA_LIGHTNING_WALL1 = 101,
DATA_LIGHTNING_WALL2 = 102,
DATA_REPAIR_STATION1 = 103,
DATA_REPAIR_STATION2 = 104,
DATA_UNBROKEN_ACHIEVEMENT = 105,
// Flame Leviathan
DATA_VEHICLE_SPAWN = 100,
DATA_LIGHTNING_WALL1 = 101,
DATA_LIGHTNING_WALL2 = 102,
DATA_REPAIR_STATION1 = 103,
DATA_REPAIR_STATION2 = 104,
DATA_UNBROKEN_ACHIEVEMENT = 105,
// Razorscales Harpoon Fire State GUIDs
DATA_HARPOON_FIRE_STATE_1 = 200,
DATA_HARPOON_FIRE_STATE_2 = 201,
DATA_HARPOON_FIRE_STATE_3 = 202,
DATA_HARPOON_FIRE_STATE_4 = 203,
// Razorscales Harpoon Fire State GUIDs
DATA_HARPOON_FIRE_STATE_1 = 200,
DATA_HARPOON_FIRE_STATE_2 = 201,
DATA_HARPOON_FIRE_STATE_3 = 202,
DATA_HARPOON_FIRE_STATE_4 = 203,
// Mimiron's first vehicle (spawned by default)
DATA_MIMIRON_LEVIATHAN_MKII = 301,
DATA_MIMIRON_VX001 = 302,
DATA_MIMIRON_ACU = 303,
// Mimiron's first vehicle (spawned by default)
DATA_MIMIRON_LEVIATHAN_MKII = 301,
DATA_MIMIRON_VX001 = 302,
DATA_MIMIRON_ACU = 303,
// Mimiron's Doors
DATA_GO_MIMIRON_DOOR_1 = 311,
DATA_GO_MIMIRON_DOOR_2 = 312,
DATA_GO_MIMIRON_DOOR_3 = 313,
// Mimiron's Doors
DATA_GO_MIMIRON_DOOR_1 = 311,
DATA_GO_MIMIRON_DOOR_2 = 312,
DATA_GO_MIMIRON_DOOR_3 = 313,
// Thorim
DATA_THORIM_LEVER_GATE = 500,
DATA_THORIM_LEVER = 501,
DATA_THORIM_FENCE = 502,
DATA_THORIM_FIRST_DOORS = 503,
DATA_THORIM_SECOND_DOORS = 504,
// Thorim
DATA_THORIM_LEVER_GATE = 500,
DATA_THORIM_LEVER = 501,
DATA_THORIM_FENCE = 502,
DATA_THORIM_FIRST_DOORS = 503,
DATA_THORIM_SECOND_DOORS = 504,
// Assembly of Iron
DATA_STEELBREAKER = 20,
DATA_MOLGEIM = 21,
DATA_BRUNDIR = 22,
// Assembly of Iron
DATA_STEELBREAKER = 20,
DATA_MOLGEIM = 21,
DATA_BRUNDIR = 22,
// Algalon the Observer
DATA_ALGALON_SUMMON_STATE = 600,
DATA_DESPAWN_ALGALON = 601,
DATA_ALGALON_DEFEATED = 602,
DATA_ALGALON_SUMMON_STATE = 600,
DATA_DESPAWN_ALGALON = 601,
DATA_ALGALON_DEFEATED = 602,
// Achievements
DATA_DWARFAGEDDON = 700,
// Achievements
DATA_DWARFAGEDDON = 700,
// Tram
DATA_CALL_TRAM = 710,
// Tram
DATA_CALL_TRAM = 710,
};
enum UlduarNPCs
{
// General
NPC_LEVIATHAN = 33113,
NPC_IGNIS = 33118,
NPC_RAZORSCALE = 33186,
NPC_XT002 = 33293,
NPC_STEELBREAKER = 32867,
NPC_MOLGEIM = 32927,
NPC_BRUNDIR = 32857,
NPC_KOLOGARN = 32930,
NPC_AURIAYA = 33515,
NPC_MIMIRON = 33350,
NPC_HODIR = 32845,
NPC_THORIM = 32865,
NPC_FREYA = 32906,
NPC_VEZAX = 33271,
NPC_SARA = 33134,
NPC_YOGGSARON = 33288,
NPC_BRAIN_OF_YOGG_SARON = 33890,
NPC_ALGALON = 32871,
// General
NPC_LEVIATHAN = 33113,
NPC_IGNIS = 33118,
NPC_RAZORSCALE = 33186,
NPC_XT002 = 33293,
NPC_STEELBREAKER = 32867,
NPC_MOLGEIM = 32927,
NPC_BRUNDIR = 32857,
NPC_KOLOGARN = 32930,
NPC_AURIAYA = 33515,
NPC_MIMIRON = 33350,
NPC_HODIR = 32845,
NPC_THORIM = 32865,
NPC_FREYA = 32906,
NPC_VEZAX = 33271,
NPC_SARA = 33134,
NPC_YOGGSARON = 33288,
NPC_BRAIN_OF_YOGG_SARON = 33890,
NPC_ALGALON = 32871,
// Razorscale
NPC_HARPOON_FIRE_STATE = 33282,
// Razorscale
NPC_HARPOON_FIRE_STATE = 33282,
// Mimiron
NPC_MIMIRON_LEVIATHAN_MKII = 33432,
NPC_MIMIRON_VX001 = 33651,
NPC_MIMIRON_ACU = 33670,
// Mimiron
NPC_MIMIRON_LEVIATHAN_MKII = 33432,
NPC_MIMIRON_VX001 = 33651,
NPC_MIMIRON_ACU = 33670,
// Freya
NPC_ELDER_BRIGHTLEAF = 32915,
NPC_ELDER_STONEBARK = 32914,
NPC_ELDER_IRONBRANCH = 32913,
// Freya
NPC_ELDER_BRIGHTLEAF = 32915,
NPC_ELDER_STONEBARK = 32914,
NPC_ELDER_IRONBRANCH = 32913,
// Yogg-Saron
NPC_FREYA_GOSSIP = 33241,
NPC_HODIR_GOSSIP = 33213,
NPC_THORIM_GOSSIP = 33242,
NPC_MIMIRON_GOSSIP = 33244,
NPC_FREYA_KEEPER = 33410,
NPC_HODIR_KEEPER = 33411,
NPC_MIMIRON_KEEPER = 33412,
NPC_THORIM_KEEPER = 33413,
// Yogg-Saron
NPC_FREYA_GOSSIP = 33241,
NPC_HODIR_GOSSIP = 33213,
NPC_THORIM_GOSSIP = 33242,
NPC_MIMIRON_GOSSIP = 33244,
NPC_FREYA_KEEPER = 33410,
NPC_HODIR_KEEPER = 33411,
NPC_MIMIRON_KEEPER = 33412,
NPC_THORIM_KEEPER = 33413,
// Flame Leviathan
NPC_SALVAGED_SIEGE_ENGINE = 33060,
NPC_SALVAGED_SIEGE_ENGINE_TURRET = 33067,
NPC_VEHICLE_CHOPPER = 33062,
NPC_SALVAGED_DEMOLISHER = 33109,
NPC_SALVAGED_DEMOLISHER_TURRET = 33167,
// Flame Leviathan
NPC_SALVAGED_SIEGE_ENGINE = 33060,
NPC_SALVAGED_SIEGE_ENGINE_TURRET = 33067,
NPC_VEHICLE_CHOPPER = 33062,
NPC_SALVAGED_DEMOLISHER = 33109,
NPC_SALVAGED_DEMOLISHER_TURRET = 33167,
// Algalon the Observer
NPC_BRANN_BRONZBEARD_ALG = 34064,
NPC_AZEROTH = 34246,
NPC_LIVING_CONSTELLATION = 33052,
NPC_ALGALON_STALKER = 33086,
NPC_COLLAPSING_STAR = 32955,
NPC_BLACK_HOLE = 32953,
NPC_WORM_HOLE = 34099,
NPC_ALGALON_VOID_ZONE_VISUAL_STALKER = 34100,
NPC_ALGALON_STALKER_ASTEROID_TARGET_01 = 33104,
NPC_ALGALON_STALKER_ASTEROID_TARGET_02 = 33105,
NPC_UNLEASHED_DARK_MATTER = 34097,
NPC_BRANN_BRONZBEARD_ALG = 34064,
NPC_AZEROTH = 34246,
NPC_LIVING_CONSTELLATION = 33052,
NPC_ALGALON_STALKER = 33086,
NPC_COLLAPSING_STAR = 32955,
NPC_BLACK_HOLE = 32953,
NPC_WORM_HOLE = 34099,
NPC_ALGALON_VOID_ZONE_VISUAL_STALKER = 34100,
NPC_ALGALON_STALKER_ASTEROID_TARGET_01 = 33104,
NPC_ALGALON_STALKER_ASTEROID_TARGET_02 = 33105,
NPC_UNLEASHED_DARK_MATTER = 34097,
};
enum UlduarGameObjects
{
// Chests
GO_KOLOGARN_CHEST = 195046,
GO_KOLOGARN_CHEST_HERO = 195047,
GO_THORIM_CHEST = 194312,
GO_THORIM_CHEST_HERO = 194314,
GO_HODIR_CHEST_NORMAL = 194307,
GO_HODIR_CHEST_NORMAL_HERO = 194308,
GO_HODIR_CHEST_HARD = 194200,
GO_HODIR_CHEST_HARD_HERO = 194201,
GO_FREYA_CHEST = 194330, // Normal, -2 - elder offset
GO_FREYA_CHEST_HERO = 194331, // Hero, -2 - elder offset
GO_MIMIRON_CHEST = 194789,
GO_MIMIRON_CHEST_HARD = 194957,
GO_MIMIRON_CHEST_HERO = 194956,
GO_MIMIRON_CHEST_HERO_HARD = 194958,
GO_ALGALON_CHEST = 194821,
GO_ALGALON_CHEST_HERO = 194822,
// Chests
GO_KOLOGARN_CHEST = 195046,
GO_KOLOGARN_CHEST_HERO = 195047,
GO_THORIM_CHEST = 194312,
GO_THORIM_CHEST_HERO = 194314,
GO_HODIR_CHEST_NORMAL = 194307,
GO_HODIR_CHEST_NORMAL_HERO = 194308,
GO_HODIR_CHEST_HARD = 194200,
GO_HODIR_CHEST_HARD_HERO = 194201,
GO_FREYA_CHEST = 194330, // Normal, -2 - elder offset
GO_FREYA_CHEST_HERO = 194331, // Hero, -2 - elder offset
GO_MIMIRON_CHEST = 194789,
GO_MIMIRON_CHEST_HARD = 194957,
GO_MIMIRON_CHEST_HERO = 194956,
GO_MIMIRON_CHEST_HERO_HARD = 194958,
GO_ALGALON_CHEST = 194821,
GO_ALGALON_CHEST_HERO = 194822,
// Flame Leviathan
GO_REPAIR_STATION_TRAP = 194262,
GO_LEVIATHAN_DOORS = 194630,
GO_LIGHTNING_WALL1 = 194905,
GO_LIGHTNING_WALL2 = 194416,
GO_MIMIRONS_TARGETTING_CRYSTAL = 194705,
GO_FREYAS_TARGETTING_CRYSTAL = 194704,
GO_HODIRS_TARGETTING_CRYSTAL = 194707,
GO_THORIMS_TARGETTING_CRYSTAL = 194706,
GO_MIMIRONS_GENERATOR = 194664,
GO_FREYAS_GENERATOR = 194663,
GO_HODIRS_GENERATOR = 194665,
GO_THORIMS_GENERATOR = 194666,
GO_STORM_BEACON = 194414,
// Flame Leviathan
GO_REPAIR_STATION_TRAP = 194262,
GO_LEVIATHAN_DOORS = 194630,
GO_LIGHTNING_WALL1 = 194905,
GO_LIGHTNING_WALL2 = 194416,
GO_MIMIRONS_TARGETTING_CRYSTAL = 194705,
GO_FREYAS_TARGETTING_CRYSTAL = 194704,
GO_HODIRS_TARGETTING_CRYSTAL = 194707,
GO_THORIMS_TARGETTING_CRYSTAL = 194706,
GO_MIMIRONS_GENERATOR = 194664,
GO_FREYAS_GENERATOR = 194663,
GO_HODIRS_GENERATOR = 194665,
GO_THORIMS_GENERATOR = 194666,
GO_STORM_BEACON = 194414,
// Middle
GO_ARCHIVUM_DOORS = 194556,
GO_ASSEMBLY_DOORS = 194554,
GO_KOLOGARN_BRIDGE = 194232,
GO_KOLOGARN_DOORS = 194553,
GO_KEEPERS_GATE = 194255,
GO_XT002_DOORS = 194631,
GO_MIMIRON_TRAM = 194675,
// Middle
GO_ARCHIVUM_DOORS = 194556,
GO_ASSEMBLY_DOORS = 194554,
GO_KOLOGARN_BRIDGE = 194232,
GO_KOLOGARN_DOORS = 194553,
GO_KEEPERS_GATE = 194255,
GO_XT002_DOORS = 194631,
GO_MIMIRON_TRAM = 194675,
// Mimiron, Hodir, Vezax
GO_MIMIRON_ELEVATOR = 194749,
GO_MIMIRON_DOOR_1 = 194776,
GO_MIMIRON_DOOR_2 = 194774,
GO_MIMIRON_DOOR_3 = 194775,
GO_HODIR_FROZEN_DOOR = 194441,
GO_HODIR_DOOR = 194634,
GO_VEZAX_DOOR = 194750,
// Mimiron, Hodir, Vezax
GO_MIMIRON_ELEVATOR = 194749,
GO_MIMIRON_DOOR_1 = 194776,
GO_MIMIRON_DOOR_2 = 194774,
GO_MIMIRON_DOOR_3 = 194775,
GO_HODIR_FROZEN_DOOR = 194441,
GO_HODIR_DOOR = 194634,
GO_VEZAX_DOOR = 194750,
GO_SNOW_MOUND = 194907,
GO_SNOW_MOUND = 194907,
// Thorim
GO_ARENA_LEVER_GATE = 194560,
GO_ARENA_LEVER = 194264,
GO_ARENA_FENCE = 194559,
GO_FIRST_COLOSSUS_DOORS = 194557,
GO_SECOND_COLOSSUS_DOORS = 194558,
// Thorim
GO_ARENA_LEVER_GATE = 194560,
GO_ARENA_LEVER = 194264,
GO_ARENA_FENCE = 194559,
GO_FIRST_COLOSSUS_DOORS = 194557,
GO_SECOND_COLOSSUS_DOORS = 194558,
// Yogg-Saron
GO_YOGG_SARON_DOORS = 194773,
// Yogg-Saron
GO_YOGG_SARON_DOORS = 194773,
// Algalon the Observer
GO_CELESTIAL_PLANETARIUM_ACCESS_10 = 194628,
GO_CELESTIAL_PLANETARIUM_ACCESS_25 = 194752,
GO_DOODAD_UL_SIGILDOOR_01 = 194767,
GO_DOODAD_UL_SIGILDOOR_02 = 194911,
GO_DOODAD_UL_SIGILDOOR_03 = 194910,
GO_DOODAD_UL_UNIVERSEFLOOR_01 = 194715,
GO_DOODAD_UL_UNIVERSEFLOOR_02 = 194716,
GO_DOODAD_UL_UNIVERSEGLOBE01 = 194148,
GO_DOODAD_UL_ULDUAR_TRAPDOOR_03 = 194253,
GO_GIFT_OF_THE_OBSERVER_10 = 194821,
GO_GIFT_OF_THE_OBSERVER_25 = 194822,
GO_CELESTIAL_PLANETARIUM_ACCESS_10 = 194628,
GO_CELESTIAL_PLANETARIUM_ACCESS_25 = 194752,
GO_DOODAD_UL_SIGILDOOR_01 = 194767,
GO_DOODAD_UL_SIGILDOOR_02 = 194911,
GO_DOODAD_UL_SIGILDOOR_03 = 194910,
GO_DOODAD_UL_UNIVERSEFLOOR_01 = 194715,
GO_DOODAD_UL_UNIVERSEFLOOR_02 = 194716,
GO_DOODAD_UL_UNIVERSEGLOBE01 = 194148,
GO_DOODAD_UL_ULDUAR_TRAPDOOR_03 = 194253,
GO_GIFT_OF_THE_OBSERVER_10 = 194821,
GO_GIFT_OF_THE_OBSERVER_25 = 194822,
};
enum UlduarMisc
{
// Flame Leviathan
VEHICLE_POS_START = 0,
VEHICLE_POS_LEVIATHAN = 1,
VEHICLE_POS_NONE = 2,
// Flame Leviathan
VEHICLE_POS_START = 0,
VEHICLE_POS_LEVIATHAN = 1,
VEHICLE_POS_NONE = 2,
EVENT_TOWER_OF_STORM_DESTROYED = 21031,
EVENT_TOWER_OF_FROST_DESTROYED = 21032,
EVENT_TOWER_OF_FLAMES_DESTROYED = 21033,
EVENT_TOWER_OF_LIFE_DESTROYED = 21030,
EVENT_TOWER_OF_STORM_DESTROYED = 21031,
EVENT_TOWER_OF_FROST_DESTROYED = 21032,
EVENT_TOWER_OF_FLAMES_DESTROYED = 21033,
EVENT_TOWER_OF_LIFE_DESTROYED = 21030,
ACTION_LEVIATHAN_REFRESH_TOWERS = -1,
ACTION_TOWER_OF_STORM_DESTROYED = 1,
ACTION_TOWER_OF_FROST_DESTROYED = 2,
ACTION_TOWER_OF_FLAMES_DESTROYED = 3,
ACTION_TOWER_OF_LIFE_DESTROYED = 4,
ACTION_LEVIATHAN_REFRESH_TOWERS = -1,
ACTION_TOWER_OF_STORM_DESTROYED = 1,
ACTION_TOWER_OF_FROST_DESTROYED = 2,
ACTION_TOWER_OF_FLAMES_DESTROYED = 3,
ACTION_TOWER_OF_LIFE_DESTROYED = 4,
// Algalon the Observer
WORLD_STATE_ALGALON_DESPAWN_TIMER = 4131,
WORLD_STATE_ALGALON_TIMER_ENABLED = 4132,
// Algalon the Observer
WORLD_STATE_ALGALON_DESPAWN_TIMER = 4131,
WORLD_STATE_ALGALON_TIMER_ENABLED = 4132,
EVENT_UPDATE_ALGALON_TIMER = 1,
ACTION_FEEDS_ON_TEARS_FAILED = 0,
ACTION_INIT_ALGALON = 1,
ACTION_DESPAWN_ALGALON = 2,
EVENT_UPDATE_ALGALON_TIMER = 1,
ACTION_FEEDS_ON_TEARS_FAILED = 0,
ACTION_INIT_ALGALON = 1,
ACTION_DESPAWN_ALGALON = 2,
TIMER_ALGALON_DEFEATED = 300,
TIMER_ALGALON_TO_SUMMON = 200,
TIMER_ALGALON_SUMMONED = 100,
TIMER_ALGALON_DEFEATED = 300,
TIMER_ALGALON_TO_SUMMON = 200,
TIMER_ALGALON_SUMMONED = 100,
KEEPER_FREYA = 0,
KEEPER_HODIR = 1,
KEEPER_MIMIRON = 2,
KEEPER_THORIM = 3,
KEEPER_FREYA = 0,
KEEPER_HODIR = 1,
KEEPER_MIMIRON = 2,
KEEPER_THORIM = 3,
// Achievement
SPELL_DWARFAGEDDON = 65387, // not exists in dbc
// Achievement
SPELL_DWARFAGEDDON = 65387, // not exists in dbc
};
Position const AlgalonSummonPos = {1632.531f, -304.8516f, 450.1123f, 1.530165f};