mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-22 05:06:24 +00:00
converted all tabs to 4 spaces
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
@@ -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();
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -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
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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};
|
||||
|
||||
Reference in New Issue
Block a user